2
0
mirror of https://github.com/openvswitch/ovs synced 2025-10-17 14:28:02 +00:00
Files
openvswitch/tests/ovsdb-data.at
Ben Pfaff ae8f13e290 ovsdb: Make scalars and 1-element sets interchangeable.
It is natural to write "abc" in place of ["set",["abc"]] and vice versa.
I cannot think of a reason not to support this, and it can make reading
and writing OVSDB files and transactions easier, so support it.
2010-02-08 16:37:49 -08:00

639 lines
22 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

AT_BANNER([OVSDB -- atoms without constraints])
OVSDB_CHECK_POSITIVE([integer atom from JSON],
[[parse-atoms '["integer"]' \
'[0]' \
'[-1]' \
'[1e3]' \
'[9223372036854775807]' \
'[-9223372036854775808]' ]],
[0
-1
1000
9223372036854775807
-9223372036854775808])
OVSDB_CHECK_POSITIVE([integer atom from string],
[[parse-atom-strings -- '["integer"]' \
'0' \
'-1' \
'+1000' \
'9223372036854775807' \
'-9223372036854775808' ]],
[0
-1
1000
9223372036854775807
-9223372036854775808])
OVSDB_CHECK_POSITIVE([real atom from JSON],
[[parse-atoms '["real"]' \
'[0]' \
'[0.0]' \
'[-0.0]' \
'[-1.25]' \
'[1e3]' \
'[1e37]' \
'[0.00390625]' ]],
[0
0
0
-1.25
1000
1e+37
0.00390625])
OVSDB_CHECK_POSITIVE([real atom from string],
[[parse-atom-strings -- '["real"]' \
'0' \
'0.0' \
'-0.0' \
'-1.25' \
'1e3' \
'1e37' \
'0.00390625' ]],
[0
0
0
-1.25
1000
1e+37
0.00390625])
OVSDB_CHECK_POSITIVE([boolean atom from JSON],
[[parse-atoms '["boolean"]' '[true]' '[false]' ]],
[true
false])
OVSDB_CHECK_POSITIVE([boolean atom from string],
[[parse-atom-strings '["boolean"]' 'true' 'false' ]],
[true
false])
OVSDB_CHECK_POSITIVE([string atom from JSON],
[[parse-atoms '["string"]' '[""]' '["true"]' '["\"\\\/\b\f\n\r\t"]']],
[""
"true"
"\"\\/\b\f\n\r\t"])
OVSDB_CHECK_POSITIVE([string atom from string],
[[parse-atom-strings '["string"]' \
'unquoted' \
'"quoted-string"' \
'"needs quotes"' \
'""' \
'"true"' \
'"\"\\\/\b\f\n\r\t"']],
[unquoted
quoted-string
"needs quotes"
""
"true"
"\"\\/\b\f\n\r\t"])
OVSDB_CHECK_POSITIVE([uuid atom from JSON],
[[parse-atoms '["uuid"]' '["uuid", "550e8400-e29b-41d4-a716-446655440000"]']],
[[["uuid","550e8400-e29b-41d4-a716-446655440000"]]])
OVSDB_CHECK_POSITIVE([uuid atom from string],
[[parse-atom-strings '["uuid"]' '550e8400-e29b-41d4-a716-446655440000']],
[550e8400-e29b-41d4-a716-446655440000])
OVSDB_CHECK_POSITIVE([integer atom sorting],
[[sort-atoms '["integer"]' '[55,0,-1,2,1]']],
[[[-1,0,1,2,55]]])
OVSDB_CHECK_POSITIVE([real atom sorting],
[[sort-atoms '["real"]' '[1.25,1.23,0.0,-0.0,-1e99]']],
[[[-1e+99,0,0,1.23,1.25]]])
OVSDB_CHECK_POSITIVE([boolean atom sorting],
[[sort-atoms '["boolean"]' '[true,false,true,false,false]']],
[[[false,false,false,true,true]]])
OVSDB_CHECK_POSITIVE([string atom sorting],
[[sort-atoms '["string"]' '["abd","abc","\b","xxx"]']],
[[["\b","abc","abd","xxx"]]])
OVSDB_CHECK_POSITIVE([uuid atom sorting],
[[sort-atoms '["uuid"]' '[
["uuid", "00000000-0000-0000-0000-000000000001"],
["uuid", "00000000-1000-0000-0000-000000000000"],
["uuid", "00000000-0000-1000-0000-000000000000"],
["uuid", "00010000-0000-0000-0000-000000000000"],
["uuid", "00000000-0000-0000-0000-000000000100"],
["uuid", "00000000-0000-0000-0000-000100000000"],
["uuid", "00000000-0000-0010-0000-000000000000"],
["uuid", "00000100-0000-0000-0000-000000000000"],
["uuid", "00000000-0000-0001-0000-000000000000"],
["uuid", "00000000-0000-0000-0000-000001000000"],
["uuid", "01000000-0000-0000-0000-000000000000"],
["uuid", "00000000-0000-0000-0000-000000001000"],
["uuid", "00000000-0000-0000-0000-000010000000"],
["uuid", "00000000-0000-0000-0000-010000000000"],
["uuid", "00000000-0000-0100-0000-000000000000"],
["uuid", "10000000-0000-0000-0000-000000000000"],
["uuid", "00000000-0000-0000-0000-000000000010"],
["uuid", "00000000-0100-0000-0000-000000000000"],
["uuid", "00000000-0000-0000-0100-000000000000"],
["uuid", "00000000-0000-0000-0001-000000000000"],
["uuid", "00000010-0000-0000-0000-000000000000"],
["uuid", "00000000-0000-0000-0010-000000000000"],
["uuid", "00000000-0000-0000-0000-000000010000"],
["uuid", "00000000-0000-0000-1000-000000000000"],
["uuid", "00000000-0000-0000-0000-100000000000"],
["uuid", "00000000-0000-0000-0000-001000000000"],
["uuid", "00000000-0000-0000-0000-000000100000"],
["uuid", "00000000-0000-0000-0000-000000000000"],
["uuid", "00000000-0010-0000-0000-000000000000"],
["uuid", "00100000-0000-0000-0000-000000000000"],
["uuid", "00000000-0001-0000-0000-000000000000"],
["uuid", "00000001-0000-0000-0000-000000000000"],
["uuid", "00001000-0000-0000-0000-000000000000"]]']],
[[[["uuid","00000000-0000-0000-0000-000000000000"],["uuid","00000000-0000-0000-0000-000000000001"],["uuid","00000000-0000-0000-0000-000000000010"],["uuid","00000000-0000-0000-0000-000000000100"],["uuid","00000000-0000-0000-0000-000000001000"],["uuid","00000000-0000-0000-0000-000000010000"],["uuid","00000000-0000-0000-0000-000000100000"],["uuid","00000000-0000-0000-0000-000001000000"],["uuid","00000000-0000-0000-0000-000010000000"],["uuid","00000000-0000-0000-0000-000100000000"],["uuid","00000000-0000-0000-0000-001000000000"],["uuid","00000000-0000-0000-0000-010000000000"],["uuid","00000000-0000-0000-0000-100000000000"],["uuid","00000000-0000-0000-0001-000000000000"],["uuid","00000000-0000-0000-0010-000000000000"],["uuid","00000000-0000-0000-0100-000000000000"],["uuid","00000000-0000-0000-1000-000000000000"],["uuid","00000000-0000-0001-0000-000000000000"],["uuid","00000000-0000-0010-0000-000000000000"],["uuid","00000000-0000-0100-0000-000000000000"],["uuid","00000000-0000-1000-0000-000000000000"],["uuid","00000000-0001-0000-0000-000000000000"],["uuid","00000000-0010-0000-0000-000000000000"],["uuid","00000000-0100-0000-0000-000000000000"],["uuid","00000000-1000-0000-0000-000000000000"],["uuid","00000001-0000-0000-0000-000000000000"],["uuid","00000010-0000-0000-0000-000000000000"],["uuid","00000100-0000-0000-0000-000000000000"],["uuid","00001000-0000-0000-0000-000000000000"],["uuid","00010000-0000-0000-0000-000000000000"],["uuid","00100000-0000-0000-0000-000000000000"],["uuid","01000000-0000-0000-0000-000000000000"],["uuid","10000000-0000-0000-0000-000000000000"]]]])
OVSDB_CHECK_POSITIVE([real not acceptable integer JSON atom],
[[parse-atoms '["integer"]' '[0.5]' ]],
[syntax "0.5": syntax error: expected integer])
dnl <C0> is not allowed anywhere in a UTF-8 string.
dnl <ED A0 80> is a surrogate and not allowed in UTF-8.
OVSDB_CHECK_POSITIVE([no invalid UTF-8 sequences in strings],
[parse-atoms '[["string"]]' \
'@<:@"m4_esyscmd([printf "\xc0"])"@:>@' \
'@<:@"m4_esyscmd([printf "\xed\xa0\x80"])"@:>@' \
],
[constraint violation: "m4_esyscmd([printf "\xc0"])" is not a valid UTF-8 string: invalid UTF-8 sequence 0xc0
constraint violation: "m4_esyscmd([printf "\xed\xa0\x80"])" is not a valid UTF-8 string: invalid UTF-8 sequence 0xed 0xa0])
OVSDB_CHECK_NEGATIVE([real not acceptable integer string atom],
[[parse-atom-strings '["integer"]' '0.5' ]],
["0.5" is not a valid integer])
OVSDB_CHECK_POSITIVE([string "true" not acceptable boolean JSON atom],
[[parse-atoms '["boolean"]' '["true"]' ]],
[syntax ""true"": syntax error: expected boolean])
OVSDB_CHECK_NEGATIVE([string "true" not acceptable boolean string atom],
[[parse-atom-strings '["boolean"]' '"true"' ]],
[""true"" is not a valid boolean (use "true" or "false")])
OVSDB_CHECK_POSITIVE([integer not acceptable string JSON atom],
[[parse-atoms '["string"]' '[1]']],
[syntax "1": syntax error: expected string])
OVSDB_CHECK_POSITIVE([uuid atom must be expressed as JSON array],
[[parse-atoms '["uuid"]' '["550e8400-e29b-41d4-a716-446655440000"]']],
[[syntax ""550e8400-e29b-41d4-a716-446655440000"": syntax error: expected ["uuid", <string>]]])
OVSDB_CHECK_NEGATIVE([empty string atom must be quoted],
[[parse-atom-strings '["string"]' '']],
[An empty string is not valid as input; use "" to represent the empty string])
OVSDB_CHECK_NEGATIVE([quotes must be balanced],
[parse-atom-strings '[["string"]]' '"asdf'],
["asdf: missing quote at end of quoted string])
OVSDB_CHECK_NEGATIVE([uuids must be valid],
[parse-atom-strings '[["uuid"]]' '1234-5678'],
["1234-5678" is not a valid UUID])
AT_BANNER([OVSDB -- atoms with constraints])
OVSDB_CHECK_POSITIVE([integers >= 5],
[[parse-atoms '[{"type": "integer", "minInteger": 5}]' \
'[0]' \
'[4]' \
'[5]' \
'[6]' \
'[12345]']],
[constraint violation: 0 is less than minimum allowed value 5
constraint violation: 4 is less than minimum allowed value 5
5
6
12345])
OVSDB_CHECK_POSITIVE([integers <= -1],
[[parse-atoms '[{"type": "integer", "maxInteger": -1}]' \
'[0]' \
'[-1]' \
'[-2]' \
'[-123]']],
[constraint violation: 0 is greater than maximum allowed value -1
-1
-2
-123])
OVSDB_CHECK_POSITIVE([integers in range -10 to 10],
[[parse-atoms '[{"type": "integer", "minInteger": -10, "maxInteger": 10}]' \
'[-20]' \
'[-11]' \
'[-10]' \
'[-9]' \
'[1]' \
'[9]' \
'[10]' \
'[11]' \
'[123576]']],
[constraint violation: -20 is not in the valid range -10 to 10 (inclusive)
constraint violation: -11 is not in the valid range -10 to 10 (inclusive)
-10
-9
1
9
10
constraint violation: 11 is not in the valid range -10 to 10 (inclusive)
constraint violation: 123576 is not in the valid range -10 to 10 (inclusive)])
OVSDB_CHECK_POSITIVE([reals >= 5],
[[parse-atoms '[{"type": "real", "minReal": 5}]' \
'[0]' \
'[4]' \
'[5]' \
'[6]' \
'[12345]']],
[constraint violation: 0 is less than minimum allowed value 5
constraint violation: 4 is less than minimum allowed value 5
5
6
12345])
OVSDB_CHECK_POSITIVE([reals <= -1],
[[parse-atoms '[{"type": "real", "maxReal": -1}]' \
'[0]' \
'[-1]' \
'[-2]' \
'[-123]']],
[constraint violation: 0 is greater than maximum allowed value -1
-1
-2
-123])
OVSDB_CHECK_POSITIVE([reals in range -10 to 10],
[[parse-atoms '[{"type": "real", "minReal": -10, "maxReal": 10}]' \
'[-20]' \
'[-11]' \
'[-10]' \
'[-9]' \
'[1]' \
'[9]' \
'[10]' \
'[11]' \
'[123576]']],
[constraint violation: -20 is not in the valid range -10 to 10 (inclusive)
constraint violation: -11 is not in the valid range -10 to 10 (inclusive)
-10
-9
1
9
10
constraint violation: 11 is not in the valid range -10 to 10 (inclusive)
constraint violation: 123576 is not in the valid range -10 to 10 (inclusive)])
AT_SETUP([strings matching /(a(b)?)c?/])
AT_KEYWORDS([ovsdb positive])
if test "$HAVE_PCRE" = yes; then
b_out='constraint violation: "b" does not match regular expression /(a(b)?)?c?/'
bc_out='constraint violation: "bc" does not match regular expression /(a(b)?)?c?/'
else
b_out='"b"'
bc_out='"bc"'
fi
AT_CHECK_UNQUOTED(
[[test-ovsdb parse-atoms '{"type": "string", "reMatch": "(a(b)?)?c?"}' \
'[""]' \
'["a"]' \
'["ab"]' \
'["abc"]' \
'["ac"]' \
'["b"]' \
'["bc"]' \
'["c"]']],
[0],
[[""
"a"
"ab"
"abc"
"ac"
$b_out
$bc_out
"c"
]])
AT_CLEANUP
OVSDB_CHECK_POSITIVE([strings at least 2 characters long],
[[parse-atoms '{"type": "string", "minLength": 2}' \
'[""]' \
'["a"]' \
'["ab"]' \
'["abc"]' \
'["\ud834\udd1e"]']],
[[constraint violation: "" length 0 is less than minimum allowed length 2
constraint violation: "a" length 1 is less than minimum allowed length 2
"ab"
"abc"
constraint violation: "𝄞" length 1 is less than minimum allowed length 2]])
OVSDB_CHECK_POSITIVE([strings no more than 2 characters long],
[[parse-atoms '{"type": "string", "maxLength": 2}' \
'[""]' \
'["a"]' \
'["ab"]' \
'["abc"]' \
'["\ud834\udd1e"]']],
[[""
"a"
"ab"
constraint violation: "abc" length 3 is greater than maximum allowed length 2
"𝄞"]])
AT_BANNER([OSVDB -- simple data])
OVSDB_CHECK_POSITIVE([integer JSON datum],
[[parse-data '["integer"]' '[0]' '["set",[1]]' '[-1]']],
[0
1
-1])
OVSDB_CHECK_POSITIVE([integer string datum],
[[parse-data-strings -- '["integer"]' '0' '1' '-1' '+1']],
[0
1
-1
1])
OVSDB_CHECK_POSITIVE([real JSON datum],
[[parse-data '["real"]' '[0]' '["set",[1.0]]' '[-1.25]']],
[0
1
-1.25])
OVSDB_CHECK_POSITIVE([real string datum],
[[parse-data-strings -- '["real"]' '0' '1.0' '-1.25']],
[0
1
-1.25])
OVSDB_CHECK_POSITIVE([boolean JSON datum],
[[parse-data '["boolean"]' '["set", [true]]' '[false]' ]],
[true
false])
OVSDB_CHECK_POSITIVE([boolean string datum],
[[parse-data-strings '["boolean"]' 'true' 'false' ]],
[true
false])
OVSDB_CHECK_POSITIVE([string JSON datum],
[[parse-data '["string"]' '["set",[""]]' '["true"]' '["\"\\\/\b\f\n\r\t"]']],
[""
"true"
"\"\\/\b\f\n\r\t"])
OVSDB_CHECK_POSITIVE([string string datum],
[[parse-data-strings '["string"]' '"x"' '""' '"true"' '"\"\\\/\b\f\n\r\t"']],
[x
""
"true"
"\"\\/\b\f\n\r\t"])
AT_BANNER([OVSDB -- set data])
OVSDB_CHECK_POSITIVE([JSON optional boolean],
[[parse-data '{"key": "boolean", "min": 0}' \
'[true]' \
'["set", [false]]' \
'["set", []]']],
[[true
false
["set",[]]]],
[set])
OVSDB_CHECK_POSITIVE([string optional boolean],
[[parse-data-strings '{"key": "boolean", "min": 0}' \
'true' \
'false' \
'[]']],
[[true
false
[]]],
[set])
OVSDB_CHECK_POSITIVE([JSON set of 0 or more integers],
[[parse-data '{"key": "integer", "min": 0, "max": "unlimited"}' \
'["set", [0]]' \
'[1]' \
'["set", [0, 1]]' \
'["set", [0, 1, 2]]' \
'["set", [0, 1, 2, 3, 4, 5]]' \
'["set", [0, 1, 2, 3, 4, 5, 6, 7, 8]]' \
'["set", [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]]']],
[[0
1
["set",[0,1]]
["set",[0,1,2]]
["set",[0,1,2,3,4,5]]
["set",[0,1,2,3,4,5,6,7,8]]
["set",[0,1,2,3,4,5,6,7,8,9,10]]]])
OVSDB_CHECK_POSITIVE([string set of 0 or more integers],
[[parse-data-strings '{"key": "integer", "min": 0, "max": "unlimited"}' \
'0' \
'0,1' \
'0, 1, 2' \
'[0, 1,2, 3, 4, 5]' \
'0, 1,2, 3,4, 5, 6, 7, 8' \
'[0, 1, 2, 3, 4,5, 6,7, 8, 9, 10]']],
[[[0]
[0, 1]
[0, 1, 2]
[0, 1, 2, 3, 4, 5]
[0, 1, 2, 3, 4, 5, 6, 7, 8]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]]])
OVSDB_CHECK_POSITIVE([JSON set of 1 to 3 uuids],
[[parse-data '{"key": "uuid", "min": 1, "max": 3}' \
'["set", [["uuid", "550e8400-e29b-41d4-a716-446655440000"]]]' \
'["uuid", "b5078be0-7664-4299-b836-8bcc03ef941f"]' \
'["set", [["uuid", "c5051240-30ff-43ed-b4b9-93cf3f050813"],
["uuid", "90558331-09af-4d2f-a572-509cad2e9088"],
["uuid", "550e8400-e29b-41d4-a716-446655440000"]]]']],
[[["uuid","550e8400-e29b-41d4-a716-446655440000"]
["uuid","b5078be0-7664-4299-b836-8bcc03ef941f"]
["set",[["uuid","550e8400-e29b-41d4-a716-446655440000"],["uuid","90558331-09af-4d2f-a572-509cad2e9088"],["uuid","c5051240-30ff-43ed-b4b9-93cf3f050813"]]]]])
OVSDB_CHECK_POSITIVE([string set of 1 to 3 uuids],
[[parse-data-strings '{"key": "uuid", "min": 1, "max": 3}' \
'[550e8400-e29b-41d4-a716-446655440000]' \
'[c5051240-30ff-43ed-b4b9-93cf3f050813,
90558331-09af-4d2f-a572-509cad2e9088,
550e8400-e29b-41d4-a716-446655440000]']],
[[[550e8400-e29b-41d4-a716-446655440000]
[550e8400-e29b-41d4-a716-446655440000, 90558331-09af-4d2f-a572-509cad2e9088, c5051240-30ff-43ed-b4b9-93cf3f050813]]])
OVSDB_CHECK_POSITIVE([JSON set of 0 to 3 strings],
[[parse-data '{"key": "string", "min": 0, "max": 3}' \
'["set", []]' \
'["a longer string"]' \
'["set", ["a relatively long string"]]' \
'["set", ["short string", "a relatively long string"]]' \
'["set", ["zzz", "short string", "a relatively long string"]]']],
[[["set",[]]
"a longer string"
"a relatively long string"
["set",["a relatively long string","short string"]]
["set",["a relatively long string","short string","zzz"]]]])
OVSDB_CHECK_POSITIVE([string set of 0 to 3 strings],
[[parse-data-strings '{"key": "string", "min": 0, "max": 3}' \
'[]' \
'"a relatively long string"' \
'["short string", "a relatively long string"]' \
'"zzz","short string","a relatively long string"']],
[[[]
["a relatively long string"]
["a relatively long string", "short string"]
["a relatively long string", "short string", zzz]]])
OVSDB_CHECK_NEGATIVE([duplicate boolean not allowed in JSON set],
[[parse-data '{"key": "boolean", "max": 5}' '["set", [true, true]]']],
[ovsdb error: set contains duplicate])
OVSDB_CHECK_NEGATIVE([duplicate boolean not allowed in string set],
[[parse-data-strings '{"key": "boolean", "max": 5}' 'true, true']],
[set contains duplicate value])
OVSDB_CHECK_NEGATIVE([duplicate integer not allowed in JSON set],
[[parse-data '{"key": "integer", "max": 5}' '["set", [1, 2, 3, 1]]']],
[ovsdb error: set contains duplicate])
OVSDB_CHECK_NEGATIVE([duplicate integer not allowed in string set],
[[parse-data-strings '{"key": "integer", "max": 5}' '[1, 2, 3, 1]']],
[set contains duplicate value])
OVSDB_CHECK_NEGATIVE([duplicate real not allowed in JSON set],
[[parse-data '{"key": "real", "max": 5}' '["set", [0.0, -0.0]]']],
[ovsdb error: set contains duplicate])
OVSDB_CHECK_NEGATIVE([duplicate real not allowed in string set],
[[parse-data-strings '{"key": "real", "max": 5}' '0.0, -0.0']],
[set contains duplicate value])
OVSDB_CHECK_NEGATIVE([duplicate string not allowed in JSON set],
[[parse-data '{"key": "string", "max": 5}' '["set", ["asdf", "ASDF", "asdf"]]']],
[ovsdb error: set contains duplicate])
OVSDB_CHECK_NEGATIVE([duplicate string not allowed in string set],
[[parse-data-strings '{"key": "string", "max": 5}' 'asdf, ASDF, "asdf"']],
[set contains duplicate value])
OVSDB_CHECK_NEGATIVE([duplicate uuid not allowed in JSON set],
[[parse-data '{"key": "uuid", "max": 5}' \
'["set", [["uuid", "7ef21525-0088-4a28-a418-5518413e43ea"],
["uuid", "355ad037-f1da-40aa-b47c-ff9c7e8c6a38"],
["uuid", "7ef21525-0088-4a28-a418-5518413e43ea"]]]']],
[ovsdb error: set contains duplicate])
OVSDB_CHECK_NEGATIVE([duplicate uuid not allowed in string set],
[[parse-data-strings '{"key": "uuid", "max": 5}' \
'7ef21525-0088-4a28-a418-5518413e43ea,
355ad037-f1da-40aa-b47c-ff9c7e8c6a38,
7ef21525-0088-4a28-a418-5518413e43ea']],
[set contains duplicate value])
AT_BANNER([OVSDB -- map data])
OVSDB_CHECK_POSITIVE([JSON map of 1 integer to boolean],
[[parse-data '{"key": "integer", "value": "boolean"}' \
'["map", [[1, true]]]']],
[[["map",[[1,true]]]]])
OVSDB_CHECK_POSITIVE([string map of 1 integer to boolean],
[[parse-data-strings '{"key": "integer", "value": "boolean"}' \
'1=true']],
[[1=true]])
OVSDB_CHECK_POSITIVE([JSON map of at least 1 integer to boolean],
[[parse-data '{"key": "integer", "value": "boolean", "max": "unlimited"}' \
'["map", [[1, true]]]' \
'["map", [[0, true], [1, false], [2, true], [3, true], [4, true]]]' \
'["map", [[3, false], [0, true], [4, false]]]']],
[[["map",[[1,true]]]
["map",[[0,true],[1,false],[2,true],[3,true],[4,true]]]
["map",[[0,true],[3,false],[4,false]]]]])
OVSDB_CHECK_POSITIVE([string map of at least 1 integer to boolean],
[[parse-data-strings '{"key": "integer", "value": "boolean", "max": "unlimited"}' \
'1=true' \
'0=true 1=false 2=true, 3=true 4=true,' \
'3=false,0=true ,4=false']],
[[{1=true}
{0=true, 1=false, 2=true, 3=true, 4=true}
{0=true, 3=false, 4=false}]])
OVSDB_CHECK_POSITIVE([JSON map of 1 boolean to integer],
[[parse-data '{"key": "boolean", "value": "integer"}' \
'["map", [[true, 1]]]']],
[[["map",[[true,1]]]]])
OVSDB_CHECK_POSITIVE([string map of 1 boolean to integer],
[[parse-data-strings '{"key": "boolean", "value": "integer"}' \
'true=1']],
[[true=1]])
OVSDB_CHECK_POSITIVE([JSON map of 1 uuid to real],
[[parse-data '{"key": "uuid", "value": "real", "min": 1, "max": 5}' \
'["map", [[["uuid", "cad8542b-6ee1-486b-971b-7dcbf6e14979"], 1.0],
[["uuid", "6b94b968-2702-4f64-9457-314a34d69b8c"], 2.0],
[["uuid", "d2c4a168-24de-47eb-a8a3-c1abfc814979"], 3.0],
[["uuid", "25bfa475-d072-4f60-8be1-00f48643e9cb"], 4.0],
[["uuid", "1c92b8ca-d5e4-4628-a85d-1dc2d099a99a"], 5.0]]]']],
[[["map",[[["uuid","1c92b8ca-d5e4-4628-a85d-1dc2d099a99a"],5],[["uuid","25bfa475-d072-4f60-8be1-00f48643e9cb"],4],[["uuid","6b94b968-2702-4f64-9457-314a34d69b8c"],2],[["uuid","cad8542b-6ee1-486b-971b-7dcbf6e14979"],1],[["uuid","d2c4a168-24de-47eb-a8a3-c1abfc814979"],3]]]]])
OVSDB_CHECK_POSITIVE([string map of 1 uuid to real],
[[parse-data-strings '{"key": "uuid", "value": "real", "min": 1, "max": 5}' \
'cad8542b-6ee1-486b-971b-7dcbf6e14979=1.0,
6b94b968-2702-4f64-9457-314a34d69b8c=2.0,
d2c4a168-24de-47eb-a8a3-c1abfc814979=3.0,
25bfa475-d072-4f60-8be1-00f48643e9cb=4.0,
1c92b8ca-d5e4-4628-a85d-1dc2d099a99a=5.0']],
[[{1c92b8ca-d5e4-4628-a85d-1dc2d099a99a=5, 25bfa475-d072-4f60-8be1-00f48643e9cb=4, 6b94b968-2702-4f64-9457-314a34d69b8c=2, cad8542b-6ee1-486b-971b-7dcbf6e14979=1, d2c4a168-24de-47eb-a8a3-c1abfc814979=3}]])
OVSDB_CHECK_POSITIVE([JSON map of 10 string to string],
[[parse-data '{"key": "string", "value": "string", "min": 1, "max": 10}' \
'["map", [["2 gills", "1 chopin"],
["2 chopins", "1 pint"],
["2 pints", "1 quart"],
["2 quarts", "1 pottle"],
["2 pottles", "1 gallon"],
["2 gallons", "1 peck"],
["2 pecks", "1 demibushel"],
["2 demibushel", "1 firkin"],
["2 firkins", "1 kilderkin"],
["2 kilderkins", "1 barrel"]]]']],
[[["map",[["2 chopins","1 pint"],["2 demibushel","1 firkin"],["2 firkins","1 kilderkin"],["2 gallons","1 peck"],["2 gills","1 chopin"],["2 kilderkins","1 barrel"],["2 pecks","1 demibushel"],["2 pints","1 quart"],["2 pottles","1 gallon"],["2 quarts","1 pottle"]]]]])
OVSDB_CHECK_POSITIVE([string map of 10 string to string],
[[parse-data-strings '{"key": "string", "value": "string", "min": 1, "max": 10}' \
'{"2 gills"="1 chopin",
"2 chopins"= "1 pint",
"2 pints"= "1 quart",
"2 quarts"= "1 pottle",
"2 pottles"= "1 gallon",
"2 gallons"= "1 peck",
"2 pecks"= "1 demibushel",
"2 demibushel"= "1 firkin",
"2 firkins"= "1 kilderkin",
"2 kilderkins"= "1 barrel"}']],
[[{"2 chopins"="1 pint", "2 demibushel"="1 firkin", "2 firkins"="1 kilderkin", "2 gallons"="1 peck", "2 gills"="1 chopin", "2 kilderkins"="1 barrel", "2 pecks"="1 demibushel", "2 pints"="1 quart", "2 pottles"="1 gallon", "2 quarts"="1 pottle"}]])
OVSDB_CHECK_NEGATIVE([duplicate integer key not allowed in JSON map],
[[parse-data '{"key": "integer", "value": "boolean", "max": 5}' \
'["map", [[1, true], [2, false], [1, false]]]']],
[ovsdb error: map contains duplicate key])
OVSDB_CHECK_NEGATIVE([duplicate integer key not allowed in string map],
[[parse-data-strings '{"key": "integer", "value": "boolean", "max": 5}' \
'1=true 2=false 1=false']],
[map contains duplicate key])