validate: Allow using the new nested structure syntax
authorThibault Saunier <tsaunier@igalia.com>
Tue, 15 Dec 2020 21:18:29 +0000 (18:18 -0300)
committerThibault Saunier <tsaunier@igalia.com>
Thu, 17 Dec 2020 01:00:37 +0000 (22:00 -0300)
And port the deeply nested tests we have

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-devtools/-/merge_requests/233>

validate/gst/validate/gst-validate-scenario.c
validate/gst/validate/validate.c
validate/tests/launcher_tests/foreach.validatetest
validate/tests/launcher_tests/foreach_deep.validatetest

index b7832b0..bc7586b 100644 (file)
@@ -4129,7 +4129,8 @@ handle_bus_message (MessageData * d)
       GST_DEBUG_OBJECT (scenario, "Got EOS; generate 'stop' action");
 
       stop_action_type = _find_action_type ("stop");
-      s = gst_structure_from_string ("stop, generated-after-eos=true;", NULL);
+      s = gst_structure_new ("stop", "generated-after-eos", G_TYPE_BOOLEAN,
+          !is_error, "generated-after-error", G_TYPE_BOOLEAN, is_error, NULL);
       stop_action = gst_validate_action_new (scenario, stop_action_type,
           s, FALSE);
       gst_structure_free (s);
index 875fbcb..4097b92 100644 (file)
@@ -217,6 +217,41 @@ create_config (const gchar * config)
 }
 
 static GList *
+get_structures_from_array (GstStructure * structure, const gchar * fieldname)
+{
+  const GValue *value;
+  GList *res = NULL;
+  guint i, size;
+
+  value = gst_structure_get_value (structure, fieldname);
+  if (!value)
+    return NULL;
+
+  if (GST_VALUE_HOLDS_STRUCTURE (value)) {
+    return g_list_append (res,
+        gst_structure_copy (gst_value_get_structure (value)));
+  }
+
+  if (!GST_VALUE_HOLDS_LIST (value)) {
+    return NULL;
+  }
+
+  size = gst_value_list_get_size (value);
+  for (i = 0; i < size; i++) {
+    const GValue *v1 = gst_value_list_get_value (value, i);
+
+    if (!GST_VALUE_HOLDS_STRUCTURE (v1))
+      break;
+
+    res =
+        g_list_append (res, gst_structure_copy (gst_value_get_structure (v1)));
+  }
+
+
+  return res;
+}
+
+static GList *
 get_structures_from_array_in_meta (const gchar * fieldname)
 {
   GList *res = NULL;
@@ -227,6 +262,10 @@ get_structures_from_array_in_meta (const gchar * fieldname)
   if (!meta)
     return NULL;
 
+  res = get_structures_from_array (meta, fieldname);
+  if (res)
+    return res;
+
   gst_structure_get (meta,
       "__lineno__", G_TYPE_INT, &current_lineno,
       "__debug__", G_TYPE_STRING, &debug,
index 1ecc9f3..a5201ff 100644 (file)
@@ -4,42 +4,44 @@ meta,
         "videotestsrc pattern=ball animation-mode=frames num-buffers=30 ! video/x-raw,framerate=10/1 ! $(videosink) name=sink sync=true",
     },
     expected-issues = {
-        "expected-issue,
-            level=critical,
-            issue-id=scenario::execution-error,
-            details=\"Pipeline position doesn.t match expectations got 0:00:00.100000000 instead of.*\"",
-        "expected-issue,
-            level=critical,
-            issue-id=scenario::execution-error,
-            details=\"Pipeline position doesn.t match expectations got 0:00:00.200000000 instead of.*\"",
+        [
+            expected-issue,
+                level=critical,
+                issue-id=scenario::execution-error,
+                details="Pipeline position doesn.t match expectations got 0:00:00.100000000 instead of.*",
+        ],
+        [
+            expected-issue,
+                level=critical,
+                issue-id=scenario::execution-error,
+                details="Pipeline position doesn.t match expectations got 0:00:00.200000000 instead of.*",
+        ],
     }
 
 pause;
 
 foreach, n=[0, 2],
     actions = {
-        "seek, start=\"$(position)+0.1\", flags=\"accurate+flush\"",
-        "check-position, expected-position=\"expr($(n)*0.01)\"", # expected to fail
+        [seek, start="$(position)+0.1", flags="accurate+flush"],
+        [check-position, expected-position="expr($(n)*0.01)"], # expected to fail
     }
 
 priv_check-action-type-calls, type=seek, n=2
 priv_check-action-type-calls, type=check-position, n=2
 
-foreach, n=[0, 6],
-    actions = {
-        "seek, start=\"$(position)+0.1\", flags=\"accurate+flush\"",
-        "check-position, expected-position=\"expr((3 + $(n)) * 0.1)\"",
-    }
+foreach, n=[0, 6], actions = {
+    [seek, start="$(position)+0.1", flags="accurate+flush"],
+    [check-position, expected-position="expr((3 + $(n)) * 0.1)"],
+}
 
 priv_check-action-type-calls, type=seek, n=8
 priv_check-action-type-calls, type=check-position, n=8
 check-position, expected-position=0.8
 
-foreach, n=[9, 11],
-    actions = {
-        "seek, start=\"$(position)+0.1\", flags=\"accurate+flush\"",
-        "check-position, expected-position=\"expr($(n)*0.1)\"",
-    }
+foreach, n=[9, 11], actions = {
+    [seek, start="$(position)+0.1", flags="accurate+flush"],
+    [check-position, expected-position="expr($(n)*0.1)"],
+}
 priv_check-action-type-calls, type=seek, n=10
 # We called it once manually
 priv_check-action-type-calls, type=check-position, n=11
index 3fa9f52..b54ea0b 100644 (file)
@@ -4,48 +4,77 @@ meta,
         "videotestsrc pattern=ball animation-mode=frames num-buffers=30 ! video/x-raw,framerate=10/1 ! $(videosink) name=sink sync=true",
     },
     expected-issues = {
-        "expected-issue, level=critical, issue-id=scenario::execution-error,
-            details=\"Pipeline position doesn.t match expectations got 0:00:00.100000000 instead of.*\"",
-        "expected-issue, level=critical, issue-id=scenario::execution-error,
-            details=\"Pipeline position doesn.t match expectations got 0:00:00.200000000 instead of.*\"",
-        "expected-issue, level=critical, issue-id=scenario::execution-error,
-            details=\"Expected subaction level 4, got 3\"",
-        "expected-issue, level=critical, issue-id=scenario::execution-error,
-            details=\"Expected subaction level 4, got 3\"",
-        "expected-issue, level=critical, issue-id=scenario::execution-error,
-            details=\"Expected subaction level 5, got 4\"",
-        "expected-issue, level=critical, issue-id=scenario::execution-error,
-            details=\"Expected subaction level 5, got 4\"",
+        [
+            expected-issue,
+                level=critical,
+                issue-id=scenario::execution-error,
+                details="Pipeline position doesn.t match expectations got 0:00:00.100000000 instead of.*",
+        ],
+        [
+            expected-issue,
+                level=critical,
+                issue-id=scenario::execution-error,
+                details="Pipeline position doesn.t match expectations got 0:00:00.200000000 instead of.*",
+        ],
+        [
+            expected-issue,
+                level=critical,
+                issue-id=scenario::execution-error,
+                details="Expected subaction level 4, got 3",
+        ],
+        [
+            expected-issue,
+                level=critical,
+                issue-id=scenario::execution-error,
+                details="Expected subaction level 4, got 3",
+        ],
+        [
+            expected-issue,
+                level=critical,
+                issue-id=scenario::execution-error,
+                details="Expected subaction level 5, got 4",
+        ],
+        [
+            expected-issue,
+                level=critical,
+                issue-id=scenario::execution-error,
+                details="Expected subaction level 5, got 4",
+        ],
     }
 
 pause;
 
 
 foreach, n=[0, 2],
