From: Tim-Philipp Müller Date: Sun, 5 Apr 2015 15:06:44 +0000 (+0100) Subject: tests: queue: check that the initial events are sent on immediately X-Git-Tag: 1.6.1~405 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=fe455d13301adaba186db9f4c78123197d8303e2;p=platform%2Fupstream%2Fgstreamer.git tests: queue: check that the initial events are sent on immediately Add a check that makes sure stream-start, caps, and segment events are passed on by queue without delay, i.e. even if no buffer is sent. --- diff --git a/tests/check/elements/queue.c b/tests/check/elements/queue.c index 1e9e9ca..8619909 100644 --- a/tests/check/elements/queue.c +++ b/tests/check/elements/queue.c @@ -45,6 +45,9 @@ static GMutex underrun_mutex; static GCond underrun_cond; static gint underrun_count; +static GMutex events_lock; +static GCond events_cond; +static gint events_count; static GList *events; static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", @@ -76,19 +79,17 @@ queue_underrun (GstElement * queue, gpointer user_data) static gboolean event_func (GstPad * pad, GstObject * parent, GstEvent * event) { - GST_DEBUG ("%s event", gst_event_type_get_name (GST_EVENT_TYPE (event))); + GST_DEBUG ("%s event", GST_EVENT_TYPE_NAME (event)); + + g_mutex_lock (&events_lock); + events = g_list_append (events, event); + ++events_count; - return TRUE; -} + g_cond_broadcast (&events_cond); + g_mutex_unlock (&events_lock); -static void -drop_events (void) -{ - while (events != NULL) { - gst_event_unref (GST_EVENT (events->data)); - events = g_list_delete_link (events, events); - } + return TRUE; } static void @@ -123,6 +124,10 @@ setup (void) underrun_count = 0; + + g_mutex_init (&events_lock); + g_cond_init (&events_cond); + events_count = 0; events = NULL; } @@ -133,7 +138,13 @@ cleanup (void) gst_check_drop_buffers (); - drop_events (); + while (events != NULL) { + gst_event_unref (GST_EVENT (events->data)); + events = g_list_delete_link (events, events); + } + events_count = 0; + g_mutex_clear (&events_lock); + g_cond_clear (&events_cond); if (mysinkpad != NULL) { gst_pad_set_active (mysinkpad, FALSE); @@ -1088,6 +1099,53 @@ GST_START_TEST (test_time_level_buffer_list) GST_END_TEST; +GST_START_TEST (test_initial_events_nodelay) +{ + GstSegment segment; + GstEvent *event; + GstCaps *caps; + gboolean ret; + + mysinkpad = gst_check_setup_sink_pad (queue, &sinktemplate); + gst_pad_set_event_function (mysinkpad, event_func); + gst_pad_set_active (mysinkpad, TRUE); + + GST_DEBUG ("starting"); + + fail_unless (gst_element_set_state (queue, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + gst_pad_push_event (mysrcpad, gst_event_new_stream_start ("test")); + + caps = gst_caps_new_empty_simple ("foo/x-bar"); + ret = gst_pad_push_event (mysrcpad, gst_event_new_caps (caps)); + gst_caps_unref (caps); + fail_unless (ret == TRUE); + + gst_segment_init (&segment, GST_FORMAT_TIME); + ret = gst_pad_push_event (mysrcpad, gst_event_new_segment (&segment)); + fail_unless (ret == TRUE); + + g_mutex_lock (&events_lock); + while (events_count < 3) { + g_cond_wait (&events_cond, &events_lock); + } + g_mutex_unlock (&events_lock); + + fail_unless_equals_int (g_list_length (events), 3); + event = g_list_nth_data (events, 0); + fail_unless_equals_int (GST_EVENT_TYPE (event), GST_EVENT_STREAM_START); + event = g_list_nth_data (events, 1); + fail_unless_equals_int (GST_EVENT_TYPE (event), GST_EVENT_CAPS); + event = g_list_nth_data (events, 2); + fail_unless_equals_int (GST_EVENT_TYPE (event), GST_EVENT_SEGMENT); + + gst_element_set_state (queue, GST_STATE_NULL); +} + +GST_END_TEST; + static Suite * queue_suite (void) { @@ -1109,6 +1167,7 @@ queue_suite (void) #endif tcase_add_test (tc_chain, test_sticky_not_linked); tcase_add_test (tc_chain, test_time_level_buffer_list); + tcase_add_test (tc_chain, test_initial_events_nodelay); return s; }