ovsdb-idl: JSONRPC_REPLY message always has nonnull 'id'.
[openvswitch] / tests / ovsdb-query.at
1 AT_BANNER([OVSDB -- queries])
2
3 OVSDB_CHECK_POSITIVE([queries on scalars],
4   [[query \
5     '{"columns":
6         {"i": {"type": "integer"},
7          "r": {"type": "real"},
8          "b": {"type": "boolean"},
9          "s": {"type": "string"},
10          "u": {"type": "uuid"}}}' \
11     '[{"i": 0,
12        "r": 0.5,
13        "b": true,
14        "s": "a",
15        "u": ["uuid", "b10d28f7-af18-4a67-9e78-2a6394516c59"]},
16       {"i": 1,
17        "r": 1.5,
18        "b": false,
19        "s": "b",
20        "u": ["uuid", "9179ca6d-6d65-400a-b455-3ad92783a099"]},
21       {"i": 2,
22        "r": 2.5,
23        "b": true,
24        "s": "c",
25        "u": ["uuid", "ad0fa355-8b84-4a36-a4b5-b2c1bfd91758"]},
26       {"i": 3,
27        "r": 3.5,
28        "b": false,
29        "s": "d",
30        "u": ["uuid", "62315898-64e0-40b9-b26f-ff74225303e6"]},
31       {"i": 4,
32        "r": 4.5,
33        "b": true,
34        "s": "e",
35        "u": ["uuid", "4a5127e2-0256-4a72-a7dc-6246213967c7"]}]' \
36     '[[],
37       [["i", "==", 0]],
38       [["i", "!=", 1]],
39       [["i", "<", 2]],
40       [["i", "<=", 3]],
41       [["i", ">", 2]],
42       [["i", ">=", 4]],
43       [["i", "includes", 3]],
44       [["i", "excludes", 2]],
45       [["r", "==", 0.5]],
46       [["r", "!=", 1.5]],
47       [["r", "<", 2.5]],
48       [["r", "<=", 3.5]],
49       [["r", ">", 4.5]],
50       [["r", ">=", 5.5]],
51       [["r", "includes", 1]],
52       [["r", "excludes", 3]],
53       [["b", "==", true]],
54       [["b", "!=", true]],
55       [["b", "includes", false]],
56       [["b", "excludes", true]],
57       [["s", "==", "a"]],
58       [["s", "!=", "b"]],
59       [["s", "includes", "c"]],
60       [["s", "excludes", "d"]],
61       [["u", "==", ["uuid", "b10d28f7-af18-4a67-9e78-2a6394516c59"]]],
62       [["u", "!=", ["uuid", "9179ca6d-6d65-400a-b455-3ad92783a099"]]],
63       [["u", "includes",["uuid", "ad0fa355-8b84-4a36-a4b5-b2c1bfd91758"]]]]']],
64   [dnl
65 query  0: 11111
66 query  1: 1----
67 query  2: 1-111
68 query  3: 11---
69 query  4: 1111-
70 query  5: ---11
71 query  6: ----1
72 query  7: ---1-
73 query  8: 11-11
74 query  9: 1----
75 query 10: 1-111
76 query 11: 11---
77 query 12: 1111-
78 query 13: -----
79 query 14: -----
80 query 15: -----
81 query 16: 11111
82 query 17: 1-1-1
83 query 18: -1-1-
84 query 19: -1-1-
85 query 20: -1-1-
86 query 21: 1----
87 query 22: 1-111
88 query 23: --1--
89 query 24: 111-1
90 query 25: 1----
91 query 26: 1-111
92 query 27: --1--],
93   [query])
94
95 OVSDB_CHECK_POSITIVE([queries on sets],
96   [[query \
97     '{"columns": {"i": {"type": {"key": "integer", "min": 0, "max": "unlimited"}}}}' \
98     '[{"i": ["set", []]},
99       {"i": ["set", [0]]},
100       {"i": ["set", [1]]},
101       {"i": ["set", [0, 1]]},
102       {"i": ["set", [2]]},
103       {"i": ["set", [2, 0]]},
104       {"i": ["set", [2, 1]]},
105       {"i": ["set", [2, 1, 0]]}]' \
106     '[[],
107       [["i", "==", ["set", []]]],
108       [["i", "==", ["set", [0]]]],
109       [["i", "==", ["set", [1]]]],
110       [["i", "==", ["set", [0, 1]]]],
111       [["i", "==", ["set", [2]]]],
112       [["i", "==", ["set", [2, 0]]]],
113       [["i", "==", ["set", [2, 1]]]],
114       [["i", "==", ["set", [2, 1, 0]]]],
115       [["i", "!=", ["set", []]]],
116       [["i", "!=", ["set", [0]]]],
117       [["i", "!=", ["set", [1]]]],
118       [["i", "!=", ["set", [0, 1]]]],
119       [["i", "!=", ["set", [2]]]],
120       [["i", "!=", ["set", [2, 0]]]],
121       [["i", "!=", ["set", [2, 1]]]],
122       [["i", "!=", ["set", [2, 1, 0]]]],
123       [["i", "includes", ["set", []]]],
124       [["i", "includes", ["set", [0]]]],
125       [["i", "includes", ["set", [1]]]],
126       [["i", "includes", ["set", [0, 1]]]],
127       [["i", "includes", ["set", [2]]]],
128       [["i", "includes", ["set", [2, 0]]]],
129       [["i", "includes", ["set", [2, 1]]]],
130       [["i", "includes", ["set", [2, 1, 0]]]],
131       [["i", "excludes", ["set", []]]],
132       [["i", "excludes", ["set", [0]]]],
133       [["i", "excludes", ["set", [1]]]],
134       [["i", "excludes", ["set", [0, 1]]]],
135       [["i", "excludes", ["set", [2]]]],
136       [["i", "excludes", ["set", [2, 0]]]],
137       [["i", "excludes", ["set", [2, 1]]]],
138       [["i", "excludes", ["set", [2, 1, 0]]]]]']],
139   [dnl
140 query  0: 11111 111
141 query  1: 1---- ---
142 query  2: -1--- ---
143 query  3: --1-- ---
144 query  4: ---1- ---
145 query  5: ----1 ---
146 query  6: ----- 1--
147 query  7: ----- -1-
148 query  8: ----- --1
149 query  9: -1111 111
150 query 10: 1-111 111
151 query 11: 11-11 111
152 query 12: 111-1 111
153 query 13: 1111- 111
154 query 14: 11111 -11
155 query 15: 11111 1-1
156 query 16: 11111 11-
157 query 17: 11111 111
158 query 18: -1-1- 1-1
159 query 19: --11- -11
160 query 20: ---1- --1
161 query 21: ----1 111
162 query 22: ----- 1-1
163 query 23: ----- -11
164 query 24: ----- --1
165 query 25: 11111 111
166 query 26: 1-1-1 -1-
167 query 27: 11--1 1--
168 query 28: 1---1 ---
169 query 29: 1111- ---
170 query 30: 1-1-- ---
171 query 31: 11--- ---
172 query 32: 1---- ---], [query])
173
174 # This is the same as the "set" test except that it adds values,
175 # all of which always match.
176 OVSDB_CHECK_POSITIVE([queries on maps (1)],
177   [[query \
178     '{"columns": {"i": {"type": {"key": "integer",
179                                  "value": "boolean",
180                                  "min": 0,
181                                  "max": "unlimited"}}}}' \
182     '[{"i": ["map", []]},
183       {"i": ["map", [[0, true]]]},
184       {"i": ["map", [[1, false]]]},
185       {"i": ["map", [[0, true], [1, false]]]},
186       {"i": ["map", [[2, true]]]},
187       {"i": ["map", [[2, true], [0, true]]]},
188       {"i": ["map", [[2, true], [1, false]]]},
189       {"i": ["map", [[2, true], [1, false], [0, true]]]}]' \
190     '[[],
191       [["i", "==", ["map", []]]],
192       [["i", "==", ["map", [[0, true]]]]],
193       [["i", "==", ["map", [[1, false]]]]],
194       [["i", "==", ["map", [[0, true], [1, false]]]]],
195       [["i", "==", ["map", [[2, true]]]]],
196       [["i", "==", ["map", [[2, true], [0, true]]]]],
197       [["i", "==", ["map", [[2, true], [1, false]]]]],
198       [["i", "==", ["map", [[2, true], [1, false], [0, true]]]]],
199       [["i", "!=", ["map", []]]],
200       [["i", "!=", ["map", [[0, true]]]]],
201       [["i", "!=", ["map", [[1, false]]]]],
202       [["i", "!=", ["map", [[0, true], [1, false]]]]],
203       [["i", "!=", ["map", [[2, true]]]]],
204       [["i", "!=", ["map", [[2, true], [0, true]]]]],
205       [["i", "!=", ["map", [[2, true], [1, false]]]]],
206       [["i", "!=", ["map", [[2, true], [1, false], [0, true]]]]],
207       [["i", "includes", ["map", []]]],
208       [["i", "includes", ["map", [[0, true]]]]],
209       [["i", "includes", ["map", [[1, false]]]]],
210       [["i", "includes", ["map", [[0, true], [1, false]]]]],
211       [["i", "includes", ["map", [[2, true]]]]],
212       [["i", "includes", ["map", [[2, true], [0, true]]]]],
213       [["i", "includes", ["map", [[2, true], [1, false]]]]],
214       [["i", "includes", ["map", [[2, true], [1, false], [0, true]]]]],
215       [["i", "excludes", ["map", []]]],
216       [["i", "excludes", ["map", [[0, true]]]]],
217       [["i", "excludes", ["map", [[1, false]]]]],
218       [["i", "excludes", ["map", [[0, true], [1, false]]]]],
219       [["i", "excludes", ["map", [[2, true]]]]],
220       [["i", "excludes", ["map", [[2, true], [0, true]]]]],
221       [["i", "excludes", ["map", [[2, true], [1, false]]]]],
222       [["i", "excludes", ["map", [[2, true], [1, false], [0, true]]]]]]']],
223   [dnl
224 query  0: 11111 111
225 query  1: 1---- ---
226 query  2: -1--- ---
227 query  3: --1-- ---
228 query  4: ---1- ---
229 query  5: ----1 ---
230 query  6: ----- 1--
231 query  7: ----- -1-
232 query  8: ----- --1
233 query  9: -1111 111
234 query 10: 1-111 111
235 query 11: 11-11 111
236 query 12: 111-1 111
237 query 13: 1111- 111
238 query 14: 11111 -11
239 query 15: 11111 1-1
240 query 16: 11111 11-
241 query 17: 11111 111
242 query 18: -1-1- 1-1
243 query 19: --11- -11
244 query 20: ---1- --1
245 query 21: ----1 111
246 query 22: ----- 1-1
247 query 23: ----- -11
248 query 24: ----- --1
249 query 25: 11111 111
250 query 26: 1-1-1 -1-
251 query 27: 11--1 1--
252 query 28: 1---1 ---
253 query 29: 1111- ---
254 query 30: 1-1-- ---
255 query 31: 11--- ---
256 query 32: 1---- ---], [query])
257
258 # This is the same as the "set" test except that it adds values,
259 # and those values don't always match.
260 OVSDB_CHECK_POSITIVE([queries on maps (2)],
261   [[query \
262     '{"columns": {"i": {"type": {"key": "integer",
263                                  "value": "boolean",
264                                  "min": 0,
265                                  "max": "unlimited"}}}}' \
266     '[{"i": ["map", []]},
267       {"i": ["map", [[0, true]]]},
268       {"i": ["map", [[0, false]]]},
269       {"i": ["map", [[1, false]]]},
270       {"i": ["map", [[1, true]]]},
271
272       {"i": ["map", [[0, true], [1, false]]]},
273       {"i": ["map", [[0, true], [1, true]]]},
274       {"i": ["map", [[2, true]]]},
275       {"i": ["map", [[2, false]]]},
276       {"i": ["map", [[2, true], [0, true]]]},
277
278       {"i": ["map", [[2, false], [0, true]]]},
279       {"i": ["map", [[2, true], [1, false]]]},
280       {"i": ["map", [[2, true], [1, true]]]},
281       {"i": ["map", [[2, true], [1, false], [0, true]]]},
282       {"i": ["map", [[2, true], [1, false], [0, false]]]}]' \
283     '[[],
284       [["i", "==", ["map", []]]],
285       [["i", "==", ["map", [[0, true]]]]],
286       [["i", "==", ["map", [[1, false]]]]],
287       [["i", "==", ["map", [[0, true], [1, false]]]]],
288       [["i", "==", ["map", [[2, true]]]]],
289       [["i", "==", ["map", [[2, true], [0, true]]]]],
290       [["i", "==", ["map", [[2, true], [1, false]]]]],
291       [["i", "==", ["map", [[2, true], [1, false], [0, true]]]]],
292       [["i", "!=", ["map", []]]],
293       [["i", "!=", ["map", [[0, true]]]]],
294       [["i", "!=", ["map", [[1, false]]]]],
295       [["i", "!=", ["map", [[0, true], [1, false]]]]],
296       [["i", "!=", ["map", [[2, true]]]]],
297       [["i", "!=", ["map", [[2, true], [0, true]]]]],
298       [["i", "!=", ["map", [[2, true], [1, false]]]]],
299       [["i", "!=", ["map", [[2, true], [1, false], [0, true]]]]],
300       [["i", "includes", ["map", []]]],
301       [["i", "includes", ["map", [[0, true]]]]],
302       [["i", "includes", ["map", [[1, false]]]]],
303       [["i", "includes", ["map", [[0, true], [1, false]]]]],
304       [["i", "includes", ["map", [[2, true]]]]],
305       [["i", "includes", ["map", [[2, true], [0, true]]]]],
306       [["i", "includes", ["map", [[2, true], [1, false]]]]],
307       [["i", "includes", ["map", [[2, true], [1, false], [0, true]]]]],
308       [["i", "excludes", ["map", []]]],
309       [["i", "excludes", ["map", [[0, true]]]]],
310       [["i", "excludes", ["map", [[1, false]]]]],
311       [["i", "excludes", ["map", [[0, true], [1, false]]]]],
312       [["i", "excludes", ["map", [[2, true]]]]],
313       [["i", "excludes", ["map", [[2, true], [0, true]]]]],
314       [["i", "excludes", ["map", [[2, true], [1, false]]]]],
315       [["i", "excludes", ["map", [[2, true], [1, false], [0, true]]]]]]']],
316   [dnl
317 query  0: 11111 11111 11111
318 query  1: 1---- ----- -----
319 query  2: -1--- ----- -----
320 query  3: ---1- ----- -----
321 query  4: ----- 1---- -----
322 query  5: ----- --1-- -----
323 query  6: ----- ----1 -----
324 query  7: ----- ----- -1---
325 query  8: ----- ----- ---1-
326 query  9: -1111 11111 11111
327 query 10: 1-111 11111 11111
328 query 11: 111-1 11111 11111
329 query 12: 11111 -1111 11111
330 query 13: 11111 11-11 11111
331 query 14: 11111 1111- 11111
332 query 15: 11111 11111 1-111
333 query 16: 11111 11111 111-1
334 query 17: 11111 11111 11111
335 query 18: -1--- 11--1 1--1-
336 query 19: ---1- 1---- -1-11
337 query 20: ----- 1---- ---1-
338 query 21: ----- --1-1 -1111
339 query 22: ----- ----1 ---1-
340 query 23: ----- ----- -1-11
341 query 24: ----- ----- ---1-
342 query 25: 11111 11111 11111
343 query 26: 1-111 --11- -11-1
344 query 27: 111-1 -1111 1-1--
345 query 28: 1-1-1 --11- --1--
346 query 29: 11111 11-1- 1----
347 query 30: 1-111 ---1- -----
348 query 31: 111-1 -1-1- 1----
349 query 32: 1-1-1 ---1- -----], [query])
350
351 OVSDB_CHECK_POSITIVE([UUID-distinct queries on scalars],
352   [[query-distinct \
353     '{"columns":
354         {"i": {"type": "integer"},
355          "r": {"type": "real"},
356          "b": {"type": "boolean"},
357          "s": {"type": "string"},
358          "u": {"type": "uuid"}}}' \
359     '[{"i": 0,
360        "r": 0.5,
361        "b": true,
362        "s": "a",
363        "u": ["uuid", "b10d28f7-af18-4a67-9e78-2a6394516c59"]},
364       {"i": 1,
365        "r": 1.5,
366        "b": false,
367        "s": "b",
368        "u": ["uuid", "9179ca6d-6d65-400a-b455-3ad92783a099"]},
369       {"i": 2,
370        "r": 2.5,
371        "b": true,
372        "s": "c",
373        "u": ["uuid", "ad0fa355-8b84-4a36-a4b5-b2c1bfd91758"]},
374       {"i": 3,
375        "r": 3.5,
376        "b": false,
377        "s": "d",
378        "u": ["uuid", "62315898-64e0-40b9-b26f-ff74225303e6"]},
379       {"i": 4,
380        "r": 4.5,
381        "b": true,
382        "s": "e",
383        "u": ["uuid", "4a5127e2-0256-4a72-a7dc-6246213967c7"]}]' \
384     '[[],
385       [["i", "==", 0]],
386       [["i", "!=", 1]],
387       [["i", "<", 2]],
388       [["i", "<=", 3]],
389       [["i", ">", 2]],
390       [["i", ">=", 4]],
391       [["i", "includes", 3]],
392       [["i", "excludes", 2]],
393       [["r", "==", 0.5]],
394       [["r", "!=", 1.5]],
395       [["r", "<", 2.5]],
396       [["r", "<=", 3.5]],
397       [["r", ">", 4.5]],
398       [["r", ">=", 5.5]],
399       [["r", "includes", 1]],
400       [["r", "excludes", 3]],
401       [["b", "==", true]],
402       [["b", "!=", true]],
403       [["b", "includes", false]],
404       [["b", "excludes", true]],
405       [["s", "==", "a"]],
406       [["s", "!=", "b"]],
407       [["s", "includes", "c"]],
408       [["s", "excludes", "d"]],
409       [["u", "==", ["uuid", "b10d28f7-af18-4a67-9e78-2a6394516c59"]]],
410       [["u", "!=", ["uuid", "9179ca6d-6d65-400a-b455-3ad92783a099"]]],
411       [["u", "includes",["uuid", "ad0fa355-8b84-4a36-a4b5-b2c1bfd91758"]]]]' \
412     '["_uuid"]']],
413   [dnl
414 query  0: abcde
415 query  1: a----
416 query  2: a-cde
417 query  3: ab---
418 query  4: abcd-
419 query  5: ---de
420 query  6: ----e
421 query  7: ---d-
422 query  8: ab-de
423 query  9: a----
424 query 10: a-cde
425 query 11: ab---
426 query 12: abcd-
427 query 13: -----
428 query 14: -----
429 query 15: -----
430 query 16: abcde
431 query 17: a-c-e
432 query 18: -b-d-
433 query 19: -b-d-
434 query 20: -b-d-
435 query 21: a----
436 query 22: a-cde
437 query 23: --c--
438 query 24: abc-e
439 query 25: a----
440 query 26: a-cde
441 query 27: --c--],
442   [query])
443
444 OVSDB_CHECK_POSITIVE([Boolean-distinct queries on scalars],
445   [[query-distinct \
446     '{"columns":
447         {"i": {"type": "integer"},
448          "r": {"type": "real"},
449          "b": {"type": "boolean"},
450          "s": {"type": "string"},
451          "u": {"type": "uuid"}}}' \
452     '[{"i": 0,
453        "r": 0.5,
454        "b": true,
455        "s": "a",
456        "u": ["uuid", "b10d28f7-af18-4a67-9e78-2a6394516c59"]},
457       {"i": 1,
458        "r": 1.5,
459        "b": false,
460        "s": "b",
461        "u": ["uuid", "9179ca6d-6d65-400a-b455-3ad92783a099"]},
462       {"i": 2,
463        "r": 2.5,
464        "b": true,
465        "s": "c",
466        "u": ["uuid", "ad0fa355-8b84-4a36-a4b5-b2c1bfd91758"]},
467       {"i": 3,
468        "r": 3.5,
469        "b": false,
470        "s": "d",
471        "u": ["uuid", "62315898-64e0-40b9-b26f-ff74225303e6"]},
472       {"i": 4,
473        "r": 4.5,
474        "b": true,
475        "s": "e",
476        "u": ["uuid", "4a5127e2-0256-4a72-a7dc-6246213967c7"]}]' \
477     '[[],
478       [["i", "==", 0]],
479       [["i", "!=", 1]],
480       [["i", "<", 2]],
481       [["i", "<=", 3]],
482       [["i", ">", 2]],
483       [["i", ">=", 4]],
484       [["i", "includes", 3]],
485       [["i", "excludes", 2]],
486       [["r", "==", 0.5]],
487       [["r", "!=", 1.5]],
488       [["r", "<", 2.5]],
489       [["r", "<=", 3.5]],
490       [["r", ">", 4.5]],
491       [["r", ">=", 5.5]],
492       [["r", "includes", 1]],
493       [["r", "excludes", 3]],
494       [["b", "==", true]],
495       [["b", "!=", true]],
496       [["b", "includes", false]],
497       [["b", "excludes", true]],
498       [["s", "==", "a"]],
499       [["s", "!=", "b"]],
500       [["s", "includes", "c"]],
501       [["s", "excludes", "d"]],
502       [["u", "==", ["uuid", "b10d28f7-af18-4a67-9e78-2a6394516c59"]]],
503       [["u", "!=", ["uuid", "9179ca6d-6d65-400a-b455-3ad92783a099"]]],
504       [["u", "includes",["uuid", "ad0fa355-8b84-4a36-a4b5-b2c1bfd91758"]]]]' \
505     '["b"]']],
506   [dnl
507 query  0: ababa
508 query  1: a-a-a
509 query  2: ababa
510 query  3: ababa
511 query  4: ababa
512 query  5: ababa
513 query  6: a-a-a
514 query  7: -b-b-
515 query  8: ababa
516 query  9: a-a-a
517 query 10: ababa
518 query 11: ababa
519 query 12: ababa
520 query 13: -----
521 query 14: -----
522 query 15: -----
523 query 16: ababa
524 query 17: a-a-a
525 query 18: -b-b-
526 query 19: -b-b-
527 query 20: -b-b-
528 query 21: a-a-a
529 query 22: ababa
530 query 23: a-a-a
531 query 24: ababa
532 query 25: a-a-a
533 query 26: ababa
534 query 27: a-a-a],
535   [query])
536
537 OVSDB_CHECK_NEGATIVE([parse colunn set containing bad name],
538   [[query-distinct \
539     '{"columns": {"i": {"type": "integer"}}}' \
540     '[{"i": 0}]' \
541     '[[]]' \
542     '["i", "bad"]']],
543   [bad is not a valid column name])