Merge "master" into "next".
[sliver-openvswitch.git] / tests / ovsdb-execution.at
index 8b2bc0b..ca155a1 100644 (file)
@@ -1,13 +1,35 @@
 AT_BANNER([OVSDB -- execution])
 
 m4_define([ORDINAL_SCHEMA],
-  [[{"name": "mydb",
+  [[{"name": "ordinals",
      "tables": {
        "ordinals": {
          "columns": {
            "number": {"type": "integer"},
            "name": {"type": "string"}}}}}]])
 
+m4_define([CONSTRAINT_SCHEMA],
+  [[{"name": "constraints",
+     "tables": {
+       "a": {
+         "columns": {
+           "a": {"type": "integer"},
+           "a2a": {"type": {"key": {"type": "uuid", "refTable": "a"},
+                            "min": 0, "max": "unlimited"}},
+           "a2b": {"type": {"key": {"type": "uuid", "refTable": "b"},
+                            "min": 0, "max": "unlimited"}}}},
+       "b": {
+         "columns": {
+           "b": {"type": "integer"},
+           "b2a": {"type": {"key": {"type": "uuid", "refTable": "a"},
+                            "min": 0, "max": "unlimited"}},
+           "b2b": {"type": {"key": {"type": "uuid", "refTable": "b"},
+                            "min": 0, "max": "unlimited"}}}},
+       "constrained": {
+         "columns": {
+           "positive": {"type": {"key": {"type": "integer",
+                                         "minInteger": 1}}}}}}}]])
+
 # OVSDB_CHECK_EXECUTION(TITLE, SCHEMA, TRANSACTIONS, OUTPUT, [KEYWORDS])
 #
 # Runs "test-ovsdb execute" with the given SCHEMA and each of the
@@ -23,7 +45,7 @@ m4_define([ORDINAL_SCHEMA],
 m4_define([OVSDB_CHECK_EXECUTION], 
   [AT_SETUP([$1])
    AT_KEYWORDS([ovsdb execute execution positive $5])
-   OVS_CHECK_LCOV([test-ovsdb execute '$2' m4_foreach([txn], [$3], [ 'txn'])],
+   AT_CHECK([test-ovsdb execute '$2' m4_foreach([txn], [$3], [ 'txn'])],
      [0], [stdout], [])
    AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [$4])
    AT_CLEANUP])
@@ -31,10 +53,12 @@ m4_define([OVSDB_CHECK_EXECUTION],
 m4_define([EXECUTION_EXAMPLES], [
 OVSDB_CHECK_EXECUTION([insert row, query table],
   [ORDINAL_SCHEMA], 
-  [[[[{"op": "insert",
+  [[[["ordinals",
+      {"op": "insert",
        "table": "ordinals",
        "row": {"number": 0, "name": "zero"}}]]],
-   [[[{"op": "select",
+   [[["ordinals",
+      {"op": "select",
        "table": "ordinals",
        "where": []}]]]],
   [[[{"uuid":["uuid","<0>"]}]
@@ -43,16 +67,20 @@ OVSDB_CHECK_EXECUTION([insert row, query table],
 
 OVSDB_CHECK_EXECUTION([insert rows, query by value],
   [ORDINAL_SCHEMA],
-  [[[[{"op": "insert",
+  [[[["ordinals",
+      {"op": "insert",
        "table": "ordinals",
        "row": {"number": 0, "name": "zero"}}]]],
-   [[[{"op": "insert",
+   [[["ordinals",
+      {"op": "insert",
        "table": "ordinals",
        "row": {"number": 1, "name": "one"}}]]],
-   [[[{"op": "select",
+   [[["ordinals",
+      {"op": "select",
        "table": "ordinals",
        "where": [["name", "==", "zero"]]}]]],
-   [[[{"op": "select",
+   [[["ordinals",
+      {"op": "select",
        "table": "ordinals",
        "where": [["name", "==", "one"]]}]]]],
   [[[{"uuid":["uuid","<0>"]}]
@@ -63,7 +91,8 @@ OVSDB_CHECK_EXECUTION([insert rows, query by value],
 
 OVSDB_CHECK_EXECUTION([insert rows, query by named-uuid],
   [ORDINAL_SCHEMA],
-  [[[[{"op": "insert",
+  [[[["ordinals",
+      {"op": "insert",
        "table": "ordinals",
        "row": {"number": 0, "name": "zero"},
        "uuid-name": "first"},
@@ -82,19 +111,23 @@ OVSDB_CHECK_EXECUTION([insert rows, query by named-uuid],
 
 OVSDB_CHECK_EXECUTION([insert rows, update rows by value],
   [ORDINAL_SCHEMA],
-  [[[[{"op": "insert",
+  [[[["ordinals",
+      {"op": "insert",
        "table": "ordinals",
        "row": {"number": 0, "name": "zero"},
        "uuid-name": "first"}]]],
-   [[[{"op": "insert",
+   [[["ordinals",
+      {"op": "insert",
        "table": "ordinals",
        "row": {"number": 1, "name": "one"},
        "uuid-name": "first"}]]],
-   [[[{"op": "update",
+   [[["ordinals",
+      {"op": "update",
        "table": "ordinals",
        "where": [["name", "==", "zero"]],
        "row": {"name": "nought"}}]]],
-   [[[{"op": "select",
+   [[["ordinals",
+      {"op": "select",
        "table": "ordinals",
        "where": [],
        "sort": ["number"]}]]]],
@@ -104,9 +137,38 @@ OVSDB_CHECK_EXECUTION([insert rows, update rows by value],
 [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<2>"],"name":"nought","number":0},{"_uuid":["uuid","<1>"],"_version":["uuid","<3>"],"name":"one","number":1}]}]
 ]])
 
+OVSDB_CHECK_EXECUTION([insert rows, mutate rows],
+  [ORDINAL_SCHEMA],
+  [[[["ordinals",
+      {"op": "insert",
+       "table": "ordinals",
+       "row": {"number": 0, "name": "zero"},
+       "uuid-name": "first"}]]],
+   [[["ordinals",
+      {"op": "insert",
+       "table": "ordinals",
+       "row": {"number": 1, "name": "one"},
+       "uuid-name": "first"}]]],
+   [[["ordinals",
+      {"op": "mutate",
+       "table": "ordinals",
+       "where": [["name", "==", "zero"]],
+       "mutations": [["number", "+=", 2]]}]]],
+   [[["ordinals",
+      {"op": "select",
+       "table": "ordinals",
+       "where": [],
+       "sort": ["number"]}]]]],
+  [[[{"uuid":["uuid","<0>"]}]
+[{"uuid":["uuid","<1>"]}]
+[{"count":1}]
+[{"rows":[{"_uuid":["uuid","<1>"],"_version":["uuid","<2>"],"name":"one","number":1},{"_uuid":["uuid","<0>"],"_version":["uuid","<3>"],"name":"zero","number":2}]}]
+]])
+
 OVSDB_CHECK_EXECUTION([insert rows, delete by named-uuid],
   [ORDINAL_SCHEMA],
-  [[[[{"op": "insert",
+  [[[["ordinals",
+      {"op": "insert",
        "table": "ordinals",
        "row": {"number": 0, "name": "zero"},
        "uuid-name": "first"},
@@ -126,18 +188,22 @@ OVSDB_CHECK_EXECUTION([insert rows, delete by named-uuid],
 
 OVSDB_CHECK_EXECUTION([insert rows, delete rows by value],
   [ORDINAL_SCHEMA],
-  [[[[{"op": "insert",
+  [[[["ordinals",
+      {"op": "insert",
        "table": "ordinals",
        "row": {"number": 0, "name": "zero"},
        "uuid-name": "first"}]]],
-   [[[{"op": "insert",
+   [[["ordinals",
+      {"op": "insert",
        "table": "ordinals",
        "row": {"number": 1, "name": "one"},
        "uuid-name": "first"}]]],
-   [[[{"op": "delete",
+   [[["ordinals",
+      {"op": "delete",
        "table": "ordinals",
        "where": [["name", "==", "zero"]]}]]],
-   [[[{"op": "select",
+   [[["ordinals",
+      {"op": "select",
        "table": "ordinals",
        "where": []}]]]],
   [[[{"uuid":["uuid","<0>"]}]
@@ -148,18 +214,22 @@ OVSDB_CHECK_EXECUTION([insert rows, delete rows by value],
 
 OVSDB_CHECK_EXECUTION([insert rows, delete by (non-matching) value],
   [ORDINAL_SCHEMA],
-  [[[[{"op": "insert",
+  [[[["ordinals",
+      {"op": "insert",
        "table": "ordinals",
        "row": {"number": 0, "name": "zero"},
        "uuid-name": "first"}]]],
-   [[[{"op": "insert",
+   [[["ordinals",
+      {"op": "insert",
        "table": "ordinals",
        "row": {"number": 1, "name": "one"},
        "uuid-name": "first"}]]],
-   [[[{"op": "delete",
+   [[["ordinals",
+      {"op": "delete",
        "table": "ordinals",
        "where": [["name", "==", "nought"]]}]]],
-   [[[{"op": "select",
+   [[["ordinals",
+      {"op": "select",
        "table": "ordinals",
        "where": [],
        "sort": ["number"]}]]]],
@@ -171,7 +241,8 @@ OVSDB_CHECK_EXECUTION([insert rows, delete by (non-matching) value],
 
 OVSDB_CHECK_EXECUTION([insert rows, delete all],
   [ORDINAL_SCHEMA],
-  [[[[{"op": "insert",
+  [[[["ordinals",
+      {"op": "insert",
        "table": "ordinals",
        "row": {"number": 0, "name": "zero"},
        "uuid-name": "first"},
@@ -191,7 +262,8 @@ OVSDB_CHECK_EXECUTION([insert rows, delete all],
 
 OVSDB_CHECK_EXECUTION([insert row, query table, commit],
   [ORDINAL_SCHEMA],
-  [[[[{"op": "insert",
+  [[[["ordinals",
+      {"op": "insert",
        "table": "ordinals",
        "row": {"number": 0, "name": "zero"}},
       {"op": "select",
@@ -204,7 +276,8 @@ OVSDB_CHECK_EXECUTION([insert row, query table, commit],
 
 OVSDB_CHECK_EXECUTION([insert row, query table, commit durably],
   [ORDINAL_SCHEMA],
-  [[[[{"op": "insert",
+  [[[["ordinals",
+      {"op": "insert",
        "table": "ordinals",
        "row": {"number": 0, "name": "zero"}},
       {"op": "select",
@@ -217,7 +290,8 @@ OVSDB_CHECK_EXECUTION([insert row, query table, commit durably],
 
 OVSDB_CHECK_EXECUTION([equality wait with correct rows],
   [ORDINAL_SCHEMA],
-  [[[[{"op": "insert",
+  [[[["ordinals",
+      {"op": "insert",
        "table": "ordinals",
        "row": {"number": 0, "name": "zero"}},
       {"op": "insert",
@@ -236,7 +310,8 @@ OVSDB_CHECK_EXECUTION([equality wait with correct rows],
 
 OVSDB_CHECK_EXECUTION([equality wait with extra row],
   [ORDINAL_SCHEMA],
-  [[[[{"op": "insert",
+  [[[["ordinals",
+      {"op": "insert",
        "table": "ordinals",
        "row": {"number": 0, "name": "zero"}},
       {"op": "insert",
@@ -256,7 +331,8 @@ OVSDB_CHECK_EXECUTION([equality wait with extra row],
 
 OVSDB_CHECK_EXECUTION([equality wait with missing row],
   [ORDINAL_SCHEMA],
-  [[[[{"op": "insert",
+  [[[["ordinals",
+      {"op": "insert",
        "table": "ordinals",
        "row": {"number": 0, "name": "zero"}},
       {"op": "insert",
@@ -274,7 +350,8 @@ OVSDB_CHECK_EXECUTION([equality wait with missing row],
 
 OVSDB_CHECK_EXECUTION([inequality wait with correct rows],
   [ORDINAL_SCHEMA],
-  [[[[{"op": "insert",
+  [[[["ordinals",
+      {"op": "insert",
        "table": "ordinals",
        "row": {"number": 0, "name": "zero"}},
       {"op": "insert",
@@ -293,7 +370,8 @@ OVSDB_CHECK_EXECUTION([inequality wait with correct rows],
 
 OVSDB_CHECK_EXECUTION([inequality wait with extra row],
   [ORDINAL_SCHEMA],
-  [[[[{"op": "insert",
+  [[[["ordinals",
+      {"op": "insert",
        "table": "ordinals",
        "row": {"number": 0, "name": "zero"}},
       {"op": "insert",
@@ -313,7 +391,8 @@ OVSDB_CHECK_EXECUTION([inequality wait with extra row],
 
 OVSDB_CHECK_EXECUTION([inequality wait with missing row],
   [ORDINAL_SCHEMA],
-  [[[[{"op": "insert",
+  [[[["ordinals",
+      {"op": "insert",
        "table": "ordinals",
        "row": {"number": 0, "name": "zero"}},
       {"op": "insert",
@@ -328,6 +407,134 @@ OVSDB_CHECK_EXECUTION([inequality wait with missing row],
        "rows": [{"name": "one", "number": 1}]}]]]],
   [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{}]
 ]])
-])
+
+OVSDB_CHECK_EXECUTION([insert and update constraints],
+  [CONSTRAINT_SCHEMA],
+  [[[["constraints",
+      {"op": "insert",
+       "table": "constrained",
+       "row": {}}]]],
+   [[["constraints",
+      {"op": "insert",
+       "table": "constrained",
+       "row": {"positive": -1}}]]],
+   [[["constraints",
+      {"op": "update",
+       "table": "constrained",
+       "where": [],
+       "row": {"positive": -2}}]]]],
+  [[[{"details":"0 is less than minimum allowed value 1","error":"constraint violation"}]
+[{"details":"-1 is less than minimum allowed value 1","error":"constraint violation"}]
+[{"details":"-2 is less than minimum allowed value 1","error":"constraint violation"}]
+]])
+
+OVSDB_CHECK_EXECUTION([referential integrity -- simple],
+  [CONSTRAINT_SCHEMA],
+  [[[["constraints",
+      {"op": "insert",
+       "table": "b",
+       "row": {"b": 1},
+       "uuid-name": "brow"},
+      {"op": "insert",
+       "table": "a",
+       "row": {"a": 0,
+               "a2b": ["set", [["named-uuid", "brow"]]]}},
+      {"op": "insert",
+       "table": "a",
+       "row": {"a": 1,
+               "a2b": ["set", [["named-uuid", "brow"]]]}},
+      {"op": "insert",
+       "table": "a",
+       "row": {"a": 2,
+               "a2b": ["set", [["named-uuid", "brow"]]]}}]]],
+   [[["constraints",
+      {"op": "delete",
+       "table": "b",
+       "where": []}]]],
+   [[["constraints",
+      {"op": "delete",
+       "table": "a",
+       "where": [["a", "==", 0]]}]]],
+   [[["constraints",
+      {"op": "delete",
+       "table": "b",
+       "where": []}]]],
+   [[["constraints",
+      {"op": "delete",
+       "table": "a",
+       "where": [["a", "==", 1]]}]]],
+   [[["constraints",
+      {"op": "delete",
+       "table": "b",
+       "where": []}]]],
+   [[["constraints",
+      {"op": "delete",
+       "table": "a",
+       "where": [["a", "==", 2]]}]]],
+   [[["constraints",
+      {"op": "delete",
+       "table": "b",
+       "where": []}]]]],
+  [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"uuid":["uuid","<2>"]},{"uuid":["uuid","<3>"]}]
+[{"count":1},{"details":"cannot delete b row <0> because of 3 remaining reference(s)","error":"referential integrity violation"}]
+[{"count":1}]
+[{"count":1},{"details":"cannot delete b row <0> because of 2 remaining reference(s)","error":"referential integrity violation"}]
+[{"count":1}]
+[{"count":1},{"details":"cannot delete b row <0> because of 1 remaining reference(s)","error":"referential integrity violation"}]
+[{"count":1}]
+[{"count":1}]
+]])
+
+OVSDB_CHECK_EXECUTION([referential integrity -- mutual references],
+  [CONSTRAINT_SCHEMA],
+  [[[["constraints",
+      {"op": "insert",
+       "table": "a",
+       "row": {"a": 0,
+               "a2b": ["set", [["named-uuid", "row2"]]],
+               "a2a": ["set", [["named-uuid", "row1"]]]},
+       "uuid-name": "row1"},
+      {"op": "insert",
+       "table": "b",
+       "row": {"b": 1,
+               "b2b": ["set", [["named-uuid", "row2"]]],
+               "b2a": ["set", [["named-uuid", "row1"]]]},
+       "uuid-name": "row2"}]]],
+   [[["constraints",
+      {"op": "insert",
+       "table": "a",
+       "row": {"a2b": ["set", [["uuid", "b516b960-5b19-4fc2-bb82-fe1cbd6d0241"]]]}}]]],
+   [[["constraints",
+      {"op": "delete",
+       "table": "a",
+       "where": [["a", "==", 0]]}]]],
+   [[["constraints",
+      {"op": "delete",
+       "table": "b",
+       "where": [["b", "==", 1]]}]]],
+   dnl Try the deletions again to make sure that the refcounts got rolled back.
+   [[["constraints",
+      {"op": "delete",
+       "table": "a",
+       "where": [["a", "==", 0]]}]]],
+   [[["constraints",
+      {"op": "delete",
+       "table": "b",
+       "where": [["b", "==", 1]]}]]],
+   [[["constraints",
+      {"op": "delete",
+       "table": "a",
+       "where": [["a", "==", 0]]},
+      {"op": "delete",
+       "table": "b",
+       "where": [["b", "==", 1]]}]]]],
+  [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]}]
+[{"uuid":["uuid","<2>"]},{"details":"reference to nonexistent row <3>","error":"referential integrity violation"}]
+[{"count":1},{"details":"cannot delete a row <0> because of 1 remaining reference(s)","error":"referential integrity violation"}]
+[{"count":1},{"details":"cannot delete b row <1> because of 1 remaining reference(s)","error":"referential integrity violation"}]
+[{"count":1},{"details":"cannot delete a row <0> because of 1 remaining reference(s)","error":"referential integrity violation"}]
+[{"count":1},{"details":"cannot delete b row <1> because of 1 remaining reference(s)","error":"referential integrity violation"}]
+[{"count":1},{"count":1}]
+]])])
 
 EXECUTION_EXAMPLES