elements: Use gst_pad_set_caps() instead of manual event fiddling
[platform/upstream/gstreamer.git] / tests / check / elements / curlfilesink.c
1 /*
2  * Unittest for curlfilesink
3  */
4
5 #include <gst/check/gstcheck.h>
6 #include <glib/gstdio.h>
7 #include <curl/curl.h>
8 #include <unistd.h>
9
10 static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
11     GST_PAD_SRC,
12     GST_PAD_ALWAYS,
13     GST_STATIC_CAPS_ANY);
14
15 static GstPad *srcpad;
16
17 static GstElement *sink;
18
19 static GstElement *
20 setup_curlfilesink (void)
21 {
22   GST_DEBUG ("setup_curlfielsink");
23   sink = gst_check_setup_element ("curlfilesink");
24   srcpad = gst_check_setup_src_pad (sink, &srctemplate);
25   gst_pad_set_active (srcpad, TRUE);
26
27   return sink;
28 }
29
30 static void
31 cleanup_curlfilesink (GstElement * sink)
32 {
33   GST_DEBUG ("cleanup_curlfilesink");
34
35   gst_check_teardown_src_pad (sink);
36   gst_check_teardown_element (sink);
37 }
38
39 static void
40 test_verify_file_data (const gchar * dir, gchar * file_name,
41     const gchar * expected_file_content)
42 {
43   GError *err = NULL;
44   gchar *res_file_content = NULL;
45   gchar *path = NULL;
46
47   path = g_strdup_printf ("%s/%s", dir, file_name);
48   g_free (file_name);
49
50   if (!g_file_get_contents (path, &res_file_content, NULL, &err)) {
51     GST_WARNING ("Error loading file: %s (%s)", file_name, err->message);
52     g_error_free (err);
53   }
54
55   fail_unless (res_file_content != NULL);
56
57   fail_unless (strncmp (res_file_content, expected_file_content,
58           strlen (expected_file_content)) == 0);
59   g_free (res_file_content);
60   g_unlink (path);
61   g_free (path);
62 }
63
64 static void
65 test_set_and_play_buffer (const gchar * _data)
66 {
67   gpointer data = (gpointer) _data;
68   GstBuffer *buffer;
69   gint num_bytes;
70
71   num_bytes = strlen (data);
72   buffer = gst_buffer_new ();
73   gst_buffer_insert_memory (buffer, 0,
74       gst_memory_new_wrapped (GST_MEMORY_FLAG_READONLY,
75           data, num_bytes, 0, num_bytes, data, NULL));
76
77   fail_unless (gst_pad_push (srcpad, buffer) == GST_FLOW_OK);
78 }
79
80 static void
81 test_set_and_fail_to_play_buffer (const gchar * _data)
82 {
83   gpointer data = (gpointer) _data;
84   GstBuffer *buffer;
85   gint num_bytes;
86
87   num_bytes = strlen (data);
88   buffer = gst_buffer_new ();
89   gst_buffer_insert_memory (buffer, 0,
90       gst_memory_new_wrapped (GST_MEMORY_FLAG_READONLY,
91           data, num_bytes, 0, num_bytes, data, NULL));
92
93   fail_unless (gst_pad_push (srcpad, buffer) == GST_FLOW_ERROR);
94 }
95
96 static gboolean
97 sebras_gst_pad_set_caps (GstPad * pad, GstCaps * caps)
98 {
99   GstEvent *event;
100   gboolean res = TRUE;
101
102   GST_WARNING ("sebraz: a %p %p", pad, caps);
103   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
104   GST_WARNING ("sebraz: b");
105   g_return_val_if_fail (caps != NULL && gst_caps_is_fixed (caps), FALSE);
106   GST_WARNING ("sebraz: c");
107
108   GST_WARNING ("sebraz: d");
109   res = gst_pad_set_caps (pad, caps);
110   GST_WARNING ("sebraz: e");
111
112   return res;
113 }
114
115 GST_START_TEST (test_properties)
116 {
117   GstElement *sink;
118   GstCaps *caps;
119   const gchar *location = "file:///tmp/";
120   const gchar *file_contents = "line 1\r\n";
121   gchar *file_name = g_strdup_printf ("curlfilesink_%d", g_random_int ());
122   gchar *res_location = NULL;
123   gchar *res_file_name = NULL;
124   gboolean res_create_dirs = FALSE;
125   gchar *path = NULL;
126
127   GST_WARNING ("sebras: a");
128
129   sink = setup_curlfilesink ();
130   GST_WARNING ("sebras: b");
131
132   g_object_set (G_OBJECT (sink), "location", "mylocation", NULL);
133   g_object_set (G_OBJECT (sink), "file-name", "myfile", NULL);
134   g_object_set (G_OBJECT (sink), "create-dirs", TRUE, NULL);
135   GST_WARNING ("sebras: c");
136
137   g_object_get (sink,
138       "location", &res_location,
139       "file-name", &res_file_name, "create-dirs", &res_create_dirs, NULL);
140   GST_WARNING ("sebras: d");
141
142   fail_unless (strncmp (res_location, "mylocation", strlen ("mylocation"))
143       == 0);
144   GST_WARNING ("sebras: e");
145   fail_unless (strncmp (res_file_name, "myfile", strlen ("myfile"))
146       == 0);
147   GST_WARNING ("sebras: f");
148   fail_unless (res_create_dirs == TRUE);
149   GST_WARNING ("sebras: g");
150   g_free (res_location);
151   g_free (res_file_name);
152   GST_WARNING ("sebras: h");
153
154   /* change properties */
155   g_object_set (G_OBJECT (sink), "location", location, NULL);
156   g_object_set (G_OBJECT (sink), "file-name", file_name, NULL);
157   g_object_set (G_OBJECT (sink), "create-dirs", FALSE, NULL);
158   GST_WARNING ("sebras: i");
159
160   g_object_get (sink,
161       "location", &res_location,
162       "file-name", &res_file_name, "create-dirs", &res_create_dirs, NULL);
163   GST_WARNING ("sebras: j");
164
165   fail_unless (strncmp (res_location, location, strlen (location))
166       == 0);
167   GST_WARNING ("sebras: k");
168   fail_unless (strncmp (res_file_name, file_name, strlen (file_name))
169       == 0);
170   GST_WARNING ("sebras: l");
171   fail_unless (res_create_dirs == FALSE);
172   GST_WARNING ("sebras: m");
173   g_free (res_location);
174   g_free (res_file_name);
175   GST_WARNING ("sebras: n");
176
177   /* start playing */
178   ASSERT_SET_STATE (sink, GST_STATE_PLAYING, GST_STATE_CHANGE_ASYNC);
179   GST_WARNING ("sebras: o");
180   caps = gst_caps_from_string ("application/x-gst-check");
181   GST_WARNING ("sebras: p");
182   fail_unless (sebras_gst_pad_set_caps (srcpad, caps));
183   fail_unless (gst_pad_set_caps (srcpad, caps));
184   GST_WARNING ("sebras: q");
185
186   /* setup buffer */
187   test_set_and_play_buffer (file_contents);
188   GST_WARNING ("sebras: r");
189
190   /* try to change location property while in PLAYING state */
191   g_object_set (G_OBJECT (sink), "location", "newlocation", NULL);
192   g_object_get (sink, "location", &res_location, NULL);
193
194   /* verify that locaiton has not been altered */
195   fail_unless (strncmp (res_location, location, strlen (location))
196       == 0);
197   g_free (res_location);
198
199   /* eos */
200   fail_unless (gst_pad_push_event (srcpad, gst_event_new_eos ()));
201   ASSERT_SET_STATE (sink, GST_STATE_NULL, GST_STATE_CHANGE_SUCCESS);
202
203   gst_caps_unref (caps);
204   cleanup_curlfilesink (sink);
205
206   path = g_strdup_printf ("/tmp/%s", file_name);
207   g_unlink (path);
208   g_free (file_name);
209   g_free (path);
210 }
211
212 GST_END_TEST;
213
214 GST_START_TEST (test_one_file)
215 {
216   GstElement *sink;
217   GstCaps *caps;
218   const gchar *location = "file:///tmp/";
219   gchar *file_name = g_strdup_printf ("curlfilesink_%d", g_random_int ());
220   const gchar *file_content = "line 1\r\n";
221   gchar *res_location = NULL;
222   gchar *res_file_name = NULL;
223
224   sink = setup_curlfilesink ();
225
226   g_object_set (G_OBJECT (sink), "location", location, NULL);
227   g_object_set (G_OBJECT (sink), "file-name", file_name, NULL);
228
229   g_object_get (sink,
230       "location", &res_location, "file-name", &res_file_name, NULL);
231
232   fail_unless (strncmp (res_location, location, strlen (location))
233       == 0);
234   fail_unless (strncmp (res_file_name, file_name, strlen (file_name))
235       == 0);
236
237   g_free (res_location);
238   g_free (res_file_name);
239
240   /* start playing */
241   ASSERT_SET_STATE (sink, GST_STATE_PLAYING, GST_STATE_CHANGE_ASYNC);
242   caps = gst_caps_from_string ("application/x-gst-check");
243   fail_unless (gst_pad_set_caps (srcpad, caps));
244
245   /* setup buffer */
246   test_set_and_play_buffer (file_content);
247
248   /* eos */
249   fail_unless (gst_pad_push_event (srcpad, gst_event_new_eos ()));
250   ASSERT_SET_STATE (sink, GST_STATE_NULL, GST_STATE_CHANGE_SUCCESS);
251
252   gst_caps_unref (caps);
253   cleanup_curlfilesink (sink);
254
255   /* verify file content */
256   test_verify_file_data ("/tmp", file_name, file_content);
257 }
258
259 GST_END_TEST;
260
261 GST_START_TEST (test_one_big_file)
262 {
263   GstElement *sink;
264   GstCaps *caps;
265   const gchar *location = "file:///tmp/";
266   gchar *file_name = g_strdup_printf ("curlfilesink_%d", g_random_int ());
267   const gchar *file_line1 = "line 1\r\n";
268   const gchar *file_line2 = "line 2\r\n";
269   const gchar *file_line3 = "line 3\r\n";
270   const gchar *expected_file_content = "line 1\r\n" "line 2\r\n" "line 3\r\n";
271   gchar *res_location = NULL;
272   gchar *res_file_name = NULL;
273
274   sink = setup_curlfilesink ();
275
276   g_object_set (G_OBJECT (sink), "location", location, NULL);
277   g_object_set (G_OBJECT (sink), "file-name", file_name, NULL);
278
279   g_object_get (sink,
280       "location", &res_location, "file-name", &res_file_name, NULL);
281
282   fail_unless (strncmp (res_location, location, strlen (location))
283       == 0);
284   fail_unless (strncmp (res_file_name, file_name, strlen (file_name))
285       == 0);
286
287   g_free (res_location);
288   g_free (res_file_name);
289
290   /* start playing */
291   ASSERT_SET_STATE (sink, GST_STATE_PLAYING, GST_STATE_CHANGE_ASYNC);
292   caps = gst_caps_from_string ("application/x-gst-check");
293   fail_unless (gst_pad_set_caps (srcpad, caps));
294
295   /* setup first buffer */
296   test_set_and_play_buffer (file_line1);
297
298   /* setup second buffer */
299   test_set_and_play_buffer (file_line2);
300
301   /* setup third buffer */
302   test_set_and_play_buffer (file_line3);
303
304   /* eos */
305   fail_unless (gst_pad_push_event (srcpad, gst_event_new_eos ()));
306   ASSERT_SET_STATE (sink, GST_STATE_NULL, GST_STATE_CHANGE_SUCCESS);
307
308   gst_caps_unref (caps);
309   cleanup_curlfilesink (sink);
310
311   /* verify file content */
312   test_verify_file_data ("/tmp", file_name, expected_file_content);
313 }
314
315 GST_END_TEST;
316
317 GST_START_TEST (test_two_files)
318 {
319   GstElement *sink;
320   GstCaps *caps;
321   const gchar *location = "file:///tmp/";
322   gchar *file_name1 = g_strdup_printf ("curlfilesink_%d", g_random_int ());
323   gchar *file_name2 = g_strdup_printf ("curlfilesink_%d", g_random_int ());
324   const gchar *file_content1 = "file content 1\r\n";
325   const gchar *file_content2 = "file content 2\r\n";
326   gchar *res_location = NULL;
327   gchar *res_file_name = NULL;
328
329   sink = setup_curlfilesink ();
330
331   g_object_set (G_OBJECT (sink), "location", location, NULL);
332   g_object_set (G_OBJECT (sink), "file-name", file_name1, NULL);
333
334   g_object_get (sink,
335       "location", &res_location, "file-name", &res_file_name, NULL);
336
337   fail_unless (strncmp (res_location, location, strlen (location))
338       == 0);
339   fail_unless (strncmp (res_file_name, file_name1, strlen (file_name1))
340       == 0);
341
342   g_free (res_location);
343   g_free (res_file_name);
344
345   /* start playing */
346   ASSERT_SET_STATE (sink, GST_STATE_PLAYING, GST_STATE_CHANGE_ASYNC);
347   caps = gst_caps_from_string ("application/x-gst-check");
348   fail_unless (gst_pad_set_caps (srcpad, caps));
349
350   /* setup first buffer - content of the first file */
351   test_set_and_play_buffer (file_content1);
352
353   g_object_set (G_OBJECT (sink), "file-name", file_name2, NULL);
354   g_object_get (sink, "file-name", &res_file_name, NULL);
355   fail_unless (strncmp (res_file_name, file_name2, strlen (file_name2))
356       == 0);
357   g_free (res_file_name);
358
359   /* setup second buffer - content of the second file */
360   test_set_and_play_buffer (file_content2);
361
362   /* eos */
363   fail_unless (gst_pad_push_event (srcpad, gst_event_new_eos ()));
364   ASSERT_SET_STATE (sink, GST_STATE_NULL, GST_STATE_CHANGE_SUCCESS);
365
366   gst_caps_unref (caps);
367   cleanup_curlfilesink (sink);
368
369   /* verify file contents of the first file */
370   test_verify_file_data ("/tmp", file_name1, file_content1);
371   test_verify_file_data ("/tmp", file_name2, file_content2);
372 }
373
374 GST_END_TEST;
375
376 GST_START_TEST (test_create_dirs)
377 {
378   GstElement *sink;
379   GstCaps *caps;
380   gchar *tmp_dir = g_strdup ("/tmp/curlfilesink_XXXXXX");
381   gchar *sub_dir;
382   gchar *sub_sub_dir;
383   gchar *location;
384   gchar *file_name = g_strdup_printf ("curlfilesink_%d", g_random_int ());
385   const gchar *file_content = "line 1\r\n";
386
387   /* create temp dir as base dir (mkdtemp saves dir name in tmp_dir) */
388   fail_unless (mkdtemp (tmp_dir) != NULL);
389
390   /* use sub-sub directory as location */
391   sub_dir = g_strdup_printf ("%s/a", tmp_dir);
392   sub_sub_dir = g_strdup_printf ("%s/b", sub_dir);
393   location = g_strdup_printf ("file://%s/", sub_sub_dir);
394
395   sink = setup_curlfilesink ();
396
397   g_object_set (G_OBJECT (sink), "location", location, NULL);
398   g_object_set (G_OBJECT (sink), "file-name", file_name, NULL);
399   g_object_set (G_OBJECT (sink), "create-dirs", TRUE, NULL);
400
401   /* start playing */
402   ASSERT_SET_STATE (sink, GST_STATE_PLAYING, GST_STATE_CHANGE_ASYNC);
403   caps = gst_caps_from_string ("application/x-gst-check");
404   fail_unless (gst_pad_set_caps (srcpad, caps));
405
406   /* setup buffer */
407   test_set_and_play_buffer (file_content);
408
409   /* eos */
410   fail_unless (gst_pad_push_event (srcpad, gst_event_new_eos ()));
411   ASSERT_SET_STATE (sink, GST_STATE_NULL, GST_STATE_CHANGE_SUCCESS);
412
413   gst_caps_unref (caps);
414   cleanup_curlfilesink (sink);
415
416   /* verify file content in sub-sub dir created by sink */
417   test_verify_file_data (sub_sub_dir, file_name, file_content);
418
419   /* remove directories */
420   fail_unless (g_rmdir (sub_sub_dir) == 0);
421   fail_unless (g_rmdir (sub_dir) == 0);
422   fail_unless (g_rmdir (tmp_dir) == 0);
423   g_free (sub_sub_dir);
424   g_free (sub_dir);
425   g_free (tmp_dir);
426 }
427
428 GST_END_TEST;
429
430 GST_START_TEST (test_missing_path)
431 {
432   GstElement *sink;
433   GstCaps *caps;
434   const gchar *location = "file:///missing/path/";
435   gchar *file_name = g_strdup_printf ("curlfilesink_%d", g_random_int ());
436   const gchar *file_content = "line 1\r\n";
437   gchar *res_location = NULL;
438   gchar *res_file_name = NULL;
439
440   sink = setup_curlfilesink ();
441
442   g_object_set (G_OBJECT (sink), "location", location, NULL);
443   g_object_set (G_OBJECT (sink), "file-name", file_name, NULL);
444
445   g_object_get (sink,
446       "location", &res_location, "file-name", &res_file_name, NULL);
447
448   fail_unless (strncmp (res_location, location, strlen (location))
449       == 0);
450   fail_unless (strncmp (res_file_name, file_name, strlen (file_name))
451       == 0);
452
453   g_free (res_location);
454   g_free (res_file_name);
455
456   /* start playing */
457   ASSERT_SET_STATE (sink, GST_STATE_PLAYING, GST_STATE_CHANGE_ASYNC);
458   caps = gst_caps_from_string ("application/x-gst-check");
459   fail_unless (gst_pad_set_caps (srcpad, caps));
460
461   /* setup & play buffer which should fail due to the missing path */
462   test_set_and_fail_to_play_buffer (file_content);
463
464   /* eos */
465   fail_unless (gst_pad_push_event (srcpad, gst_event_new_eos ()));
466   ASSERT_SET_STATE (sink, GST_STATE_NULL, GST_STATE_CHANGE_SUCCESS);
467
468   gst_caps_unref (caps);
469   cleanup_curlfilesink (sink);
470 }
471
472 GST_END_TEST;
473
474 static Suite *
475 curlsink_suite (void)
476 {
477   Suite *s = suite_create ("curlfilesink");
478   TCase *tc_chain = tcase_create ("general");
479
480   suite_add_tcase (s, tc_chain);
481   tcase_set_timeout (tc_chain, 20);
482   tcase_add_test (tc_chain, test_properties);
483   tcase_add_test (tc_chain, test_one_file);
484   tcase_add_test (tc_chain, test_one_big_file);
485   tcase_add_test (tc_chain, test_two_files);
486   tcase_add_test (tc_chain, test_missing_path);
487   tcase_add_test (tc_chain, test_create_dirs);
488
489   return s;
490 }
491
492 GST_CHECK_MAIN (curlsink);