Merge "master" into "next".
[sliver-openvswitch.git] / tests / ovsdb-execution.at
1 AT_BANNER([OVSDB -- execution])
2
3 m4_define([ORDINAL_SCHEMA],
4   [[{"name": "ordinals",
5      "tables": {
6        "ordinals": {
7          "columns": {
8            "number": {"type": "integer"},
9            "name": {"type": "string"}}}}}]])
10
11 m4_define([CONSTRAINT_SCHEMA],
12   [[{"name": "constraints",
13      "tables": {
14        "a": {
15          "columns": {
16            "a": {"type": "integer"},
17            "a2a": {"type": {"key": {"type": "uuid", "refTable": "a"},
18                             "min": 0, "max": "unlimited"}},
19            "a2b": {"type": {"key": {"type": "uuid", "refTable": "b"},
20                             "min": 0, "max": "unlimited"}}}},
21        "b": {
22          "columns": {
23            "b": {"type": "integer"},
24            "b2a": {"type": {"key": {"type": "uuid", "refTable": "a"},
25                             "min": 0, "max": "unlimited"}},
26            "b2b": {"type": {"key": {"type": "uuid", "refTable": "b"},
27                             "min": 0, "max": "unlimited"}}}},
28        "constrained": {
29          "columns": {
30            "positive": {"type": {"key": {"type": "integer",
31                                          "minInteger": 1}}}}}}}]])
32
33 # OVSDB_CHECK_EXECUTION(TITLE, SCHEMA, TRANSACTIONS, OUTPUT, [KEYWORDS])
34 #
35 # Runs "test-ovsdb execute" with the given SCHEMA and each of the
36 # TRANSACTIONS (which should be a quoted list of quoted strings).
37 #
38 # Checks that the overall output is OUTPUT, but UUIDs in the output
39 # are replaced by markers of the form <N> where N is a number.  The
40 # first unique UUID is replaced by <0>, the next by <1>, and so on.
41 # If a given UUID appears more than once it is always replaced by the
42 # same marker.
43 #
44 # TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS.
45 m4_define([OVSDB_CHECK_EXECUTION], 
46   [AT_SETUP([$1])
47    AT_KEYWORDS([ovsdb execute execution positive $5])
48    AT_CHECK([test-ovsdb execute '$2' m4_foreach([txn], [$3], [ 'txn'])],
49      [0], [stdout], [])
50    AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [$4])
51    AT_CLEANUP])
52
53 m4_define([EXECUTION_EXAMPLES], [
54 OVSDB_CHECK_EXECUTION([insert row, query table],
55   [ORDINAL_SCHEMA], 
56   [[[["ordinals",
57       {"op": "insert",
58        "table": "ordinals",
59        "row": {"number": 0, "name": "zero"}}]]],
60    [[["ordinals",
61       {"op": "select",
62        "table": "ordinals",
63        "where": []}]]]],
64   [[[{"uuid":["uuid","<0>"]}]
65 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"zero","number":0}]}]
66 ]])
67
68 OVSDB_CHECK_EXECUTION([insert rows, query by value],
69   [ORDINAL_SCHEMA],
70   [[[["ordinals",
71       {"op": "insert",
72        "table": "ordinals",
73        "row": {"number": 0, "name": "zero"}}]]],
74    [[["ordinals",
75       {"op": "insert",
76        "table": "ordinals",
77        "row": {"number": 1, "name": "one"}}]]],
78    [[["ordinals",
79       {"op": "select",
80        "table": "ordinals",
81        "where": [["name", "==", "zero"]]}]]],
82    [[["ordinals",
83       {"op": "select",
84        "table": "ordinals",
85        "where": [["name", "==", "one"]]}]]]],
86   [[[{"uuid":["uuid","<0>"]}]
87 [{"uuid":["uuid","<1>"]}]
88 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"zero","number":0}]}]
89 [{"rows":[{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}]
90 ]])
91
92 OVSDB_CHECK_EXECUTION([insert rows, query by named-uuid],
93   [ORDINAL_SCHEMA],
94   [[[["ordinals",
95       {"op": "insert",
96        "table": "ordinals",
97        "row": {"number": 0, "name": "zero"},
98        "uuid-name": "first"},
99       {"op": "insert",
100        "table": "ordinals",
101        "row": {"number": 1, "name": "one"},
102        "uuid-name": "second"},
103       {"op": "select",
104        "table": "ordinals",
105        "where": [["_uuid", "==", ["named-uuid", "first"]]]},
106       {"op": "select",
107        "table": "ordinals",
108        "where": [["_uuid", "==", ["named-uuid", "second"]]]}]]]],
109   [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"zero","number":0}]},{"rows":[{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}]
110 ]])
111
112 OVSDB_CHECK_EXECUTION([insert rows, update rows by value],
113   [ORDINAL_SCHEMA],
114   [[[["ordinals",
115       {"op": "insert",
116        "table": "ordinals",
117        "row": {"number": 0, "name": "zero"},
118        "uuid-name": "first"}]]],
119    [[["ordinals",
120       {"op": "insert",
121        "table": "ordinals",
122        "row": {"number": 1, "name": "one"},
123        "uuid-name": "first"}]]],
124    [[["ordinals",
125       {"op": "update",
126        "table": "ordinals",
127        "where": [["name", "==", "zero"]],
128        "row": {"name": "nought"}}]]],
129    [[["ordinals",
130       {"op": "select",
131        "table": "ordinals",
132        "where": [],
133        "sort": ["number"]}]]]],
134   [[[{"uuid":["uuid","<0>"]}]
135 [{"uuid":["uuid","<1>"]}]
136 [{"count":1}]
137 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"nought","number":0},{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}]
138 ]])
139
140 OVSDB_CHECK_EXECUTION([insert rows, mutate rows],
141   [ORDINAL_SCHEMA],
142   [[[["ordinals",
143       {"op": "insert",
144        "table": "ordinals",
145        "row": {"number": 0, "name": "zero"},
146        "uuid-name": "first"}]]],
147    [[["ordinals",
148       {"op": "insert",
149        "table": "ordinals",
150        "row": {"number": 1, "name": "one"},
151        "uuid-name": "first"}]]],
152    [[["ordinals",
153       {"op": "mutate",
154        "table": "ordinals",
155        "where": [["name", "==", "zero"]],
156        "mutations": [["number", "+=", 2]]}]]],
157    [[["ordinals",
158       {"op": "select",
159        "table": "ordinals",
160        "where": [],
161        "sort": ["number"]}]]]],
162   [[[{"uuid":["uuid","<0>"]}]
163 [{"uuid":["uuid","<1>"]}]
164 [{"count":1}]
165 [{"rows":[{"_uuid":["uuid","<1>"],"_version":["uuid","<2>"],"name":"one","number":1},{"_uuid":["uuid","<0>"],"_version":["uuid","<3>"],"name":"zero","number":2}]}]
166 ]])
167
168 OVSDB_CHECK_EXECUTION([insert rows, delete by named-uuid],
169   [ORDINAL_SCHEMA],
170   [[[["ordinals",
171       {"op": "insert",
172        "table": "ordinals",
173        "row": {"number": 0, "name": "zero"},
174        "uuid-name": "first"},
175       {"op": "insert",
176        "table": "ordinals",
177        "row": {"number": 1, "name": "one"},
178        "uuid-name": "second"},
179       {"op": "delete",
180        "table": "ordinals",
181        "where": [["_uuid", "==", ["named-uuid", "first"]]]},
182       {"op": "select",
183        "table": "ordinals",
184        "where": [],
185        "columns": ["name","number"]}]]]],
186   [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"count":1},{"rows":[{"name":"one","number":1}]}]
187 ]])
188
189 OVSDB_CHECK_EXECUTION([insert rows, delete rows by value],
190   [ORDINAL_SCHEMA],
191   [[[["ordinals",
192       {"op": "insert",
193        "table": "ordinals",
194        "row": {"number": 0, "name": "zero"},
195        "uuid-name": "first"}]]],
196    [[["ordinals",
197       {"op": "insert",
198        "table": "ordinals",
199        "row": {"number": 1, "name": "one"},
200        "uuid-name": "first"}]]],
201    [[["ordinals",
202       {"op": "delete",
203        "table": "ordinals",
204        "where": [["name", "==", "zero"]]}]]],
205    [[["ordinals",
206       {"op": "select",
207        "table": "ordinals",
208        "where": []}]]]],
209   [[[{"uuid":["uuid","<0>"]}]
210 [{"uuid":["uuid","<1>"]}]
211 [{"count":1}]
212 [{"rows":[{"_uuid":["uuid","<1>"],"_version":["uuid","<2>"],"name":"one","number":1}]}]
213 ]])
214
215 OVSDB_CHECK_EXECUTION([insert rows, delete by (non-matching) value],
216   [ORDINAL_SCHEMA],
217   [[[["ordinals",
218       {"op": "insert",
219        "table": "ordinals",
220        "row": {"number": 0, "name": "zero"},
221        "uuid-name": "first"}]]],
222    [[["ordinals",
223       {"op": "insert",
224        "table": "ordinals",
225        "row": {"number": 1, "name": "one"},
226        "uuid-name": "first"}]]],
227    [[["ordinals",
228       {"op": "delete",
229        "table": "ordinals",
230        "where": [["name", "==", "nought"]]}]]],
231    [[["ordinals",
232       {"op": "select",
233        "table": "ordinals",
234        "where": [],
235        "sort": ["number"]}]]]],
236   [[[{"uuid":["uuid","<0>"]}]
237 [{"uuid":["uuid","<1>"]}]
238 [{"count":0}]
239 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"zero","number":0},{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}]
240 ]])
241
242 OVSDB_CHECK_EXECUTION([insert rows, delete all],
243   [ORDINAL_SCHEMA],
244   [[[["ordinals",
245       {"op": "insert",
246        "table": "ordinals",
247        "row": {"number": 0, "name": "zero"},
248        "uuid-name": "first"},
249       {"op": "insert",
250        "table": "ordinals",
251        "row": {"number": 1, "name": "one"},
252        "uuid-name": "second"},
253       {"op": "delete",
254        "table": "ordinals",
255        "where": []},
256       {"op": "select",
257        "table": "ordinals",
258        "where": [],
259        "columns": ["name","number"]}]]]],
260   [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"count":2},{"rows":[]}]
261 ]])
262
263 OVSDB_CHECK_EXECUTION([insert row, query table, commit],
264   [ORDINAL_SCHEMA],
265   [[[["ordinals",
266       {"op": "insert",
267        "table": "ordinals",
268        "row": {"number": 0, "name": "zero"}},
269       {"op": "select",
270        "table": "ordinals",
271        "where": []},
272       {"op": "commit",
273        "durable": false}]]]],
274   [[[{"uuid":["uuid","<0>"]},{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"zero","number":0}]},{}]
275 ]])
276
277 OVSDB_CHECK_EXECUTION([insert row, query table, commit durably],
278   [ORDINAL_SCHEMA],
279   [[[["ordinals",
280       {"op": "insert",
281        "table": "ordinals",
282        "row": {"number": 0, "name": "zero"}},
283       {"op": "select",
284        "table": "ordinals",
285        "where": []},
286       {"op": "commit",
287        "durable": true}]]]],
288   [[[{"uuid":["uuid","<0>"]},{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"zero","number":0}]},{}]
289 ]])
290
291 OVSDB_CHECK_EXECUTION([equality wait with correct rows],
292   [ORDINAL_SCHEMA],
293   [[[["ordinals",
294       {"op": "insert",
295        "table": "ordinals",
296        "row": {"number": 0, "name": "zero"}},
297       {"op": "insert",
298        "table": "ordinals",
299        "row": {"number": 1, "name": "one"}},
300       {"op": "wait",
301        "timeout": 0,
302        "table": "ordinals",
303        "where": [],
304        "columns": ["name", "number"],
305        "until": "==",
306        "rows": [{"name": "zero", "number": 0},
307                 {"name": "one", "number": 1}]}]]]],
308   [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{}]
309 ]])
310
311 OVSDB_CHECK_EXECUTION([equality wait with extra row],
312   [ORDINAL_SCHEMA],
313   [[[["ordinals",
314       {"op": "insert",
315        "table": "ordinals",
316        "row": {"number": 0, "name": "zero"}},
317       {"op": "insert",
318        "table": "ordinals",
319        "row": {"number": 1, "name": "one"}},
320       {"op": "wait",
321        "timeout": 0,
322        "table": "ordinals",
323        "where": [],
324        "columns": ["name", "number"],
325        "until": "==",
326        "rows": [{"name": "zero", "number": 0},
327                 {"name": "one", "number": 1},
328                 {"name": "two", "number": 2}]}]]]],
329   [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"details":"\"wait\" timed out","error":"timed out"}]
330 ]])
331
332 OVSDB_CHECK_EXECUTION([equality wait with missing row],
333   [ORDINAL_SCHEMA],
334   [[[["ordinals",
335       {"op": "insert",
336        "table": "ordinals",
337        "row": {"number": 0, "name": "zero"}},
338       {"op": "insert",
339        "table": "ordinals",
340        "row": {"number": 1, "name": "one"}},
341       {"op": "wait",
342        "timeout": 0,
343        "table": "ordinals",
344        "where": [],
345        "columns": ["name", "number"],
346        "until": "==",
347        "rows": [{"name": "one", "number": 1}]}]]]],
348   [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"details":"\"wait\" timed out","error":"timed out"}]
349 ]])
350
351 OVSDB_CHECK_EXECUTION([inequality wait with correct rows],
352   [ORDINAL_SCHEMA],
353   [[[["ordinals",
354       {"op": "insert",
355        "table": "ordinals",
356        "row": {"number": 0, "name": "zero"}},
357       {"op": "insert",
358        "table": "ordinals",
359        "row": {"number": 1, "name": "one"}},
360       {"op": "wait",
361        "timeout": 0,
362        "table": "ordinals",
363        "where": [],
364        "columns": ["name", "number"],
365        "until": "!=",
366        "rows": [{"name": "zero", "number": 0},
367                 {"name": "one", "number": 1}]}]]]],
368   [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"details":"\"wait\" timed out","error":"timed out"}]
369 ]])
370
371 OVSDB_CHECK_EXECUTION([inequality wait with extra row],
372   [ORDINAL_SCHEMA],
373   [[[["ordinals",
374       {"op": "insert",
375        "table": "ordinals",
376        "row": {"number": 0, "name": "zero"}},
377       {"op": "insert",
378        "table": "ordinals",
379        "row": {"number": 1, "name": "one"}},
380       {"op": "wait",
381        "timeout": 0,
382        "table": "ordinals",
383        "where": [],
384        "columns": ["name", "number"],
385        "until": "!=",
386        "rows": [{"name": "zero", "number": 0},
387                 {"name": "one", "number": 1},
388                 {"name": "two", "number": 2}]}]]]],
389   [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{}]
390 ]])
391
392 OVSDB_CHECK_EXECUTION([inequality wait with missing row],
393   [ORDINAL_SCHEMA],
394   [[[["ordinals",
395       {"op": "insert",
396        "table": "ordinals",
397        "row": {"number": 0, "name": "zero"}},
398       {"op": "insert",
399        "table": "ordinals",
400        "row": {"number": 1, "name": "one"}},
401       {"op": "wait",
402        "timeout": 0,
403        "table": "ordinals",
404        "where": [],
405        "columns": ["name", "number"],
406        "until": "!=",
407        "rows": [{"name": "one", "number": 1}]}]]]],
408   [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{}]
409 ]])
410
411 OVSDB_CHECK_EXECUTION([insert and update constraints],
412   [CONSTRAINT_SCHEMA],
413   [[[["constraints",
414       {"op": "insert",
415        "table": "constrained",
416        "row": {}}]]],
417    [[["constraints",
418       {"op": "insert",
419        "table": "constrained",
420        "row": {"positive": -1}}]]],
421    [[["constraints",
422       {"op": "update",
423        "table": "constrained",
424        "where": [],
425        "row": {"positive": -2}}]]]],
426   [[[{"details":"0 is less than minimum allowed value 1","error":"constraint violation"}]
427 [{"details":"-1 is less than minimum allowed value 1","error":"constraint violation"}]
428 [{"details":"-2 is less than minimum allowed value 1","error":"constraint violation"}]
429 ]])
430
431 OVSDB_CHECK_EXECUTION([referential integrity -- simple],
432   [CONSTRAINT_SCHEMA],
433   [[[["constraints",
434       {"op": "insert",
435        "table": "b",
436        "row": {"b": 1},
437        "uuid-name": "brow"},
438       {"op": "insert",
439        "table": "a",
440        "row": {"a": 0,
441                "a2b": ["set", [["named-uuid", "brow"]]]}},
442       {"op": "insert",
443        "table": "a",
444        "row": {"a": 1,
445                "a2b": ["set", [["named-uuid", "brow"]]]}},
446       {"op": "insert",
447        "table": "a",
448        "row": {"a": 2,
449                "a2b": ["set", [["named-uuid", "brow"]]]}}]]],
450    [[["constraints",
451       {"op": "delete",
452        "table": "b",
453        "where": []}]]],
454    [[["constraints",
455       {"op": "delete",
456        "table": "a",
457        "where": [["a", "==", 0]]}]]],
458    [[["constraints",
459       {"op": "delete",
460        "table": "b",
461        "where": []}]]],
462    [[["constraints",
463       {"op": "delete",
464        "table": "a",
465        "where": [["a", "==", 1]]}]]],
466    [[["constraints",
467       {"op": "delete",
468        "table": "b",
469        "where": []}]]],
470    [[["constraints",
471       {"op": "delete",
472        "table": "a",
473        "where": [["a", "==", 2]]}]]],
474    [[["constraints",
475       {"op": "delete",
476        "table": "b",
477        "where": []}]]]],
478   [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"uuid":["uuid","<2>"]},{"uuid":["uuid","<3>"]}]
479 [{"count":1},{"details":"cannot delete b row <0> because of 3 remaining reference(s)","error":"referential integrity violation"}]
480 [{"count":1}]
481 [{"count":1},{"details":"cannot delete b row <0> because of 2 remaining reference(s)","error":"referential integrity violation"}]
482 [{"count":1}]
483 [{"count":1},{"details":"cannot delete b row <0> because of 1 remaining reference(s)","error":"referential integrity violation"}]
484 [{"count":1}]
485 [{"count":1}]
486 ]])
487
488 OVSDB_CHECK_EXECUTION([referential integrity -- mutual references],
489   [CONSTRAINT_SCHEMA],
490   [[[["constraints",
491       {"op": "insert",
492        "table": "a",
493        "row": {"a": 0,
494                "a2b": ["set", [["named-uuid", "row2"]]],
495                "a2a": ["set", [["named-uuid", "row1"]]]},
496        "uuid-name": "row1"},
497       {"op": "insert",
498        "table": "b",
499        "row": {"b": 1,
500                "b2b": ["set", [["named-uuid", "row2"]]],
501                "b2a": ["set", [["named-uuid", "row1"]]]},
502        "uuid-name": "row2"}]]],
503    [[["constraints",
504       {"op": "insert",
505        "table": "a",
506        "row": {"a2b": ["set", [["uuid", "b516b960-5b19-4fc2-bb82-fe1cbd6d0241"]]]}}]]],
507    [[["constraints",
508       {"op": "delete",
509        "table": "a",
510        "where": [["a", "==", 0]]}]]],
511    [[["constraints",
512       {"op": "delete",
513        "table": "b",
514        "where": [["b", "==", 1]]}]]],
515    dnl Try the deletions again to make sure that the refcounts got rolled back.
516    [[["constraints",
517       {"op": "delete",
518        "table": "a",
519        "where": [["a", "==", 0]]}]]],
520    [[["constraints",
521       {"op": "delete",
522        "table": "b",
523        "where": [["b", "==", 1]]}]]],
524    [[["constraints",
525       {"op": "delete",
526        "table": "a",
527        "where": [["a", "==", 0]]},
528       {"op": "delete",
529        "table": "b",
530        "where": [["b", "==", 1]]}]]]],
531   [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]}]
532 [{"uuid":["uuid","<2>"]},{"details":"reference to nonexistent row <3>","error":"referential integrity violation"}]
533 [{"count":1},{"details":"cannot delete a row <0> because of 1 remaining reference(s)","error":"referential integrity violation"}]
534 [{"count":1},{"details":"cannot delete b row <1> because of 1 remaining reference(s)","error":"referential integrity violation"}]
535 [{"count":1},{"details":"cannot delete a row <0> because of 1 remaining reference(s)","error":"referential integrity violation"}]
536 [{"count":1},{"details":"cannot delete b row <1> because of 1 remaining reference(s)","error":"referential integrity violation"}]
537 [{"count":1},{"count":1}]
538 ]])])
539
540 EXECUTION_EXAMPLES