From 842afb973241042f1c282fcc2dcb8bc9ae090051 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Fri, 9 Mar 2012 11:49:08 +0100 Subject: test: add test to check sticky events order Sticky events pushed on an unlinked pad should be stored on the pad. When the pad is then linked and an event is pushed, the event should be merged with the already existing sticky events and then the sticky events should be pushed in the order that they were originally pushed. --- tests/check/gst/gstpad.c | 89 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) diff --git a/tests/check/gst/gstpad.c b/tests/check/gst/gstpad.c index 59e88d5d2..06dde3458 100644 --- a/tests/check/gst/gstpad.c +++ b/tests/check/gst/gstpad.c @@ -1386,6 +1386,94 @@ GST_START_TEST (test_block_async_replace_callback_no_flush) GST_END_TEST; +static gint sticky_count; + +static gboolean +test_sticky_events_handler (GstPad * pad, GstObject * parent, GstEvent * event) +{ + GST_DEBUG_OBJECT (pad, "received event %" GST_PTR_FORMAT, event); + + switch (sticky_count) { + case 0: + fail_unless (GST_EVENT_TYPE (event) == GST_EVENT_STREAM_START); + break; + case 1: + { + GstCaps *caps; + GstStructure *s; + + fail_unless (GST_EVENT_TYPE (event) == GST_EVENT_CAPS); + + gst_event_parse_caps (event, &caps); + fail_unless (gst_caps_get_size (caps) == 1); + s = gst_caps_get_structure (caps, 0); + fail_unless (gst_structure_has_name (s, "foo/baz")); + break; + } + case 2: + fail_unless (GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT); + break; + default: + fail_unless (FALSE); + break; + } + + gst_event_unref (event); + sticky_count++; + + return TRUE; +} + +GST_START_TEST (test_sticky_events) +{ + GstPad *srcpad, *sinkpad; + GstCaps *caps; + GstSegment seg; + + /* make unlinked srcpad */ + srcpad = gst_pad_new ("src", GST_PAD_SRC); + fail_unless (srcpad != NULL); + gst_pad_set_active (srcpad, TRUE); + + /* push an event, it should be sticky on the srcpad */ + gst_pad_push_event (srcpad, gst_event_new_stream_start ()); + + /* make a caps event */ + caps = gst_caps_new_empty_simple ("foo/bar"); + gst_pad_push_event (srcpad, gst_event_new_caps (caps)); + gst_caps_unref (caps); + + /* make segment event */ + gst_segment_init (&seg, GST_FORMAT_TIME); + gst_pad_push_event (srcpad, gst_event_new_segment (&seg)); + + /* now make a sinkpad */ + sinkpad = gst_pad_new ("sink", GST_PAD_SINK); + fail_unless (sinkpad != NULL); + sticky_count = 0; + gst_pad_set_event_function (sinkpad, test_sticky_events_handler); + fail_unless (sticky_count == 0); + gst_pad_set_active (sinkpad, TRUE); + + /* link the pads */ + gst_pad_link (srcpad, sinkpad); + /* should not trigger events */ + fail_unless (sticky_count == 0); + + /* caps replaces old caps event at position 2, the pushes all + * pending events */ + caps = gst_caps_new_empty_simple ("foo/baz"); + gst_pad_push_event (srcpad, gst_event_new_caps (caps)); + gst_caps_unref (caps); + + /* should have triggered 2 events */ + fail_unless (sticky_count == 3); + + gst_object_unref (srcpad); + gst_object_unref (sinkpad); +} + +GST_END_TEST; static Suite * gst_pad_suite (void) @@ -1424,6 +1512,7 @@ gst_pad_suite (void) tcase_add_test (tc_chain, test_block_async_full_destroy); tcase_add_test (tc_chain, test_block_async_full_destroy_dispose); tcase_add_test (tc_chain, test_block_async_replace_callback_no_flush); + tcase_add_test (tc_chain, test_sticky_events); return s; } -- cgit v1.2.3