diff options
author | Thiago Santos <ts.santos@sisa.samsung.com> | 2014-02-04 14:15:40 -0300 |
---|---|---|
committer | Tim-Philipp Müller <tim@centricular.com> | 2014-04-12 13:25:11 +0100 |
commit | e2022e98c5fc112e49361559fc2d0eaaa328804a (patch) | |
tree | 48c3288d9857a1a5cbf0cabdad403f89349a4aed | |
parent | 09b7ee1ffea332fcc49b0bd36c938c01fee4fa5e (diff) | |
download | gstreamer-plugins-bad-e2022e98c5fc112e49361559fc2d0eaaa328804a.tar.gz |
tests: insertbin: update tests to 1.x scenario
The thread that calls the success/failure callback can be the
same that is adding/removing the element as the IDLE probe can
happen instantly if the pad is not 'busy'.
This required moving some checks for the callback counter around
as well as removing some pad pushes from the main test thread as
they were made useless after the IDLE pad probe was fixed in core
by commit 0324358ebc8122a41ab499a3ef7973b61c3e621b
-rw-r--r-- | tests/check/libs/insertbin.c | 77 |
1 files changed, 50 insertions, 27 deletions
diff --git a/tests/check/libs/insertbin.c b/tests/check/libs/insertbin.c index cc45c598f..c2872eb40 100644 --- a/tests/check/libs/insertbin.c +++ b/tests/check/libs/insertbin.c @@ -27,17 +27,17 @@ #include <gst/check/gstcheck.h> #include <gst/insertbin/gstinsertbin.h> -GstStaticPadTemplate sinkpad_template = GST_STATIC_PAD_TEMPLATE ("sink", // the name of the pad - GST_PAD_SINK, // the direction of the pad - GST_PAD_ALWAYS, // when this pad will be present - GST_STATIC_CAPS ( // the capabilities of the padtemplate +GstStaticPadTemplate sinkpad_template = GST_STATIC_PAD_TEMPLATE ("sink", /* the name of the pad */ + GST_PAD_SINK, /* the direction of the pad */ + GST_PAD_ALWAYS, /* when this pad will be present */ + GST_STATIC_CAPS ( /* the capabilities of the padtemplate */ "video/test") ); -GstStaticPadTemplate srcpad_template = GST_STATIC_PAD_TEMPLATE ("src", // the name of the pad - GST_PAD_SRC, // the direction of the pad - GST_PAD_ALWAYS, // when this pad will be present - GST_STATIC_CAPS ( // the capabilities of the padtemplate +GstStaticPadTemplate srcpad_template = GST_STATIC_PAD_TEMPLATE ("src", /* the name of the pad */ + GST_PAD_SRC, /* the direction of the pad */ + GST_PAD_ALWAYS, /* when this pad will be present */ + GST_STATIC_CAPS ( /* the capabilities of the padtemplate */ "video/test") ); @@ -47,6 +47,7 @@ GMutex mutex; GCond cond; GThread *push_thread = NULL; +GThread *streaming_thread = NULL; gulong block_probe_id = 0; gboolean is_blocked = FALSE; @@ -54,7 +55,7 @@ static void success_cb (GstInsertBin * insertbin, GstElement * element, gboolean success, gpointer user_data) { - fail_unless (g_thread_self () != push_thread); + fail_unless (g_thread_self () == push_thread); fail_unless (success == TRUE); fail_unless (GST_IS_ELEMENT (insertbin)); fail_unless (GST_IS_ELEMENT (element)); @@ -170,7 +171,9 @@ GST_START_TEST (test_insertbin_simple) fail_cb, NULL)); fail_unless (cb_count == 0); - + /* insertbin is stopped and pads are idle, should be called immediately + * from this same thread */ + push_thread = g_thread_self (); elem = gst_element_factory_make ("identity", NULL); gst_insert_bin_append (GST_INSERT_BIN (insertbin), elem, success_cb, NULL); check_reset_cb_count (1); @@ -190,63 +193,70 @@ GST_START_TEST (test_insertbin_simple) fail_unless (cb_count == 0); fail_unless (buffers == NULL); + push_thread = g_thread_self (); push_buffer (srcpad, 0); + /* now the pad should be active, the change should come from the + * 'streaming thread' */ + push_thread = NULL; block_thread (); elem = gst_element_factory_make ("identity", NULL); gst_insert_bin_prepend (GST_INSERT_BIN (insertbin), elem, success_cb, NULL); unblock_thread (); - push_buffer (srcpad, 1); - push_buffer (srcpad, 0); + check_reset_cb_count (1); + /* can't add the same element twice */ block_thread (); gst_insert_bin_append (GST_INSERT_BIN (insertbin), elem, fail_cb, NULL); check_reset_cb_count (1); unblock_thread (); push_buffer (srcpad, 0); + /* remove the element */ block_thread (); gst_insert_bin_remove (GST_INSERT_BIN (insertbin), elem, success_cb, NULL); unblock_thread (); - push_buffer (srcpad, 1); + check_reset_cb_count (1); push_buffer (srcpad, 0); + /* try adding multiple elements, one at a time */ block_thread (); elem = gst_element_factory_make ("identity", NULL); gst_insert_bin_append (GST_INSERT_BIN (insertbin), elem, success_cb, NULL); unblock_thread (); - push_buffer (srcpad, 1); + check_reset_cb_count (1); push_buffer (srcpad, 0); block_thread (); elem2 = gst_element_factory_make ("identity", NULL); gst_insert_bin_append (GST_INSERT_BIN (insertbin), elem2, success_cb, NULL); unblock_thread (); - push_buffer (srcpad, 1); + check_reset_cb_count (1); push_buffer (srcpad, 0); block_thread (); elem3 = gst_element_factory_make ("identity", NULL); gst_insert_bin_append (GST_INSERT_BIN (insertbin), elem3, success_cb, NULL); unblock_thread (); - push_buffer (srcpad, 1); + check_reset_cb_count (1); push_buffer (srcpad, 0); block_thread (); elem4 = gst_element_factory_make ("identity", NULL); gst_insert_bin_prepend (GST_INSERT_BIN (insertbin), elem4, success_cb, NULL); unblock_thread (); - push_buffer (srcpad, 1); + check_reset_cb_count (1); push_buffer (srcpad, 0); + /* remove 2 of those elements at once */ block_thread (); gst_insert_bin_remove (GST_INSERT_BIN (insertbin), elem3, success_cb, NULL); gst_insert_bin_remove (GST_INSERT_BIN (insertbin), elem2, success_cb, NULL); unblock_thread (); - push_buffer (srcpad, 1); - push_buffer (srcpad, 1); + check_reset_cb_count (2); push_buffer (srcpad, 0); + /* add another 2 elements at once */ block_thread (); elem2 = gst_element_factory_make ("identity", NULL); elem3 = gst_element_factory_make ("identity", NULL); @@ -255,17 +265,18 @@ GST_START_TEST (test_insertbin_simple) gst_insert_bin_insert_before (GST_INSERT_BIN (insertbin), elem3, elem4, success_cb, NULL); unblock_thread (); - push_buffer (srcpad, 1); - push_buffer (srcpad, 1); + check_reset_cb_count (2); push_buffer (srcpad, 0); + /* remove 2 elements */ block_thread (); gst_insert_bin_remove (GST_INSERT_BIN (insertbin), elem3, success_cb, NULL); gst_insert_bin_remove (GST_INSERT_BIN (insertbin), elem2, success_cb, NULL); unblock_thread (); - push_buffer (srcpad, 2); + check_reset_cb_count (2); push_buffer (srcpad, 0); + /* and add again */ block_thread (); elem2 = gst_element_factory_make ("identity", NULL); elem3 = gst_element_factory_make ("identity", NULL); @@ -274,15 +285,17 @@ GST_START_TEST (test_insertbin_simple) gst_insert_bin_insert_after (GST_INSERT_BIN (insertbin), elem2, elem, success_cb, NULL); unblock_thread (); - push_buffer (srcpad, 2); + check_reset_cb_count (2); push_buffer (srcpad, 0); + /* try to add an element that has no pads */ block_thread (); elem = gst_bin_new (NULL); gst_insert_bin_append (GST_INSERT_BIN (insertbin), elem, fail_cb, NULL); check_reset_cb_count (1); unblock_thread (); + /* try to add an element that has a parent */ block_thread (); elem = gst_bin_new (NULL); elem2 = gst_element_factory_make ("identity", NULL); @@ -293,20 +306,29 @@ GST_START_TEST (test_insertbin_simple) check_reset_cb_count (1); unblock_thread (); gst_object_unref (elem); - push_buffer (srcpad, 0); - block_thread (); + /* when removing an element insertbin will look at the pending operations list + * and check if that element is pending and remove it before adding. + * So we check that the callback count hapenned before the end, and it + * also happens from this same main thread. So we need to store the + * streaming thread to restore it after the check */ elem = gst_element_factory_make ("identity", NULL); elem2 = gst_element_factory_make ("identity", NULL); + block_thread (); gst_insert_bin_append (GST_INSERT_BIN (insertbin), elem, success_cb, NULL); gst_insert_bin_append (GST_INSERT_BIN (insertbin), elem2, success_cb, NULL); + streaming_thread = push_thread; + push_thread = g_thread_self (); gst_insert_bin_remove (GST_INSERT_BIN (insertbin), elem2, success_cb, NULL); + push_thread = streaming_thread; check_reset_cb_count (2); unblock_thread (); - push_buffer (srcpad, 1); + check_reset_cb_count (1); push_buffer (srcpad, 0); + /* fail when trying to add an element before another that isn't in + * insertbin */ block_thread (); elem = gst_element_factory_make ("identity", NULL); elem2 = gst_element_factory_make ("identity", NULL); @@ -322,7 +344,8 @@ GST_START_TEST (test_insertbin_simple) gst_pad_set_active (srcpad, FALSE); gst_pad_set_active (sinkpad, FALSE); - + cb_count = 0; + push_thread = g_thread_self (); elem = gst_element_factory_make ("identity", NULL); gst_insert_bin_remove (GST_INSERT_BIN (insertbin), elem, fail_cb, NULL); check_reset_cb_count (1); |