summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--tests/check/Makefile.am11
-rw-r--r--tests/check/main/rtpsendcodecs.c323
3 files changed, 334 insertions, 1 deletions
diff --git a/.gitignore b/.gitignore
index 5bf791d9..0818709f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -42,6 +42,7 @@ tests/check/transmitter/rawudp
tests/check/transmitter/multicast
tests/check/main/rtpconference
tests/check/main/rtpcodecs
+tests/check/main/rtpsendcodecs
tests/check/utils/binadded
tests/rtp/codec-discovery
tests/gui/*.pyo
diff --git a/tests/check/Makefile.am b/tests/check/Makefile.am
index c260b677..46c58ff2 100644
--- a/tests/check/Makefile.am
+++ b/tests/check/Makefile.am
@@ -14,7 +14,7 @@ TESTS_ENVIRONMENT = \
# ths core dumps of some machines have PIDs appended
-CLEANFILES = core.* test-registry.xml
+CLEANFILES = core* test-registry.xml
clean-local: clean-local-check
@@ -37,6 +37,7 @@ check_PROGRAMS = \
transmitter/multicast \
main/rtpconference \
main/rtpcodecs \
+ main/rtpsendcodecs \
utils/binadded
@@ -90,6 +91,14 @@ main_rtpcodecs_SOURCES = \
main/rtpcodecs.c
+main_rtpsendcodecs_LDADD = $(LDADD) \
+ $(top_builddir)/gst-libs/gst/farsight/libgstfarsight-0.10.la \
+ -lgstrtp-0.10
+main_rtpsendcodecs_CFLAGS = $(FS2_INTERNAL_CFLAGS) $(CFLAGS) $(AM_CFLAGS)
+main_rtpsendcodecs_SOURCES = \
+ main/generic.c \
+ main/generic.h \
+ main/rtpsendcodecs.c
utils_binadded_LDADD = $(LDADD) \
diff --git a/tests/check/main/rtpsendcodecs.c b/tests/check/main/rtpsendcodecs.c
new file mode 100644
index 00000000..3e4d24b5
--- /dev/null
+++ b/tests/check/main/rtpsendcodecs.c
@@ -0,0 +1,323 @@
+/* Farsight 2 unit tests for FsRtpConference
+ *
+ * Copyright (C) 2007 Collabora, Nokia
+ * @author: Olivier Crete <olivier.crete@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <gst/check/gstcheck.h>
+#include <gst/rtp/gstrtpbuffer.h>
+
+#include <gst/farsight/fs-conference-iface.h>
+
+#include "check-threadsafe.h"
+#include "generic.h"
+
+GMainLoop *loop = NULL;
+
+guint dtmf_id = 0;
+
+struct SimpleTestConference *dat = NULL;
+
+static gboolean
+_start_pipeline (gpointer user_data)
+{
+ struct SimpleTestConference *dat = user_data;
+
+ g_debug ("%d: Starting pipeline", dat->id);
+
+ ts_fail_if (gst_element_set_state (dat->pipeline, GST_STATE_PLAYING) ==
+ GST_STATE_CHANGE_FAILURE, "Could not set the pipeline to playing");
+
+ dat->started = TRUE;
+
+ return FALSE;
+}
+
+
+static gboolean
+_bus_callback (GstBus *bus, GstMessage *message, gpointer user_data)
+{
+ struct SimpleTestConference *dat = user_data;
+
+ switch (GST_MESSAGE_TYPE (message))
+ {
+ case GST_MESSAGE_ELEMENT:
+ if (gst_implements_interface_check (GST_MESSAGE_SRC (message),
+ FS_TYPE_CONFERENCE))
+ {
+ const GValue *errorvalue, *debugvalue;
+ gint errno;
+
+ gst_structure_get_int (message->structure, "error-no", &errno);
+ errorvalue = gst_structure_get_value (message->structure, "error-msg");
+ debugvalue = gst_structure_get_value (message->structure, "debug-msg");
+
+ ts_fail ("Error on BUS (%d) %s .. %s", errno,
+ g_value_get_string (errorvalue),
+ g_value_get_string (debugvalue));
+ }
+
+ break;
+ case GST_MESSAGE_ERROR:
+ {
+ GError *error = NULL;
+ gchar *debug = NULL;
+ gst_message_parse_error (message, &error, &debug);
+
+ ts_fail ("Got an error on the BUS (%d): %s (%s)", error->code,
+ error->message, debug);
+ g_error_free (error);
+ g_free (debug);
+ }
+ break;
+ case GST_MESSAGE_WARNING:
+ {
+ GError *error = NULL;
+ gchar *debug = NULL;
+ gst_message_parse_warning (message, &error, &debug);
+
+ g_debug ("%d: Got a warning on the BUS (%d): %s (%s)", dat->id,
+ error->code,
+ error->message, debug);
+ g_error_free (error);
+ g_free (debug);
+ }
+ break;
+ default:
+ break;
+ }
+
+ return TRUE;
+}
+
+static GstElement *
+build_recv_pipeline (GCallback handoff_handler, gpointer data, gint *port)
+{
+ GstElement *pipeline;
+ GstElement *src;
+ GstElement *sink;
+
+ pipeline = gst_pipeline_new (NULL);
+
+ src = gst_element_factory_make ("udpsrc", NULL);
+ sink = gst_element_factory_make ("fakesink", NULL);
+
+ ts_fail_unless (pipeline && src && sink, "Could not make pipeline(%p)"
+ " or src(%p) or sink(%p)", pipeline, src, sink);
+
+ gst_bin_add_many (GST_BIN (pipeline), src, sink, NULL);
+
+ ts_fail_unless (gst_element_link (src, sink), "Could not link udpsrc"
+ " and fakesink");
+
+ g_signal_connect (sink, "handoff", handoff_handler, data);
+
+ ts_fail_if (gst_element_set_state (pipeline, GST_STATE_PLAYING) ==
+ GST_STATE_CHANGE_FAILURE, "Could not start recv pipeline");
+
+ g_object_get (G_OBJECT (src), "port", port, NULL);
+
+ return pipeline;
+}
+
+static void
+set_codecs (struct SimpleTestConference *dat, FsStream *stream)
+{
+ GList *local_codecs = NULL;
+ GList *filtered_codecs = NULL;
+ GList *item = NULL;
+ GError *error = NULL;
+
+ g_object_get (dat->session, "local-codecs", &local_codecs, NULL);
+
+ ts_fail_if (local_codecs == NULL, "Could not get the local codecs");
+
+ for (item = g_list_first (local_codecs); item; item = g_list_next (item))
+ {
+ FsCodec *codec = item->data;
+ if (codec->id == 0 || codec->id == 8)
+ {
+ filtered_codecs = g_list_append (filtered_codecs, codec);
+ }
+ else if (codec->clock_rate == 8000 &&
+ !g_strcasecmp (codec->encoding_name, "telephone-event"))
+ {
+ ts_fail_unless (dtmf_id == 0, "More than one copy of telephon-event");
+ dtmf_id = codec->id;
+ filtered_codecs = g_list_append (filtered_codecs, codec);
+ }
+ }
+
+ ts_fail_if (filtered_codecs == NULL, "PCMA and PCMU are not in the codecs"
+ " you must install gst-plugins-good");
+
+
+ if (!fs_stream_set_remote_codecs (stream, filtered_codecs, &error))
+ {
+ if (error)
+ ts_fail ("Could not set the remote codecs on stream (%d): %s",
+ error->code,
+ error->message);
+ else
+ ts_fail ("Could not set the remote codecs on stream"
+ " and we did NOT get a GError!!");
+ }
+}
+
+static void
+one_way (GCallback handoff_handler, gpointer data)
+{
+ FsStream *stream = NULL;
+ FsParticipant *participant = NULL;
+ GError *error = NULL;
+ gint port = 0;
+ GstElement *recv_pipeline;
+ FsCandidate *candidate = NULL;
+ GstBus *bus = NULL;
+
+ loop = g_main_loop_new (NULL, FALSE);
+
+ dat = setup_simple_conference (1, "fsrtpconference", "tester@123445");
+
+ bus = gst_element_get_bus (dat->pipeline);
+ gst_bus_add_watch (bus, _bus_callback, dat);
+ gst_object_unref (bus);
+
+ g_idle_add (_start_pipeline, dat);
+
+ participant = fs_conference_new_participant (
+ FS_CONFERENCE (dat->conference), "blob@blob.com", &error);
+ if (error)
+ ts_fail ("Error while creating new participant (%d): %s",
+ error->code, error->message);
+ ts_fail_if (dat->session == NULL,
+ "Could not make participant, but no GError!");
+
+ stream = fs_session_new_stream (dat->session, participant,
+ FS_DIRECTION_SEND, "rawudp", 0, NULL, &error);
+ if (error)
+ ts_fail ("Error while creating new stream (%d): %s",
+ error->code, error->message);
+ ts_fail_if (stream == NULL, "Could not make stream, but no GError!");
+
+ recv_pipeline = build_recv_pipeline (handoff_handler, NULL, &port);
+
+ g_debug ("port is %d", port);
+
+ candidate = fs_candidate_new ("1", FS_COMPONENT_RTP, FS_CANDIDATE_TYPE_HOST,
+ FS_NETWORK_PROTOCOL_UDP, "127.0.0.1", port);
+
+ ts_fail_unless (fs_stream_add_remote_candidate (stream, candidate, &error),
+ "Could not set remote candidate");
+ fs_stream_remote_candidates_added (stream);
+
+ set_codecs (dat, stream);
+
+ g_main_loop_run (loop);
+
+ gst_element_set_state (dat->pipeline, GST_STATE_NULL);
+ gst_element_set_state (recv_pipeline, GST_STATE_NULL);
+
+ cleanup_simple_conference (dat);
+ gst_object_unref (recv_pipeline);
+
+ g_main_loop_unref (loop);
+}
+
+gint digit = 1;
+gboolean sending = FALSE;
+
+static void
+send_dmtf_handoff_handler (GstElement *fakesink, GstBuffer *buf, GstPad *pad,
+ gpointer user_data)
+{
+ gchar *data;
+
+ ts_fail_unless (gst_rtp_buffer_validate (buf), "Buffer is not valid rtp");
+
+ data = gst_rtp_buffer_get_payload (buf);
+
+ ts_fail_if (data[0] != digit, "Not sending the right digit");
+
+
+}
+
+static gboolean
+start_stop_sending_dtmf (gpointer data)
+{
+
+ if (!dat || !dat->session)
+ return TRUE;
+
+ if (sending)
+ {
+ ts_fail_unless (fs_session_stop_telephony_event (dat->session,
+ FS_DTMF_METHOD_RTP_RFC4733), "Could not stop telephony event");
+ sending = FALSE;
+
+ if (digit > FS_DTMF_EVENT_D)
+ {
+ digit = 1;
+ g_main_loop_quit (loop);
+ return FALSE;
+ }
+ }
+ else
+ {
+ digit++;
+
+ ts_fail_unless (fs_session_start_telephony_event (dat->session,
+ digit, digit, FS_DTMF_METHOD_RTP_RFC4733),
+ "Could not start telephony event");
+ sending = TRUE;
+ }
+
+ return TRUE;
+}
+
+GST_START_TEST (test_senddtmf_event)
+{
+ g_timeout_add (200, start_stop_sending_dtmf, NULL);
+ one_way (G_CALLBACK (send_dmtf_handoff_handler), NULL);
+}
+GST_END_TEST;
+
+
+static Suite *
+fsrtpsendcodecs_suite (void)
+{
+ Suite *s = suite_create ("fsrtpsendcodecs");
+ TCase *tc_chain;
+ GLogLevelFlags fatal_mask;
+
+ fatal_mask = g_log_set_always_fatal (G_LOG_FATAL_MASK);
+ fatal_mask |= G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL;
+ g_log_set_always_fatal (fatal_mask);
+
+
+ tc_chain = tcase_create ("fsrtpsenddtmf");
+ tcase_add_test (tc_chain, test_senddtmf_event);
+ suite_add_tcase (s, tc_chain);
+
+ return s;
+}
+
+GST_CHECK_MAIN (fsrtpsendcodecs);