tests/check/: use the new macro
[platform/upstream/gstreamer.git] / tests / check / pipelines / parse-launch.c
1 /* GStreamer
2  * Copyright (C) <2005> Thomas Vander Stichele <thomas at apestaart dot org>
3  *
4  * cleanup.c: Unit test for cleanup of pipelines
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Library General Public
8  * License as published by the Free Software Foundation; either
9  * version 2 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Library General Public License for more details.
15  *
16  * You should have received a copy of the GNU Library General Public
17  * License along with this library; if not, write to the
18  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19  * Boston, MA 02111-1307, USA.
20  */
21
22
23 #include <gst/check/gstcheck.h>
24
25 static GstElement *
26 setup_pipeline (const gchar * pipe_descr)
27 {
28   GstElement *pipeline;
29   GError *error = NULL;
30
31   pipeline = gst_parse_launch (pipe_descr, &error);
32   if (error != NULL) {
33     fail_if (error != NULL, "Error parsing pipeline %s: %s", pipe_descr,
34         error->message);
35     g_error_free (error);
36   }
37   fail_unless (pipeline != NULL, "Failed to create pipeline %s", pipe_descr);
38   return pipeline;
39 }
40
41 static void
42 expected_fail_pipe (const gchar * pipe_descr)
43 {
44   GstElement *pipeline;
45   GError *error = NULL;
46
47 #ifndef GST_DISABLE_GST_DEBUG
48   gst_debug_set_default_threshold (GST_LEVEL_NONE);
49 #endif
50
51   pipeline = gst_parse_launch (pipe_descr, &error);
52   fail_unless (error != NULL, "Expected failure pipeline %s: succeeded!");
53   g_error_free (error);
54
55   /* We get a pipeline back even when parsing has failed, sometimes! */
56   if (pipeline)
57     gst_object_unref (pipeline);
58 }
59
60 static void
61 check_pipeline_runs (GstElement * p)
62 {
63   GstStateChangeReturn ret;
64
65   /* Check that the pipeline changes state to PAUSED and back to NULL */
66   ret = gst_element_set_state (p, GST_STATE_PAUSED);
67   if (ret == GST_STATE_CHANGE_ASYNC)
68     ret = gst_element_get_state (p, NULL, NULL, GST_CLOCK_TIME_NONE);
69   fail_unless (ret != GST_STATE_CHANGE_FAILURE,
70       "Could not set pipeline to paused");
71
72   ret = gst_element_set_state (p, GST_STATE_NULL);
73   if (ret == GST_STATE_CHANGE_ASYNC)
74     ret = gst_element_get_state (p, NULL, NULL, GST_CLOCK_TIME_NONE);
75   fail_unless (ret != GST_STATE_CHANGE_FAILURE,
76       "Could not set pipeline to null");
77 }
78
79 static const gchar *test_lines[] = {
80   "filesrc location=music.mp3 ! identity ! fakesink",
81   "filesrc location=music.ogg ! tee ! identity ! identity ! fakesink",
82   "filesrc location=http://domain.com/music.mp3 ! identity ! fakesink",
83   "filesrc location=movie.avi ! tee name=demuxer ! ( queue ! identity ! fakesink ) ( demuxer. ! queue ! identity ! fakesink )",
84   "fakesrc ! video/x-raw-yuv ! fakesink",
85   "fakesrc !   video/raw,  format=(fourcc)YUY2; video/raw, format=(fourcc)YV12 ! fakesink",
86   "fakesrc ! audio/x-raw-int, width=[16,  32], depth={16, 24, 32}, signed=TRUE ! fakesink",
87   NULL
88 };
89
90 GST_START_TEST (test_launch_lines)
91 {
92   GstElement *pipeline;
93   const gchar **s;
94
95   for (s = test_lines; *s != NULL; s++) {
96     pipeline = setup_pipeline (*s);
97     gst_object_unref (pipeline);
98   }
99 }
100
101 GST_END_TEST;
102
103 #define PIPELINE1  "fakesrc"
104 #define PIPELINE2  "fakesrc name=donald num-buffers= 27 silent =TruE sizetype = 3 data=   Subbuffer\\ data"
105 #define PIPELINE3  "fakesrc identity fakesink"
106 #define PIPELINE4  "fakesrc num-buffers=4 .src ! identity !.sink identity .src ! .sink fakesink"
107 #define PIPELINE5  "fakesrc num-buffers=4 name=src identity name=id1 identity name = id2 fakesink name =sink src. ! id1. id1.! id2.sink id2.src!sink.sink"
108 #define PIPELINE6  "pipeline.(name=\"john\" fakesrc num-buffers=4 ( bin. ( ! queue ! identity !( queue ! fakesink )) ))"
109 #define PIPELINE7  "fakesrc num-buffers=4 ! tee name=tee .src%d! queue ! fakesink tee.src%d ! queue ! fakesink queue name =\"foo\" ! fakesink tee.src%d ! foo."
110 /* aggregator is borked
111  * #define PIPELINE8  "fakesrc num-buffers=4 ! tee name=tee1 .src0,src1 ! .sink0, sink1 aggregator ! fakesink"
112  * */
113 #define PIPELINE8  "fakesrc num-buffers=4 ! fakesink"
114 #define PIPELINE9  "fakesrc num-buffers=4 ! test. fakesink name=test"
115 #define PIPELINE10 "( fakesrc num-buffers=\"4\" ! ) identity ! fakesink"
116 #define PIPELINE11 "fakesink name = sink identity name=id ( fakesrc num-buffers=\"4\" ! id. ) id. ! sink."
117 #define PIPELINE12 "fakesrc num-buffers=4 name=\"a=b\"  a=b. ! fakesink"
118 #define PIPELINE13 "file:///tmp/test.file ! fakesink"
119
120 GST_START_TEST (test_launch_lines2)
121 {
122   GstElement *cur;
123   gint i;
124   gboolean b;
125   gchar *s = NULL;
126
127   /**
128    * checks:
129    * - specifying an element works :)
130    * - if only 1 element is requested, no bin is returned, but the element
131    */
132   cur = setup_pipeline (PIPELINE1);
133   fail_unless (G_OBJECT_TYPE (cur) == g_type_from_name ("GstFakeSrc"),
134       "parse_launch did not produce a fakesrc");
135   gst_object_unref (cur);
136
137   /**
138    * checks:
139    * - properties works
140    * - string, int, boolean and enums can be properly set
141    * - first test of escaping strings
142    */
143   cur = setup_pipeline (PIPELINE2);
144   g_object_get (G_OBJECT (cur), "name", &s, "num-buffers", &i,
145       "silent", &b, NULL);
146   fail_if (s == NULL, "name was NULL");
147   fail_unless (strcmp (s, "donald") == 0, "fakesrc name was not 'donald'");
148   fail_unless (i == 27, "num-buffers was not 27");
149   fail_unless (b == TRUE, "silent was not TRUE");
150   g_free (s);
151
152   g_object_get (G_OBJECT (cur), "sizetype", &i, NULL);
153   fail_unless (i == 3, "sizetype != 3");
154
155   g_object_get (G_OBJECT (cur), "data", &i, NULL);
156   fail_unless (i == 2, "data != 2");
157   gst_object_unref (cur);
158
159   /**
160    * checks:
161    * - specifying multiple elements without links works
162    * - if multiple toplevel elements exist, a pipeline is returned
163    */
164   cur = setup_pipeline (PIPELINE3);
165   fail_unless (GST_BIN_NUMCHILDREN (cur) == 3,
166       "Pipeline does not contain 3 children");
167   gst_object_unref (cur);
168
169   /**
170    * checks:
171    * - test default link "!"
172    * - test if specifying pads on links works
173    */
174   cur = setup_pipeline (PIPELINE4);
175   check_pipeline_runs (cur);
176   gst_object_unref (cur);
177
178   /**
179    * checks:
180    * - test if appending the links works, too
181    * - check if the pipeline constructed works the same as the one before (how?)
182    */
183   cur = setup_pipeline (PIPELINE5);
184   check_pipeline_runs (cur);
185   gst_object_unref (cur);
186
187   /**
188    * checks:
189    * - test various types of bins
190    * - test if linking across bins works
191    * - test if escaping strings works
192    */
193   cur = setup_pipeline (PIPELINE6);
194   fail_unless (GST_IS_PIPELINE (cur), "Parse did not produce a pipeline");
195   g_object_get (G_OBJECT (cur), "name", &s, NULL);
196   fail_if (s == NULL, "name was NULL");
197   fail_unless (strcmp (s, "john") == 0, "Name was not 'john'");
198   g_free (s);
199   check_pipeline_runs (cur);
200   gst_object_unref (cur);
201
202   /**
203    * checks:
204    * - test request pads
205    */
206   cur = setup_pipeline (PIPELINE7);
207   check_pipeline_runs (cur);
208   gst_object_unref (cur);
209
210   /**
211    * checks:
212    * - multiple pads on 1 link
213    */
214   cur = setup_pipeline (PIPELINE8);
215   check_pipeline_runs (cur);
216   gst_object_unref (cur);
217
218   /**
219    * checks:
220    * - failed in grammar.y cvs version 1.17
221    */
222   cur = setup_pipeline (PIPELINE9);
223   check_pipeline_runs (cur);
224   gst_object_unref (cur);
225
226   /**
227    * checks:
228    * - failed in grammar.y cvs version 1.17
229    */
230   cur = setup_pipeline (PIPELINE10);
231   check_pipeline_runs (cur);
232   gst_object_unref (cur);
233
234   /**
235    * checks:
236    * - failed in grammar.y cvs version 1.18
237    */
238   cur = setup_pipeline (PIPELINE11);
239   check_pipeline_runs (cur);
240   gst_object_unref (cur);
241
242   /**
243    * checks:    
244    * - fails because a=b. is not a valid element reference in parse.l 
245    */
246   expected_fail_pipe (PIPELINE12);
247
248   /**
249    * checks:
250    * - URI detection works
251    */
252   cur = setup_pipeline (PIPELINE13);
253   gst_object_unref (cur);
254 }
255
256 GST_END_TEST;
257
258 Suite *
259 parse_suite (void)
260 {
261   Suite *s = suite_create ("Parse Launch syntax");
262   TCase *tc_chain = tcase_create ("parselaunch");
263
264   /* time out after 20s, not the default 3 */
265   tcase_set_timeout (tc_chain, 20);
266
267   suite_add_tcase (s, tc_chain);
268   tcase_add_test (tc_chain, test_launch_lines);
269   tcase_add_test (tc_chain, test_launch_lines2);
270   return s;
271 }
272
273 GST_CHECK_MAIN (parse);