From ccd4472e2aaa5315873461c689febd98880879d0 Mon Sep 17 00:00:00 2001 From: William Manley Date: Mon, 3 Nov 2014 12:47:18 +0000 Subject: [PATCH] Add test_that_multisocketsink_and_socketsrc_preserve_meta This test is in a seperate commit to the previous two because it depends on and tests the functionality in both. --- configure.ac | 6 ++ tests/check/Makefile.am | 10 +++- tests/check/pipelines/tcp.c | 108 +++++++++++++++++++++++++++++++++--- 3 files changed, 113 insertions(+), 11 deletions(-) diff --git a/configure.ac b/configure.ac index f60dc0af64..f3dab3d275 100644 --- a/configure.ac +++ b/configure.ac @@ -703,6 +703,12 @@ AG_GST_CHECK_FEATURE(VORBIS, [Xiph Vorbis audio codec], vorbis, [ AG_GST_PKG_CHECK_MODULES(VORBIS, vorbis >= 1.0 vorbisenc >= 1.0) ]) +dnl *** gio-unix-2.0 for tests/check/pipelines/tcp.c *** +translit(dnm, m, l) AM_CONDITIONAL(USE_GIO_UNIX_2_0, true) +AG_GST_CHECK_FEATURE(GIO_UNIX_2_0, [glib GIO unix], gio-unix-2.0, [ + AG_GST_PKG_CHECK_MODULES(GIO_UNIX_2_0, gio-unix-2.0 >= 2.24) +]) + if test "x$HAVE_VORBIS" = "xyes"; then ac_cflags_save="$CFLAGS" AC_COMPILE_IFELSE([ diff --git a/tests/check/Makefile.am b/tests/check/Makefile.am index 0075a52775..e34037d438 100644 --- a/tests/check/Makefile.am +++ b/tests/check/Makefile.am @@ -593,9 +593,13 @@ libs_videoencoder_LDADD = \ elements_multisocketsink_CFLAGS = $(GIO_CFLAGS) $(AM_CFLAGS) elements_multisocketsink_LDADD = $(GIO_LIBS) $(LDADD) -pipelines_tcp_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GIO_CFLAGS) $(AM_CFLAGS) -pipelines_tcp_LDADD = $(GST_PLUGINS_BASE_LIBS) $(GIO_LIBS) $(LDADD) \ - $(top_builddir)/gst-libs/gst/app/libgstapp-@GST_API_VERSION@.la +if USE_GIO_UNIX_2_0 +GIO_UNIX_2_0_DEFINED=-DHAVE_GIO_UNIX_2_0=1 +endif + +pipelines_tcp_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_NET_CFLAGS) $(GIO_CFLAGS) $(GIO_UNIX_2_0_CFLAGS) $(GIO_UNIX_2_0_DEFINED) $(AM_CFLAGS) +pipelines_tcp_LDADD = $(GST_PLUGINS_BASE_LIBS) $(GST_NET_LIBS) $(GIO_LIBS) $(LDADD) \ + $(GIO_UNIX_2_0_LIBS) $(top_builddir)/gst-libs/gst/app/libgstapp-@GST_API_VERSION@.la pipelines_gio_CFLAGS = $(GIO_CFLAGS) $(AM_CFLAGS) pipelines_gio_LDADD = $(GIO_LIBS) $(LDADD) diff --git a/tests/check/pipelines/tcp.c b/tests/check/pipelines/tcp.c index 997e4bda57..08733b9448 100644 --- a/tests/check/pipelines/tcp.c +++ b/tests/check/pipelines/tcp.c @@ -25,6 +25,15 @@ #include #include #include +#include + +#ifdef HAVE_GIO_UNIX_2_0 +#include +#endif /* HAVE_GIO_UNIX_2_0 */ + +#include +#include +#include static gboolean g_socketpair (GSocketFamily family, GSocketType type, GSocketProtocol protocol, @@ -139,29 +148,34 @@ g_socketpair (GSocketFamily family, GSocketType type, GSocketProtocol protocol, return TRUE; } -GST_START_TEST (test_that_socketsrc_and_multisocketsink_are_symmetrical) +static void +setup_multisocketsink_and_socketsrc (SymmetryTest * st) { - SymmetryTest st = { 0 }; GSocket *sockets[2] = { NULL, NULL }; GError *err = NULL; - st.sink = gst_check_setup_element ("multisocketsink"); - st.src = gst_check_setup_element ("socketsrc"); + st->sink = gst_check_setup_element ("multisocketsink"); + st->src = gst_check_setup_element ("socketsrc"); fail_unless (g_socketpair (G_SOCKET_FAMILY_UNIX, G_SOCKET_TYPE_STREAM | SOCK_CLOEXEC, G_SOCKET_PROTOCOL_DEFAULT, sockets, &err)); - g_object_set (st.src, "socket", sockets[0], NULL); + g_object_set (st->src, "socket", sockets[0], NULL); g_object_unref (sockets[0]); sockets[0] = NULL; - symmetry_test_setup (&st, st.sink, st.src); + symmetry_test_setup (st, st->sink, st->src); - g_signal_emit_by_name (st.sink, "add", sockets[1], NULL); + g_signal_emit_by_name (st->sink, "add", sockets[1], NULL); g_object_unref (sockets[1]); sockets[1] = NULL; +} +GST_START_TEST (test_that_socketsrc_and_multisocketsink_are_symmetrical) +{ + SymmetryTest st = { 0 }; + setup_multisocketsink_and_socketsrc (&st); symmetry_test_assert_passthrough (&st, gst_buffer_new_wrapped (g_strdup ("hello"), 5)); symmetry_test_teardown (&st); @@ -265,7 +279,81 @@ GST_START_TEST (test_that_we_can_provide_new_socketsrc_sockets_during_signal) gst_object_unref (pipeline); } -GST_END_TEST static Suite * +GST_END_TEST + +#ifdef HAVE_GIO_UNIX_2_0 +static GSocketControlMessage * +get_control_message_meta (GstBuffer * buf) +{ + GstMeta *meta; + gpointer iter_state = NULL; + + while ((meta = gst_buffer_iterate_meta (buf, &iter_state)) != NULL) { + if (meta->info->api == GST_NET_CONTROL_MESSAGE_META_API_TYPE) + return ((GstNetControlMessageMeta *) meta)->message; + } + fail ("Expected GSocketControlMessage attached to buffer"); + return NULL; +} + + +GST_START_TEST (test_that_multisocketsink_and_socketsrc_preserve_meta) +{ + GstBuffer *buf; + GSocketControlMessage *msg; + SymmetryTest st = { 0 }; + char tmpfilename[] = "/tmp/tcp-test.XXXXXX"; + GstSample *out; + int orig_fd, *new_fds, new_fds_len; + struct stat orig_stat, new_stat; + + setup_multisocketsink_and_socketsrc (&st); + + orig_fd = mkstemp (tmpfilename); + fail_unless (orig_fd > 0); + fail_unless (unlink (tmpfilename) == 0); + fstat (orig_fd, &orig_stat); + + msg = g_unix_fd_message_new (); + fail_unless (g_unix_fd_message_append_fd ((GUnixFDMessage *) msg, orig_fd, + NULL)); + close (orig_fd); + orig_fd = -1; + + buf = gst_buffer_new_wrapped (g_strdup ("hello"), 5); + gst_buffer_add_net_control_message_meta (buf, msg); + g_clear_object (&msg); + + fail_unless (gst_app_src_push_buffer (st.sink_src, buf) == GST_FLOW_OK); + buf = NULL; + + out = gst_app_sink_pull_sample (st.src_sink); + fail_unless (out != NULL); + + fail_unless (gst_buffer_get_size (gst_sample_get_buffer (out)) == 5); + fail_unless (gst_buffer_memcmp (gst_sample_get_buffer (out), 0, "hello", + 5) == 0); + + msg = get_control_message_meta (gst_sample_get_buffer (out)); + fail_unless (g_socket_control_message_get_msg_type (msg) == SCM_RIGHTS); + new_fds = g_unix_fd_message_steal_fds ((GUnixFDMessage *) msg, &new_fds_len); + fail_unless (new_fds_len == 1); + + fstat (new_fds[0], &new_stat); + fail_unless (orig_stat.st_ino, new_stat.st_ino); + + close (new_fds[0]); + g_free (new_fds); + + gst_sample_unref (out); + + symmetry_test_teardown (&st); +} + +GST_END_TEST; +#endif /* HAVE_GIO_UNIX_2_0 */ + +static Suite * socketintegrationtest_suite (void) { Suite *s = suite_create ("socketintegrationtest"); @@ -280,6 +368,10 @@ socketintegrationtest_suite (void) test_that_tcpserversink_and_tcpclientsrc_are_symmetrical); tcase_add_test (tc_chain, test_that_we_can_provide_new_socketsrc_sockets_during_signal); +#ifdef HAVE_GIO_UNIX_2_0 + tcase_add_test (tc_chain, + test_that_multisocketsink_and_socketsrc_preserve_meta); +#endif /* HAVE_GIO_UNIX_2_0 */ return s; }