Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(202)

Side by Side Diff: webrtc/call/rtp_demuxer_unittest.cc

Issue 2968693002: SSRC and RSID may only refer to one sink each in RtpDemuxer (Closed)
Patch Set: TODO added. Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
74 const int rsid_extension_id = 6; 74 const int rsid_extension_id = 6;
75 RtpPacketReceived::ExtensionManager extension_manager; 75 RtpPacketReceived::ExtensionManager extension_manager;
76 extension_manager.Register<RtpStreamId>(rsid_extension_id); 76 extension_manager.Register<RtpStreamId>(rsid_extension_id);
77 auto packet = rtc::MakeUnique<RtpPacketReceived>(&extension_manager); 77 auto packet = rtc::MakeUnique<RtpPacketReceived>(&extension_manager);
78 packet->SetExtension<RtpStreamId>(rsid); 78 packet->SetExtension<RtpStreamId>(rsid);
79 packet->SetSsrc(ssrc); 79 packet->SetSsrc(ssrc);
80 packet->SetSequenceNumber(static_cast<uint16_t>(sequence_number)); 80 packet->SetSequenceNumber(static_cast<uint16_t>(sequence_number));
81 return packet; 81 return packet;
82 } 82 }
83 83
84 TEST(RtpDemuxerTest, CanAddSinkBySsrc) {
85 RtpDemuxer demuxer;
86 MockRtpPacketSink sink;
87 constexpr uint32_t ssrc = 1;
88
89 EXPECT_TRUE(demuxer.AddSink(ssrc, &sink));
90
91 // Test tear-down
92 demuxer.RemoveSink(&sink);
93 }
94
84 TEST(RtpDemuxerTest, OnRtpPacketCalledOnCorrectSinkBySsrc) { 95 TEST(RtpDemuxerTest, OnRtpPacketCalledOnCorrectSinkBySsrc) {
85 RtpDemuxer demuxer; 96 RtpDemuxer demuxer;
86 97
87 constexpr uint32_t ssrcs[] = {101, 202, 303}; 98 constexpr uint32_t ssrcs[] = {101, 202, 303};
88 MockRtpPacketSink sinks[arraysize(ssrcs)]; 99 MockRtpPacketSink sinks[arraysize(ssrcs)];
89 for (size_t i = 0; i < arraysize(ssrcs); i++) { 100 for (size_t i = 0; i < arraysize(ssrcs); i++) {
90 demuxer.AddSink(ssrcs[i], &sinks[i]); 101 demuxer.AddSink(ssrcs[i], &sinks[i]);
91 } 102 }
92 103
93 for (size_t i = 0; i < arraysize(ssrcs); i++) { 104 for (size_t i = 0; i < arraysize(ssrcs); i++) {
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
142 } 153 }
143 154
144 for (const auto& packet : packets) { 155 for (const auto& packet : packets) {
145 EXPECT_TRUE(demuxer.OnRtpPacket(*packet)); 156 EXPECT_TRUE(demuxer.OnRtpPacket(*packet));
146 } 157 }
147 158
148 // Test tear-down 159 // Test tear-down
149 demuxer.RemoveSink(&sink); 160 demuxer.RemoveSink(&sink);
150 } 161 }
151 162
152 TEST(RtpDemuxerTest, MultipleSinksMappedToSameSsrc) {
153 RtpDemuxer demuxer;
154
155 MockRtpPacketSink sinks[3];
156 constexpr uint32_t ssrc = 404;
157 for (auto& sink : sinks) {
158 demuxer.AddSink(ssrc, &sink);
159 }
160
161 // Reception of an RTP packet associated with the shared SSRC triggers the
162 // callback on all of the sinks associated with it.
163 auto packet = CreateRtpPacketReceived(ssrc);
164 for (auto& sink : sinks) {
165 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet)));
166 }
167 EXPECT_TRUE(demuxer.OnRtpPacket(*packet));
168
169 // Test tear-down
170 for (const auto& sink : sinks) {
171 demuxer.RemoveSink(&sink);
172 }
173 }
174
175 TEST(RtpDemuxerTest, SinkMappedToMultipleSsrcs) { 163 TEST(RtpDemuxerTest, SinkMappedToMultipleSsrcs) {
176 RtpDemuxer demuxer; 164 RtpDemuxer demuxer;
177 165
178 constexpr uint32_t ssrcs[] = {404, 505, 606}; 166 constexpr uint32_t ssrcs[] = {404, 505, 606};
179 MockRtpPacketSink sink; 167 MockRtpPacketSink sink;
180 for (uint32_t ssrc : ssrcs) { 168 for (uint32_t ssrc : ssrcs) {
181 demuxer.AddSink(ssrc, &sink); 169 demuxer.AddSink(ssrc, &sink);
182 } 170 }
183 171
184 // The sink which is associated with multiple SSRCs gets the callback 172 // The sink which is associated with multiple SSRCs gets the callback
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
222 } 210 }
223 211
224 ASSERT_TRUE(demuxer.RemoveSink(&sink)); 212 ASSERT_TRUE(demuxer.RemoveSink(&sink));
225 213
226 // The removed sink does not get callbacks. 214 // The removed sink does not get callbacks.
227 auto packet = CreateRtpPacketReceived(ssrc, seq_num); 215 auto packet = CreateRtpPacketReceived(ssrc, seq_num);
228 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0); // Not called. 216 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0); // Not called.
229 EXPECT_FALSE(demuxer.OnRtpPacket(*packet)); 217 EXPECT_FALSE(demuxer.OnRtpPacket(*packet));
230 } 218 }
231 219
232 TEST(RtpDemuxerTest, RepeatedSsrcAssociationsDoNotTriggerRepeatedCallbacks) { 220 TEST(RtpDemuxerTest, AddSinkFailsIfCalledForTwoSinks) {
221 RtpDemuxer demuxer;
222 MockRtpPacketSink sink_a;
223 MockRtpPacketSink sink_b;
224 constexpr uint32_t ssrc = 1;
225 ASSERT_TRUE(demuxer.AddSink(ssrc, &sink_a));
226
227 EXPECT_FALSE(demuxer.AddSink(ssrc, &sink_b));
228
229 // Test tear-down
230 demuxer.RemoveSink(&sink_a);
231 }
232
233 // An SSRC may only be mapped to a single sink. However, since configuration
234 // of this associations might come from the network, we need to fail gracefully.
235 TEST(RtpDemuxerTest, OnlyOneSinkPerSsrcGetsOnRtpPacketTriggered) {
236 RtpDemuxer demuxer;
237
238 MockRtpPacketSink sinks[3];
239 constexpr uint32_t ssrc = 404;
240 for (size_t i = 0; i < arraysize(sinks); i++) {
danilchap 2017/06/30 16:45:31 unwind loop probably easier to read: ASSERT_TRUE(d
eladalon 2017/07/03 08:23:35 Done. (The downside of this approach is that you c
241 const bool is_first_add = (i == 0);
242 ASSERT_EQ(is_first_add, demuxer.AddSink(ssrc, &sinks[i]));
243 }
244
245 // The first sink associated with the SSRC remains active; other sinks
246 // were not really added, and so do not get OnRtpPacket() called.
247 auto packet = CreateRtpPacketReceived(ssrc);
248 EXPECT_CALL(sinks[0], OnRtpPacket(SamePacketAs(*packet)));
249 ASSERT_TRUE(demuxer.OnRtpPacket(*packet));
250
251 // Test tear-down
252 demuxer.RemoveSink(&sinks[0]);
253 }
254
255 TEST(RtpDemuxerTest, AddSinkFailsIfCalledTwiceEvenIfBothTimesAreForSameSink) {
danilchap 2017/06/30 16:45:31 may be drop 'EvenIfBothTimesAre'
eladalon 2017/07/03 08:23:35 Changed to AddSinkFailsIfCalledTwiceEvenIfSameSink
256 RtpDemuxer demuxer;
257 MockRtpPacketSink sink;
258 constexpr uint32_t ssrc = 1;
259 ASSERT_TRUE(demuxer.AddSink(ssrc, &sink));
260
261 EXPECT_FALSE(demuxer.AddSink(ssrc, &sink));
262
263 // Test tear-down
264 demuxer.RemoveSink(&sink);
265 }
266
267 TEST(RtpDemuxerTest, NoRepeatedCallbackOnRepeatedAddSinkForSameSink) {
233 RtpDemuxer demuxer; 268 RtpDemuxer demuxer;
234 269
235 constexpr uint32_t ssrc = 111; 270 constexpr uint32_t ssrc = 111;
236 MockRtpPacketSink sink; 271 MockRtpPacketSink sink;
237 272
238 demuxer.AddSink(ssrc, &sink); 273 ASSERT_TRUE(demuxer.AddSink(ssrc, &sink));
239 demuxer.AddSink(ssrc, &sink); 274 ASSERT_FALSE(demuxer.AddSink(ssrc, &sink));
240 275
241 auto packet = CreateRtpPacketReceived(ssrc); 276 auto packet = CreateRtpPacketReceived(ssrc);
242 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1); 277 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
243 EXPECT_TRUE(demuxer.OnRtpPacket(*packet)); 278 EXPECT_TRUE(demuxer.OnRtpPacket(*packet));
244 279
245 // Test tear-down 280 // Test tear-down
246 demuxer.RemoveSink(&sink); 281 demuxer.RemoveSink(&sink);
247 } 282 }
248 283
249 TEST(RtpDemuxerTest, RemoveSinkReturnsFalseForNeverAddedSink) { 284 TEST(RtpDemuxerTest, RemoveSinkReturnsFalseForNeverAddedSink) {
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
425 auto packet = 460 auto packet =
426 CreateRtpPacketReceivedWithRsid(rsids[i], ssrc, sequence_number); 461 CreateRtpPacketReceivedWithRsid(rsids[i], ssrc, sequence_number);
427 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1); 462 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
428 EXPECT_TRUE(demuxer.OnRtpPacket(*packet)); 463 EXPECT_TRUE(demuxer.OnRtpPacket(*packet));
429 } 464 }
430 465
431 // Test tear-down 466 // Test tear-down
432 demuxer.RemoveSink(&sink); 467 demuxer.RemoveSink(&sink);
433 } 468 }
434 469
435 TEST(RtpDemuxerTest, RsidUsedByMultipleSinks) {
436 RtpDemuxer demuxer;
437
438 MockRtpPacketSink sinks[3];
439 const std::string shared_rsid = "a";
440
441 for (MockRtpPacketSink& sink : sinks) {
442 demuxer.AddSink(shared_rsid, &sink);
443 }
444
445 constexpr uint32_t shared_ssrc = 888;
446 auto packet = CreateRtpPacketReceivedWithRsid(shared_rsid, shared_ssrc);
447
448 for (auto& sink : sinks) {
449 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
450 }
451
452 EXPECT_TRUE(demuxer.OnRtpPacket(*packet));
453
454 // Test tear-down
455 for (MockRtpPacketSink& sink : sinks) {
456 demuxer.RemoveSink(&sink);
457 }
458 }
459
460 TEST(RtpDemuxerTest, SinkWithBothRsidAndSsrcAssociations) { 470 TEST(RtpDemuxerTest, SinkWithBothRsidAndSsrcAssociations) {
461 RtpDemuxer demuxer; 471 RtpDemuxer demuxer;
462 472
463 MockRtpPacketSink sink; 473 MockRtpPacketSink sink;
464 constexpr uint32_t standalone_ssrc = 10101; 474 constexpr uint32_t standalone_ssrc = 10101;
465 constexpr uint32_t rsid_ssrc = 20202; 475 constexpr uint32_t rsid_ssrc = 20202;
466 const std::string rsid = "a"; 476 const std::string rsid = "a";
467 477
468 demuxer.AddSink(standalone_ssrc, &sink); 478 demuxer.AddSink(standalone_ssrc, &sink);
469 demuxer.AddSink(rsid, &sink); 479 demuxer.AddSink(rsid, &sink);
(...skipping 24 matching lines...) Expand all
494 504
495 constexpr uint16_t seq_num = 999; 505 constexpr uint16_t seq_num = 999;
496 auto packet = CreateRtpPacketReceivedWithRsid(rsid, ssrc, seq_num); 506 auto packet = CreateRtpPacketReceivedWithRsid(rsid, ssrc, seq_num);
497 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1); 507 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
498 EXPECT_TRUE(demuxer.OnRtpPacket(*packet)); 508 EXPECT_TRUE(demuxer.OnRtpPacket(*packet));
499 509
500 // Test tear-down 510 // Test tear-down
501 demuxer.RemoveSink(&sink); 511 demuxer.RemoveSink(&sink);
502 } 512 }
503 513
504 TEST(RtpDemuxerTest, RsidObserversInformedOfResolutions) { 514 TEST(RtpDemuxerTest, RsidObserversInformedOfResolutionsOfTrackedRsids) {
505 RtpDemuxer demuxer; 515 RtpDemuxer demuxer;
506 516
507 constexpr uint32_t ssrc = 111; 517 constexpr uint32_t ssrc = 111;
508 const std::string rsid = "a"; 518 const std::string rsid = "a";
509 519
520 // Only RSIDs which the demuxer knows may be resolved.
521 NiceMock<MockRtpPacketSink> sink;
522 demuxer.AddSink(rsid, &sink);
523
510 MockRsidResolutionObserver rsid_resolution_observers[3]; 524 MockRsidResolutionObserver rsid_resolution_observers[3];
511 for (auto& observer : rsid_resolution_observers) { 525 for (auto& observer : rsid_resolution_observers) {
512 demuxer.RegisterRsidResolutionObserver(&observer); 526 demuxer.RegisterRsidResolutionObserver(&observer);
513 EXPECT_CALL(observer, OnRsidResolved(rsid, ssrc)).Times(1); 527 EXPECT_CALL(observer, OnRsidResolved(rsid, ssrc)).Times(1);
514 } 528 }
515 529
516 // The expected calls to OnRsidResolved() will be triggered by this. 530 // The expected calls to OnRsidResolved() will be triggered by this.
517 demuxer.OnRtpPacket(*CreateRtpPacketReceivedWithRsid(rsid, ssrc)); 531 demuxer.OnRtpPacket(*CreateRtpPacketReceivedWithRsid(rsid, ssrc));
518 532
519 // Test tear-down 533 // Test tear-down
520 for (auto& observer : rsid_resolution_observers) { 534 for (auto& observer : rsid_resolution_observers) {
521 demuxer.DeregisterRsidResolutionObserver(&observer); 535 demuxer.DeregisterRsidResolutionObserver(&observer);
522 } 536 }
537 demuxer.RemoveSink(&sink);
538 }
539
540 TEST(RtpDemuxerTest, RsidObserversNotInformedOfResolutionsOfUntrackedRsids) {
541 RtpDemuxer demuxer;
542
543 constexpr uint32_t ssrc = 111;
544 const std::string rsid = "a";
545
546 MockRsidResolutionObserver rsid_resolution_observers[3];
547 for (auto& observer : rsid_resolution_observers) {
548 demuxer.RegisterRsidResolutionObserver(&observer);
549 EXPECT_CALL(observer, OnRsidResolved(rsid, ssrc)).Times(0);
550 }
551
552 // The expected calls to OnRsidResolved() will be triggered by this.
553 demuxer.OnRtpPacket(*CreateRtpPacketReceivedWithRsid(rsid, ssrc));
554
555 // Test tear-down
556 for (auto& observer : rsid_resolution_observers) {
557 demuxer.DeregisterRsidResolutionObserver(&observer);
558 }
523 } 559 }
524 560
561 // If one sink is associated with SSRC x, and another sink with RSID y, we
562 // should never observe RSID x being resolved to SSRC x, or else we'd end
563 // up with one SSRC mapped to two sinks. However, if such faulty input
564 // ever reaches us, we should handle it gracefully - not crash, and keep the
565 // packets routed only to the SSRC sink.
566 TEST(RtpDemuxerTest, PacketFittingBothRsidSinkAndSsrcSinkGivenOnlyToSsrcSink) {
567 RtpDemuxer demuxer;
568
569 constexpr uint32_t ssrc = 111;
570 MockRtpPacketSink ssrc_sink;
571 demuxer.AddSink(ssrc, &ssrc_sink);
572
573 const std::string rsid = "a";
574 MockRtpPacketSink rsid_sink;
575 demuxer.AddSink(rsid, &rsid_sink);
576
577 auto packet = CreateRtpPacketReceivedWithRsid(rsid, ssrc);
578 EXPECT_CALL(ssrc_sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
579 EXPECT_CALL(rsid_sink, OnRtpPacket(SamePacketAs(*packet))).Times(0);
580 demuxer.OnRtpPacket(*packet);
581
582 // Test tear-down
583 demuxer.RemoveSink(&ssrc_sink);
584 demuxer.RemoveSink(&rsid_sink);
585 }
586
587 TEST(RtpDemuxerTest,
588 PacketFittingBothRsidSinkAndSsrcSinkDoesNotTriggerResolutionCallbacks) {
589 RtpDemuxer demuxer;
590
591 constexpr uint32_t ssrc = 111;
592 NiceMock<MockRtpPacketSink> ssrc_sink;
593 demuxer.AddSink(ssrc, &ssrc_sink);
594
595 const std::string rsid = "a";
596 NiceMock<MockRtpPacketSink> rsid_sink;
597 demuxer.AddSink(rsid, &rsid_sink);
598
599 MockRsidResolutionObserver observer;
600 demuxer.RegisterRsidResolutionObserver(&observer);
601
602 auto packet = CreateRtpPacketReceivedWithRsid(rsid, ssrc);
603 EXPECT_CALL(observer, OnRsidResolved(_, _)).Times(0);
604 demuxer.OnRtpPacket(*packet);
605
606 // Test tear-down
607 demuxer.RemoveSink(&ssrc_sink);
608 demuxer.RemoveSink(&rsid_sink);
609 }
610
611 // We're not expecting RSIDs to be resolved to SSRCs which were previously
612 // mapped to sinks, and make no guarantees except for graceful handling.
613 TEST(RtpDemuxerTest, GracefullyHandleRsidBeingMappedToPrevouslyAssociatedSsrc) {
614 RtpDemuxer demuxer;
615
616 constexpr uint32_t ssrc = 111;
617 NiceMock<MockRtpPacketSink> ssrc_sink;
618 demuxer.AddSink(ssrc, &ssrc_sink);
619
620 const std::string rsid = "a";
621 MockRtpPacketSink rsid_sink;
622 demuxer.AddSink(rsid, &rsid_sink);
623
624 MockRsidResolutionObserver observer;
625 demuxer.RegisterRsidResolutionObserver(&observer);
626
627 // The SSRC was mapped to an SSRC sink, but was even active (packets flowed
628 // over it).
629 auto packet = CreateRtpPacketReceivedWithRsid(rsid, ssrc);
630 demuxer.OnRtpPacket(*packet);
631
632 // If the SSRC sink is ever removed, the RSID sink *might* receive indications
633 // of packets, and observers *might* be informed. Only graceful handling
634 // is guaranteed.
635 demuxer.RemoveSink(&ssrc_sink);
636 EXPECT_CALL(rsid_sink, OnRtpPacket(SamePacketAs(*packet))).Times(AtLeast(0));
637 EXPECT_CALL(observer, OnRsidResolved(rsid, ssrc)).Times(AtLeast(0));
638 demuxer.OnRtpPacket(*packet);
639
640 // Test tear-down
641 demuxer.DeregisterRsidResolutionObserver(&observer);
642 demuxer.RemoveSink(&rsid_sink);
643 }
644
525 TEST(RtpDemuxerTest, DeregisteredRsidObserversNotInformedOfResolutions) { 645 TEST(RtpDemuxerTest, DeregisteredRsidObserversNotInformedOfResolutions) {
526 RtpDemuxer demuxer; 646 RtpDemuxer demuxer;
527 647
528 constexpr uint32_t ssrc = 111; 648 constexpr uint32_t ssrc = 111;
529 const std::string rsid = "a"; 649 const std::string rsid = "a";
530 NiceMock<MockRtpPacketSink> sink; 650 NiceMock<MockRtpPacketSink> sink;
531 demuxer.AddSink(rsid, &sink); 651 demuxer.AddSink(rsid, &sink);
532 652
533 // Register several, then deregister only one, to show that not all of the 653 // Register several, then deregister only one, to show that not all of the
534 // observers had been forgotten when one was removed. 654 // observers had been forgotten when one was removed.
(...skipping 17 matching lines...) Expand all
552 // Test tear-down 672 // Test tear-down
553 demuxer.RemoveSink(&sink); 673 demuxer.RemoveSink(&sink);
554 demuxer.DeregisterRsidResolutionObserver(&observer_1); 674 demuxer.DeregisterRsidResolutionObserver(&observer_1);
555 demuxer.DeregisterRsidResolutionObserver(&observer_3); 675 demuxer.DeregisterRsidResolutionObserver(&observer_3);
556 } 676 }
557 677
558 #if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID) 678 #if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
559 TEST(RtpDemuxerTest, RsidMustBeNonEmpty) { 679 TEST(RtpDemuxerTest, RsidMustBeNonEmpty) {
560 RtpDemuxer demuxer; 680 RtpDemuxer demuxer;
561 MockRtpPacketSink sink; 681 MockRtpPacketSink sink;
682
562 EXPECT_DEATH(demuxer.AddSink("", &sink), ""); 683 EXPECT_DEATH(demuxer.AddSink("", &sink), "");
563 } 684 }
564 685
565 TEST(RtpDemuxerTest, RsidMustBeAlphaNumeric) { 686 TEST(RtpDemuxerTest, RsidMustBeAlphaNumeric) {
566 RtpDemuxer demuxer; 687 RtpDemuxer demuxer;
567 MockRtpPacketSink sink; 688 MockRtpPacketSink sink;
689
568 EXPECT_DEATH(demuxer.AddSink("a_3", &sink), ""); 690 EXPECT_DEATH(demuxer.AddSink("a_3", &sink), "");
569 } 691 }
570 692
571 TEST(RtpDemuxerTest, RsidMustNotExceedMaximumLength) { 693 TEST(RtpDemuxerTest, RsidMustNotExceedMaximumLength) {
572 RtpDemuxer demuxer; 694 RtpDemuxer demuxer;
573 MockRtpPacketSink sink; 695 MockRtpPacketSink sink;
574 std::string rsid(StreamId::kMaxSize + 1, 'a'); 696 std::string rsid(StreamId::kMaxSize + 1, 'a');
697
575 EXPECT_DEATH(demuxer.AddSink(rsid, &sink), ""); 698 EXPECT_DEATH(demuxer.AddSink(rsid, &sink), "");
576 } 699 }
577 700
578 TEST(RtpDemuxerTest, RepeatedRsidAssociationsDisallowed) { 701 TEST(RtpDemuxerTest, RepeatedRsidAssociationsDisallowed) {
579 RtpDemuxer demuxer; 702 RtpDemuxer demuxer;
703 MockRtpPacketSink sink_a;
704 MockRtpPacketSink sink_b;
705
706 const std::string rsid = "a";
707 demuxer.AddSink(rsid, &sink_a);
708
709 EXPECT_DEATH(demuxer.AddSink(rsid, &sink_b), "");
710
711 // Test tear-down
712 demuxer.RemoveSink(&sink_a);
713 }
714
715 TEST(RtpDemuxerTest, RepeatedRsidAssociationsDisallowedEvenIfSameSink) {
716 RtpDemuxer demuxer;
580 MockRtpPacketSink sink; 717 MockRtpPacketSink sink;
581 demuxer.AddSink("a", &sink); 718
582 EXPECT_DEATH(demuxer.AddSink("a", &sink), ""); 719 const std::string rsid = "a";
720 demuxer.AddSink(rsid, &sink);
721
722 EXPECT_DEATH(demuxer.AddSink(rsid, &sink), "");
723
724 // Test tear-down
583 demuxer.RemoveSink(&sink); 725 demuxer.RemoveSink(&sink);
584 } 726 }
585 727
586 TEST(RtpDemuxerTest, 728 TEST(RtpDemuxerTest, DoubleRegisterationOfRsidResolutionObserverDisallowed) {
587 DoubleRegisterationOfNeverRegisteredRsidResolutionObserverDisallowed) {
588 RtpDemuxer demuxer; 729 RtpDemuxer demuxer;
589 MockRsidResolutionObserver observer; 730 MockRsidResolutionObserver observer;
590 demuxer.RegisterRsidResolutionObserver(&observer); 731 demuxer.RegisterRsidResolutionObserver(&observer);
732
591 EXPECT_DEATH(demuxer.RegisterRsidResolutionObserver(&observer), ""); 733 EXPECT_DEATH(demuxer.RegisterRsidResolutionObserver(&observer), "");
734
735 // Test tear-down
592 demuxer.DeregisterRsidResolutionObserver(&observer); 736 demuxer.DeregisterRsidResolutionObserver(&observer);
593 } 737 }
594 738
595 TEST(RtpDemuxerTest, 739 TEST(RtpDemuxerTest,
596 DregisterationOfNeverRegisteredRsidResolutionObserverDisallowed) { 740 DregisterationOfNeverRegisteredRsidResolutionObserverDisallowed) {
597 RtpDemuxer demuxer; 741 RtpDemuxer demuxer;
598 MockRsidResolutionObserver observer; 742 MockRsidResolutionObserver observer;
743
599 EXPECT_DEATH(demuxer.DeregisterRsidResolutionObserver(&observer), ""); 744 EXPECT_DEATH(demuxer.DeregisterRsidResolutionObserver(&observer), "");
600 } 745 }
601 746
602 #endif 747 #endif
603 748
604 } // namespace 749 } // namespace
605 } // namespace webrtc 750 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698