2 * Unittest for curlfilesink
5 #include <gst/check/gstcheck.h>
6 #include <glib/gstdio.h>
10 static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
15 static GstPad *srcpad;
17 static GstElement *sink;
20 setup_curlfilesink (void)
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);
31 cleanup_curlfilesink (GstElement * sink)
33 GST_DEBUG ("cleanup_curlfilesink");
35 gst_check_teardown_src_pad (sink);
36 gst_check_teardown_element (sink);
40 test_verify_file_data (const gchar * dir, gchar * file_name,
41 const gchar * expected_file_content)
44 gchar *res_file_content = NULL;
47 path = g_strdup_printf ("%s/%s", dir, file_name);
50 if (!g_file_get_contents (path, &res_file_content, NULL, &err)) {
51 GST_WARNING ("Error loading file: %s (%s)", file_name, err->message);
55 fail_unless (res_file_content != NULL);
57 fail_unless (strncmp (res_file_content, expected_file_content,
58 strlen (expected_file_content)) == 0);
59 g_free (res_file_content);
65 test_set_and_play_buffer (const gchar * _data)
67 gpointer data = (gpointer) _data;
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));
77 fail_unless (gst_pad_push (srcpad, buffer) == GST_FLOW_OK);
81 test_set_and_fail_to_play_buffer (const gchar * _data)
83 gpointer data = (gpointer) _data;
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));
93 fail_unless (gst_pad_push (srcpad, buffer) == GST_FLOW_ERROR);
97 sebras_gst_pad_set_caps (GstPad * pad, GstCaps * caps)
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");
108 GST_WARNING ("sebraz: d");
109 res = gst_pad_set_caps (pad, caps);
110 GST_WARNING ("sebraz: e");
115 GST_START_TEST (test_properties)
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;
127 GST_WARNING ("sebras: a");
129 sink = setup_curlfilesink ();
130 GST_WARNING ("sebras: b");
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");
138 "location", &res_location,
139 "file-name", &res_file_name, "create-dirs", &res_create_dirs, NULL);
140 GST_WARNING ("sebras: d");
142 fail_unless (strncmp (res_location, "mylocation", strlen ("mylocation"))
144 GST_WARNING ("sebras: e");
145 fail_unless (strncmp (res_file_name, "myfile", strlen ("myfile"))
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");
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");
161 "location", &res_location,
162 "file-name", &res_file_name, "create-dirs", &res_create_dirs, NULL);
163 GST_WARNING ("sebras: j");
165 fail_unless (strncmp (res_location, location, strlen (location))
167 GST_WARNING ("sebras: k");
168 fail_unless (strncmp (res_file_name, file_name, strlen (file_name))
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");
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");
187 test_set_and_play_buffer (file_contents);
188 GST_WARNING ("sebras: r");
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);
194 /* verify that locaiton has not been altered */
195 fail_unless (strncmp (res_location, location, strlen (location))
197 g_free (res_location);
200 fail_unless (gst_pad_push_event (srcpad, gst_event_new_eos ()));
201 ASSERT_SET_STATE (sink, GST_STATE_NULL, GST_STATE_CHANGE_SUCCESS);
203 gst_caps_unref (caps);
204 cleanup_curlfilesink (sink);
206 path = g_strdup_printf ("/tmp/%s", file_name);
214 GST_START_TEST (test_one_file)
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;
224 sink = setup_curlfilesink ();
226 g_object_set (G_OBJECT (sink), "location", location, NULL);
227 g_object_set (G_OBJECT (sink), "file-name", file_name, NULL);
230 "location", &res_location, "file-name", &res_file_name, NULL);
232 fail_unless (strncmp (res_location, location, strlen (location))
234 fail_unless (strncmp (res_file_name, file_name, strlen (file_name))
237 g_free (res_location);
238 g_free (res_file_name);
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));
246 test_set_and_play_buffer (file_content);
249 fail_unless (gst_pad_push_event (srcpad, gst_event_new_eos ()));
250 ASSERT_SET_STATE (sink, GST_STATE_NULL, GST_STATE_CHANGE_SUCCESS);
252 gst_caps_unref (caps);
253 cleanup_curlfilesink (sink);
255 /* verify file content */
256 test_verify_file_data ("/tmp", file_name, file_content);
261 GST_START_TEST (test_one_big_file)
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;
274 sink = setup_curlfilesink ();
276 g_object_set (G_OBJECT (sink), "location", location, NULL);
277 g_object_set (G_OBJECT (sink), "file-name", file_name, NULL);
280 "location", &res_location, "file-name", &res_file_name, NULL);
282 fail_unless (strncmp (res_location, location, strlen (location))
284 fail_unless (strncmp (res_file_name, file_name, strlen (file_name))
287 g_free (res_location);
288 g_free (res_file_name);
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));
295 /* setup first buffer */
296 test_set_and_play_buffer (file_line1);
298 /* setup second buffer */
299 test_set_and_play_buffer (file_line2);
301 /* setup third buffer */
302 test_set_and_play_buffer (file_line3);
305 fail_unless (gst_pad_push_event (srcpad, gst_event_new_eos ()));
306 ASSERT_SET_STATE (sink, GST_STATE_NULL, GST_STATE_CHANGE_SUCCESS);
308 gst_caps_unref (caps);
309 cleanup_curlfilesink (sink);
311 /* verify file content */
312 test_verify_file_data ("/tmp", file_name, expected_file_content);
317 GST_START_TEST (test_two_files)
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;
329 sink = setup_curlfilesink ();
331 g_object_set (G_OBJECT (sink), "location", location, NULL);
332 g_object_set (G_OBJECT (sink), "file-name", file_name1, NULL);
335 "location", &res_location, "file-name", &res_file_name, NULL);
337 fail_unless (strncmp (res_location, location, strlen (location))
339 fail_unless (strncmp (res_file_name, file_name1, strlen (file_name1))
342 g_free (res_location);
343 g_free (res_file_name);
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));
350 /* setup first buffer - content of the first file */
351 test_set_and_play_buffer (file_content1);
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))
357 g_free (res_file_name);
359 /* setup second buffer - content of the second file */
360 test_set_and_play_buffer (file_content2);
363 fail_unless (gst_pad_push_event (srcpad, gst_event_new_eos ()));
364 ASSERT_SET_STATE (sink, GST_STATE_NULL, GST_STATE_CHANGE_SUCCESS);
366 gst_caps_unref (caps);
367 cleanup_curlfilesink (sink);
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);
376 GST_START_TEST (test_create_dirs)
380 gchar *tmp_dir = g_strdup ("/tmp/curlfilesink_XXXXXX");
384 gchar *file_name = g_strdup_printf ("curlfilesink_%d", g_random_int ());
385 const gchar *file_content = "line 1\r\n";
387 /* create temp dir as base dir (mkdtemp saves dir name in tmp_dir) */
388 fail_unless (mkdtemp (tmp_dir) != NULL);
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);
395 sink = setup_curlfilesink ();
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);
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));
407 test_set_and_play_buffer (file_content);
410 fail_unless (gst_pad_push_event (srcpad, gst_event_new_eos ()));
411 ASSERT_SET_STATE (sink, GST_STATE_NULL, GST_STATE_CHANGE_SUCCESS);
413 gst_caps_unref (caps);
414 cleanup_curlfilesink (sink);
416 /* verify file content in sub-sub dir created by sink */
417 test_verify_file_data (sub_sub_dir, file_name, file_content);
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);
430 GST_START_TEST (test_missing_path)
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;
440 sink = setup_curlfilesink ();
442 g_object_set (G_OBJECT (sink), "location", location, NULL);
443 g_object_set (G_OBJECT (sink), "file-name", file_name, NULL);
446 "location", &res_location, "file-name", &res_file_name, NULL);
448 fail_unless (strncmp (res_location, location, strlen (location))
450 fail_unless (strncmp (res_file_name, file_name, strlen (file_name))
453 g_free (res_location);
454 g_free (res_file_name);
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));
461 /* setup & play buffer which should fail due to the missing path */
462 test_set_and_fail_to_play_buffer (file_content);
465 fail_unless (gst_pad_push_event (srcpad, gst_event_new_eos ()));
466 ASSERT_SET_STATE (sink, GST_STATE_NULL, GST_STATE_CHANGE_SUCCESS);
468 gst_caps_unref (caps);
469 cleanup_curlfilesink (sink);
475 curlsink_suite (void)
477 Suite *s = suite_create ("curlfilesink");
478 TCase *tc_chain = tcase_create ("general");
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);
492 GST_CHECK_MAIN (curlsink);