Index: webrtc/call/rtp_demuxer_unittest.cc |
diff --git a/webrtc/call/rtp_demuxer_unittest.cc b/webrtc/call/rtp_demuxer_unittest.cc |
index f9196caef2e689e06dea5e3e7bbf2ea8e14ce17c..a2b4578a71a02a32d5d9ef58c2a920d9fea8b7f0 100644 |
--- a/webrtc/call/rtp_demuxer_unittest.cc |
+++ b/webrtc/call/rtp_demuxer_unittest.cc |
@@ -76,17 +76,6 @@ |
return packet; |
} |
-TEST(RtpDemuxerTest, CanAddSinkBySsrc) { |
- RtpDemuxer demuxer; |
- MockRtpPacketSink sink; |
- constexpr uint32_t ssrc = 1; |
- |
- EXPECT_TRUE(demuxer.AddSink(ssrc, &sink)); |
- |
- // Test tear-down |
- demuxer.RemoveSink(&sink); |
-} |
- |
TEST(RtpDemuxerTest, OnRtpPacketCalledOnCorrectSinkBySsrc) { |
RtpDemuxer demuxer; |
@@ -153,6 +142,29 @@ |
// Test tear-down |
demuxer.RemoveSink(&sink); |
+} |
+ |
+TEST(RtpDemuxerTest, MultipleSinksMappedToSameSsrc) { |
+ RtpDemuxer demuxer; |
+ |
+ MockRtpPacketSink sinks[3]; |
+ constexpr uint32_t ssrc = 404; |
+ for (auto& sink : sinks) { |
+ demuxer.AddSink(ssrc, &sink); |
+ } |
+ |
+ // Reception of an RTP packet associated with the shared SSRC triggers the |
+ // callback on all of the sinks associated with it. |
+ auto packet = CreateRtpPacketReceived(ssrc); |
+ for (auto& sink : sinks) { |
+ EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))); |
+ } |
+ EXPECT_TRUE(demuxer.OnRtpPacket(*packet)); |
+ |
+ // Test tear-down |
+ for (const auto& sink : sinks) { |
+ demuxer.RemoveSink(&sink); |
+ } |
} |
TEST(RtpDemuxerTest, SinkMappedToMultipleSsrcs) { |
@@ -212,62 +224,14 @@ |
EXPECT_FALSE(demuxer.OnRtpPacket(*packet)); |
} |
-TEST(RtpDemuxerTest, AddSinkFailsIfCalledForTwoSinks) { |
- RtpDemuxer demuxer; |
- MockRtpPacketSink sink_a; |
- MockRtpPacketSink sink_b; |
- constexpr uint32_t ssrc = 1; |
- ASSERT_TRUE(demuxer.AddSink(ssrc, &sink_a)); |
- |
- EXPECT_FALSE(demuxer.AddSink(ssrc, &sink_b)); |
- |
- // Test tear-down |
- demuxer.RemoveSink(&sink_a); |
-} |
- |
-// An SSRC may only be mapped to a single sink. However, since configuration |
-// of this associations might come from the network, we need to fail gracefully. |
-TEST(RtpDemuxerTest, OnlyOneSinkPerSsrcGetsOnRtpPacketTriggered) { |
- RtpDemuxer demuxer; |
- |
- MockRtpPacketSink sinks[3]; |
- constexpr uint32_t ssrc = 404; |
- ASSERT_TRUE(demuxer.AddSink(ssrc, &sinks[0])); |
- ASSERT_FALSE(demuxer.AddSink(ssrc, &sinks[1])); |
- ASSERT_FALSE(demuxer.AddSink(ssrc, &sinks[2])); |
- |
- // The first sink associated with the SSRC remains active; other sinks |
- // were not really added, and so do not get OnRtpPacket() called. |
- auto packet = CreateRtpPacketReceived(ssrc); |
- EXPECT_CALL(sinks[0], OnRtpPacket(SamePacketAs(*packet))).Times(1); |
- EXPECT_CALL(sinks[1], OnRtpPacket(_)).Times(0); |
- EXPECT_CALL(sinks[2], OnRtpPacket(_)).Times(0); |
- ASSERT_TRUE(demuxer.OnRtpPacket(*packet)); |
- |
- // Test tear-down |
- demuxer.RemoveSink(&sinks[0]); |
-} |
- |
-TEST(RtpDemuxerTest, AddSinkFailsIfCalledTwiceEvenIfSameSink) { |
- RtpDemuxer demuxer; |
- MockRtpPacketSink sink; |
- constexpr uint32_t ssrc = 1; |
- ASSERT_TRUE(demuxer.AddSink(ssrc, &sink)); |
- |
- EXPECT_FALSE(demuxer.AddSink(ssrc, &sink)); |
- |
- // Test tear-down |
- demuxer.RemoveSink(&sink); |
-} |
- |
-TEST(RtpDemuxerTest, NoRepeatedCallbackOnRepeatedAddSinkForSameSink) { |
+TEST(RtpDemuxerTest, RepeatedSsrcAssociationsDoNotTriggerRepeatedCallbacks) { |
RtpDemuxer demuxer; |
constexpr uint32_t ssrc = 111; |
MockRtpPacketSink sink; |
- ASSERT_TRUE(demuxer.AddSink(ssrc, &sink)); |
- ASSERT_FALSE(demuxer.AddSink(ssrc, &sink)); |
+ demuxer.AddSink(ssrc, &sink); |
+ demuxer.AddSink(ssrc, &sink); |
auto packet = CreateRtpPacketReceived(ssrc); |
EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1); |
@@ -463,6 +427,31 @@ |
demuxer.RemoveSink(&sink); |
} |
+TEST(RtpDemuxerTest, RsidUsedByMultipleSinks) { |
+ RtpDemuxer demuxer; |
+ |
+ MockRtpPacketSink sinks[3]; |
+ const std::string shared_rsid = "a"; |
+ |
+ for (MockRtpPacketSink& sink : sinks) { |
+ demuxer.AddSink(shared_rsid, &sink); |
+ } |
+ |
+ constexpr uint32_t shared_ssrc = 888; |
+ auto packet = CreateRtpPacketReceivedWithRsid(shared_rsid, shared_ssrc); |
+ |
+ for (auto& sink : sinks) { |
+ EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1); |
+ } |
+ |
+ EXPECT_TRUE(demuxer.OnRtpPacket(*packet)); |
+ |
+ // Test tear-down |
+ for (MockRtpPacketSink& sink : sinks) { |
+ demuxer.RemoveSink(&sink); |
+ } |
+} |
+ |
TEST(RtpDemuxerTest, SinkWithBothRsidAndSsrcAssociations) { |
RtpDemuxer demuxer; |
@@ -507,15 +496,11 @@ |
demuxer.RemoveSink(&sink); |
} |
-TEST(RtpDemuxerTest, RsidObserversInformedOfResolutionsOfTrackedRsids) { |
+TEST(RtpDemuxerTest, RsidObserversInformedOfResolutions) { |
RtpDemuxer demuxer; |
constexpr uint32_t ssrc = 111; |
const std::string rsid = "a"; |
- |
- // Only RSIDs which the demuxer knows may be resolved. |
- NiceMock<MockRtpPacketSink> sink; |
- demuxer.AddSink(rsid, &sink); |
MockRsidResolutionObserver rsid_resolution_observers[3]; |
for (auto& observer : rsid_resolution_observers) { |
@@ -530,112 +515,6 @@ |
for (auto& observer : rsid_resolution_observers) { |
demuxer.DeregisterRsidResolutionObserver(&observer); |
} |
- demuxer.RemoveSink(&sink); |
-} |
- |
-TEST(RtpDemuxerTest, RsidObserversNotInformedOfResolutionsOfUntrackedRsids) { |
- RtpDemuxer demuxer; |
- |
- constexpr uint32_t ssrc = 111; |
- const std::string rsid = "a"; |
- |
- MockRsidResolutionObserver rsid_resolution_observers[3]; |
- for (auto& observer : rsid_resolution_observers) { |
- demuxer.RegisterRsidResolutionObserver(&observer); |
- EXPECT_CALL(observer, OnRsidResolved(rsid, ssrc)).Times(0); |
- } |
- |
- // The expected calls to OnRsidResolved() will be triggered by this. |
- demuxer.OnRtpPacket(*CreateRtpPacketReceivedWithRsid(rsid, ssrc)); |
- |
- // Test tear-down |
- for (auto& observer : rsid_resolution_observers) { |
- demuxer.DeregisterRsidResolutionObserver(&observer); |
- } |
-} |
- |
-// If one sink is associated with SSRC x, and another sink with RSID y, we |
-// should never observe RSID x being resolved to SSRC x, or else we'd end |
-// up with one SSRC mapped to two sinks. However, if such faulty input |
-// ever reaches us, we should handle it gracefully - not crash, and keep the |
-// packets routed only to the SSRC sink. |
-TEST(RtpDemuxerTest, PacketFittingBothRsidSinkAndSsrcSinkGivenOnlyToSsrcSink) { |
- RtpDemuxer demuxer; |
- |
- constexpr uint32_t ssrc = 111; |
- MockRtpPacketSink ssrc_sink; |
- demuxer.AddSink(ssrc, &ssrc_sink); |
- |
- const std::string rsid = "a"; |
- MockRtpPacketSink rsid_sink; |
- demuxer.AddSink(rsid, &rsid_sink); |
- |
- auto packet = CreateRtpPacketReceivedWithRsid(rsid, ssrc); |
- EXPECT_CALL(ssrc_sink, OnRtpPacket(SamePacketAs(*packet))).Times(1); |
- EXPECT_CALL(rsid_sink, OnRtpPacket(SamePacketAs(*packet))).Times(0); |
- demuxer.OnRtpPacket(*packet); |
- |
- // Test tear-down |
- demuxer.RemoveSink(&ssrc_sink); |
- demuxer.RemoveSink(&rsid_sink); |
-} |
- |
-TEST(RtpDemuxerTest, |
- PacketFittingBothRsidSinkAndSsrcSinkDoesNotTriggerResolutionCallbacks) { |
- RtpDemuxer demuxer; |
- |
- constexpr uint32_t ssrc = 111; |
- NiceMock<MockRtpPacketSink> ssrc_sink; |
- demuxer.AddSink(ssrc, &ssrc_sink); |
- |
- const std::string rsid = "a"; |
- NiceMock<MockRtpPacketSink> rsid_sink; |
- demuxer.AddSink(rsid, &rsid_sink); |
- |
- MockRsidResolutionObserver observer; |
- demuxer.RegisterRsidResolutionObserver(&observer); |
- |
- auto packet = CreateRtpPacketReceivedWithRsid(rsid, ssrc); |
- EXPECT_CALL(observer, OnRsidResolved(_, _)).Times(0); |
- demuxer.OnRtpPacket(*packet); |
- |
- // Test tear-down |
- demuxer.RemoveSink(&ssrc_sink); |
- demuxer.RemoveSink(&rsid_sink); |
-} |
- |
-// We're not expecting RSIDs to be resolved to SSRCs which were previously |
-// mapped to sinks, and make no guarantees except for graceful handling. |
-TEST(RtpDemuxerTest, GracefullyHandleRsidBeingMappedToPrevouslyAssociatedSsrc) { |
- RtpDemuxer demuxer; |
- |
- constexpr uint32_t ssrc = 111; |
- NiceMock<MockRtpPacketSink> ssrc_sink; |
- demuxer.AddSink(ssrc, &ssrc_sink); |
- |
- const std::string rsid = "a"; |
- MockRtpPacketSink rsid_sink; |
- demuxer.AddSink(rsid, &rsid_sink); |
- |
- MockRsidResolutionObserver observer; |
- demuxer.RegisterRsidResolutionObserver(&observer); |
- |
- // The SSRC was mapped to an SSRC sink, but was even active (packets flowed |
- // over it). |
- auto packet = CreateRtpPacketReceivedWithRsid(rsid, ssrc); |
- demuxer.OnRtpPacket(*packet); |
- |
- // If the SSRC sink is ever removed, the RSID sink *might* receive indications |
- // of packets, and observers *might* be informed. Only graceful handling |
- // is guaranteed. |
- demuxer.RemoveSink(&ssrc_sink); |
- EXPECT_CALL(rsid_sink, OnRtpPacket(SamePacketAs(*packet))).Times(AtLeast(0)); |
- EXPECT_CALL(observer, OnRsidResolved(rsid, ssrc)).Times(AtLeast(0)); |
- demuxer.OnRtpPacket(*packet); |
- |
- // Test tear-down |
- demuxer.DeregisterRsidResolutionObserver(&observer); |
- demuxer.RemoveSink(&rsid_sink); |
} |
TEST(RtpDemuxerTest, DeregisteredRsidObserversNotInformedOfResolutions) { |
@@ -675,14 +554,12 @@ |
TEST(RtpDemuxerTest, RsidMustBeNonEmpty) { |
RtpDemuxer demuxer; |
MockRtpPacketSink sink; |
- |
EXPECT_DEATH(demuxer.AddSink("", &sink), ""); |
} |
TEST(RtpDemuxerTest, RsidMustBeAlphaNumeric) { |
RtpDemuxer demuxer; |
MockRtpPacketSink sink; |
- |
EXPECT_DEATH(demuxer.AddSink("a_3", &sink), ""); |
} |
@@ -690,45 +567,23 @@ |
RtpDemuxer demuxer; |
MockRtpPacketSink sink; |
std::string rsid(StreamId::kMaxSize + 1, 'a'); |
- |
EXPECT_DEATH(demuxer.AddSink(rsid, &sink), ""); |
} |
TEST(RtpDemuxerTest, RepeatedRsidAssociationsDisallowed) { |
RtpDemuxer demuxer; |
- MockRtpPacketSink sink_a; |
- MockRtpPacketSink sink_b; |
- |
- const std::string rsid = "a"; |
- demuxer.AddSink(rsid, &sink_a); |
- |
- EXPECT_DEATH(demuxer.AddSink(rsid, &sink_b), ""); |
- |
- // Test tear-down |
- demuxer.RemoveSink(&sink_a); |
-} |
- |
-TEST(RtpDemuxerTest, RepeatedRsidAssociationsDisallowedEvenIfSameSink) { |
- RtpDemuxer demuxer; |
- MockRtpPacketSink sink; |
- |
- const std::string rsid = "a"; |
- demuxer.AddSink(rsid, &sink); |
- |
- EXPECT_DEATH(demuxer.AddSink(rsid, &sink), ""); |
- |
- // Test tear-down |
- demuxer.RemoveSink(&sink); |
-} |
- |
-TEST(RtpDemuxerTest, DoubleRegisterationOfRsidResolutionObserverDisallowed) { |
+ MockRtpPacketSink sink; |
+ demuxer.AddSink("a", &sink); |
+ EXPECT_DEATH(demuxer.AddSink("a", &sink), ""); |
+ demuxer.RemoveSink(&sink); |
+} |
+ |
+TEST(RtpDemuxerTest, |
+ DoubleRegisterationOfNeverRegisteredRsidResolutionObserverDisallowed) { |
RtpDemuxer demuxer; |
MockRsidResolutionObserver observer; |
demuxer.RegisterRsidResolutionObserver(&observer); |
- |
EXPECT_DEATH(demuxer.RegisterRsidResolutionObserver(&observer), ""); |
- |
- // Test tear-down |
demuxer.DeregisterRsidResolutionObserver(&observer); |
} |
@@ -736,7 +591,6 @@ |
DregisterationOfNeverRegisteredRsidResolutionObserverDisallowed) { |
RtpDemuxer demuxer; |
MockRsidResolutionObserver observer; |
- |
EXPECT_DEATH(demuxer.DeregisterRsidResolutionObserver(&observer), ""); |
} |