Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / media / cast / rtcp / receiver_rtcp_event_subscriber_unittest.cc
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.
4
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"
14
15 namespace media {
16 namespace cast {
17
18 namespace {
19
20 const size_t kMaxEventEntries = 10u;
21 const int64 kDelayMs = 20L;
22
23 }  // namespace
24
25 class ReceiverRtcpEventSubscriberTest : public ::testing::Test {
26  protected:
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())) {}
34
35   virtual ~ReceiverRtcpEventSubscriberTest() {}
36
37   virtual void TearDown() OVERRIDE {
38     if (event_subscriber_) {
39       cast_environment_->Logging()->RemoveRawEventSubscriber(
40           event_subscriber_.get());
41     }
42   }
43
44   void Init(ReceiverRtcpEventSubscriber::Type type) {
45     event_subscriber_.reset(
46         new ReceiverRtcpEventSubscriber(kMaxEventEntries, type));
47     cast_environment_->Logging()->AddRawEventSubscriber(
48         event_subscriber_.get());
49   }
50
51   void InsertEvents() {
52     // Video events
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,
58         /*frame_id*/ 1u);
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);
63
64     // Audio events
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,
70         /*frame_id*/ 3u);
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);
75
76     // Unrelated events
77     cast_environment_->Logging()->InsertFrameEvent(
78         testing_clock_->NowTicks(), kVideoFrameReceived, /*rtp_timestamp*/ 100u,
79         /*frame_id*/ 1u);
80     cast_environment_->Logging()->InsertFrameEvent(
81         testing_clock_->NowTicks(), kAudioFrameReceived, /*rtp_timestamp*/ 100u,
82         /*frame_id*/ 1u);
83     cast_environment_->Logging()->InsertGenericEvent(testing_clock_->NowTicks(),
84                                                      kRttMs, /*value*/ 100);
85   }
86
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_;
91 };
92
93 TEST_F(ReceiverRtcpEventSubscriberTest, LogVideoEvents) {
94   Init(ReceiverRtcpEventSubscriber::kVideoEventSubscriber);
95
96   InsertEvents();
97
98   RtcpReceiverLogMessage receiver_log;
99   event_subscriber_->GetReceiverLogMessageAndReset(&receiver_log);
100
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());
109
110   ++log_it;
111   EXPECT_EQ(200u, log_it->rtp_timestamp_);
112   ASSERT_EQ(2u, log_it->event_log_messages_.size());
113 }
114
115 TEST_F(ReceiverRtcpEventSubscriberTest, LogAudioEvents) {
116   Init(ReceiverRtcpEventSubscriber::kAudioEventSubscriber);
117
118   InsertEvents();
119
120   RtcpReceiverLogMessage receiver_log;
121   event_subscriber_->GetReceiverLogMessageAndReset(&receiver_log);
122
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());
131
132   ++log_it;
133   EXPECT_EQ(400u, log_it->rtp_timestamp_);
134   ASSERT_EQ(2u, log_it->event_log_messages_.size());
135 }
136
137 TEST_F(ReceiverRtcpEventSubscriberTest, MapReset) {
138   Init(ReceiverRtcpEventSubscriber::kVideoEventSubscriber);
139
140   cast_environment_->Logging()->InsertFrameEvent(
141       testing_clock_->NowTicks(), kVideoFrameDecoded, /*rtp_timestamp*/ 100u,
142       /*frame_id*/ 1u);
143
144   RtcpReceiverLogMessage receiver_log;
145   event_subscriber_->GetReceiverLogMessageAndReset(&receiver_log);
146
147   EXPECT_EQ(1u, receiver_log.size());
148
149   // Call again without any logging in between, should return empty log.
150   event_subscriber_->GetReceiverLogMessageAndReset(&receiver_log);
151   EXPECT_TRUE(receiver_log.empty());
152 }
153
154 TEST_F(ReceiverRtcpEventSubscriberTest, DropEventsWhenSizeExceeded) {
155   Init(ReceiverRtcpEventSubscriber::kVideoEventSubscriber);
156
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);
161   }
162
163   RtcpReceiverLogMessage receiver_log;
164   event_subscriber_->GetReceiverLogMessageAndReset(&receiver_log);
165
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_);
169
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);
174   }
175
176   event_subscriber_->GetReceiverLogMessageAndReset(&receiver_log);
177
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_);
182 }
183
184 }  // namespace cast
185 }  // namespace media