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

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: 1. Rebase. 2. Remove old TODO. Created 3 years, 4 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 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698