summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThiago Santos <ts.santos@sisa.samsung.com>2014-02-04 14:15:40 -0300
committerTim-Philipp Müller <tim@centricular.com>2014-04-12 13:25:11 +0100
commite2022e98c5fc112e49361559fc2d0eaaa328804a (patch)
tree48c3288d9857a1a5cbf0cabdad403f89349a4aed
parent09b7ee1ffea332fcc49b0bd36c938c01fee4fa5e (diff)
downloadgstreamer-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.c77
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);