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 dnl At one point the "commit" code ignored new rows with all-default values,
55 dnl so this checks for that problem.
56 OVSDB_CHECK_EXECUTION([insert default row, query table],
57   [ORDINAL_SCHEMA], 
58   [[[["ordinals",
59       {"op": "insert",
60        "table": "ordinals",
61        "row": {}}]]],
62    [[["ordinals",
63       {"op": "select",
64        "table": "ordinals",
65        "where": []}]]]],
66   [[[{"uuid":["uuid","<0>"]}]
67 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"","number":0}]}]
68 ]])
69
70 OVSDB_CHECK_EXECUTION([insert row, query table],
71   [ORDINAL_SCHEMA], 
72   [[[["ordinals",
73       {"op": "insert",
74        "table": "ordinals",
75        "row": {"number": 0, "name": "zero"}}]]],
76    [[["ordinals",
77       {"op": "select",
78        "table": "ordinals",
79        "where": []}]]]],
80   [[[{"uuid":["uuid","<0>"]}]
81 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"zero","number":0}]}]
82 ]])
83
84 OVSDB_CHECK_EXECUTION([insert rows, query by value],
85   [ORDINAL_SCHEMA],
86   [[[["ordinals",
87       {"op": "insert",
88        "table": "ordinals",
89        "row": {"number": 0, "name": "zero"}}]]],
90    [[["ordinals",
91       {"op": "insert",
92        "table": "ordinals",
93        "row": {"number": 1, "name": "one"}}]]],
94    [[["ordinals",
95       {"op": "select",
96        "table": "ordinals",
97        "where": [["name", "==", "zero"]]}]]],
98    [[["ordinals",
99       {"op": "select",
100        "table": "ordinals",
101        "where": [["name", "==", "one"]]}]]]],
102   [[[{"uuid":["uuid","<0>"]}]
103 [{"uuid":["uuid","<1>"]}]
104 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"zero","number":0}]}]
105 [{"rows":[{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}]
106 ]])
107
108 OVSDB_CHECK_EXECUTION([insert rows, query by named-uuid],
109   [ORDINAL_SCHEMA],
110   [[[["ordinals",
111       {"op": "insert",
112        "table": "ordinals",
113        "row": {"number": 0, "name": "zero"},
114        "uuid-name": "first"},
115       {"op": "insert",
116        "table": "ordinals",
117        "row": {"number": 1, "name": "one"},
118        "uuid-name": "second"},
119       {"op": "select",
120        "table": "ordinals",
121        "where": [["_uuid", "==", ["named-uuid", "first"]]]},
122       {"op": "select",
123        "table": "ordinals",
124        "where": [["_uuid", "==", ["named-uuid", "second"]]]}]]]],
125   [[[{"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}]}]
126 ]])
127
128 OVSDB_CHECK_EXECUTION([insert rows, update rows by value],
129   [ORDINAL_SCHEMA],
130   [[[["ordinals",
131       {"op": "insert",
132        "table": "ordinals",
133        "row": {"number": 0, "name": "zero"},
134        "uuid-name": "first"}]]],
135    [[["ordinals",
136       {"op": "insert",
137        "table": "ordinals",
138        "row": {"number": 1, "name": "one"},
139        "uuid-name": "first"}]]],
140    [[["ordinals",
141       {"op": "update",
142        "table": "ordinals",
143        "where": [["name", "==", "zero"]],
144        "row": {"name": "nought"}}]]],
145    [[["ordinals",
146       {"op": "select",
147        "table": "ordinals",
148        "where": [],
149        "sort": ["number"]}]]]],
150   [[[{"uuid":["uuid","<0>"]}]
151 [{"uuid":["uuid","<1>"]}]
152 [{"count":1}]
153 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"nought","number":0},{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}]
154 ]])
155
156 OVSDB_CHECK_EXECUTION([insert rows, mutate rows],
157   [ORDINAL_SCHEMA],
158   [[[["ordinals",
159       {"op": "insert",
160        "table": "ordinals",
161        "row": {"number": 0, "name": "zero"},
162        "uuid-name": "first"}]]],
163    [[["ordinals",
164       {"op": "insert",
165        "table": "ordinals",
166        "row": {"number": 1, "name": "one"},
167        "uuid-name": "first"}]]],
168    [[["ordinals",
169       {"op": "mutate",
170        "table": "ordinals",
171        "where": [["name", "==", "zero"]],
172        "mutations": [["number", "+=", 2]]}]]],
173    [[["ordinals",
174       {"op": "select",
175        "table": "ordinals",
176        "where": [],
177        "sort": ["number"]}]]]],
178   [[[{"uuid":["uuid","<0>"]}]
179 [{"uuid":["uuid","<1>"]}]
180 [{"count":1}]
181 [{"rows":[{"_uuid":["uuid","<1>"],"_version":["uuid","<2>"],"name":"one","number":1},{"_uuid":["uuid","<0>"],"_version":["uuid","<3>"],"name":"zero","number":2}]}]
182 ]])
183
184 OVSDB_CHECK_EXECUTION([insert rows, delete by named-uuid],
185   [ORDINAL_SCHEMA],
186   [[[["ordinals",
187       {"op": "insert",
188        "table": "ordinals",
189        "row": {"number": 0, "name": "zero"},
190        "uuid-name": "first"},
191       {"op": "insert",
192        "table": "ordinals",
193        "row": {"number": 1, "name": "one"},
194        "uuid-name": "second"},
195       {"op": "delete",
196        "table": "ordinals",
197        "where": [["_uuid", "==", ["named-uuid", "first"]]]},
198       {"op": "select",
199        "table": "ordinals",
200        "where": [],
201        "columns": ["name","number"]}]]]],
202   [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"count":1},{"rows":[{"name":"one","number":1}]}]
203 ]])
204
205 OVSDB_CHECK_EXECUTION([insert rows, delete rows by value],
206   [ORDINAL_SCHEMA],
207   [[[["ordinals",
208       {"op": "insert",
209        "table": "ordinals",
210        "row": {"number": 0, "name": "zero"},
211        "uuid-name": "first"}]]],
212    [[["ordinals",
213       {"op": "insert",
214        "table": "ordinals",
215        "row": {"number": 1, "name": "one"},
216        "uuid-name": "first"}]]],
217    [[["ordinals",
218       {"op": "delete",
219        "table": "ordinals",
220        "where": [["name", "==", "zero"]]}]]],
221    [[["ordinals",
222       {"op": "select",
223        "table": "ordinals",
224        "where": []}]]]],
225   [[[{"uuid":["uuid","<0>"]}]
226 [{"uuid":["uuid","<1>"]}]
227 [{"count":1}]
228 [{"rows":[{"_uuid":["uuid","<1>"],"_version":["uuid","<2>"],"name":"one","number":1}]}]
229 ]])
230
231 OVSDB_CHECK_EXECUTION([insert rows, delete by (non-matching) value],
232   [ORDINAL_SCHEMA],
233   [[[["ordinals",
234       {"op": "insert",
235        "table": "ordinals",
236        "row": {"number": 0, "name": "zero"},
237        "uuid-name": "first"}]]],
238    [[["ordinals",
239       {"op": "insert",
240        "table": "ordinals",
241        "row": {"number": 1, "name": "one"},
242        "uuid-name": "first"}]]],
243    [[["ordinals",
244       {"op": "delete",
245        "table": "ordinals",
246        "where": [["name", "==", "nought"]]}]]],
247    [[["ordinals",
248       {"op": "select",
249        "table": "ordinals",
250        "where": [],
251        "sort": ["number"]}]]]],
252   [[[{"uuid":["uuid","<0>"]}]
253 [{"uuid":["uuid","<1>"]}]
254 [{"count":0}]
255 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"zero","number":0},{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}]
256 ]])
257
258 OVSDB_CHECK_EXECUTION([insert rows, delete all],
259   [ORDINAL_SCHEMA],
260   [[[["ordinals",
261       {"op": "insert",
262        "table": "ordinals",
263        "row": {"number": 0, "name": "zero"},
264        "uuid-name": "first"},
265       {"op": "insert",
266        "table": "ordinals",
267        "row": {"number": 1, "name": "one"},
268        "uuid-name": "second"},
269       {"op": "delete",
270        "table": "ordinals",
271        "where": []},
272       {"op": "select",
273        "table": "ordinals",
274        "where": [],
275        "columns": ["name","number"]}]]]],
276   [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"count":2},{"rows":[]}]
277 ]])
278
279 OVSDB_CHECK_EXECUTION([insert row, query table, commit],
280   [ORDINAL_SCHEMA],
281   [[[["ordinals",
282       {"op": "insert",
283        "table": "ordinals",
284        "row": {"number": 0, "name": "zero"}},
285       {"op": "select",
286        "table": "ordinals",
287        "where": []},
288       {"op": "commit",
289        "durable": false}]]]],
290   [[[{"uuid":["uuid","<0>"]},{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"zero","number":0}]},{}]
291 ]])
292
293 OVSDB_CHECK_EXECUTION([insert row, query table, commit durably],
294   [ORDINAL_SCHEMA],
295   [[[["ordinals",
296       {"op": "insert",
297        "table": "ordinals",
298        "row": {"number": 0, "name": "zero"}},
299       {"op": "select",
300        "table": "ordinals",
301        "where": []},
302       {"op": "commit",
303        "durable": true}]]]],
304   [[[{"uuid":["uuid","<0>"]},{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"zero","number":0}]},{}]
305 ]])
306
307 OVSDB_CHECK_EXECUTION([equality wait with correct rows],
308   [ORDINAL_SCHEMA],
309   [[[["ordinals",
310       {"op": "insert",
311        "table": "ordinals",
312        "row": {"number": 0, "name": "zero"}},
313       {"op": "insert",
314        "table": "ordinals",
315        "row": {"number": 1, "name": "one"}},
316       {"op": "wait",
317        "timeout": 0,
318        "table": "ordinals",
319        "where": [],
320        "columns": ["name", "number"],
321        "until": "==",
322        "rows": [{"name": "zero", "number": 0},
323                 {"name": "one", "number": 1}]}]]]],
324   [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{}]
325 ]])
326
327 OVSDB_CHECK_EXECUTION([equality wait with extra row],
328   [ORDINAL_SCHEMA],
329   [[[["ordinals",
330       {"op": "insert",
331        "table": "ordinals",
332        "row": {"number": 0, "name": "zero"}},
333       {"op": "insert",
334        "table": "ordinals",
335        "row": {"number": 1, "name": "one"}},
336       {"op": "wait",
337        "timeout": 0,
338        "table": "ordinals",
339        "where": [],
340        "columns": ["name", "number"],
341        "until": "==",
342        "rows": [{"name": "zero", "number": 0},
343                 {"name": "one", "number": 1},
344                 {"name": "two", "number": 2}]}]]]],
345   [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"details":"\"wait\" timed out","error":"timed out"}]
346 ]])
347
348 OVSDB_CHECK_EXECUTION([equality wait with missing row],
349   [ORDINAL_SCHEMA],
350   [[[["ordinals",
351       {"op": "insert",
352        "table": "ordinals",
353        "row": {"number": 0, "name": "zero"}},
354       {"op": "insert",
355        "table": "ordinals",
356        "row": {"number": 1, "name": "one"}},
357       {"op": "wait",
358        "timeout": 0,
359        "table": "ordinals",
360        "where": [],
361        "columns": ["name", "number"],
362        "until": "==",
363        "rows": [{"name": "one", "number": 1}]}]]]],
364   [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"details":"\"wait\" timed out","error":"timed out"}]
365 ]])
366
367 OVSDB_CHECK_EXECUTION([inequality wait with correct rows],
368   [ORDINAL_SCHEMA],
369   [[[["ordinals",
370       {"op": "insert",
371        "table": "ordinals",
372        "row": {"number": 0, "name": "zero"}},
373       {"op": "insert",
374        "table": "ordinals",
375        "row": {"number": 1, "name": "one"}},
376       {"op": "wait",
377        "timeout": 0,
378        "table": "ordinals",
379        "where": [],
380        "columns": ["name", "number"],
381        "until": "!=",
382        "rows": [{"name": "zero", "number": 0},
383                 {"name": "one", "number": 1}]}]]]],
384   [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"details":"\"wait\" timed out","error":"timed out"}]
385 ]])
386
387 OVSDB_CHECK_EXECUTION([inequality wait with extra row],
388   [ORDINAL_SCHEMA],
389   [[[["ordinals",
390       {"op": "insert",
391        "table": "ordinals",
392        "row": {"number": 0, "name": "zero"}},
393       {"op": "insert",
394        "table": "ordinals",
395        "row": {"number": 1, "name": "one"}},
396       {"op": "wait",
397        "timeout": 0,
398        "table": "ordinals",
399        "where": [],
400        "columns": ["name", "number"],
401        "until": "!=",
402        "rows": [{"name": "zero", "number": 0},
403                 {"name": "one", "number": 1},
404                 {"name": "two", "number": 2}]}]]]],
405   [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{}]
406 ]])
407
408 OVSDB_CHECK_EXECUTION([inequality wait with missing row],
409   [ORDINAL_SCHEMA],
410   [[[["ordinals",
411       {"op": "insert",
412        "table": "ordinals",
413        "row": {"number": 0, "name": "zero"}},
414       {"op": "insert",
415        "table": "ordinals",
416        "row": {"number": 1, "name": "one"}},
417       {"op": "wait",
418        "timeout": 0,
419        "table": "ordinals",
420        "where": [],
421        "columns": ["name", "number"],
422        "until": "!=",
423        "rows": [{"name": "one", "number": 1}]}]]]],
424   [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{}]
425 ]])
426
427 OVSDB_CHECK_EXECUTION([insert and update constraints],
428   [CONSTRAINT_SCHEMA],
429   [[[["constraints",
430       {"op": "insert",
431        "table": "constrained",
432        "row": {}}]]],
433    [[["constraints",
434       {"op": "insert",
435        "table": "constrained",
436        "row": {"positive": -1}}]]],
437    [[["constraints",
438       {"op": "update",
439        "table": "constrained",
440        "where": [],
441        "row": {"positive": -2}}]]]],
442   [[[{"details":"0 is less than minimum allowed value 1","error":"constraint violation"}]
443 [{"details":"-1 is less than minimum allowed value 1","error":"constraint violation"}]
444 [{"details":"-2 is less than minimum allowed value 1","error":"constraint violation"}]
445 ]])
446
447 OVSDB_CHECK_EXECUTION([referential integrity -- simple],
448   [CONSTRAINT_SCHEMA],
449   [[[["constraints",
450       {"op": "insert",
451        "table": "b",
452        "row": {"b": 1},
453        "uuid-name": "brow"},
454       {"op": "insert",
455        "table": "a",
456        "row": {"a": 0,
457                "a2b": ["set", [["named-uuid", "brow"]]]}},
458       {"op": "insert",
459        "table": "a",
460        "row": {"a": 1,
461                "a2b": ["set", [["named-uuid", "brow"]]]}},
462       {"op": "insert",
463        "table": "a",
464        "row": {"a": 2,
465                "a2b": ["set", [["named-uuid", "brow"]]]}}]]],
466    [[["constraints",
467       {"op": "delete",
468        "table": "b",
469        "where": []}]]],
470    [[["constraints",
471       {"op": "delete",
472        "table": "a",
473        "where": [["a", "==", 0]]}]]],
474    [[["constraints",
475       {"op": "delete",
476        "table": "b",
477        "where": []}]]],
478    [[["constraints",
479       {"op": "delete",
480        "table": "a",
481        "where": [["a", "==", 1]]}]]],
482    [[["constraints",
483       {"op": "delete",
484        "table": "b",
485        "where": []}]]],
486    [[["constraints",
487       {"op": "delete",
488        "table": "a",
489        "where": [["a", "==", 2]]}]]],
490    [[["constraints",
491       {"op": "delete",
492        "table": "b",
493        "where": []}]]]],
494   [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"uuid":["uuid","<2>"]},{"uuid":["uuid","<3>"]}]
495 [{"count":1},{"details":"cannot delete b row <0> because of 3 remaining reference(s)","error":"referential integrity violation"}]
496 [{"count":1}]
497 [{"count":1},{"details":"cannot delete b row <0> because of 2 remaining reference(s)","error":"referential integrity violation"}]
498 [{"count":1}]
499 [{"count":1},{"details":"cannot delete b row <0> because of 1 remaining reference(s)","error":"referential integrity violation"}]
500 [{"count":1}]
501 [{"count":1}]
502 ]])
503
504 OVSDB_CHECK_EXECUTION([referential integrity -- mutual references],
505   [CONSTRAINT_SCHEMA],
506   [[[["constraints",
507       {"op": "insert",
508        "table": "a",
509        "row": {"a": 0,
510                "a2b": ["set", [["named-uuid", "row2"]]],
511                "a2a": ["set", [["named-uuid", "row1"]]]},
512        "uuid-name": "row1"},
513       {"op": "insert",
514        "table": "b",
515        "row": {"b": 1,
516                "b2b": ["set", [["named-uuid", "row2"]]],
517                "b2a": ["set", [["named-uuid", "row1"]]]},
518        "uuid-name": "row2"}]]],
519    [[["constraints",
520       {"op": "insert",
521        "table": "a",
522        "row": {"a2b": ["set", [["uuid", "b516b960-5b19-4fc2-bb82-fe1cbd6d0241"]]]}}]]],
523    [[["constraints",
524       {"op": "delete",
525        "table": "a",
526        "where": [["a", "==", 0]]}]]],
527    [[["constraints",
528       {"op": "delete",
529        "table": "b",
530        "where": [["b", "==", 1]]}]]],
531    dnl Try the deletions again to make sure that the refcounts got rolled back.
532    [[["constraints",
533       {"op": "delete",
534        "table": "a",
535        "where": [["a", "==", 0]]}]]],
536    [[["constraints",
537       {"op": "delete",
538        "table": "b",
539        "where": [["b", "==", 1]]}]]],
540    [[["constraints",
541       {"op": "delete",
542        "table": "a",
543        "where": [["a", "==", 0]]},
544       {"op": "delete",
545        "table": "b",
546        "where": [["b", "==", 1]]}]]]],
547   [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]}]
548 [{"uuid":["uuid","<2>"]},{"details":"reference to nonexistent row <3>","error":"referential integrity violation"}]
549 [{"count":1},{"details":"cannot delete a row <0> because of 1 remaining reference(s)","error":"referential integrity violation"}]
550 [{"count":1},{"details":"cannot delete b row <1> because of 1 remaining reference(s)","error":"referential integrity violation"}]
551 [{"count":1},{"details":"cannot delete a row <0> because of 1 remaining reference(s)","error":"referential integrity violation"}]
552 [{"count":1},{"details":"cannot delete b row <1> because of 1 remaining reference(s)","error":"referential integrity violation"}]
553 [{"count":1},{"count":1}]
554 ]])])
555
556 EXECUTION_EXAMPLES