1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "base/memory/ref_counted.h"
6 #include "base/memory/scoped_ptr.h"
7 #include "base/test/simple_test_tick_clock.h"
8 #include "base/time/tick_clock.h"
9 #include "media/cast/cast_environment.h"
10 #include "media/cast/logging/logging_defines.h"
11 #include "media/cast/rtcp/receiver_rtcp_event_subscriber.h"
12 #include "media/cast/test/fake_single_thread_task_runner.h"
13 #include "testing/gtest/include/gtest/gtest.h"
20 const size_t kMaxEventEntries = 10u;
21 const int64 kDelayMs = 20L;
25 class ReceiverRtcpEventSubscriberTest : public ::testing::Test {
27 ReceiverRtcpEventSubscriberTest()
28 : testing_clock_(new base::SimpleTestTickClock()),
29 task_runner_(new test::FakeSingleThreadTaskRunner(testing_clock_)),
30 cast_environment_(new CastEnvironment(
31 scoped_ptr<base::TickClock>(testing_clock_).Pass(), task_runner_,
32 task_runner_, task_runner_, task_runner_, task_runner_,
33 task_runner_, GetLoggingConfigWithRawEventsAndStatsEnabled())) {}
35 virtual ~ReceiverRtcpEventSubscriberTest() {}
37 virtual void TearDown() OVERRIDE {
38 if (event_subscriber_) {
39 cast_environment_->Logging()->RemoveRawEventSubscriber(
40 event_subscriber_.get());
44 void Init(ReceiverRtcpEventSubscriber::Type type) {
45 event_subscriber_.reset(
46 new ReceiverRtcpEventSubscriber(kMaxEventEntries, type));
47 cast_environment_->Logging()->AddRawEventSubscriber(
48 event_subscriber_.get());
53 cast_environment_->Logging()->InsertFrameEventWithDelay(
54 testing_clock_->NowTicks(), kVideoRenderDelay, /*rtp_timestamp*/ 100u,
55 /*frame_id*/ 2u, base::TimeDelta::FromMilliseconds(kDelayMs));
56 cast_environment_->Logging()->InsertFrameEvent(
57 testing_clock_->NowTicks(), kVideoFrameDecoded, /*rtp_timestamp*/ 200u,
59 cast_environment_->Logging()->InsertPacketEvent(
60 testing_clock_->NowTicks(), kVideoPacketReceived,
61 /*rtp_timestamp */ 200u, /*frame_id*/ 2u, /*packet_id*/ 1u,
62 /*max_packet_id*/ 10u, /*size*/ 1024u);
65 cast_environment_->Logging()->InsertFrameEventWithDelay(
66 testing_clock_->NowTicks(), kAudioPlayoutDelay, /*rtp_timestamp*/ 300u,
67 /*frame_id*/ 4u, base::TimeDelta::FromMilliseconds(kDelayMs));
68 cast_environment_->Logging()->InsertFrameEvent(
69 testing_clock_->NowTicks(), kAudioFrameDecoded, /*rtp_timestamp*/ 400u,
71 cast_environment_->Logging()->InsertPacketEvent(
72 testing_clock_->NowTicks(), kAudioPacketReceived,
73 /*rtp_timestamp */ 400u, /*frame_id*/ 5u, /*packet_id*/ 1u,
74 /*max_packet_id*/ 10u, /*size*/ 128u);
77 cast_environment_->Logging()->InsertFrameEvent(
78 testing_clock_->NowTicks(), kVideoFrameReceived, /*rtp_timestamp*/ 100u,
80 cast_environment_->Logging()->InsertFrameEvent(
81 testing_clock_->NowTicks(), kAudioFrameReceived, /*rtp_timestamp*/ 100u,
83 cast_environment_->Logging()->InsertGenericEvent(testing_clock_->NowTicks(),
84 kRttMs, /*value*/ 100);
87 base::SimpleTestTickClock* testing_clock_; // Owned by CastEnvironment.
88 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_;
89 scoped_refptr<CastEnvironment> cast_environment_;
90 scoped_ptr<ReceiverRtcpEventSubscriber> event_subscriber_;
93 TEST_F(ReceiverRtcpEventSubscriberTest, LogVideoEvents) {
94 Init(ReceiverRtcpEventSubscriber::kVideoEventSubscriber);
98 RtcpReceiverLogMessage receiver_log;
99 event_subscriber_->GetReceiverLogMessageAndReset(&receiver_log);
101 ASSERT_EQ(2u, receiver_log.size());
102 RtcpReceiverLogMessage::iterator log_it = receiver_log.begin();
103 EXPECT_EQ(100u, log_it->rtp_timestamp_);
104 ASSERT_EQ(1u, log_it->event_log_messages_.size());
105 RtcpReceiverEventLogMessages::iterator event_it =
106 log_it->event_log_messages_.begin();
107 EXPECT_EQ(kVideoRenderDelay, event_it->type);
108 EXPECT_EQ(kDelayMs, event_it->delay_delta.InMilliseconds());
111 EXPECT_EQ(200u, log_it->rtp_timestamp_);
112 ASSERT_EQ(2u, log_it->event_log_messages_.size());
115 TEST_F(ReceiverRtcpEventSubscriberTest, LogAudioEvents) {
116 Init(ReceiverRtcpEventSubscriber::kAudioEventSubscriber);
120 RtcpReceiverLogMessage receiver_log;
121 event_subscriber_->GetReceiverLogMessageAndReset(&receiver_log);
123 ASSERT_EQ(2u, receiver_log.size());
124 RtcpReceiverLogMessage::iterator log_it = receiver_log.begin();
125 EXPECT_EQ(300u, log_it->rtp_timestamp_);
126 ASSERT_EQ(1u, log_it->event_log_messages_.size());
127 RtcpReceiverEventLogMessages::iterator event_it =
128 log_it->event_log_messages_.begin();
129 EXPECT_EQ(kAudioPlayoutDelay, event_it->type);
130 EXPECT_EQ(kDelayMs, event_it->delay_delta.InMilliseconds());
133 EXPECT_EQ(400u, log_it->rtp_timestamp_);
134 ASSERT_EQ(2u, log_it->event_log_messages_.size());
137 TEST_F(ReceiverRtcpEventSubscriberTest, MapReset) {
138 Init(ReceiverRtcpEventSubscriber::kVideoEventSubscriber);
140 cast_environment_->Logging()->InsertFrameEvent(
141 testing_clock_->NowTicks(), kVideoFrameDecoded, /*rtp_timestamp*/ 100u,
144 RtcpReceiverLogMessage receiver_log;
145 event_subscriber_->GetReceiverLogMessageAndReset(&receiver_log);
147 EXPECT_EQ(1u, receiver_log.size());
149 // Call again without any logging in between, should return empty log.
150 event_subscriber_->GetReceiverLogMessageAndReset(&receiver_log);
151 EXPECT_TRUE(receiver_log.empty());
154 TEST_F(ReceiverRtcpEventSubscriberTest, DropEventsWhenSizeExceeded) {
155 Init(ReceiverRtcpEventSubscriber::kVideoEventSubscriber);
157 for (uint32 i = 1u; i <= 10u; ++i) {
158 cast_environment_->Logging()->InsertFrameEvent(
159 testing_clock_->NowTicks(), kVideoFrameDecoded,
160 /*rtp_timestamp*/ i * 10, /*frame_id*/ i);
163 RtcpReceiverLogMessage receiver_log;
164 event_subscriber_->GetReceiverLogMessageAndReset(&receiver_log);
166 ASSERT_EQ(10u, receiver_log.size());
167 EXPECT_EQ(10u, receiver_log.begin()->rtp_timestamp_);
168 EXPECT_EQ(100u, receiver_log.rbegin()->rtp_timestamp_);
170 for (uint32 i = 1u; i <= 11u; ++i) {
171 cast_environment_->Logging()->InsertFrameEvent(
172 testing_clock_->NowTicks(), kVideoFrameDecoded,
173 /*rtp_timestamp*/ i * 10, /*frame_id*/ i);
176 event_subscriber_->GetReceiverLogMessageAndReset(&receiver_log);
178 // Event with RTP timestamp 10 should have been dropped when 110 is inserted.
179 ASSERT_EQ(10u, receiver_log.size());
180 EXPECT_EQ(20u, receiver_log.begin()->rtp_timestamp_);
181 EXPECT_EQ(110u, receiver_log.rbegin()->rtp_timestamp_);