OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
69 const int rsid_extension_id = 6; | 69 const int rsid_extension_id = 6; |
70 RtpPacketReceived::ExtensionManager extension_manager; | 70 RtpPacketReceived::ExtensionManager extension_manager; |
71 extension_manager.Register<RtpStreamId>(rsid_extension_id); | 71 extension_manager.Register<RtpStreamId>(rsid_extension_id); |
72 auto packet = rtc::MakeUnique<RtpPacketReceived>(&extension_manager); | 72 auto packet = rtc::MakeUnique<RtpPacketReceived>(&extension_manager); |
73 packet->SetExtension<RtpStreamId>(rsid); | 73 packet->SetExtension<RtpStreamId>(rsid); |
74 packet->SetSsrc(ssrc); | 74 packet->SetSsrc(ssrc); |
75 packet->SetSequenceNumber(static_cast<uint16_t>(sequence_number)); | 75 packet->SetSequenceNumber(static_cast<uint16_t>(sequence_number)); |
76 return packet; | 76 return packet; |
77 } | 77 } |
78 | 78 |
79 TEST(RtpDemuxerTest, CanAddSinkBySsrc) { | |
80 RtpDemuxer demuxer; | |
81 MockRtpPacketSink sink; | |
82 constexpr uint32_t ssrc = 1; | |
83 | |
84 EXPECT_TRUE(demuxer.AddSink(ssrc, &sink)); | |
85 | |
86 // Test tear-down | |
87 demuxer.RemoveSink(&sink); | |
88 } | |
89 | |
79 TEST(RtpDemuxerTest, OnRtpPacketCalledOnCorrectSinkBySsrc) { | 90 TEST(RtpDemuxerTest, OnRtpPacketCalledOnCorrectSinkBySsrc) { |
80 RtpDemuxer demuxer; | 91 RtpDemuxer demuxer; |
81 | 92 |
82 constexpr uint32_t ssrcs[] = {101, 202, 303}; | 93 constexpr uint32_t ssrcs[] = {101, 202, 303}; |
83 MockRtpPacketSink sinks[arraysize(ssrcs)]; | 94 MockRtpPacketSink sinks[arraysize(ssrcs)]; |
84 for (size_t i = 0; i < arraysize(ssrcs); i++) { | 95 for (size_t i = 0; i < arraysize(ssrcs); i++) { |
85 demuxer.AddSink(ssrcs[i], &sinks[i]); | 96 demuxer.AddSink(ssrcs[i], &sinks[i]); |
86 } | 97 } |
87 | 98 |
88 for (size_t i = 0; i < arraysize(ssrcs); i++) { | 99 for (size_t i = 0; i < arraysize(ssrcs); i++) { |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
137 } | 148 } |
138 | 149 |
139 for (const auto& packet : packets) { | 150 for (const auto& packet : packets) { |
140 EXPECT_TRUE(demuxer.OnRtpPacket(*packet)); | 151 EXPECT_TRUE(demuxer.OnRtpPacket(*packet)); |
141 } | 152 } |
142 | 153 |
143 // Test tear-down | 154 // Test tear-down |
144 demuxer.RemoveSink(&sink); | 155 demuxer.RemoveSink(&sink); |
145 } | 156 } |
146 | 157 |
147 TEST(RtpDemuxerTest, MultipleSinksMappedToSameSsrc) { | |
148 RtpDemuxer demuxer; | |
149 | |
150 MockRtpPacketSink sinks[3]; | |
151 constexpr uint32_t ssrc = 404; | |
152 for (auto& sink : sinks) { | |
153 demuxer.AddSink(ssrc, &sink); | |
154 } | |
155 | |
156 // Reception of an RTP packet associated with the shared SSRC triggers the | |
157 // callback on all of the sinks associated with it. | |
158 auto packet = CreateRtpPacketReceived(ssrc); | |
159 for (auto& sink : sinks) { | |
160 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))); | |
161 } | |
162 EXPECT_TRUE(demuxer.OnRtpPacket(*packet)); | |
163 | |
164 // Test tear-down | |
165 for (const auto& sink : sinks) { | |
166 demuxer.RemoveSink(&sink); | |
167 } | |
168 } | |
169 | |
170 TEST(RtpDemuxerTest, SinkMappedToMultipleSsrcs) { | 158 TEST(RtpDemuxerTest, SinkMappedToMultipleSsrcs) { |
171 RtpDemuxer demuxer; | 159 RtpDemuxer demuxer; |
172 | 160 |
173 constexpr uint32_t ssrcs[] = {404, 505, 606}; | 161 constexpr uint32_t ssrcs[] = {404, 505, 606}; |
174 MockRtpPacketSink sink; | 162 MockRtpPacketSink sink; |
175 for (uint32_t ssrc : ssrcs) { | 163 for (uint32_t ssrc : ssrcs) { |
176 demuxer.AddSink(ssrc, &sink); | 164 demuxer.AddSink(ssrc, &sink); |
177 } | 165 } |
178 | 166 |
179 // The sink which is associated with multiple SSRCs gets the callback | 167 // The sink which is associated with multiple SSRCs gets the callback |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
217 } | 205 } |
218 | 206 |
219 ASSERT_TRUE(demuxer.RemoveSink(&sink)); | 207 ASSERT_TRUE(demuxer.RemoveSink(&sink)); |
220 | 208 |
221 // The removed sink does not get callbacks. | 209 // The removed sink does not get callbacks. |
222 auto packet = CreateRtpPacketReceived(ssrc, seq_num); | 210 auto packet = CreateRtpPacketReceived(ssrc, seq_num); |
223 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0); // Not called. | 211 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0); // Not called. |
224 EXPECT_FALSE(demuxer.OnRtpPacket(*packet)); | 212 EXPECT_FALSE(demuxer.OnRtpPacket(*packet)); |
225 } | 213 } |
226 | 214 |
227 TEST(RtpDemuxerTest, RepeatedSsrcAssociationsDoNotTriggerRepeatedCallbacks) { | 215 TEST(RtpDemuxerTest, AddSinkFailsIfCalledForTwoSinks) { |
216 RtpDemuxer demuxer; | |
217 MockRtpPacketSink sink_a; | |
218 MockRtpPacketSink sink_b; | |
219 constexpr uint32_t ssrc = 1; | |
220 ASSERT_TRUE(demuxer.AddSink(ssrc, &sink_a)); | |
221 | |
222 EXPECT_FALSE(demuxer.AddSink(ssrc, &sink_b)); | |
223 | |
224 // Test tear-down | |
225 demuxer.RemoveSink(&sink_a); | |
226 } | |
227 | |
228 // An SSRC may only be mapped to a single sink. However, since configuration | |
229 // of this associations might come from the network, we need to fail gracefully. | |
230 TEST(RtpDemuxerTest, OnlyOneSinkPerSsrcGetsOnRtpPacketTriggered) { | |
231 RtpDemuxer demuxer; | |
232 | |
233 MockRtpPacketSink sinks[3]; | |
234 constexpr uint32_t ssrc = 404; | |
235 ASSERT_TRUE(demuxer.AddSink(ssrc, &sinks[0])); | |
236 ASSERT_FALSE(demuxer.AddSink(ssrc, &sinks[1])); | |
237 ASSERT_FALSE(demuxer.AddSink(ssrc, &sinks[2])); | |
Steve Anton
2017/08/02 20:35:24
nit: I don't think it's really necessary to check
eladalon
2017/08/03 11:14:25
I've used an ASSERT here, which marks that "though
| |
238 | |
239 // The first sink associated with the SSRC remains active; other sinks | |
240 // were not really added, and so do not get OnRtpPacket() called. | |
241 auto packet = CreateRtpPacketReceived(ssrc); | |
242 EXPECT_CALL(sinks[0], OnRtpPacket(SamePacketAs(*packet))); | |
Steve Anton
2017/08/02 20:35:24
nit: Perhaps also expect that sinks[1], sinks[2] r
eladalon
2017/08/03 11:14:25
Done.
| |
243 ASSERT_TRUE(demuxer.OnRtpPacket(*packet)); | |
244 | |
245 // Test tear-down | |
246 demuxer.RemoveSink(&sinks[0]); | |
247 } | |
248 | |
249 TEST(RtpDemuxerTest, AddSinkFailsIfCalledTwiceEvenIfSameSink) { | |
250 RtpDemuxer demuxer; | |
251 MockRtpPacketSink sink; | |
252 constexpr uint32_t ssrc = 1; | |
253 ASSERT_TRUE(demuxer.AddSink(ssrc, &sink)); | |
254 | |
255 EXPECT_FALSE(demuxer.AddSink(ssrc, &sink)); | |
256 | |
257 // Test tear-down | |
258 demuxer.RemoveSink(&sink); | |
259 } | |
260 | |
261 TEST(RtpDemuxerTest, NoRepeatedCallbackOnRepeatedAddSinkForSameSink) { | |
228 RtpDemuxer demuxer; | 262 RtpDemuxer demuxer; |
229 | 263 |
230 constexpr uint32_t ssrc = 111; | 264 constexpr uint32_t ssrc = 111; |
231 MockRtpPacketSink sink; | 265 MockRtpPacketSink sink; |
232 | 266 |
233 demuxer.AddSink(ssrc, &sink); | 267 ASSERT_TRUE(demuxer.AddSink(ssrc, &sink)); |
234 demuxer.AddSink(ssrc, &sink); | 268 ASSERT_FALSE(demuxer.AddSink(ssrc, &sink)); |
235 | 269 |
236 auto packet = CreateRtpPacketReceived(ssrc); | 270 auto packet = CreateRtpPacketReceived(ssrc); |
237 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1); | 271 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1); |
238 EXPECT_TRUE(demuxer.OnRtpPacket(*packet)); | 272 EXPECT_TRUE(demuxer.OnRtpPacket(*packet)); |
239 | 273 |
240 // Test tear-down | 274 // Test tear-down |
241 demuxer.RemoveSink(&sink); | 275 demuxer.RemoveSink(&sink); |
242 } | 276 } |
243 | 277 |
244 TEST(RtpDemuxerTest, RemoveSinkReturnsFalseForNeverAddedSink) { | 278 TEST(RtpDemuxerTest, RemoveSinkReturnsFalseForNeverAddedSink) { |
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
420 auto packet = | 454 auto packet = |
421 CreateRtpPacketReceivedWithRsid(rsids[i], ssrc, sequence_number); | 455 CreateRtpPacketReceivedWithRsid(rsids[i], ssrc, sequence_number); |
422 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1); | 456 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1); |
423 EXPECT_TRUE(demuxer.OnRtpPacket(*packet)); | 457 EXPECT_TRUE(demuxer.OnRtpPacket(*packet)); |
424 } | 458 } |
425 | 459 |
426 // Test tear-down | 460 // Test tear-down |
427 demuxer.RemoveSink(&sink); | 461 demuxer.RemoveSink(&sink); |
428 } | 462 } |
429 | 463 |
430 TEST(RtpDemuxerTest, RsidUsedByMultipleSinks) { | |
431 RtpDemuxer demuxer; | |
432 | |
433 MockRtpPacketSink sinks[3]; | |
434 const std::string shared_rsid = "a"; | |
435 | |
436 for (MockRtpPacketSink& sink : sinks) { | |
437 demuxer.AddSink(shared_rsid, &sink); | |
438 } | |
439 | |
440 constexpr uint32_t shared_ssrc = 888; | |
441 auto packet = CreateRtpPacketReceivedWithRsid(shared_rsid, shared_ssrc); | |
442 | |
443 for (auto& sink : sinks) { | |
444 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1); | |
445 } | |
446 | |
447 EXPECT_TRUE(demuxer.OnRtpPacket(*packet)); | |
448 | |
449 // Test tear-down | |
450 for (MockRtpPacketSink& sink : sinks) { | |
451 demuxer.RemoveSink(&sink); | |
452 } | |
453 } | |
454 | |
455 TEST(RtpDemuxerTest, SinkWithBothRsidAndSsrcAssociations) { | 464 TEST(RtpDemuxerTest, SinkWithBothRsidAndSsrcAssociations) { |
456 RtpDemuxer demuxer; | 465 RtpDemuxer demuxer; |
457 | 466 |
458 MockRtpPacketSink sink; | 467 MockRtpPacketSink sink; |
459 constexpr uint32_t standalone_ssrc = 10101; | 468 constexpr uint32_t standalone_ssrc = 10101; |
460 constexpr uint32_t rsid_ssrc = 20202; | 469 constexpr uint32_t rsid_ssrc = 20202; |
461 const std::string rsid = "a"; | 470 const std::string rsid = "a"; |
462 | 471 |
463 demuxer.AddSink(standalone_ssrc, &sink); | 472 demuxer.AddSink(standalone_ssrc, &sink); |
464 demuxer.AddSink(rsid, &sink); | 473 demuxer.AddSink(rsid, &sink); |
(...skipping 24 matching lines...) Expand all Loading... | |
489 | 498 |
490 constexpr uint16_t seq_num = 999; | 499 constexpr uint16_t seq_num = 999; |
491 auto packet = CreateRtpPacketReceivedWithRsid(rsid, ssrc, seq_num); | 500 auto packet = CreateRtpPacketReceivedWithRsid(rsid, ssrc, seq_num); |
492 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1); | 501 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1); |
493 EXPECT_TRUE(demuxer.OnRtpPacket(*packet)); | 502 EXPECT_TRUE(demuxer.OnRtpPacket(*packet)); |
494 | 503 |
495 // Test tear-down | 504 // Test tear-down |
496 demuxer.RemoveSink(&sink); | 505 demuxer.RemoveSink(&sink); |
497 } | 506 } |
498 | 507 |
499 TEST(RtpDemuxerTest, RsidObserversInformedOfResolutions) { | 508 TEST(RtpDemuxerTest, RsidObserversInformedOfResolutionsOfTrackedRsids) { |
500 RtpDemuxer demuxer; | 509 RtpDemuxer demuxer; |
501 | 510 |
502 constexpr uint32_t ssrc = 111; | 511 constexpr uint32_t ssrc = 111; |
503 const std::string rsid = "a"; | 512 const std::string rsid = "a"; |
504 | 513 |
514 // Only RSIDs which the demuxer knows may be resolved. | |
515 NiceMock<MockRtpPacketSink> sink; | |
516 demuxer.AddSink(rsid, &sink); | |
517 | |
505 MockRsidResolutionObserver rsid_resolution_observers[3]; | 518 MockRsidResolutionObserver rsid_resolution_observers[3]; |
506 for (auto& observer : rsid_resolution_observers) { | 519 for (auto& observer : rsid_resolution_observers) { |
507 demuxer.RegisterRsidResolutionObserver(&observer); | 520 demuxer.RegisterRsidResolutionObserver(&observer); |
508 EXPECT_CALL(observer, OnRsidResolved(rsid, ssrc)).Times(1); | 521 EXPECT_CALL(observer, OnRsidResolved(rsid, ssrc)).Times(1); |
509 } | 522 } |
510 | 523 |
511 // The expected calls to OnRsidResolved() will be triggered by this. | 524 // The expected calls to OnRsidResolved() will be triggered by this. |
512 demuxer.OnRtpPacket(*CreateRtpPacketReceivedWithRsid(rsid, ssrc)); | 525 demuxer.OnRtpPacket(*CreateRtpPacketReceivedWithRsid(rsid, ssrc)); |
513 | 526 |
514 // Test tear-down | 527 // Test tear-down |
515 for (auto& observer : rsid_resolution_observers) { | 528 for (auto& observer : rsid_resolution_observers) { |
516 demuxer.DeregisterRsidResolutionObserver(&observer); | 529 demuxer.DeregisterRsidResolutionObserver(&observer); |
517 } | 530 } |
531 demuxer.RemoveSink(&sink); | |
532 } | |
533 | |
534 TEST(RtpDemuxerTest, RsidObserversNotInformedOfResolutionsOfUntrackedRsids) { | |
535 RtpDemuxer demuxer; | |
536 | |
537 constexpr uint32_t ssrc = 111; | |
538 const std::string rsid = "a"; | |
539 | |
540 MockRsidResolutionObserver rsid_resolution_observers[3]; | |
541 for (auto& observer : rsid_resolution_observers) { | |
542 demuxer.RegisterRsidResolutionObserver(&observer); | |
543 EXPECT_CALL(observer, OnRsidResolved(rsid, ssrc)).Times(0); | |
544 } | |
545 | |
546 // The expected calls to OnRsidResolved() will be triggered by this. | |
547 demuxer.OnRtpPacket(*CreateRtpPacketReceivedWithRsid(rsid, ssrc)); | |
548 | |
549 // Test tear-down | |
550 for (auto& observer : rsid_resolution_observers) { | |
551 demuxer.DeregisterRsidResolutionObserver(&observer); | |
552 } | |
518 } | 553 } |
519 | 554 |
555 // If one sink is associated with SSRC x, and another sink with RSID y, we | |
556 // should never observe RSID x being resolved to SSRC x, or else we'd end | |
557 // up with one SSRC mapped to two sinks. However, if such faulty input | |
558 // ever reaches us, we should handle it gracefully - not crash, and keep the | |
559 // packets routed only to the SSRC sink. | |
560 TEST(RtpDemuxerTest, PacketFittingBothRsidSinkAndSsrcSinkGivenOnlyToSsrcSink) { | |
561 RtpDemuxer demuxer; | |
562 | |
563 constexpr uint32_t ssrc = 111; | |
564 MockRtpPacketSink ssrc_sink; | |
565 demuxer.AddSink(ssrc, &ssrc_sink); | |
566 | |
567 const std::string rsid = "a"; | |
568 MockRtpPacketSink rsid_sink; | |
569 demuxer.AddSink(rsid, &rsid_sink); | |
570 | |
571 auto packet = CreateRtpPacketReceivedWithRsid(rsid, ssrc); | |
572 EXPECT_CALL(ssrc_sink, OnRtpPacket(SamePacketAs(*packet))).Times(1); | |
573 EXPECT_CALL(rsid_sink, OnRtpPacket(SamePacketAs(*packet))).Times(0); | |
574 demuxer.OnRtpPacket(*packet); | |
575 | |
576 // Test tear-down | |
577 demuxer.RemoveSink(&ssrc_sink); | |
578 demuxer.RemoveSink(&rsid_sink); | |
579 } | |
580 | |
581 TEST(RtpDemuxerTest, | |
582 PacketFittingBothRsidSinkAndSsrcSinkDoesNotTriggerResolutionCallbacks) { | |
583 RtpDemuxer demuxer; | |
584 | |
585 constexpr uint32_t ssrc = 111; | |
586 NiceMock<MockRtpPacketSink> ssrc_sink; | |
587 demuxer.AddSink(ssrc, &ssrc_sink); | |
588 | |
589 const std::string rsid = "a"; | |
590 NiceMock<MockRtpPacketSink> rsid_sink; | |
591 demuxer.AddSink(rsid, &rsid_sink); | |
592 | |
593 MockRsidResolutionObserver observer; | |
594 demuxer.RegisterRsidResolutionObserver(&observer); | |
595 | |
596 auto packet = CreateRtpPacketReceivedWithRsid(rsid, ssrc); | |
597 EXPECT_CALL(observer, OnRsidResolved(_, _)).Times(0); | |
598 demuxer.OnRtpPacket(*packet); | |
599 | |
600 // Test tear-down | |
601 demuxer.RemoveSink(&ssrc_sink); | |
602 demuxer.RemoveSink(&rsid_sink); | |
603 } | |
604 | |
605 // We're not expecting RSIDs to be resolved to SSRCs which were previously | |
606 // mapped to sinks, and make no guarantees except for graceful handling. | |
607 TEST(RtpDemuxerTest, GracefullyHandleRsidBeingMappedToPrevouslyAssociatedSsrc) { | |
608 RtpDemuxer demuxer; | |
609 | |
610 constexpr uint32_t ssrc = 111; | |
611 NiceMock<MockRtpPacketSink> ssrc_sink; | |
612 demuxer.AddSink(ssrc, &ssrc_sink); | |
613 | |
614 const std::string rsid = "a"; | |
615 MockRtpPacketSink rsid_sink; | |
616 demuxer.AddSink(rsid, &rsid_sink); | |
617 | |
618 MockRsidResolutionObserver observer; | |
619 demuxer.RegisterRsidResolutionObserver(&observer); | |
620 | |
621 // The SSRC was mapped to an SSRC sink, but was even active (packets flowed | |
622 // over it). | |
623 auto packet = CreateRtpPacketReceivedWithRsid(rsid, ssrc); | |
624 demuxer.OnRtpPacket(*packet); | |
625 | |
626 // If the SSRC sink is ever removed, the RSID sink *might* receive indications | |
627 // of packets, and observers *might* be informed. Only graceful handling | |
628 // is guaranteed. | |
629 demuxer.RemoveSink(&ssrc_sink); | |
630 EXPECT_CALL(rsid_sink, OnRtpPacket(SamePacketAs(*packet))).Times(AtLeast(0)); | |
631 EXPECT_CALL(observer, OnRsidResolved(rsid, ssrc)).Times(AtLeast(0)); | |
632 demuxer.OnRtpPacket(*packet); | |
633 | |
634 // Test tear-down | |
635 demuxer.DeregisterRsidResolutionObserver(&observer); | |
636 demuxer.RemoveSink(&rsid_sink); | |
637 } | |
638 | |
520 TEST(RtpDemuxerTest, DeregisteredRsidObserversNotInformedOfResolutions) { | 639 TEST(RtpDemuxerTest, DeregisteredRsidObserversNotInformedOfResolutions) { |
521 RtpDemuxer demuxer; | 640 RtpDemuxer demuxer; |
522 | 641 |
523 constexpr uint32_t ssrc = 111; | 642 constexpr uint32_t ssrc = 111; |
524 const std::string rsid = "a"; | 643 const std::string rsid = "a"; |
525 NiceMock<MockRtpPacketSink> sink; | 644 NiceMock<MockRtpPacketSink> sink; |
526 demuxer.AddSink(rsid, &sink); | 645 demuxer.AddSink(rsid, &sink); |
527 | 646 |
528 // Register several, then deregister only one, to show that not all of the | 647 // Register several, then deregister only one, to show that not all of the |
529 // observers had been forgotten when one was removed. | 648 // observers had been forgotten when one was removed. |
(...skipping 17 matching lines...) Expand all Loading... | |
547 // Test tear-down | 666 // Test tear-down |
548 demuxer.RemoveSink(&sink); | 667 demuxer.RemoveSink(&sink); |
549 demuxer.DeregisterRsidResolutionObserver(&observer_1); | 668 demuxer.DeregisterRsidResolutionObserver(&observer_1); |
550 demuxer.DeregisterRsidResolutionObserver(&observer_3); | 669 demuxer.DeregisterRsidResolutionObserver(&observer_3); |
551 } | 670 } |
552 | 671 |
553 #if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID) | 672 #if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID) |
554 TEST(RtpDemuxerTest, RsidMustBeNonEmpty) { | 673 TEST(RtpDemuxerTest, RsidMustBeNonEmpty) { |
555 RtpDemuxer demuxer; | 674 RtpDemuxer demuxer; |
556 MockRtpPacketSink sink; | 675 MockRtpPacketSink sink; |
676 | |
557 EXPECT_DEATH(demuxer.AddSink("", &sink), ""); | 677 EXPECT_DEATH(demuxer.AddSink("", &sink), ""); |
558 } | 678 } |
559 | 679 |
560 TEST(RtpDemuxerTest, RsidMustBeAlphaNumeric) { | 680 TEST(RtpDemuxerTest, RsidMustBeAlphaNumeric) { |
561 RtpDemuxer demuxer; | 681 RtpDemuxer demuxer; |
562 MockRtpPacketSink sink; | 682 MockRtpPacketSink sink; |
683 | |
563 EXPECT_DEATH(demuxer.AddSink("a_3", &sink), ""); | 684 EXPECT_DEATH(demuxer.AddSink("a_3", &sink), ""); |
564 } | 685 } |
565 | 686 |
566 TEST(RtpDemuxerTest, RsidMustNotExceedMaximumLength) { | 687 TEST(RtpDemuxerTest, RsidMustNotExceedMaximumLength) { |
567 RtpDemuxer demuxer; | 688 RtpDemuxer demuxer; |
568 MockRtpPacketSink sink; | 689 MockRtpPacketSink sink; |
569 std::string rsid(StreamId::kMaxSize + 1, 'a'); | 690 std::string rsid(StreamId::kMaxSize + 1, 'a'); |
691 | |
570 EXPECT_DEATH(demuxer.AddSink(rsid, &sink), ""); | 692 EXPECT_DEATH(demuxer.AddSink(rsid, &sink), ""); |
571 } | 693 } |
572 | 694 |
573 TEST(RtpDemuxerTest, RepeatedRsidAssociationsDisallowed) { | 695 TEST(RtpDemuxerTest, RepeatedRsidAssociationsDisallowed) { |
574 RtpDemuxer demuxer; | 696 RtpDemuxer demuxer; |
697 MockRtpPacketSink sink_a; | |
698 MockRtpPacketSink sink_b; | |
699 | |
700 const std::string rsid = "a"; | |
701 demuxer.AddSink(rsid, &sink_a); | |
702 | |
703 EXPECT_DEATH(demuxer.AddSink(rsid, &sink_b), ""); | |
704 | |
705 // Test tear-down | |
706 demuxer.RemoveSink(&sink_a); | |
707 } | |
708 | |
709 TEST(RtpDemuxerTest, RepeatedRsidAssociationsDisallowedEvenIfSameSink) { | |
710 RtpDemuxer demuxer; | |
575 MockRtpPacketSink sink; | 711 MockRtpPacketSink sink; |
576 demuxer.AddSink("a", &sink); | 712 |
577 EXPECT_DEATH(demuxer.AddSink("a", &sink), ""); | 713 const std::string rsid = "a"; |
714 demuxer.AddSink(rsid, &sink); | |
715 | |
716 EXPECT_DEATH(demuxer.AddSink(rsid, &sink), ""); | |
717 | |
718 // Test tear-down | |
578 demuxer.RemoveSink(&sink); | 719 demuxer.RemoveSink(&sink); |
579 } | 720 } |
580 | 721 |
581 TEST(RtpDemuxerTest, | 722 TEST(RtpDemuxerTest, DoubleRegisterationOfRsidResolutionObserverDisallowed) { |
582 DoubleRegisterationOfNeverRegisteredRsidResolutionObserverDisallowed) { | |
583 RtpDemuxer demuxer; | 723 RtpDemuxer demuxer; |
584 MockRsidResolutionObserver observer; | 724 MockRsidResolutionObserver observer; |
585 demuxer.RegisterRsidResolutionObserver(&observer); | 725 demuxer.RegisterRsidResolutionObserver(&observer); |
726 | |
586 EXPECT_DEATH(demuxer.RegisterRsidResolutionObserver(&observer), ""); | 727 EXPECT_DEATH(demuxer.RegisterRsidResolutionObserver(&observer), ""); |
728 | |
729 // Test tear-down | |
587 demuxer.DeregisterRsidResolutionObserver(&observer); | 730 demuxer.DeregisterRsidResolutionObserver(&observer); |
588 } | 731 } |
589 | 732 |
590 TEST(RtpDemuxerTest, | 733 TEST(RtpDemuxerTest, |
591 DregisterationOfNeverRegisteredRsidResolutionObserverDisallowed) { | 734 DregisterationOfNeverRegisteredRsidResolutionObserverDisallowed) { |
592 RtpDemuxer demuxer; | 735 RtpDemuxer demuxer; |
593 MockRsidResolutionObserver observer; | 736 MockRsidResolutionObserver observer; |
737 | |
594 EXPECT_DEATH(demuxer.DeregisterRsidResolutionObserver(&observer), ""); | 738 EXPECT_DEATH(demuxer.DeregisterRsidResolutionObserver(&observer), ""); |
595 } | 739 } |
596 | 740 |
597 #endif | 741 #endif |
598 | 742 |
599 } // namespace | 743 } // namespace |
600 } // namespace webrtc | 744 } // namespace webrtc |
OLD | NEW |