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

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

Issue 2943693003: Create RtcpDemuxer (Closed)
Patch Set: Get rid of ArrayView in rtp_rtcp_demuxer_helper_unittest.cc, too. Created 3 years, 6 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
11 #include "webrtc/call/rtp_demuxer.h" 11 #include "webrtc/call/rtp_demuxer.h"
12 12
13 #include <memory> 13 #include <memory>
14 #include <string> 14 #include <string>
15 15
16 #include "webrtc/base/arraysize.h" 16 #include "webrtc/base/arraysize.h"
17 #include "webrtc/base/checks.h" 17 #include "webrtc/base/checks.h"
18 #include "webrtc/base/ptr_util.h" 18 #include "webrtc/base/ptr_util.h"
19 #include "webrtc/call/rsid_resolution_observer.h"
19 #include "webrtc/call/rtp_packet_sink_interface.h" 20 #include "webrtc/call/rtp_packet_sink_interface.h"
21 #include "webrtc/common_types.h"
20 #include "webrtc/modules/rtp_rtcp/include/rtp_header_extension_map.h" 22 #include "webrtc/modules/rtp_rtcp/include/rtp_header_extension_map.h"
21 #include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h" 23 #include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h"
22 #include "webrtc/modules/rtp_rtcp/source/rtp_packet_received.h" 24 #include "webrtc/modules/rtp_rtcp/source/rtp_packet_received.h"
23 #include "webrtc/test/gmock.h" 25 #include "webrtc/test/gmock.h"
24 #include "webrtc/test/gtest.h" 26 #include "webrtc/test/gtest.h"
25 27
26 namespace webrtc { 28 namespace webrtc {
27 29
28 namespace { 30 namespace {
29 31
30 using ::testing::_; 32 using ::testing::_;
31 using ::testing::AtLeast; 33 using ::testing::AtLeast;
32 using ::testing::InSequence; 34 using ::testing::InSequence;
33 using ::testing::NiceMock; 35 using ::testing::NiceMock;
34 36
35 class MockRtpPacketSink : public RtpPacketSinkInterface { 37 class MockRtpPacketSink : public RtpPacketSinkInterface {
36 public: 38 public:
37 MOCK_METHOD1(OnRtpPacket, void(const RtpPacketReceived&)); 39 MOCK_METHOD1(OnRtpPacket, void(const RtpPacketReceived&));
38 }; 40 };
39 41
42 class MockRsidResolutionObserver : public RsidResolutionObserver {
43 public:
44 MOCK_METHOD2(OnRsidResolved, void(const std::string& rsid, uint32_t ssrc));
45 };
46
40 MATCHER_P(SamePacketAs, other, "") { 47 MATCHER_P(SamePacketAs, other, "") {
41 return arg.Ssrc() == other.Ssrc() && 48 return arg.Ssrc() == other.Ssrc() &&
42 arg.SequenceNumber() == other.SequenceNumber(); 49 arg.SequenceNumber() == other.SequenceNumber();
43 } 50 }
44 51
45 std::unique_ptr<RtpPacketReceived> CreateRtpPacketReceived( 52 std::unique_ptr<RtpPacketReceived> CreateRtpPacketReceived(
46 uint32_t ssrc, 53 uint32_t ssrc,
47 size_t sequence_number = 0) { 54 size_t sequence_number = 0) {
48 // |sequence_number| is declared |size_t| to prevent ugly casts when calling 55 // |sequence_number| is declared |size_t| to prevent ugly casts when calling
49 // the function, but should in reality always be a |uint16_t|. 56 // the function, but should in reality always be a |uint16_t|.
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
112 119
113 // Test tear-down 120 // Test tear-down
114 for (const auto& sink : sinks) { 121 for (const auto& sink : sinks) {
115 demuxer.RemoveSink(&sink); 122 demuxer.RemoveSink(&sink);
116 } 123 }
117 } 124 }
118 125
119 TEST(RtpDemuxerTest, PacketsDeliveredInRightOrder) { 126 TEST(RtpDemuxerTest, PacketsDeliveredInRightOrder) {
120 RtpDemuxer demuxer; 127 RtpDemuxer demuxer;
121 128
122 constexpr uint32_t ssrcs[] = {101, 202, 303}; 129 constexpr uint32_t ssrc = 101;
123 MockRtpPacketSink sinks[arraysize(ssrcs)]; 130 MockRtpPacketSink sink;
124 for (size_t i = 0; i < arraysize(ssrcs); i++) { 131 demuxer.AddSink(ssrc, &sink);
125 demuxer.AddSink(ssrcs[i], &sinks[i]);
126 }
127 132
128 std::unique_ptr<RtpPacketReceived> packets[5]; 133 std::unique_ptr<RtpPacketReceived> packets[5];
129 for (size_t i = 0; i < arraysize(packets); i++) { 134 for (size_t i = 0; i < arraysize(packets); i++) {
130 packets[i] = CreateRtpPacketReceived(ssrcs[0], i); 135 packets[i] = CreateRtpPacketReceived(ssrc, i);
131 } 136 }
132 137
133 InSequence sequence; 138 InSequence sequence;
134 for (const auto& packet : packets) { 139 for (const auto& packet : packets) {
135 EXPECT_CALL(sinks[0], OnRtpPacket(SamePacketAs(*packet))).Times(1); 140 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
136 } 141 }
137 142
138 for (const auto& packet : packets) { 143 for (const auto& packet : packets) {
139 EXPECT_TRUE(demuxer.OnRtpPacket(*packet)); 144 EXPECT_TRUE(demuxer.OnRtpPacket(*packet));
140 } 145 }
141 146
142 // Test tear-down 147 // Test tear-down
143 for (const auto& sink : sinks) { 148 demuxer.RemoveSink(&sink);
144 demuxer.RemoveSink(&sink);
145 }
146 } 149 }
147 150
148 TEST(RtpDemuxerTest, MultipleSinksMappedToSameSsrc) { 151 TEST(RtpDemuxerTest, MultipleSinksMappedToSameSsrc) {
149 RtpDemuxer demuxer; 152 RtpDemuxer demuxer;
150 153
151 MockRtpPacketSink sinks[3]; 154 MockRtpPacketSink sinks[3];
152 constexpr uint32_t ssrc = 404; 155 constexpr uint32_t ssrc = 404;
153 for (auto& sink : sinks) { 156 for (auto& sink : sinks) {
154 demuxer.AddSink(ssrc, &sink); 157 demuxer.AddSink(ssrc, &sink);
155 } 158 }
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after
417 auto packet = 420 auto packet =
418 CreateRtpPacketReceivedWithRsid(rsids[i], ssrc, sequence_number); 421 CreateRtpPacketReceivedWithRsid(rsids[i], ssrc, sequence_number);
419 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1); 422 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
420 EXPECT_TRUE(demuxer.OnRtpPacket(*packet)); 423 EXPECT_TRUE(demuxer.OnRtpPacket(*packet));
421 } 424 }
422 425
423 // Test tear-down 426 // Test tear-down
424 demuxer.RemoveSink(&sink); 427 demuxer.RemoveSink(&sink);
425 } 428 }
426 429
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
427 TEST(RtpDemuxerTest, SinkWithBothRsidAndSsrcAssociations) { 455 TEST(RtpDemuxerTest, SinkWithBothRsidAndSsrcAssociations) {
428 RtpDemuxer demuxer; 456 RtpDemuxer demuxer;
429 457
430 MockRtpPacketSink sink; 458 MockRtpPacketSink sink;
431 constexpr uint32_t standalone_ssrc = 10101; 459 constexpr uint32_t standalone_ssrc = 10101;
432 constexpr uint32_t rsid_ssrc = 20202; 460 constexpr uint32_t rsid_ssrc = 20202;
433 const std::string rsid = "a"; 461 const std::string rsid = "a";
434 462
435 demuxer.AddSink(standalone_ssrc, &sink); 463 demuxer.AddSink(standalone_ssrc, &sink);
436 demuxer.AddSink(rsid, &sink); 464 demuxer.AddSink(rsid, &sink);
(...skipping 24 matching lines...) Expand all
461 489
462 constexpr uint16_t seq_num = 999; 490 constexpr uint16_t seq_num = 999;
463 auto packet = CreateRtpPacketReceivedWithRsid(rsid, ssrc, seq_num); 491 auto packet = CreateRtpPacketReceivedWithRsid(rsid, ssrc, seq_num);
464 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1); 492 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
465 EXPECT_TRUE(demuxer.OnRtpPacket(*packet)); 493 EXPECT_TRUE(demuxer.OnRtpPacket(*packet));
466 494
467 // Test tear-down 495 // Test tear-down
468 demuxer.RemoveSink(&sink); 496 demuxer.RemoveSink(&sink);
469 } 497 }
470 498
499 TEST(RtpDemuxerTest, RsidObserversInformedOfResolutions) {
500 RtpDemuxer demuxer;
501
502 constexpr uint32_t ssrc = 111;
503 const std::string rsid = "a";
504
505 MockRsidResolutionObserver rsid_resolution_observers[3];
506 for (auto& observer : rsid_resolution_observers) {
507 demuxer.RegisterRsidResolutionObserver(&observer);
508 EXPECT_CALL(observer, OnRsidResolved(rsid, ssrc)).Times(1);
509 }
510
511 // The expected calls to OnRsidResolved() will be triggered by this.
512 demuxer.OnRtpPacket(*CreateRtpPacketReceivedWithRsid(rsid, ssrc));
513
514 // Test tear-down
515 for (auto& observer : rsid_resolution_observers) {
516 demuxer.DeregisterRsidResolutionObserver(&observer);
517 }
518 }
519
520 // Normally, we only produce one notification per resolution (though no such
521 // guarantee is made), but when a new observer is added, we reset
522 // this suppression - we "re-resolve" associations for the benefit of the
523 // new observer..
524 TEST(RtpDemuxerTest, NotificationSuppressionResetWhenNewObserverAdded) {
danilchap 2017/06/19 13:31:56 do you have any (practical) scenario where you wan
eladalon 2017/06/19 14:35:17 The line between practical and theoretical is blur
525 RtpDemuxer demuxer;
526
527 constexpr uint32_t ssrc = 111;
528 const std::string rsid = "a";
529
530 // First observer registered, then gets a notification.
531 NiceMock<MockRsidResolutionObserver> first_observer;
532 demuxer.RegisterRsidResolutionObserver(&first_observer);
533 demuxer.OnRtpPacket(*CreateRtpPacketReceivedWithRsid(rsid, ssrc));
534
535 // Second observer registered, then gets a notification. No guarantee is made
536 // about whether the first observer would get an additional notification.
537 MockRsidResolutionObserver second_observer;
538 demuxer.RegisterRsidResolutionObserver(&second_observer);
539 EXPECT_CALL(first_observer, OnRsidResolved(rsid, ssrc)).Times(AtLeast(0));
540 EXPECT_CALL(second_observer, OnRsidResolved(rsid, ssrc)).Times(1);
541 demuxer.OnRtpPacket(*CreateRtpPacketReceivedWithRsid(rsid, ssrc));
542
543 // Test tear-down
544 demuxer.DeregisterRsidResolutionObserver(&first_observer);
545 demuxer.DeregisterRsidResolutionObserver(&second_observer);
546 }
547
548 TEST(RtpDemuxerTest, DeregisteredRsidObserversNotInformedOfResolutions) {
549 RtpDemuxer demuxer;
550
551 constexpr uint32_t ssrc = 111;
552 const std::string rsid = "a";
553 NiceMock<MockRtpPacketSink> sink;
554 demuxer.AddSink(rsid, &sink);
555
556 // Register several, then deregister only one, to show that not all of the
557 // observers had been forgotten when one was removed.
558 MockRsidResolutionObserver observer_1;
559 MockRsidResolutionObserver observer_2_removed;
560 MockRsidResolutionObserver observer_3;
561
562 demuxer.RegisterRsidResolutionObserver(&observer_1);
563 demuxer.RegisterRsidResolutionObserver(&observer_2_removed);
564 demuxer.RegisterRsidResolutionObserver(&observer_3);
565
566 demuxer.DeregisterRsidResolutionObserver(&observer_2_removed);
567
568 EXPECT_CALL(observer_1, OnRsidResolved(rsid, ssrc)).Times(1);
569 EXPECT_CALL(observer_2_removed, OnRsidResolved(_, _)).Times(0);
570 EXPECT_CALL(observer_3, OnRsidResolved(rsid, ssrc)).Times(1);
571
572 // The expected calls to OnRsidResolved() will be triggered by this.
573 demuxer.OnRtpPacket(*CreateRtpPacketReceivedWithRsid(rsid, ssrc));
574
575 // Test tear-down
576 demuxer.RemoveSink(&sink);
577 demuxer.DeregisterRsidResolutionObserver(&observer_1);
578 demuxer.DeregisterRsidResolutionObserver(&observer_3);
579 }
580
471 #if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID) 581 #if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
472 TEST(RtpDemuxerTest, RsidMustBeNonEmpty) { 582 TEST(RtpDemuxerTest, RsidMustBeNonEmpty) {
473 RtpDemuxer demuxer; 583 RtpDemuxer demuxer;
474 MockRtpPacketSink sink; 584 MockRtpPacketSink sink;
475 EXPECT_DEATH(demuxer.AddSink("", &sink), ""); 585 EXPECT_DEATH(demuxer.AddSink("", &sink), "");
476 } 586 }
477 587
478 TEST(RtpDemuxerTest, RsidMustBeAlphaNumeric) { 588 TEST(RtpDemuxerTest, RsidMustBeAlphaNumeric) {
479 RtpDemuxer demuxer; 589 RtpDemuxer demuxer;
480 MockRtpPacketSink sink; 590 MockRtpPacketSink sink;
481 EXPECT_DEATH(demuxer.AddSink("a_3", &sink), ""); 591 EXPECT_DEATH(demuxer.AddSink("a_3", &sink), "");
482 } 592 }
483 593
484 TEST(RtpDemuxerTest, RsidMustNotExceedMaximumLength) { 594 TEST(RtpDemuxerTest, RsidMustNotExceedMaximumLength) {
485 RtpDemuxer demuxer; 595 RtpDemuxer demuxer;
486 MockRtpPacketSink sink; 596 MockRtpPacketSink sink;
487 std::string rsid(StreamId::kMaxSize + 1, 'a'); 597 std::string rsid(StreamId::kMaxSize + 1, 'a');
488 EXPECT_DEATH(demuxer.AddSink(rsid, &sink), ""); 598 EXPECT_DEATH(demuxer.AddSink(rsid, &sink), "");
489 } 599 }
490 600
491 TEST(RtpDemuxerTest, RepeatedRsidAssociationsDisallowed) { 601 TEST(RtpDemuxerTest, RepeatedRsidAssociationsDisallowed) {
492 RtpDemuxer demuxer; 602 RtpDemuxer demuxer;
493 MockRtpPacketSink sink; 603 MockRtpPacketSink sink;
494 demuxer.AddSink("a", &sink); 604 demuxer.AddSink("a", &sink);
495 EXPECT_DEATH(demuxer.AddSink("a", &sink), ""); 605 EXPECT_DEATH(demuxer.AddSink("a", &sink), "");
606 demuxer.RemoveSink(&sink);
496 } 607 }
608
609 TEST(RtpDemuxerTest,
610 DoubleRegisterationOfNeverRegisteredRsidResolutionObserverDisallowed) {
611 RtpDemuxer demuxer;
612 MockRsidResolutionObserver observer;
613 demuxer.RegisterRsidResolutionObserver(&observer);
614 EXPECT_DEATH(demuxer.RegisterRsidResolutionObserver(&observer), "");
615 demuxer.DeregisterRsidResolutionObserver(&observer);
616 }
617
618 TEST(RtpDemuxerTest,
619 DregisterationOfNeverRegisteredRsidResolutionObserverDisallowed) {
620 RtpDemuxer demuxer;
621 MockRsidResolutionObserver observer;
622 EXPECT_DEATH(demuxer.DeregisterRsidResolutionObserver(&observer), "");
623 }
624
497 #endif 625 #endif
498 626
499 } // namespace 627 } // namespace
500 } // namespace webrtc 628 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698