-    actions = {
-        "seek, start=\"$(position)+0.1\", flags=\"accurate+flush\"",
-        "check-position, expected-position=\"expr($(n)*0.01)\"",  # Expected failling subaction!
+    actions={
+        [seek, start="$(position)+0.1", flags="accurate+flush"],
+        [check-position, expected-position="expr($(n)*0.01)"],  # Expected failling subaction!
     }
 
 priv_check-action-type-calls, type=seek, n=2
 priv_check-action-type-calls, type=check-position, n=2
 
-foreach, n=[0, 2],
-    actions = {
-        "seek, start=\"$(position)+0.1\", flags=\"accurate+flush\"",
-        "priv_check-subaction-level, level=1",
-        "foreach, n=[0, 1],
+foreach, i=[0, 2],
+    actions={
+        [seek, start="$(position)+0.1", flags="accurate+flush"],
+        [priv_check-subaction-level, level=1],
+        [foreach, j=[0, 1],
             actions={
-                \"priv_check-subaction-level, level=2\",
-                \"foreach, j=[0, 1], actions={
-                    \\\"priv_check-subaction-level, level=4\\\",  # Failling... twice
-                    \\\"priv_check-subaction-level, level=3\\\",
-                    \\\"foreach, j=[0, 1], actions={
-                        \\\\\\\"priv_check-subaction-level, level=4\\\\\\\",
-                        \\\\\\\"priv_check-subaction-level, level=5\\\\\\\", # Failling... twice
-                    }\\\",
-                }\",
-        }",
+                [priv_check-subaction-level, level=2],
+                [foreach, k=[0, 1],
+                    actions={
+                        [priv_check-subaction-level, level=4],  # Failling... twice
+                        [priv_check-subaction-level, level=3],
+                        [foreach, l=[0, 1],
+                            actions={
+                                [priv_check-subaction-level, level=4],
+                                [priv_check-subaction-level, level=5], # Failling... twice
+                            },
+                        ],
+                    },
+                ],
+            },
+        ],
     }
 priv_check-action-type-calls, type=seek, n=4
 stop