]> git.proxmox.com Git - ovs.git/blob - tests/ovsdb-monitor.at
tests: Convert ovsdb-monitor-sort utility from Perl to Python.
[ovs.git] / tests / ovsdb-monitor.at
1 AT_BANNER([OVSDB -- ovsdb-server monitors])
2
3 # OVSDB_CHECK_MONITOR(TITLE, SCHEMA, [PRE-MONITOR-TXN], DB, TABLE,
4 # TRANSACTIONS, OUTPUT, [COLUMNS], [KEYWORDS])
5 #
6 # Creates a database with the given SCHEMA, starts an ovsdb-server on
7 # that database, and runs each of the TRANSACTIONS (which should be a
8 # quoted list of quoted strings) against it with ovsdb-client one at a
9 # time. COLUMNS, if specified, is passed to ovsdb-client as the set
10 # of columns and operations to select.
11 #
12 # Checks that the overall output is OUTPUT, but UUIDs in the output
13 # are replaced by markers of the form <N> where N is a number. The
14 # first unique UUID is replaced by <0>, the next by <1>, and so on.
15 # If a given UUID appears more than once it is always replaced by the
16 # same marker.
17 #
18 # TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS.
19 m4_define([OVSDB_CHECK_MONITOR],
20 [AT_SETUP([$1])
21 AT_KEYWORDS([ovsdb server monitor positive $9])
22 $2 > schema
23 AT_CHECK([ovsdb-tool create db schema], [0], [stdout], [ignore])
24 m4_foreach([txn], [$3],
25 [AT_CHECK([ovsdb-tool transact db 'txn'], [0], [ignore], [ignore])])
26 AT_CAPTURE_FILE([ovsdb-server-log])
27 AT_CHECK([ovsdb-server --detach --no-chdir --pidfile --remote=punix:socket --log-file="`pwd`"/ovsdb-server-log db >/dev/null 2>&1],
28 [0], [], [])
29 on_exit 'kill `cat ovsdb-server.pid`'
30 AT_CAPTURE_FILE([ovsdb-client-log])
31 if test "$IS_WIN32" = "yes"; then
32 AT_CHECK([ovsdb-client -vjsonrpc --pidfile --log-file="`pwd`"/ovsdb-client-log -d json monitor --format=csv unix:socket $4 $5 $8 > output 2>/dev/null &],
33 [0], [ignore], [ignore])
34 sleep 1
35 else
36 AT_CHECK([ovsdb-client -vjsonrpc --detach --no-chdir --pidfile --log-file="`pwd`"/ovsdb-client-log -d json monitor --format=csv unix:socket $4 $5 $8 > output],
37 [0], [ignore], [ignore])
38 fi
39 on_exit 'kill `cat ovsdb-client.pid`'
40 m4_foreach([txn], [$6],
41 [AT_CHECK([ovsdb-client transact unix:socket 'txn'], [0],
42 [ignore], [ignore])])
43 AT_CHECK([ovsdb-client transact unix:socket '[["$4"]]'], [0],
44 [ignore], [ignore])
45 OVS_APP_EXIT_AND_WAIT_BY_TARGET([ovsdb-server], [ovsdb-server.pid])
46 OVS_WAIT_UNTIL([test ! -e ovsdb-client.pid])
47 AT_CHECK([$PYTHON $srcdir/ovsdb-monitor-sort.py < output | uuidfilt], [0], [$7], [ignore])
48 AT_CLEANUP])
49
50 # OVSDB_CHECK_MONITOR_COND(TITLE, SCHEMA, [PRE-MONITOR-TXN], DB, TABLE,
51 # TRANSACTIONS, OUTPUT, CONDITIONS, [COLUMNS], [KEYWORDS],
52 # [CONDITIONS_CHANGE])
53 #
54 # Creates a database with the given SCHEMA, starts an ovsdb-server on
55 # that database, and runs each of the TRANSACTIONS (which should be a
56 # quoted list of quoted strings) against it with ovsdb-client one at a
57 # time. COLUMNS, if specified, is passed to ovsdb-client as the set
58 # of columns and operations to select.
59 #
60 # Checks that the overall output is OUTPUT, but UUIDs in the output
61 # are replaced by markers of the form <N> where N is a number. The
62 # first unique UUID is replaced by <0>, the next by <1>, and so on.
63 # If a given UUID appears more than once it is always replaced by the
64 # same marker.
65 #
66 # TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS.
67 m4_define([OVSDB_CHECK_MONITOR_COND],
68 [AT_SETUP([$1])
69 AT_KEYWORDS([ovsdb server monitor monitor-cond positive $10])
70 $2 > schema
71 AT_CHECK([ovsdb-tool create db schema], [0], [stdout], [ignore])
72 m4_foreach([txn], [$3],
73 [AT_CHECK([ovsdb-tool transact db 'txn'], [0], [ignore], [ignore])])
74 AT_CAPTURE_FILE([ovsdb-server-log])
75 AT_CHECK([ovsdb-server --detach --no-chdir --pidfile --remote=punix:socket --log-file="`pwd`"/ovsdb-server-log db >/dev/null 2>&1])
76 on_exit 'kill `cat ovsdb-server.pid`'
77 AT_CHECK([ovsdb-client -vjsonrpc --pidfile --detach --no-chdir -d json monitor-cond --format=csv unix:socket $4 '[$8]' $5 $9 > output],
78 [0], [ignore], [ignore])
79 on_exit 'kill `cat ovsdb-client.pid`'
80 m4_foreach([txn], [$6],
81 [AT_CHECK([ovsdb-client transact unix:socket 'txn'], [0],
82 [ignore], [ignore], [kill `cat server-pid client-pid`])])
83 m4_foreach([cond], [$10],
84 [AT_CHECK([ovs-appctl -t ovsdb-client ovsdb-client/cond_change $5 'cond'], [0], [ignore], [ignore])])
85 AT_CHECK([ovsdb-client transact unix:socket '[["$4"]]'], [0],
86 [ignore], [ignore])
87 AT_CHECK([ovs-appctl -t ovsdb-server -e exit], [0], [ignore], [ignore])
88 OVS_WAIT_UNTIL([test ! -e ovsdb-server.pid && test ! -e ovsdb-client.pid])
89 AT_CHECK([$PYTHON $srcdir/ovsdb-monitor-sort.py < output | uuidfilt], [0], [$7], [ignore])
90 AT_CLEANUP])
91
92 OVSDB_CHECK_MONITOR([monitor insert into empty table],
93 [ordinal_schema],
94 [],
95 [ordinals], [ordinals],
96 [[[["ordinals",
97 {"op": "insert",
98 "table": "ordinals",
99 "row": {"number": 0, "name": "zero"}}]]]],
100 [[row,action,name,number,_version
101 <0>,insert,"""zero""",0,"[""uuid"",""<1>""]"
102 ]])
103
104 OVSDB_CHECK_MONITOR([monitor insert into populated table],
105 [ordinal_schema],
106 [[[["ordinals",
107 {"op": "insert",
108 "table": "ordinals",
109 "row": {"number": 10, "name": "ten"}}]]]],
110 [ordinals], [ordinals],
111 [[[["ordinals",
112 {"op": "insert",
113 "table": "ordinals",
114 "row": {"number": 0, "name": "zero"}}]]]],
115 [[row,action,name,number,_version
116 <0>,initial,"""ten""",10,"[""uuid"",""<1>""]"
117
118 row,action,name,number,_version
119 <2>,insert,"""zero""",0,"[""uuid"",""<3>""]"
120 ]])
121
122 OVSDB_CHECK_MONITOR([monitor delete],
123 [ordinal_schema],
124 [[[["ordinals",
125 {"op": "insert",
126 "table": "ordinals",
127 "row": {"number": 10, "name": "ten"}}]]]],
128 [ordinals], [ordinals],
129 [[[["ordinals",
130 {"op": "delete",
131 "table": "ordinals",
132 "where": [["number", "==", 10]]}]]]],
133 [[row,action,name,number,_version
134 <0>,initial,"""ten""",10,"[""uuid"",""<1>""]"
135
136 row,action,name,number,_version
137 <0>,delete,"""ten""",10,"[""uuid"",""<1>""]"
138 ]])
139
140 OVSDB_CHECK_MONITOR([monitor row update],
141 [ordinal_schema],
142 [[[["ordinals",
143 {"op": "insert",
144 "table": "ordinals",
145 "row": {"number": 10, "name": "ten"}}]]]],
146 [ordinals], [ordinals],
147 [[[["ordinals",
148 {"op": "update",
149 "table": "ordinals",
150 "where": [["number", "==", 10]],
151 "row": {"name": "five plus five"}}]]]],
152 [[row,action,name,number,_version
153 <0>,initial,"""ten""",10,"[""uuid"",""<1>""]"
154
155 row,action,name,number,_version
156 <0>,old,"""ten""",,"[""uuid"",""<1>""]"
157 ,new,"""five plus five""",10,"[""uuid"",""<2>""]"
158 ]])
159
160 OVSDB_CHECK_MONITOR([monitor no-op row updates],
161 [ordinal_schema],
162 [[[["ordinals",
163 {"op": "insert",
164 "table": "ordinals",
165 "row": {"number": 10, "name": "ten"}}]]]],
166 [ordinals], [ordinals],
167 [[[["ordinals",
168 {"op": "update",
169 "table": "ordinals",
170 "where": [["number", "==", 10]],
171 "row": {"number": 10, "name": "ten"}}]]],
172 [[["ordinals",
173 {"op": "insert",
174 "table": "ordinals",
175 "row": {"number": 9, "name": "nine"}}]]]],
176 [[row,action,name,number,_version
177 <0>,initial,"""ten""",10,"[""uuid"",""<1>""]"
178
179 row,action,name,number,_version
180 <2>,insert,"""nine""",9,"[""uuid"",""<3>""]"
181 ]])
182
183 OVSDB_CHECK_MONITOR([monitor insert-and-update transaction],
184 [ordinal_schema],
185 [[[["ordinals",
186 {"op": "insert",
187 "table": "ordinals",
188 "row": {"number": 10, "name": "ten"}}]]]],
189 [ordinals], [ordinals],
190 [[[["ordinals",
191 {"op": "insert",
192 "table": "ordinals",
193 "row": {"number": 9, "name": "nine"},
194 "uuid-name": "nine"},
195 {"op": "update",
196 "table": "ordinals",
197 "where": [["_uuid", "==", ["named-uuid", "nine"]]],
198 "row": {"name": "three squared"}}]]]],
199 [[row,action,name,number,_version
200 <0>,initial,"""ten""",10,"[""uuid"",""<1>""]"
201
202 row,action,name,number,_version
203 <2>,insert,"""three squared""",9,"[""uuid"",""<3>""]"
204 ]])
205
206 OVSDB_CHECK_MONITOR([monitor insert-update-and-delete transaction],
207 [ordinal_schema],
208 [[[["ordinals",
209 {"op": "insert",
210 "table": "ordinals",
211 "row": {"number": 10, "name": "ten"}}]]]],
212 [ordinals], [ordinals],
213 [[[["ordinals",
214 {"op": "insert",
215 "table": "ordinals",
216 "row": {"number": 9, "name": "nine"},
217 "uuid-name": "nine"},
218 {"op": "update",
219 "table": "ordinals",
220 "where": [["_uuid", "==", ["named-uuid", "nine"]]],
221 "row": {"name": "three squared"}},
222 {"op": "delete",
223 "table": "ordinals",
224 "where": [["_uuid", "==", ["named-uuid", "nine"]]]},
225 {"op": "insert",
226 "table": "ordinals",
227 "row": {"number": 7, "name": "seven"}}]]]],
228 [[row,action,name,number,_version
229 <0>,initial,"""ten""",10,"[""uuid"",""<1>""]"
230
231 row,action,name,number,_version
232 <2>,insert,"""seven""",7,"[""uuid"",""<3>""]"
233 ]])
234
235 OVSDB_CHECK_MONITOR([monitor weak reference change],
236 [weak_schema],
237 [[[["weak",
238 {"op": "insert",
239 "table": "a",
240 "row": {"a": 0,
241 "a2a1": ["named-uuid", "a0"],
242 "a2b": ["named-uuid", "b2"]},
243 "uuid-name": "a0"},
244 {"op": "insert",
245 "table": "a",
246 "row": {"a": 1,
247 "a2a": ["named-uuid", "a0"],
248 "a2a1": ["named-uuid", "a1"],
249 "a2b": ["named-uuid", "b2"]},
250 "uuid-name": "a1"},
251 {"op": "insert",
252 "table": "b",
253 "row": {"b": 2},
254 "uuid-name": "b2"}]]]],
255 [weak], [a],
256 [[[["weak",
257 {"op": "delete",
258 "table": "a",
259 "where": [["a", "==", 0]]}]]]],
260 [[row,action,a,a2a,a2a1,a2b,_version
261 <0>,initial,0,"[""set"",[]]","[""uuid"",""<0>""]","[""uuid"",""<1>""]","[""uuid"",""<2>""]"
262 <3>,initial,1,"[""uuid"",""<0>""]","[""uuid"",""<3>""]","[""uuid"",""<1>""]","[""uuid"",""<4>""]"
263
264 row,action,a,a2a,a2a1,a2b,_version
265 <0>,delete,0,"[""set"",[]]","[""uuid"",""<0>""]","[""uuid"",""<1>""]","[""uuid"",""<2>""]"
266 <3>,old,,"[""uuid"",""<0>""]",,,"[""uuid"",""<4>""]"
267 ,new,1,"[""set"",[]]","[""uuid"",""<3>""]","[""uuid"",""<1>""]","[""uuid"",""<5>""]"
268 ]])
269
270 OVSDB_CHECK_MONITOR([monitor insert-update-and-delete transaction],
271 [ordinal_schema],
272 [[[["ordinals",
273 {"op": "insert",
274 "table": "ordinals",
275 "row": {"number": 10, "name": "ten"}}]]]],
276 [ordinals], [ordinals],
277 [[[["ordinals",
278 {"op": "insert",
279 "table": "ordinals",
280 "row": {"number": 9, "name": "nine"},
281 "uuid-name": "nine"},
282 {"op": "update",
283 "table": "ordinals",
284 "where": [["_uuid", "==", ["named-uuid", "nine"]]],
285 "row": {"name": "three squared"}},
286 {"op": "delete",
287 "table": "ordinals",
288 "where": [["_uuid", "==", ["named-uuid", "nine"]]]},
289 {"op": "insert",
290 "table": "ordinals",
291 "row": {"number": 7, "name": "seven"}}]]]],
292 [[row,action,name,number,_version
293 <0>,initial,"""ten""",10,"[""uuid"",""<1>""]"
294
295 row,action,name,number,_version
296 <2>,insert,"""seven""",7,"[""uuid"",""<3>""]"
297 ]])
298 \f
299 AT_BANNER([ovsdb -- ovsdb-monitor monitor only some operations])
300
301 m4_define([OVSDB_MONITOR_INITIAL],
302 [[[["ordinals",
303 {"op": "insert",
304 "table": "ordinals",
305 "row": {"number": 10, "name": "ten"}}]]]])
306 m4_define([OVSDB_MONITOR_TXNS],
307 [[[["ordinals",
308 {"op": "insert",
309 "table": "ordinals",
310 "row": {"number": 5, "name": "five"}}]]],
311 [[["ordinals",
312 {"op": "update",
313 "table": "ordinals",
314 "where": [["name", "==", "five"]],
315 "row": {"name": "FIVE"}}]]],
316 [[["ordinals",
317 {"op": "delete",
318 "table": "ordinals",
319 "where": []}]]]])
320
321 OVSDB_CHECK_MONITOR([monitor all operations],
322 [ordinal_schema], [OVSDB_MONITOR_INITIAL],
323 [ordinals], [ordinals], [OVSDB_MONITOR_TXNS],
324 [[row,action,name,number,_version
325 <0>,initial,"""ten""",10,"[""uuid"",""<1>""]"
326
327 row,action,name,number,_version
328 <2>,insert,"""five""",5,"[""uuid"",""<3>""]"
329
330 row,action,name,number,_version
331 <2>,old,"""five""",,"[""uuid"",""<3>""]"
332 ,new,"""FIVE""",5,"[""uuid"",""<4>""]"
333
334 row,action,name,number,_version
335 <2>,delete,"""FIVE""",5,"[""uuid"",""<4>""]"
336 <0>,delete,"""ten""",10,"[""uuid"",""<1>""]"
337 ]])
338
339 dnl A monitor with "initial" only doesn't really make sense,
340 dnl but it's still allowed and should work.
341 OVSDB_CHECK_MONITOR([monitor initial only],
342 [ordinal_schema], [OVSDB_MONITOR_INITIAL],
343 [ordinals], [ordinals], [OVSDB_MONITOR_TXNS],
344 [[row,action,name,number,_version
345 <0>,initial,"""ten""",10,"[""uuid"",""<1>""]"
346 ]], [!insert,!delete,!modify])
347
348 OVSDB_CHECK_MONITOR([monitor insert only],
349 [ordinal_schema], [OVSDB_MONITOR_INITIAL],
350 [ordinals], [ordinals], [OVSDB_MONITOR_TXNS],
351 [[row,action,name,number,_version
352 <0>,insert,"""five""",5,"[""uuid"",""<1>""]"
353 ]], [!initial,!delete,!modify])
354
355 OVSDB_CHECK_MONITOR([monitor delete only],
356 [ordinal_schema], [OVSDB_MONITOR_INITIAL],
357 [ordinals], [ordinals], [OVSDB_MONITOR_TXNS],
358 [[row,action,name,number,_version
359 <0>,delete,"""FIVE""",5,"[""uuid"",""<1>""]"
360 <2>,delete,"""ten""",10,"[""uuid"",""<3>""]"
361 ]], [!initial,!insert,!modify])
362
363 OVSDB_CHECK_MONITOR([monitor modify only],
364 [ordinal_schema], [OVSDB_MONITOR_INITIAL],
365 [ordinals], [ordinals], [OVSDB_MONITOR_TXNS],
366 [[row,action,name,number,_version
367 <0>,old,"""five""",,"[""uuid"",""<1>""]"
368 ,new,"""FIVE""",5,"[""uuid"",""<2>""]"
369 ]], [!initial,!insert,!delete])
370
371 AT_BANNER([ovsdb -- ovsdb-monitor-cond conditional monitor only some operations])
372
373 OVSDB_CHECK_MONITOR_COND([monitor-cond empty condition],
374 [ordinal_schema],
375 [[[["ordinals",
376 {"op": "insert",
377 "table": "ordinals",
378 "row": {"number": 0, "name": "zero"}},
379 {"op": "insert",
380 "table": "ordinals",
381 "row": {"number": 1, "name": "one"}},
382 {"op": "insert",
383 "table": "ordinals",
384 "row": {"number": 2, "name": "two"}}]]]],
385 [ordinals], [ordinals],
386 [[[["ordinals",
387 {"op": "insert",
388 "table": "ordinals",
389 "row": {"number": 10, "name": "ten"}},
390 {"op": "insert",
391 "table": "ordinals",
392 "row": {"number": 11, "name": "eleven"}}]]]],
393 [[row,action,name,number,_version
394 <0>,initial,"""one""",1,"[""uuid"",""<1>""]"
395 <2>,initial,"""two""",2,"[""uuid"",""<3>""]"
396 <4>,initial,"""zero""",,"[""uuid"",""<5>""]"
397
398 row,action,name,number,_version
399 <6>,insert,"""eleven""",11,"[""uuid"",""<7>""]"
400 <8>,insert,"""ten""",10,"[""uuid"",""<9>""]"
401 ]],
402 [[]])
403
404 OVSDB_CHECK_MONITOR_COND([monitor-cond multiple conditions],
405 [ordinal_schema],
406 [[[["ordinals",
407 {"op": "insert",
408 "table": "ordinals",
409 "row": {"number": 0, "name": "zero"}},
410 {"op": "insert",
411 "table": "ordinals",
412 "row": {"number": 1, "name": "one"}},
413 {"op": "insert",
414 "table": "ordinals",
415 "row": {"number": 2, "name": "two"}}]]]],
416 [ordinals], [ordinals],
417 [[[["ordinals",
418 {"op": "insert",
419 "table": "ordinals",
420 "row": {"number": 10, "name": "ten"}},
421 {"op": "insert",
422 "table": "ordinals",
423 "row": {"number": 11, "name": "eleven"}}]]]],
424 [[row,action,name,number,_version
425 <0>,initial,"""one""",1,"[""uuid"",""<1>""]"
426
427 row,action,name,number,_version
428 <2>,insert,"""ten""",10,"[""uuid"",""<3>""]"
429 ]],
430 [[["name","==","one"],["name","==","ten"]]])
431
432 OVSDB_CHECK_MONITOR_COND([monitor-cond delete from populated table],
433 [ordinal_schema],
434 [[[["ordinals",
435 {"op": "insert",
436 "table": "ordinals",
437 "row": {"number": 0, "name": "zero"}},
438 {"op": "insert",
439 "table": "ordinals",
440 "row": {"number": 1, "name": "one"}},
441 {"op": "insert",
442 "table": "ordinals",
443 "row": {"number": 2, "name": "two"}}]]]],
444 [ordinals], [ordinals],
445 [[[["ordinals",
446 {"op": "delete",
447 "table": "ordinals",
448 "where": []}]]]],
449 [[row,action,name,number,_version
450 <0>,initial,"""one""",1,"[""uuid"",""<1>""]"
451
452 row,action,name,number,_version
453 <0>,delete,,,
454 ]],
455 [[["name","==","one"],["name","==","ten"]]])
456
457 OVSDB_CHECK_MONITOR_COND([monitor-cond insert due to modify],
458 [ordinal_schema],
459 [[[["ordinals",
460 {"op": "insert",
461 "table": "ordinals",
462 "row": {"number": 0, "name": "zero"}},
463 {"op": "insert",
464 "table": "ordinals",
465 "row": {"number": 1, "name": "one"}},
466 {"op": "insert",
467 "table": "ordinals",
468 "row": {"number": 2, "name": "two"}}]]]],
469 [ordinals], [ordinals],
470 [[[["ordinals",
471 {"op": "update",
472 "table": "ordinals",
473 "where": [["name", "==", "one"]],
474 "row": {"name": "ONE"}}]]]],
475 [[row,action,name,number,_version
476 <0>,insert,"""ONE""",1,"[""uuid"",""<1>""]"
477 ]],
478 [[["name","==","ONE"]]],
479 [!initial,!delete,!modify])
480
481 OVSDB_CHECK_MONITOR_COND([monitor-cond delete due to modify],
482 [ordinal_schema],
483 [[[["ordinals",
484 {"op": "insert",
485 "table": "ordinals",
486 "row": {"number": 0, "name": "zero"}},
487 {"op": "insert",
488 "table": "ordinals",
489 "row": {"number": 1, "name": "one"}},
490 {"op": "insert",
491 "table": "ordinals",
492 "row": {"number": 2, "name": "two"}}]]]],
493 [ordinals], [ordinals],
494 [[[["ordinals",
495 {"op": "update",
496 "table": "ordinals",
497 "where": [["name", "==", "one"]],
498 "row": {"name": "ONE"}}]]]],
499 [[row,action,name,number,_version
500 <0>,delete,,,
501 ]],
502 [[["name","==","one"]]],
503 [!initial,!insert,!modify])
504
505 OVSDB_CHECK_MONITOR_COND([monitor-cond condition non-monitored columns],
506 [ordinal_schema],
507 [[[["ordinals",
508 {"op": "insert",
509 "table": "ordinals",
510 "row": {"number": 0, "name": "zero"}},
511 {"op": "insert",
512 "table": "ordinals",
513 "row": {"number": 1, "name": "one"}},
514 {"op": "insert",
515 "table": "ordinals",
516 "row": {"number": 2, "name": "two"}}]]]],
517 [ordinals], [ordinals],
518 [[[["ordinals",
519 {"op": "insert",
520 "table": "ordinals",
521 "row": {"number": 10, "name": "ten"}},
522 {"op": "insert",
523 "table": "ordinals",
524 "row": {"number": 11, "name": "eleven"}}]]]],
525 [[row,action,number
526 <0>,initial,1
527
528 row,action,number
529 <1>,insert,10
530 ]],
531 [[["name","==","one"],["name","==","ten"]]],
532 ["number"])
533
534 OVSDB_CHECK_MONITOR_COND([monitor-cond-change],
535 [ordinal_schema],
536 [[[["ordinals",
537 {"op": "insert",
538 "table": "ordinals",
539 "row": {"number": 0, "name": "zero"}},
540 {"op": "insert",
541 "table": "ordinals",
542 "row": {"number": 1, "name": "one"}},
543 {"op": "insert",
544 "table": "ordinals",
545 "row": {"number": 2, "name": "two"}}]]]],
546 [ordinals], [ordinals],
547 [],
548 [[row,action,name,number,_version
549 <0>,initial,"""one""",1,"[""uuid"",""<1>""]"
550 <2>,initial,"""two""",2,"[""uuid"",""<3>""]"
551 <4>,initial,"""zero""",,"[""uuid"",""<5>""]"
552
553 row,action,name,number,_version
554 <4>,delete,,,
555
556 row,action,name,number,_version
557 <2>,delete,,,
558
559 row,action,name,number,_version
560 <0>,delete,,,
561
562 row,action,name,number,_version
563 <0>,insert,"""one""",1,"[""uuid"",""<1>""]"
564 <2>,insert,"""two""",2,"[""uuid"",""<3>""]"
565 <4>,insert,"""zero""",,"[""uuid"",""<5>""]"
566 ]],
567 [[]],
568 [],
569 [[[[["name","==","one"],["name","==","two"]]]],
570 [[[["name","==","one"]]]],
571 [[[false]]],
572 [[[true]]]])