rtpsession: Add test for collision on incoming packets
authorOlivier CrĂȘte <olivier.crete@collabora.com>
Wed, 23 Jan 2019 22:19:15 +0000 (17:19 -0500)
committerNicolas Dufresne <nicolas@ndufresne.ca>
Sat, 6 Jul 2019 14:23:20 +0000 (14:23 +0000)
Make sure that the collision is properly detected on incoming packets.

tests/check/elements/rtpsession.c

index 0057d89..b571df8 100644 (file)
@@ -1002,6 +1002,52 @@ GST_START_TEST (test_ssrc_collision_when_sending)
 
 GST_END_TEST;
 
+
+GST_START_TEST (test_ssrc_collision_when_receiving)
+{
+  SessionHarness *h = session_harness_new ();
+  GstBuffer *buf;
+  GstEvent *ev;
+  GSocketAddress *saddr;
+  gboolean had_collision = FALSE;
+
+  g_signal_connect (h->internal_session, "on-ssrc-collision",
+      G_CALLBACK (on_ssrc_collision_cb), &had_collision);
+
+  /* Push RTP buffer making our internal SSRC=0x12345678 */
+  buf = generate_test_buffer (0, 0x12345678);
+  fail_unless_equals_int (GST_FLOW_OK, session_harness_send_rtp (h, buf));
+
+  fail_unless (had_collision == FALSE);
+
+  /* Push SDES with identical SSRC as what we used to send RTP,
+     to create a collision */
+  buf = gst_rtcp_buffer_new (1400);
+  add_rtcp_sdes_packet (buf, 0x12345678, "test@foo.bar");
+  saddr = g_inet_socket_address_new_from_string ("127.0.0.1", 8080);
+  gst_buffer_add_net_address_meta (buf, saddr);
+  g_object_unref (saddr);
+  session_harness_recv_rtcp (h, buf);
+
+  fail_unless (had_collision == TRUE);
+
+  /* Verify the packet we just sent is not being boomeranged back to us
+     as a received packet! */
+  fail_unless_equals_int (0, gst_harness_buffers_in_queue (h->recv_rtp_h));
+
+  while ((ev = gst_harness_try_pull_upstream_event (h->send_rtp_h)) != NULL) {
+    if (GST_EVENT_CUSTOM_UPSTREAM == GST_EVENT_TYPE (ev))
+      break;
+    gst_event_unref (ev);
+  }
+  fail_unless (ev != NULL);
+  gst_event_unref (ev);
+
+  session_harness_free (h);
+}
+
+GST_END_TEST;
+
 GST_START_TEST (test_request_fir)
 {
   SessionHarness *h = session_harness_new ();
@@ -2003,6 +2049,7 @@ rtpsession_suite (void)
   tcase_add_test (tc_chain, test_dont_lock_on_stats);
   tcase_add_test (tc_chain, test_ignore_suspicious_bye);
   tcase_add_test (tc_chain, test_ssrc_collision_when_sending);
+  tcase_add_test (tc_chain, test_ssrc_collision_when_receiving);
   tcase_add_test (tc_chain, test_request_fir);
   tcase_add_test (tc_chain, test_request_pli);
   tcase_add_test (tc_chain, test_request_nack);