Add test_that_multisocketsink_and_socketsrc_preserve_meta
authorWilliam Manley <will@williammanley.net>
Mon, 3 Nov 2014 12:47:18 +0000 (12:47 +0000)
committerWim Taymans <wtaymans@redhat.com>
Sat, 14 Mar 2015 12:23:40 +0000 (13:23 +0100)
This test is in a seperate commit to the previous two because it depends
on and tests the functionality in both.

configure.ac
tests/check/Makefile.am
tests/check/pipelines/tcp.c

index f60dc0a..f3dab3d 100644 (file)
@@ -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([
index 0075a52..e34037d 100644 (file)
@@ -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)
index 997e4bd..08733b9 100644 (file)
 #include <gst/check/gstcheck.h>
 #include <gst/app/gstappsink.h>
 #include <gst/app/gstappsrc.h>
+#include <gst/net/gstnetcontrolmessagemeta.h>
+
+#ifdef HAVE_GIO_UNIX_2_0
+#include <gio/gunixfdmessage.h>
+#endif /*  HAVE_GIO_UNIX_2_0 */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
 
 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;
 }