json_schemer-fuzz 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +2 -0
- data/CHANGELOG.md +19 -0
- data/CODE_OF_CONDUCT.md +84 -0
- data/CONTRIBUTING.md +47 -0
- data/LICENSE.txt +22 -0
- data/README.md +221 -0
- data/SECURITY.md +13 -0
- data/lib/json_schemer/fuzz/keyword/additional_properties.rb +60 -0
- data/lib/json_schemer/fuzz/keyword/all_of.rb +46 -0
- data/lib/json_schemer/fuzz/keyword/any_of.rb +43 -0
- data/lib/json_schemer/fuzz/keyword/dependencies.rb +49 -0
- data/lib/json_schemer/fuzz/keyword/enum.rb +32 -0
- data/lib/json_schemer/fuzz/keyword/format.rb +119 -0
- data/lib/json_schemer/fuzz/keyword/items.rb +67 -0
- data/lib/json_schemer/fuzz/keyword/max_items.rb +43 -0
- data/lib/json_schemer/fuzz/keyword/max_length.rb +28 -0
- data/lib/json_schemer/fuzz/keyword/max_properties.rb +43 -0
- data/lib/json_schemer/fuzz/keyword/maximum.rb +44 -0
- data/lib/json_schemer/fuzz/keyword/min_items.rb +42 -0
- data/lib/json_schemer/fuzz/keyword/min_length.rb +27 -0
- data/lib/json_schemer/fuzz/keyword/min_properties.rb +37 -0
- data/lib/json_schemer/fuzz/keyword/minimum.rb +43 -0
- data/lib/json_schemer/fuzz/keyword/multiple_of.rb +27 -0
- data/lib/json_schemer/fuzz/keyword/not.rb +26 -0
- data/lib/json_schemer/fuzz/keyword/one_of.rb +74 -0
- data/lib/json_schemer/fuzz/keyword/pattern.rb +17 -0
- data/lib/json_schemer/fuzz/keyword/properties.rb +38 -0
- data/lib/json_schemer/fuzz/keyword/required.rb +39 -0
- data/lib/json_schemer/fuzz/keyword/unique_items.rb +31 -0
- data/lib/json_schemer/fuzz/keyword.rb +29 -0
- data/lib/json_schemer/fuzz/primitive_type/array.rb +50 -0
- data/lib/json_schemer/fuzz/primitive_type/boolean.rb +29 -0
- data/lib/json_schemer/fuzz/primitive_type/integer.rb +55 -0
- data/lib/json_schemer/fuzz/primitive_type/null.rb +30 -0
- data/lib/json_schemer/fuzz/primitive_type/number.rb +50 -0
- data/lib/json_schemer/fuzz/primitive_type/object.rb +54 -0
- data/lib/json_schemer/fuzz/primitive_type/string.rb +50 -0
- data/lib/json_schemer/fuzz/primitive_type.rb +31 -0
- data/lib/json_schemer/fuzz/version.rb +7 -0
- data/lib/json_schemer/fuzz.rb +170 -0
- data/lib/json_schemer-fuzz.rb +7 -0
- data.tar.gz.sig +0 -0
- metadata +387 -0
- metadata.gz.sig +0 -0
@@ -0,0 +1,39 @@
|
|
1
|
+
module JSONSchemer
|
2
|
+
module Fuzz
|
3
|
+
class Keyword
|
4
|
+
class Required
|
5
|
+
class << self
|
6
|
+
def invalid_params(attributes)
|
7
|
+
required_properties = attributes["required"]
|
8
|
+
raise "No required keyword given: #{attributes}" unless required_properties
|
9
|
+
|
10
|
+
generated_params = []
|
11
|
+
|
12
|
+
required_properties.each do |property|
|
13
|
+
template = JSONSchemer::Fuzz.default_param(attributes)
|
14
|
+
template.delete(property)
|
15
|
+
generated_params << template
|
16
|
+
end
|
17
|
+
|
18
|
+
generated_params
|
19
|
+
end
|
20
|
+
|
21
|
+
def valid_param(attributes)
|
22
|
+
required_properties = attributes["required"]
|
23
|
+
raise "No required keyword given: #{attributes}" unless required_properties
|
24
|
+
|
25
|
+
generated_param = {}
|
26
|
+
|
27
|
+
required_properties.each do |property|
|
28
|
+
properties_key = attributes.key?("members") ? "members" : "properties"
|
29
|
+
attribute = attributes[properties_key][property]
|
30
|
+
generated_param[property] = JSONSchemer::Fuzz.default_param(attribute)
|
31
|
+
end
|
32
|
+
|
33
|
+
generated_param
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module JSONSchemer
|
2
|
+
module Fuzz
|
3
|
+
class Keyword
|
4
|
+
class UniqueItems
|
5
|
+
class << self
|
6
|
+
def invalid_params(attributes)
|
7
|
+
unique_items_flag = attributes["uniqueItems"]
|
8
|
+
raise "No uniqueItems keyword given: #{attributes}" if unique_items_flag.nil?
|
9
|
+
return unless unique_items_flag
|
10
|
+
|
11
|
+
generated_params = []
|
12
|
+
template = valid_param(attributes)
|
13
|
+
template << template.sample
|
14
|
+
generated_params << template
|
15
|
+
|
16
|
+
generated_params
|
17
|
+
end
|
18
|
+
|
19
|
+
def valid_param(attributes)
|
20
|
+
attributes = Marshal.load(Marshal.dump(attributes))
|
21
|
+
unique_items_flag = attributes.delete("uniqueItems")
|
22
|
+
raise "No uniqueItems keyword given: #{attributes}" if unique_items_flag.nil?
|
23
|
+
return unless unique_items_flag
|
24
|
+
|
25
|
+
JSONSchemer::Fuzz.generators("array").valid_param(attributes).uniq
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module JSONSchemer
|
2
|
+
module Fuzz
|
3
|
+
class Keyword
|
4
|
+
end
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
require_relative "keyword/additional_properties"
|
9
|
+
require_relative "keyword/all_of"
|
10
|
+
require_relative "keyword/any_of"
|
11
|
+
require_relative "keyword/dependencies"
|
12
|
+
require_relative "keyword/enum"
|
13
|
+
require_relative "keyword/format"
|
14
|
+
require_relative "keyword/items"
|
15
|
+
require_relative "keyword/max_items"
|
16
|
+
require_relative "keyword/max_length"
|
17
|
+
require_relative "keyword/max_properties"
|
18
|
+
require_relative "keyword/maximum"
|
19
|
+
require_relative "keyword/min_items"
|
20
|
+
require_relative "keyword/min_length"
|
21
|
+
require_relative "keyword/min_properties"
|
22
|
+
require_relative "keyword/minimum"
|
23
|
+
require_relative "keyword/multiple_of"
|
24
|
+
require_relative "keyword/not"
|
25
|
+
require_relative "keyword/one_of"
|
26
|
+
require_relative "keyword/pattern"
|
27
|
+
require_relative "keyword/properties"
|
28
|
+
require_relative "keyword/required"
|
29
|
+
require_relative "keyword/unique_items"
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module JSONSchemer
|
2
|
+
module Fuzz
|
3
|
+
class PrimitiveType
|
4
|
+
class Array
|
5
|
+
class << self
|
6
|
+
def invalid_params(attributes)
|
7
|
+
generated_params = []
|
8
|
+
|
9
|
+
if type = attributes["type"]
|
10
|
+
JSONSchemer::Fuzz::PrimitiveType.invalid_params_by_type(attributes).each do |invalid_param|
|
11
|
+
generated_params.push(invalid_param)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
attributes.each do |keyword, attribute|
|
16
|
+
if klass = keyword_to_class_map[keyword]
|
17
|
+
klass.invalid_params(attributes).each do |invalid_param|
|
18
|
+
generated_params << invalid_param
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
generated_params
|
24
|
+
end
|
25
|
+
|
26
|
+
def valid_param(attributes = {})
|
27
|
+
valid_params = []
|
28
|
+
|
29
|
+
attributes.each do |keyword, attribute|
|
30
|
+
if klass = keyword_to_class_map[keyword]
|
31
|
+
valid_params << klass.valid_param(attributes)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
valid_params.empty? ? ["sample", "array"] : valid_params.sample
|
36
|
+
end
|
37
|
+
|
38
|
+
def keyword_to_class_map
|
39
|
+
{
|
40
|
+
"minItems" => JSONSchemer::Fuzz::Keyword::MinItems,
|
41
|
+
"maxItems" => JSONSchemer::Fuzz::Keyword::MaxItems,
|
42
|
+
"uniqueItems" => JSONSchemer::Fuzz::Keyword::UniqueItems,
|
43
|
+
"items" => JSONSchemer::Fuzz::Keyword::Items,
|
44
|
+
}
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module JSONSchemer
|
2
|
+
module Fuzz
|
3
|
+
class PrimitiveType
|
4
|
+
class Boolean
|
5
|
+
class << self
|
6
|
+
def invalid_params(attributes)
|
7
|
+
generated_params = []
|
8
|
+
|
9
|
+
if type = attributes["type"]
|
10
|
+
valid_types = [type].flatten
|
11
|
+
generated_params = ["true", "false", "1", "0"] unless valid_types.include?("string")
|
12
|
+
JSONSchemer::Fuzz::PrimitiveType.invalid_params_by_type(attributes).each do |invalid_param|
|
13
|
+
generated_params.push(invalid_param)
|
14
|
+
end
|
15
|
+
else
|
16
|
+
generated_params = ["true", "false", "1", "0"]
|
17
|
+
end
|
18
|
+
|
19
|
+
generated_params
|
20
|
+
end
|
21
|
+
|
22
|
+
def valid_param(attributes = {})
|
23
|
+
[true, false].sample
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module JSONSchemer
|
2
|
+
module Fuzz
|
3
|
+
class PrimitiveType
|
4
|
+
class Integer
|
5
|
+
class << self
|
6
|
+
def invalid_params(attributes)
|
7
|
+
generated_params = []
|
8
|
+
if type = attributes["type"]
|
9
|
+
valid_types = [type].flatten
|
10
|
+
# TODO: Ideally this array would include a string number, as that is the intent here
|
11
|
+
["&"].each { |val| generated_params << val } unless valid_types.include?("string")
|
12
|
+
# TODO: Ideally 0.1 would work here as invalid, as it is not an integer
|
13
|
+
# But it doesn't, so instead we use an array
|
14
|
+
generated_params << [0.1] unless valid_types.include?("number")
|
15
|
+
JSONSchemer::Fuzz::PrimitiveType.invalid_params_by_type(attributes).each do |invalid_param|
|
16
|
+
generated_params << invalid_param
|
17
|
+
end
|
18
|
+
else
|
19
|
+
generated_params = ["#"]
|
20
|
+
end
|
21
|
+
|
22
|
+
attributes.each do |keyword, attribute|
|
23
|
+
if (klass = keyword_to_class_map[keyword])
|
24
|
+
klass.invalid_params(attributes).each do |invalid_param|
|
25
|
+
generated_params << invalid_param
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
generated_params
|
31
|
+
end
|
32
|
+
|
33
|
+
def valid_param(attributes = {})
|
34
|
+
valid_params = []
|
35
|
+
attributes.each do |keyword, attribute|
|
36
|
+
if klass = keyword_to_class_map[keyword]
|
37
|
+
valid_params << klass.valid_param(attributes)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
valid_params.empty? ? rand(100) : valid_params.sample
|
42
|
+
end
|
43
|
+
|
44
|
+
def keyword_to_class_map
|
45
|
+
{
|
46
|
+
"minimum" => JSONSchemer::Fuzz::Keyword::Minimum,
|
47
|
+
"maximum" => JSONSchemer::Fuzz::Keyword::Maximum,
|
48
|
+
"multipleOf" => JSONSchemer::Fuzz::Keyword::MultipleOf,
|
49
|
+
}
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module JSONSchemer
|
2
|
+
module Fuzz
|
3
|
+
class PrimitiveType
|
4
|
+
class Null
|
5
|
+
class << self
|
6
|
+
def invalid_params(attributes)
|
7
|
+
generated_params = []
|
8
|
+
if type = attributes["type"]
|
9
|
+
valid_types = [type].flatten
|
10
|
+
generated_params = ["nil", "0", "null", ""] unless valid_types.include?("string")
|
11
|
+
generated_params.push(false) unless valid_types.include?("boolean")
|
12
|
+
|
13
|
+
JSONSchemer::Fuzz::PrimitiveType.invalid_params_by_type(attributes).each do |invalid_param|
|
14
|
+
generated_params.push(invalid_param)
|
15
|
+
end
|
16
|
+
else
|
17
|
+
generated_params = ["nil", "0", "null", false, ""]
|
18
|
+
end
|
19
|
+
|
20
|
+
generated_params
|
21
|
+
end
|
22
|
+
|
23
|
+
def valid_param(attributes = {})
|
24
|
+
nil
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module JSONSchemer
|
2
|
+
module Fuzz
|
3
|
+
class PrimitiveType
|
4
|
+
class Number
|
5
|
+
class << self
|
6
|
+
def invalid_params(attributes)
|
7
|
+
generated_params = []
|
8
|
+
if type = attributes["type"]
|
9
|
+
valid_types = [type].flatten
|
10
|
+
generated_params = ["0.1", "10", "hoge"] unless valid_types.include?("string")
|
11
|
+
JSONSchemer::Fuzz::PrimitiveType.invalid_params_by_type(attributes).each do |invalid_param|
|
12
|
+
generated_params << invalid_param
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
attributes.each do |keyword, attribute|
|
17
|
+
if klass = keyword_to_class_map[keyword]
|
18
|
+
klass.invalid_params(attributes).each do |invalid_param|
|
19
|
+
generated_params << invalid_param
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
generated_params
|
25
|
+
end
|
26
|
+
|
27
|
+
def valid_param(attributes = {})
|
28
|
+
valid_params = []
|
29
|
+
|
30
|
+
attributes.each do |keyword, attribute|
|
31
|
+
if klass = keyword_to_class_map[keyword]
|
32
|
+
valid_params << klass.valid_param(attributes).to_f
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
valid_params.empty? ? rand : valid_params.sample
|
37
|
+
end
|
38
|
+
|
39
|
+
def keyword_to_class_map
|
40
|
+
{
|
41
|
+
"minimum" => JSONSchemer::Fuzz::Keyword::Minimum,
|
42
|
+
"maximum" => JSONSchemer::Fuzz::Keyword::Maximum,
|
43
|
+
"multipleOf" => JSONSchemer::Fuzz::Keyword::MultipleOf,
|
44
|
+
}
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module JSONSchemer
|
2
|
+
module Fuzz
|
3
|
+
class PrimitiveType
|
4
|
+
class Object
|
5
|
+
class << self
|
6
|
+
def invalid_params(attributes)
|
7
|
+
generated_params = []
|
8
|
+
|
9
|
+
if type = attributes["type"]
|
10
|
+
valid_types = [type].flatten
|
11
|
+
JSONSchemer::Fuzz::PrimitiveType.invalid_params_by_type(attributes).each do |invalid_param|
|
12
|
+
generated_params.push(invalid_param)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
attributes.each do |keyword, attribute|
|
17
|
+
if klass = keyword_to_class_map[keyword]
|
18
|
+
klass.invalid_params(attributes).each do |invalid_param|
|
19
|
+
generated_params << invalid_param
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
generated_params
|
25
|
+
end
|
26
|
+
|
27
|
+
def valid_param(attributes = {})
|
28
|
+
generated_params = {}
|
29
|
+
|
30
|
+
attributes.each do |keyword, attribute|
|
31
|
+
if klass = keyword_to_class_map[keyword]
|
32
|
+
generated_params.merge!(klass.valid_param(attributes))
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
generated_params
|
37
|
+
end
|
38
|
+
|
39
|
+
def keyword_to_class_map
|
40
|
+
{
|
41
|
+
"members" => JSONSchemer::Fuzz::Keyword::Properties,
|
42
|
+
"properties" => JSONSchemer::Fuzz::Keyword::Properties,
|
43
|
+
"required" => JSONSchemer::Fuzz::Keyword::Required,
|
44
|
+
"minProperties" => JSONSchemer::Fuzz::Keyword::MinProperties,
|
45
|
+
"maxProperties" => JSONSchemer::Fuzz::Keyword::MaxProperties,
|
46
|
+
"additionalProperties" => JSONSchemer::Fuzz::Keyword::AdditionalProperties,
|
47
|
+
"dependencies" => JSONSchemer::Fuzz::Keyword::Dependencies,
|
48
|
+
}
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module JSONSchemer
|
2
|
+
module Fuzz
|
3
|
+
class PrimitiveType
|
4
|
+
class String
|
5
|
+
class << self
|
6
|
+
def invalid_params(attributes)
|
7
|
+
generated_params = []
|
8
|
+
if type = attributes["type"]
|
9
|
+
valid_types = [type].flatten
|
10
|
+
JSONSchemer::Fuzz::PrimitiveType.invalid_params_by_type(attributes).each do |invalid_param|
|
11
|
+
generated_params.push(invalid_param)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
attributes.each do |keyword, attribute|
|
16
|
+
if klass = keyword_to_class_map[keyword]
|
17
|
+
klass.invalid_params(attributes).each do |invalid_param|
|
18
|
+
generated_params << invalid_param
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
generated_params.empty? ? [1] : generated_params
|
24
|
+
end
|
25
|
+
|
26
|
+
def valid_param(attributes = {})
|
27
|
+
generated_params = []
|
28
|
+
|
29
|
+
attributes.each do |keyword, attribute|
|
30
|
+
if klass = keyword_to_class_map[keyword]
|
31
|
+
generated_params << klass.valid_param(attributes)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
generated_params.empty? ? "hoge" : generated_params.sample
|
36
|
+
end
|
37
|
+
|
38
|
+
def keyword_to_class_map
|
39
|
+
{
|
40
|
+
"pattern" => JSONSchemer::Fuzz::Keyword::Pattern,
|
41
|
+
"minLength" => JSONSchemer::Fuzz::Keyword::MinLength,
|
42
|
+
"maxLength" => JSONSchemer::Fuzz::Keyword::MaxLength,
|
43
|
+
"format" => JSONSchemer::Fuzz::Keyword::Format,
|
44
|
+
}
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require_relative "primitive_type/array"
|
2
|
+
require_relative "primitive_type/boolean"
|
3
|
+
require_relative "primitive_type/integer"
|
4
|
+
require_relative "primitive_type/null"
|
5
|
+
require_relative "primitive_type/number"
|
6
|
+
require_relative "primitive_type/object"
|
7
|
+
require_relative "primitive_type/string"
|
8
|
+
|
9
|
+
module JSONSchemer
|
10
|
+
module Fuzz
|
11
|
+
class PrimitiveType
|
12
|
+
class << self
|
13
|
+
def invalid_params_by_type(attributes)
|
14
|
+
type = attributes["type"]
|
15
|
+
raise "No type given: #{attributes}" unless type
|
16
|
+
|
17
|
+
valid_types = [type].flatten
|
18
|
+
valid_types.push("integer") if valid_types.include?("number")
|
19
|
+
|
20
|
+
invalid_params = []
|
21
|
+
|
22
|
+
GENERATOR_MAP.each do |key, klass|
|
23
|
+
invalid_params.push(klass.valid_param(attributes)) unless valid_types.include?(key)
|
24
|
+
end
|
25
|
+
|
26
|
+
invalid_params
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,170 @@
|
|
1
|
+
# External gems
|
2
|
+
require "version_gem"
|
3
|
+
require "json_schemer"
|
4
|
+
require "file_exists" # must load before randexp
|
5
|
+
require "randexp"
|
6
|
+
|
7
|
+
# This gem
|
8
|
+
require_relative "fuzz/version"
|
9
|
+
require_relative "fuzz/keyword"
|
10
|
+
require_relative "fuzz/primitive_type"
|
11
|
+
|
12
|
+
module JSONSchemer
|
13
|
+
module Fuzz
|
14
|
+
GENERATOR_MAP = {
|
15
|
+
"array" => JSONSchemer::Fuzz::PrimitiveType::Array,
|
16
|
+
"boolean" => JSONSchemer::Fuzz::PrimitiveType::Boolean,
|
17
|
+
"integer" => JSONSchemer::Fuzz::PrimitiveType::Integer,
|
18
|
+
"null" => JSONSchemer::Fuzz::PrimitiveType::Null,
|
19
|
+
"number" => JSONSchemer::Fuzz::PrimitiveType::Number,
|
20
|
+
"object" => JSONSchemer::Fuzz::PrimitiveType::Object,
|
21
|
+
"string" => JSONSchemer::Fuzz::PrimitiveType::String,
|
22
|
+
}.freeze
|
23
|
+
|
24
|
+
extend self
|
25
|
+
|
26
|
+
def generators(type)
|
27
|
+
raise "no generator for #{type}" unless GENERATOR_MAP.key?(type)
|
28
|
+
|
29
|
+
GENERATOR_MAP[type]
|
30
|
+
end
|
31
|
+
|
32
|
+
# Generate invalid data
|
33
|
+
def generate(schema)
|
34
|
+
schema = JSON.parse(open(schema).read) if schema.instance_of?(String)
|
35
|
+
generated_params = []
|
36
|
+
|
37
|
+
if (type = schema["type"])
|
38
|
+
if type.instance_of?(Array) # union type
|
39
|
+
all_types.each do |target_type|
|
40
|
+
if type.include?(target_type)
|
41
|
+
generators(target_type).invalid_params(schema).each do |invalid_param|
|
42
|
+
generated_params.push(invalid_param)
|
43
|
+
end
|
44
|
+
else
|
45
|
+
generated_params.push(generators(target_type).invalid_params("type" => target_type))
|
46
|
+
end
|
47
|
+
end
|
48
|
+
elsif type == "any"
|
49
|
+
# do nothing
|
50
|
+
else
|
51
|
+
generators(type).invalid_params(schema).each do |invalid_param|
|
52
|
+
generated_params.push(invalid_param)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
elsif schema.key?("members") || schema.key?("properties")
|
56
|
+
generators("object").invalid_params(schema).each do |invalid_param|
|
57
|
+
generated_params.push(invalid_param)
|
58
|
+
end
|
59
|
+
elsif schema.empty?
|
60
|
+
# do nothing
|
61
|
+
elsif schema.key?("minimum") || schema.key?("maximum")
|
62
|
+
generators("number").invalid_params(schema).each do |invalid_param|
|
63
|
+
generated_params.push(invalid_param)
|
64
|
+
end
|
65
|
+
elsif schema.key?("minItems") || schema.key?("maxItems")
|
66
|
+
generators("array").invalid_params(schema).each do |invalid_param|
|
67
|
+
generated_params << invalid_param
|
68
|
+
end
|
69
|
+
elsif schema.key?("minProperties") || schema.key?("maxProperties")
|
70
|
+
generators("object").invalid_params(schema).each do |invalid_param|
|
71
|
+
generated_params << invalid_param
|
72
|
+
end
|
73
|
+
elsif schema.key?("uniqueItems")
|
74
|
+
generators("array").invalid_params(schema).each do |invalid_param|
|
75
|
+
generated_params << invalid_param
|
76
|
+
end
|
77
|
+
elsif schema.key?("pattern")
|
78
|
+
generators("string").invalid_params(schema).each do |invalid_param|
|
79
|
+
generated_params << invalid_param
|
80
|
+
end
|
81
|
+
elsif schema.key?("minLength") || schema.key?("maxLength")
|
82
|
+
generators("string").invalid_params(schema).each do |invalid_param|
|
83
|
+
generated_params << invalid_param
|
84
|
+
end
|
85
|
+
elsif schema.key?("enum")
|
86
|
+
JSONSchemer::Fuzz::Keyword::Enum.invalid_params(schema).each do |invalid_param|
|
87
|
+
generated_params << invalid_param
|
88
|
+
end
|
89
|
+
elsif schema.key?("multipleOf")
|
90
|
+
generators("number").invalid_params(schema).each do |invalid_param|
|
91
|
+
generated_params << invalid_param
|
92
|
+
end
|
93
|
+
elsif schema.key?("items")
|
94
|
+
generators("array").invalid_params(schema).each do |invalid_param|
|
95
|
+
generated_params << invalid_param
|
96
|
+
end
|
97
|
+
elsif schema.key?("$ref")
|
98
|
+
raise "not impremented yet"
|
99
|
+
elsif schema.key?("allOf") || schema.key?("anyOf") || schema.key?("oneOf")
|
100
|
+
generators("object").invalid_params(schema).each do |invalid_param|
|
101
|
+
generated_params << invalid_param
|
102
|
+
end
|
103
|
+
elsif schema.key?("not")
|
104
|
+
JSONSchemer::Fuzz::Keyword::Not.invalid_params(schema).each do |invalid_param|
|
105
|
+
generated_params << invalid_param
|
106
|
+
end
|
107
|
+
else
|
108
|
+
raise "Not implemented generator for schema:#{schema}"
|
109
|
+
end
|
110
|
+
|
111
|
+
generated_params
|
112
|
+
end
|
113
|
+
|
114
|
+
# Generate valid data
|
115
|
+
def default_param(schema)
|
116
|
+
schema = JSON.parse(open(schema).read) if schema.instance_of?(String)
|
117
|
+
|
118
|
+
if (type = schema["type"])
|
119
|
+
type = type.sample if type.instance_of?(Array)
|
120
|
+
type = all_types.sample if type == "any"
|
121
|
+
generators(type).valid_param(schema)
|
122
|
+
elsif schema.key?("properties")
|
123
|
+
generators("object").valid_param(schema)
|
124
|
+
elsif schema.empty?
|
125
|
+
_, generator = JSONSchemer::Fuzz::GENERATOR_MAP.to_a.sample
|
126
|
+
generator.valid_param
|
127
|
+
elsif schema.key?("minimum") || schema.key?("maximum")
|
128
|
+
generators("number").valid_param(schema)
|
129
|
+
elsif schema.key?("minItems") || schema.key?("maxItems")
|
130
|
+
generators("array").valid_param(schema)
|
131
|
+
elsif schema.key?("minProperties") || schema.key?("maxProperties")
|
132
|
+
generators("object").valid_param(schema)
|
133
|
+
elsif schema.key?("uniqueItems")
|
134
|
+
generators("array").valid_param(schema)
|
135
|
+
elsif schema.key?("pattern")
|
136
|
+
generators("string").valid_param(schema)
|
137
|
+
elsif schema.key?("minLength") || schema.key?("maxLength")
|
138
|
+
generators("string").valid_param(schema)
|
139
|
+
elsif schema.key?("enum")
|
140
|
+
JSONSchemer::Fuzz::Keyword::Enum.valid_param(schema)
|
141
|
+
elsif schema.key?("multipleOf")
|
142
|
+
generators("number").valid_param(schema)
|
143
|
+
elsif schema.key?("items")
|
144
|
+
generators("array").valid_param(schema)
|
145
|
+
elsif schema.key?("$ref")
|
146
|
+
raise "not impremented yet"
|
147
|
+
elsif schema.key?("allOf")
|
148
|
+
JSONSchemer::Fuzz::Keyword::AllOf.valid_param(schema)
|
149
|
+
elsif schema.key?("anyOf")
|
150
|
+
JSONSchemer::Fuzz::Keyword::AnyOf.valid_param(schema)
|
151
|
+
elsif schema.key?("oneOf")
|
152
|
+
JSONSchemer::Fuzz::Keyword::OneOf.valid_param(schema)
|
153
|
+
elsif schema.key?("not")
|
154
|
+
JSONSchemer::Fuzz::Keyword::Not.valid_param(schema)
|
155
|
+
else
|
156
|
+
raise "Not implemented generator for schema:#{schema}"
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
private
|
161
|
+
|
162
|
+
def all_types
|
163
|
+
%w[array boolean integer null number object string]
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
JSONSchemer::Fuzz::Version.class_eval do
|
169
|
+
extend VersionGem::Basic
|
170
|
+
end
|
@@ -0,0 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# This file should be required by any tools (e.g. bundler) loading this library
|
4
|
+
# Bundler should automatically load this file, based on RubyGems' directory and naming conventions.
|
5
|
+
# For technical reasons, this cannot be require_relative.
|
6
|
+
# See: https://github.com/fxn/zeitwerk#for_gem_extension
|
7
|
+
require "json_schemer/fuzz"
|
data.tar.gz.sig
ADDED
Binary file
|