diff options
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | tests/check/Makefile.am | 11 | ||||
-rw-r--r-- | tests/check/main/rtpsendcodecs.c | 323 |
3 files changed, 334 insertions, 1 deletions
@@ -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); |