From: Andy Wingo Date: Wed, 21 Sep 2005 13:24:33 +0000 (+0000) Subject: Test that removing probes from within the probe functions works. X-Git-Tag: RELEASE-0_9_3~83 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=7be2b34bc6b7622aa7b0561d53eb15e0e08d1887;p=platform%2Fupstream%2Fgstreamer.git Test that removing probes from within the probe functions works. Original commit message from CVS: (test_buffer_probe_once): Test that removing probes from within the probe functions works. --- diff --git a/ChangeLog b/ChangeLog index 0a13ffd..d4b64dc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,8 @@ * check/gst/gstutils.c (test_buffer_probe_n_times): Add tests for data and event probes on the same pad. + (test_buffer_probe_once): Test that removing probes from within + the probe functions works. 2005-09-21 Andy Wingo diff --git a/check/gst/gstutils.c b/check/gst/gstutils.c index b740c4d..9deafe0 100644 --- a/check/gst/gstutils.c +++ b/check/gst/gstutils.c @@ -92,6 +92,81 @@ GST_START_TEST (test_buffer_probe_n_times) g_assert (n_data_probes == 12); /* duh */ } GST_END_TEST; +static int n_data_probes_once = 0; +static int n_buffer_probes_once = 0; +static int n_event_probes_once = 0; + +static gboolean +data_probe_once (GstPad * pad, GstMiniObject * obj, guint * data) +{ + n_data_probes_once++; + g_assert (GST_IS_MINI_OBJECT (obj)); + + gst_pad_remove_data_probe (pad, *data); + + return TRUE; +} + +static gboolean +buffer_probe_once (GstPad * pad, GstBuffer * obj, guint * data) +{ + n_buffer_probes_once++; + g_assert (GST_IS_BUFFER (obj)); + + gst_pad_remove_buffer_probe (pad, *data); + + return TRUE; +} + +static gboolean +event_probe_once (GstPad * pad, GstEvent * obj, guint * data) +{ + n_event_probes_once++; + g_assert (GST_IS_EVENT (obj)); + + gst_pad_remove_event_probe (pad, *data); + + return TRUE; +} + +GST_START_TEST (test_buffer_probe_once) +{ + GstElement *pipeline, *fakesrc, *fakesink; + GstBus *bus; + GstMessage *message; + GstPad *pad; + guint id1, id2, id3; + + pipeline = gst_element_factory_make ("pipeline", NULL); + fakesrc = gst_element_factory_make ("fakesrc", NULL); + fakesink = gst_element_factory_make ("fakesink", NULL); + + g_object_set (fakesrc, "num-buffers", (int) 10, NULL); + + gst_bin_add_many (GST_BIN (pipeline), fakesrc, fakesink, NULL); + gst_element_link (fakesrc, fakesink); + + pad = gst_element_get_pad (fakesink, "sink"); + id1 = gst_pad_add_data_probe (pad, G_CALLBACK (data_probe_once), &id1); + id2 = gst_pad_add_buffer_probe (pad, G_CALLBACK (buffer_probe_once), &id2); + id3 = gst_pad_add_event_probe (pad, G_CALLBACK (event_probe_once), &id3); + gst_object_unref (pad); + + gst_element_set_state (pipeline, GST_STATE_PLAYING); + + bus = gst_element_get_bus (pipeline); + message = gst_bus_poll (bus, GST_MESSAGE_EOS, -1); + gst_message_unref (message); + gst_object_unref (bus); + + gst_element_set_state (pipeline, GST_STATE_NULL); + gst_object_unref (pipeline); + + g_assert (n_buffer_probes_once == 1); /* can we hit it and quit? */ + g_assert (n_event_probes_once == 1); /* i said, can we hit it and quit? */ + g_assert (n_data_probes_once == 1); /* let's hit it and quit!!! */ +} GST_END_TEST; + Suite * gst_utils_suite (void) { @@ -100,6 +175,7 @@ gst_utils_suite (void) suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_buffer_probe_n_times); + tcase_add_test (tc_chain, test_buffer_probe_once); return s; } diff --git a/tests/check/gst/gstutils.c b/tests/check/gst/gstutils.c index b740c4d..9deafe0 100644 --- a/tests/check/gst/gstutils.c +++ b/tests/check/gst/gstutils.c @@ -92,6 +92,81 @@ GST_START_TEST (test_buffer_probe_n_times) g_assert (n_data_probes == 12); /* duh */ } GST_END_TEST; +static int n_data_probes_once = 0; +static int n_buffer_probes_once = 0; +static int n_event_probes_once = 0; + +static gboolean +data_probe_once (GstPad * pad, GstMiniObject * obj, guint * data) +{ + n_data_probes_once++; + g_assert (GST_IS_MINI_OBJECT (obj)); + + gst_pad_remove_data_probe (pad, *data); + + return TRUE; +} + +static gboolean +buffer_probe_once (GstPad * pad, GstBuffer * obj, guint * data) +{ + n_buffer_probes_once++; + g_assert (GST_IS_BUFFER (obj)); + + gst_pad_remove_buffer_probe (pad, *data); + + return TRUE; +} + +static gboolean +event_probe_once (GstPad * pad, GstEvent * obj, guint * data) +{ + n_event_probes_once++; + g_assert (GST_IS_EVENT (obj)); + + gst_pad_remove_event_probe (pad, *data); + + return TRUE; +} + +GST_START_TEST (test_buffer_probe_once) +{ + GstElement *pipeline, *fakesrc, *fakesink; + GstBus *bus; + GstMessage *message; + GstPad *pad; + guint id1, id2, id3; + + pipeline = gst_element_factory_make ("pipeline", NULL); + fakesrc = gst_element_factory_make ("fakesrc", NULL); + fakesink = gst_element_factory_make ("fakesink", NULL); + + g_object_set (fakesrc, "num-buffers", (int) 10, NULL); + + gst_bin_add_many (GST_BIN (pipeline), fakesrc, fakesink, NULL); + gst_element_link (fakesrc, fakesink); + + pad = gst_element_get_pad (fakesink, "sink"); + id1 = gst_pad_add_data_probe (pad, G_CALLBACK (data_probe_once), &id1); + id2 = gst_pad_add_buffer_probe (pad, G_CALLBACK (buffer_probe_once), &id2); + id3 = gst_pad_add_event_probe (pad, G_CALLBACK (event_probe_once), &id3); + gst_object_unref (pad); + + gst_element_set_state (pipeline, GST_STATE_PLAYING); + + bus = gst_element_get_bus (pipeline); + message = gst_bus_poll (bus, GST_MESSAGE_EOS, -1); + gst_message_unref (message); + gst_object_unref (bus); + + gst_element_set_state (pipeline, GST_STATE_NULL); + gst_object_unref (pipeline); + + g_assert (n_buffer_probes_once == 1); /* can we hit it and quit? */ + g_assert (n_event_probes_once == 1); /* i said, can we hit it and quit? */ + g_assert (n_data_probes_once == 1); /* let's hit it and quit!!! */ +} GST_END_TEST; + Suite * gst_utils_suite (void) { @@ -100,6 +175,7 @@ gst_utils_suite (void) suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_buffer_probe_n_times); + tcase_add_test (tc_chain, test_buffer_probe_once); return s; }