summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorWim Taymans <wim.taymans@gmail.com>2005-10-12 08:38:06 +0000
committerWim Taymans <wim.taymans@gmail.com>2005-10-12 08:38:06 +0000
commitcc28efc239406dcfa36b846d2c656b45863ce2c6 (patch)
tree17fbade62a57458292407b86d06740dbea04945c /tests
parent0296eb6e9dff8dde21de844a2a3485e6164a9ac9 (diff)
check/: Moved sinks2 testcode in sinks check.
Original commit message from CVS: * check/Makefile.am: * check/states/sinks.c: (GST_START_TEST), (gst_object_suite): * check/states/sinks2.c: Moved sinks2 testcode in sinks check. * gst/gstbin.c: (gst_bin_provide_clock_func), (gst_bin_add_func), (gst_bin_remove_func), (gst_bin_recalc_state), (gst_bin_change_state_func), (bin_bus_handler): Fix potential race condition when _get_state() iterated over an ASYNC element right before it posted a state completion. * gst/gstclock.h: Do proper cast here. * gst/gstevent.c: (gst_event_new_newsegment), (gst_event_parse_newsegment): A playback rate of 0.0 is not allowed.
Diffstat (limited to 'tests')
-rw-r--r--tests/check/Makefile.am1
-rw-r--r--tests/check/generic/sinks.c58
2 files changed, 54 insertions, 5 deletions
diff --git a/tests/check/Makefile.am b/tests/check/Makefile.am
index 242bb27e57..53cedc786f 100644
--- a/tests/check/Makefile.am
+++ b/tests/check/Makefile.am
@@ -54,7 +54,6 @@ check_PROGRAMS = \
pipelines/simple_launch_lines \
pipelines/cleanup \
states/sinks \
- states/sinks2 \
gst-libs/controller \
gst-libs/gdp
diff --git a/tests/check/generic/sinks.c b/tests/check/generic/sinks.c
index e63abfcc42..1add001a1b 100644
--- a/tests/check/generic/sinks.c
+++ b/tests/check/generic/sinks.c
@@ -58,6 +58,50 @@ GST_START_TEST (test_sink)
}
GST_END_TEST
+/* a sink should go ASYNC to PAUSE and PLAYING, when linking a src, it
+ * should complete the state change. */
+GST_START_TEST (test_sink_completion)
+{
+ GstElement *sink, *src;
+ GstStateChangeReturn ret;
+ GstState current, pending;
+ GTimeVal tv;
+
+ sink = gst_element_factory_make ("fakesink", "sink");
+
+ ret = gst_element_set_state (sink, GST_STATE_PLAYING);
+ fail_unless (ret == GST_STATE_CHANGE_ASYNC, "no async state return");
+
+ GST_TIME_TO_TIMEVAL ((GstClockTime) 0, tv);
+
+ ret = gst_element_get_state (sink, &current, &pending, &tv);
+ fail_unless (ret == GST_STATE_CHANGE_ASYNC, "not changing state async");
+ fail_unless (current == GST_STATE_READY, "bad current state");
+ fail_unless (pending == GST_STATE_PLAYING, "bad pending state");
+
+ src = gst_element_factory_make ("fakesrc", "src");
+ gst_element_link (src, sink);
+
+ ret = gst_element_set_state (src, GST_STATE_PLAYING);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "no success state return");
+
+ /* now wait for final state */
+ ret = gst_element_get_state (sink, &current, &pending, NULL);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "failed to change state");
+ fail_unless (current == GST_STATE_PLAYING, "bad current state");
+ fail_unless (pending == GST_STATE_VOID_PENDING, "bad pending state");
+
+ ret = gst_element_set_state (sink, GST_STATE_NULL);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "failed to go to null");
+
+ ret = gst_element_set_state (src, GST_STATE_NULL);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "failed to go to null");
+
+ gst_object_unref (sink);
+ gst_object_unref (src);
+}
+
+GST_END_TEST
/* a sink should go ASYNC to PAUSE. PAUSE should complete when
* prerolled. */
GST_START_TEST (test_src_sink)
@@ -152,6 +196,7 @@ GST_START_TEST (test_livesrc_sink)
GstStateChangeReturn ret;
GstState current, pending;
GstPad *srcpad, *sinkpad;
+ GTimeVal tv;
pipeline = gst_pipeline_new ("pipeline");
src = gst_element_factory_make ("fakesrc", "src");
@@ -176,16 +221,20 @@ GST_START_TEST (test_livesrc_sink)
fail_unless (current == GST_STATE_PAUSED, "not paused");
fail_unless (pending == GST_STATE_VOID_PENDING, "not playing");
+ /* don't block here */
+ GST_TIME_TO_TIMEVAL (0, tv);
+ ret = gst_element_get_state (sink, &current, &pending, &tv);
+ fail_unless (ret == GST_STATE_CHANGE_ASYNC, "not async");
+ fail_unless (current == GST_STATE_READY, "not ready");
+ fail_unless (pending == GST_STATE_PAUSED, "not paused");
+
ret = gst_element_get_state (pipeline, &current, &pending, NULL);
fail_unless (ret == GST_STATE_CHANGE_NO_PREROLL, "not paused");
fail_unless (current == GST_STATE_PAUSED, "not paused");
fail_unless (pending == GST_STATE_VOID_PENDING, "not playing");
ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
- ret = gst_element_get_state (pipeline, NULL, NULL, NULL);
- fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "cannot force play got %d",
- ret);
-
+ fail_unless (ret == GST_STATE_CHANGE_ASYNC, "not async");
ret = gst_element_get_state (pipeline, &current, &pending, NULL);
fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "not playing");
fail_unless (current == GST_STATE_PLAYING, "not playing");
@@ -204,6 +253,7 @@ gst_object_suite (void)
suite_add_tcase (s, tc_chain);
tcase_add_test (tc_chain, test_sink);
+ tcase_add_test (tc_chain, test_sink_completion);
tcase_add_test (tc_chain, test_src_sink);
tcase_add_test (tc_chain, test_livesrc_remove);
tcase_add_test (tc_chain, test_livesrc_sink);