harness: Abort when failed to construct the specified pipeline
authorYasushi SHOJI <yashi@atmark-techno.com>
Sun, 30 Apr 2017 03:10:49 +0000 (12:10 +0900)
committerTim-Philipp Müller <tim@centricular.com>
Thu, 4 May 2017 18:48:33 +0000 (19:48 +0100)
gst_harness_new_parse() returns without any error even if it doesn't
find the specified element.  Then a succeeding call to
gst_harness_set_sink_caps_str() causes an error like this:

Unexpected critical/warning: gst_pad_push_event: assertion 'GST_IS_PAD (pad)' failed

This is a bit cryptic and doesn't give users any clue what was going
on.

gst_harness_new_parse() calls gst_harness_add_parse() with a newly
created empty harness and the given pipeline description string, but
gst_harness_add_parse() does not have a way to propagate the error
back to the caller.  Since the function, gst_harness_add_parse(), is a
public API, it's not a good idea to change its signature.  This patch,
instead, makes the function to g_error() when it discovers any error.
With this change the same error prints:

** (myelement-test:25345): ERROR **: Unable to create pipeline 'bin.( myelement )': no element "myelement"

The current implementation of gst_parse_launch_full() doesn't return
partially constructed pipeline when GST_PARSE_FLAG_FATAL_ERRORS is
specified, however, this patch also adds a check for it.

https://bugzilla.gnome.org/show_bug.cgi?id=781958

libs/gst/check/gstharness.c

index 7a6d2aa..959a5f9 100644 (file)
@@ -912,16 +912,19 @@ gst_harness_add_parse (GstHarness * h, const gchar * launchline)
   GstPad *pad;
   GstIterator *iter;
   gboolean done = FALSE;
+  GError *error = NULL;
 
   g_return_if_fail (launchline != NULL);
 
   desc = g_strdup_printf ("bin.( %s )", launchline);
   bin =
-      (GstBin *) gst_parse_launch_full (desc, NULL, GST_PARSE_FLAG_NONE, NULL);
-  g_free (desc);
+      (GstBin *) gst_parse_launch_full (desc, NULL, GST_PARSE_FLAG_FATAL_ERRORS,
+      &error);
 
-  if (G_UNLIKELY (bin == NULL))
-    return;
+  if (G_UNLIKELY (error != NULL)) {
+    g_error ("Unable to create pipeline '%s': %s", desc, error->message);
+  }
+  g_free (desc);
 
   /* find pads and ghost them if necessary */
   if ((pad = gst_bin_find_unlinked_pad (bin, GST_PAD_SRC)) != NULL) {