ovsdb: Add simple constraints.
[sliver-openvswitch.git] / tests / ovsdb-execution.at
1 AT_BANNER([OVSDB -- execution])
2
3 m4_define([ORDINAL_SCHEMA],
4   [[{"name": "mydb",
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        "constrained": {
15          "columns": {
16            "positive": {"type": {"key": {"type": "integer",
17                                          "minInteger": 1}}}}}}}]])
18
19 # OVSDB_CHECK_EXECUTION(TITLE, SCHEMA, TRANSACTIONS, OUTPUT, [KEYWORDS])
20 #
21 # Runs "test-ovsdb execute" with the given SCHEMA and each of the
22 # TRANSACTIONS (which should be a quoted list of quoted strings).
23 #
24 # Checks that the overall output is OUTPUT, but UUIDs in the output
25 # are replaced by markers of the form <N> where N is a number.  The
26 # first unique UUID is replaced by <0>, the next by <1>, and so on.
27 # If a given UUID appears more than once it is always replaced by the
28 # same marker.
29 #
30 # TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS.
31 m4_define([OVSDB_CHECK_EXECUTION], 
32   [AT_SETUP([$1])
33    AT_KEYWORDS([ovsdb execute execution positive $5])
34    AT_CHECK([test-ovsdb execute '$2' m4_foreach([txn], [$3], [ 'txn'])],
35      [0], [stdout], [])
36    AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [$4])
37    AT_CLEANUP])
38
39 m4_define([EXECUTION_EXAMPLES], [
40 OVSDB_CHECK_EXECUTION([insert row, query table],
41   [ORDINAL_SCHEMA], 
42   [[[[{"op": "insert",
43        "table": "ordinals",
44        "row": {"number": 0, "name": "zero"}}]]],
45    [[[{"op": "select",
46        "table": "ordinals",
47        "where": []}]]]],
48   [[[{"uuid":["uuid","<0>"]}]
49 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"zero","number":0}]}]
50 ]])
51
52 OVSDB_CHECK_EXECUTION([insert rows, query by value],
53   [ORDINAL_SCHEMA],
54   [[[[{"op": "insert",
55        "table": "ordinals",
56        "row": {"number": 0, "name": "zero"}}]]],
57    [[[{"op": "insert",
58        "table": "ordinals",
59        "row": {"number": 1, "name": "one"}}]]],
60    [[[{"op": "select",
61        "table": "ordinals",
62        "where": [["name", "==", "zero"]]}]]],
63    [[[{"op": "select",
64        "table": "ordinals",
65        "where": [["name", "==", "one"]]}]]]],
66   [[[{"uuid":["uuid","<0>"]}]
67 [{"uuid":["uuid","<1>"]}]
68 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"zero","number":0}]}]
69 [{"rows":[{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}]
70 ]])
71
72 OVSDB_CHECK_EXECUTION([insert rows, query by named-uuid],
73   [ORDINAL_SCHEMA],
74   [[[[{"op": "insert",
75        "table": "ordinals",
76        "row": {"number": 0, "name": "zero"},
77        "uuid-name": "first"},
78       {"op": "insert",
79        "table": "ordinals",
80        "row": {"number": 1, "name": "one"},
81        "uuid-name": "second"},
82       {"op": "select",
83        "table": "ordinals",
84        "where": [["_uuid", "==", ["named-uuid", "first"]]]},
85       {"op": "select",
86        "table": "ordinals",
87        "where": [["_uuid", "==", ["named-uuid", "second"]]]}]]]],
88   [[[{"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}]}]
89 ]])
90
91 OVSDB_CHECK_EXECUTION([insert rows, update rows by value],
92   [ORDINAL_SCHEMA],
93   [[[[{"op": "insert",
94        "table": "ordinals",
95        "row": {"number": 0, "name": "zero"},
96        "uuid-name": "first"}]]],
97    [[[{"op": "insert",
98        "table": "ordinals",
99        "row": {"number": 1, "name": "one"},
100        "uuid-name": "first"}]]],
101    [[[{"op": "update",
102        "table": "ordinals",
103        "where": [["name", "==", "zero"]],
104        "row": {"name": "nought"}}]]],
105    [[[{"op": "select",
106        "table": "ordinals",
107        "where": [],
108        "sort": ["number"]}]]]],
109   [[[{"uuid":["uuid","<0>"]}]
110 [{"uuid":["uuid","<1>"]}]
111 [{"count":1}]
112 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"nought","number":0},{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}]
113 ]])
114
115 OVSDB_CHECK_EXECUTION([insert rows, mutate rows],
116   [ORDINAL_SCHEMA],
117   [[[[{"op": "insert",
118        "table": "ordinals",
119        "row": {"number": 0, "name": "zero"},
120        "uuid-name": "first"}]]],
121    [[[{"op": "insert",
122        "table": "ordinals",
123        "row": {"number": 1, "name": "one"},
124        "uuid-name": "first"}]]],
125    [[[{"op": "mutate",
126        "table": "ordinals",
127        "where": [["name", "==", "zero"]],
128        "mutations": [["number", "+=", 2]]}]]],
129    [[[{"op": "select",
130        "table": "ordinals",
131        "where": [],
132        "sort": ["number"]}]]]],
133   [[[{"uuid":["uuid","<0>"]}]
134 [{"uuid":["uuid","<1>"]}]
135 [{"count":1}]
136 [{"rows":[{"_uuid":["uuid","<1>"],"_version":["uuid","<2>"],"name":"one","number":1},{"_uuid":["uuid","<0>"],"_version":["uuid","<3>"],"name":"zero","number":2}]}]
137 ]])
138
139 OVSDB_CHECK_EXECUTION([insert rows, delete by named-uuid],
140   [ORDINAL_SCHEMA],
141   [[[[{"op": "insert",
142        "table": "ordinals",
143        "row": {"number": 0, "name": "zero"},
144        "uuid-name": "first"},
145       {"op": "insert",
146        "table": "ordinals",
147        "row": {"number": 1, "name": "one"},
148        "uuid-name": "second"},
149       {"op": "delete",
150        "table": "ordinals",
151        "where": [["_uuid", "==", ["named-uuid", "first"]]]},
152       {"op": "select",
153        "table": "ordinals",
154        "where": [],
155        "columns": ["name","number"]}]]]],
156   [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"count":1},{"rows":[{"name":"one","number":1}]}]
157 ]])
158
159 OVSDB_CHECK_EXECUTION([insert rows, delete rows by value],
160   [ORDINAL_SCHEMA],
161   [[[[{"op": "insert",
162        "table": "ordinals",
163        "row": {"number": 0, "name": "zero"},
164        "uuid-name": "first"}]]],
165    [[[{"op": "insert",
166        "table": "ordinals",
167        "row": {"number": 1, "name": "one"},
168        "uuid-name": "first"}]]],
169    [[[{"op": "delete",
170        "table": "ordinals",
171        "where": [["name", "==", "zero"]]}]]],
172    [[[{"op": "select",
173        "table": "ordinals",
174        "where": []}]]]],
175   [[[{"uuid":["uuid","<0>"]}]
176 [{"uuid":["uuid","<1>"]}]
177 [{"count":1}]
178 [{"rows":[{"_uuid":["uuid","<1>"],"_version":["uuid","<2>"],"name":"one","number":1}]}]
179 ]])
180
181 OVSDB_CHECK_EXECUTION([insert rows, delete by (non-matching) value],
182   [ORDINAL_SCHEMA],
183   [[[[{"op": "insert",
184        "table": "ordinals",
185        "row": {"number": 0, "name": "zero"},
186        "uuid-name": "first"}]]],
187    [[[{"op": "insert",
188        "table": "ordinals",
189        "row": {"number": 1, "name": "one"},
190        "uuid-name": "first"}]]],
191    [[[{"op": "delete",
192        "table": "ordinals",
193        "where": [["name", "==", "nought"]]}]]],
194    [[[{"op": "select",
195        "table": "ordinals",
196        "where": [],
197        "sort": ["number"]}]]]],
198   [[[{"uuid":["uuid","<0>"]}]
199 [{"uuid":["uuid","<1>"]}]
200 [{"count":0}]
201 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"zero","number":0},{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}]
202 ]])
203
204 OVSDB_CHECK_EXECUTION([insert rows, delete all],
205   [ORDINAL_SCHEMA],
206   [[[[{"op": "insert",
207        "table": "ordinals",
208        "row": {"number": 0, "name": "zero"},
209        "uuid-name": "first"},
210       {"op": "insert",
211        "table": "ordinals",
212        "row": {"number": 1, "name": "one"},
213        "uuid-name": "second"},
214       {"op": "delete",
215        "table": "ordinals",
216        "where": []},
217       {"op": "select",
218        "table": "ordinals",
219        "where": [],
220        "columns": ["name","number"]}]]]],
221   [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"count":2},{"rows":[]}]
222 ]])
223
224 OVSDB_CHECK_EXECUTION([insert row, query table, commit],
225   [ORDINAL_SCHEMA],
226   [[[[{"op": "insert",
227        "table": "ordinals",
228        "row": {"number": 0, "name": "zero"}},
229       {"op": "select",
230        "table": "ordinals",
231        "where": []},
232       {"op": "commit",
233        "durable": false}]]]],
234   [[[{"uuid":["uuid","<0>"]},{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"zero","number":0}]},{}]
235 ]])
236
237 OVSDB_CHECK_EXECUTION([insert row, query table, commit durably],
238   [ORDINAL_SCHEMA],
239   [[[[{"op": "insert",
240        "table": "ordinals",
241        "row": {"number": 0, "name": "zero"}},
242       {"op": "select",
243        "table": "ordinals",
244        "where": []},
245       {"op": "commit",
246        "durable": true}]]]],
247   [[[{"uuid":["uuid","<0>"]},{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"zero","number":0}]},{}]
248 ]])
249
250 OVSDB_CHECK_EXECUTION([equality wait with correct rows],
251   [ORDINAL_SCHEMA],
252   [[[[{"op": "insert",
253        "table": "ordinals",
254        "row": {"number": 0, "name": "zero"}},
255       {"op": "insert",
256        "table": "ordinals",
257        "row": {"number": 1, "name": "one"}},
258       {"op": "wait",
259        "timeout": 0,
260        "table": "ordinals",
261        "where": [],
262        "columns": ["name", "number"],
263        "until": "==",
264        "rows": [{"name": "zero", "number": 0},
265                 {"name": "one", "number": 1}]}]]]],
266   [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{}]
267 ]])
268
269 OVSDB_CHECK_EXECUTION([equality wait with extra row],
270   [ORDINAL_SCHEMA],
271   [[[[{"op": "insert",
272        "table": "ordinals",
273        "row": {"number": 0, "name": "zero"}},
274       {"op": "insert",
275        "table": "ordinals",
276        "row": {"number": 1, "name": "one"}},
277       {"op": "wait",
278        "timeout": 0,
279        "table": "ordinals",
280        "where": [],
281        "columns": ["name", "number"],
282        "until": "==",
283        "rows": [{"name": "zero", "number": 0},
284                 {"name": "one", "number": 1},
285                 {"name": "two", "number": 2}]}]]]],
286   [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"details":"\"wait\" timed out","error":"timed out"}]
287 ]])
288
289 OVSDB_CHECK_EXECUTION([equality wait with missing row],
290   [ORDINAL_SCHEMA],
291   [[[[{"op": "insert",
292        "table": "ordinals",
293        "row": {"number": 0, "name": "zero"}},
294       {"op": "insert",
295        "table": "ordinals",
296        "row": {"number": 1, "name": "one"}},
297       {"op": "wait",
298        "timeout": 0,
299        "table": "ordinals",
300        "where": [],
301        "columns": ["name", "number"],
302        "until": "==",
303        "rows": [{"name": "one", "number": 1}]}]]]],
304   [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"details":"\"wait\" timed out","error":"timed out"}]
305 ]])
306
307 OVSDB_CHECK_EXECUTION([inequality wait with correct rows],
308   [ORDINAL_SCHEMA],
309   [[[[{"op": "insert",
310        "table": "ordinals",
311        "row": {"number": 0, "name": "zero"}},
312       {"op": "insert",
313        "table": "ordinals",
314        "row": {"number": 1, "name": "one"}},
315       {"op": "wait",
316        "timeout": 0,
317        "table": "ordinals",
318        "where": [],
319        "columns": ["name", "number"],
320        "until": "!=",
321        "rows": [{"name": "zero", "number": 0},
322                 {"name": "one", "number": 1}]}]]]],
323   [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"details":"\"wait\" timed out","error":"timed out"}]
324 ]])
325
326 OVSDB_CHECK_EXECUTION([inequality wait with extra row],
327   [ORDINAL_SCHEMA],
328   [[[[{"op": "insert",
329        "table": "ordinals",
330        "row": {"number": 0, "name": "zero"}},
331       {"op": "insert",
332        "table": "ordinals",
333        "row": {"number": 1, "name": "one"}},
334       {"op": "wait",
335        "timeout": 0,
336        "table": "ordinals",
337        "where": [],
338        "columns": ["name", "number"],
339        "until": "!=",
340        "rows": [{"name": "zero", "number": 0},
341                 {"name": "one", "number": 1},
342                 {"name": "two", "number": 2}]}]]]],
343   [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{}]
344 ]])
345
346 OVSDB_CHECK_EXECUTION([inequality wait with missing row],
347   [ORDINAL_SCHEMA],
348   [[[[{"op": "insert",
349        "table": "ordinals",
350        "row": {"number": 0, "name": "zero"}},
351       {"op": "insert",
352        "table": "ordinals",
353        "row": {"number": 1, "name": "one"}},
354       {"op": "wait",
355        "timeout": 0,
356        "table": "ordinals",
357        "where": [],
358        "columns": ["name", "number"],
359        "until": "!=",
360        "rows": [{"name": "one", "number": 1}]}]]]],
361   [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{}]
362 ]])
363
364 OVSDB_CHECK_EXECUTION([insert and update constraints],
365   [CONSTRAINT_SCHEMA],
366   [[[[{"op": "insert",
367        "table": "constrained",
368        "row": {}}]]],
369    [[[{"op": "insert",
370        "table": "constrained",
371        "row": {"positive": -1}}]]],
372    [[[{"op": "update",
373        "table": "constrained",
374        "where": [],
375        "row": {"positive": -2}}]]]],
376   [[[{"details":"0 is less than minimum allowed value 1","error":"constraint violation"}]
377 [{"details":"-1 is less than minimum allowed value 1","error":"constraint violation"}]
378 [{"details":"-2 is less than minimum allowed value 1","error":"constraint violation"}]
379 ]])])
380
381 EXECUTION_EXAMPLES