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.
9 #include "base/rand_util.h"
10 #include "base/test/simple_test_tick_clock.h"
11 #include "base/time/tick_clock.h"
12 #include "base/time/time.h"
13 #include "media/cast/logging/logging_defines.h"
14 #include "media/cast/logging/logging_impl.h"
15 #include "media/cast/logging/simple_event_subscriber.h"
16 #include "testing/gtest/include/gtest/gtest.h"
21 // Insert frame duration- one second.
22 const int64 kIntervalTime1S = 1;
23 // Test frame rate goal - 30fps.
24 const int kFrameIntervalMs = 33;
26 static const int64 kStartMillisecond = INT64_C(12345678900000);
28 class LoggingImplTest : public ::testing::Test {
31 testing_clock_.Advance(
32 base::TimeDelta::FromMilliseconds(kStartMillisecond));
33 logging_.AddRawEventSubscriber(&event_subscriber_);
36 virtual ~LoggingImplTest() {
37 logging_.RemoveRawEventSubscriber(&event_subscriber_);
41 base::SimpleTestTickClock testing_clock_;
42 SimpleEventSubscriber event_subscriber_;
44 DISALLOW_COPY_AND_ASSIGN(LoggingImplTest);
47 TEST_F(LoggingImplTest, BasicFrameLogging) {
48 base::TimeTicks start_time = testing_clock_.NowTicks();
49 base::TimeDelta time_interval = testing_clock_.NowTicks() - start_time;
50 uint32 rtp_timestamp = 0;
54 now = testing_clock_.NowTicks();
55 logging_.InsertFrameEvent(
56 now, kAudioFrameCaptureBegin, rtp_timestamp, frame_id);
57 testing_clock_.Advance(
58 base::TimeDelta::FromMilliseconds(kFrameIntervalMs));
59 rtp_timestamp += kFrameIntervalMs * 90;
61 time_interval = now - start_time;
62 } while (time_interval.InSeconds() < kIntervalTime1S);
65 std::vector<FrameEvent> frame_events;
66 event_subscriber_.GetFrameEventsAndReset(&frame_events);
67 // Size of vector should be equal to the number of events logged,
68 // which equals to number of frames in this case.
69 EXPECT_EQ(frame_id, frame_events.size());
72 TEST_F(LoggingImplTest, FrameLoggingWithSize) {
73 // Average packet size.
74 const int kBaseFrameSizeBytes = 25000;
75 const int kRandomSizeInterval = 100;
76 base::TimeTicks start_time = testing_clock_.NowTicks();
77 base::TimeDelta time_interval = testing_clock_.NowTicks() - start_time;
78 uint32 rtp_timestamp = 0;
81 int target_bitrate = 1234;
83 int size = kBaseFrameSizeBytes +
84 base::RandInt(-kRandomSizeInterval, kRandomSizeInterval);
85 sum_size += static_cast<size_t>(size);
86 logging_.InsertEncodedFrameEvent(testing_clock_.NowTicks(),
87 kVideoFrameEncoded, rtp_timestamp,
88 frame_id, size, true, target_bitrate);
89 testing_clock_.Advance(base::TimeDelta::FromMilliseconds(kFrameIntervalMs));
90 rtp_timestamp += kFrameIntervalMs * 90;
92 time_interval = testing_clock_.NowTicks() - start_time;
93 } while (time_interval.InSeconds() < kIntervalTime1S);
95 std::vector<FrameEvent> frame_events;
96 event_subscriber_.GetFrameEventsAndReset(&frame_events);
97 // Size of vector should be equal to the number of events logged, which
98 // equals to number of frames in this case.
99 EXPECT_EQ(frame_id, frame_events.size());
102 TEST_F(LoggingImplTest, FrameLoggingWithDelay) {
103 // Average packet size.
104 const int kPlayoutDelayMs = 50;
105 const int kRandomSizeInterval = 20;
106 base::TimeTicks start_time = testing_clock_.NowTicks();
107 base::TimeDelta time_interval = testing_clock_.NowTicks() - start_time;
108 uint32 rtp_timestamp = 0;
111 int delay = kPlayoutDelayMs +
112 base::RandInt(-kRandomSizeInterval, kRandomSizeInterval);
113 logging_.InsertFrameEventWithDelay(
114 testing_clock_.NowTicks(),
115 kAudioFrameCaptureBegin,
118 base::TimeDelta::FromMilliseconds(delay));
119 testing_clock_.Advance(base::TimeDelta::FromMilliseconds(kFrameIntervalMs));
120 rtp_timestamp += kFrameIntervalMs * 90;
122 time_interval = testing_clock_.NowTicks() - start_time;
123 } while (time_interval.InSeconds() < kIntervalTime1S);
125 std::vector<FrameEvent> frame_events;
126 event_subscriber_.GetFrameEventsAndReset(&frame_events);
127 // Size of vector should be equal to the number of frames logged.
128 EXPECT_EQ(frame_id, frame_events.size());
131 TEST_F(LoggingImplTest, MultipleEventFrameLogging) {
132 base::TimeTicks start_time = testing_clock_.NowTicks();
133 base::TimeDelta time_interval = testing_clock_.NowTicks() - start_time;
134 uint32 rtp_timestamp = 0u;
135 uint32 frame_id = 0u;
136 uint32 num_events = 0u;
138 logging_.InsertFrameEvent(testing_clock_.NowTicks(),
139 kAudioFrameCaptureBegin,
144 logging_.InsertEncodedFrameEvent(testing_clock_.NowTicks(),
145 kAudioFrameEncoded, rtp_timestamp,
146 frame_id, 1500, true, 0);
147 } else if (frame_id % 3) {
148 logging_.InsertFrameEvent(testing_clock_.NowTicks(), kVideoFrameDecoded,
149 rtp_timestamp, frame_id);
151 logging_.InsertFrameEventWithDelay(
152 testing_clock_.NowTicks(), kVideoRenderDelay, rtp_timestamp, frame_id,
153 base::TimeDelta::FromMilliseconds(20));
157 testing_clock_.Advance(base::TimeDelta::FromMilliseconds(kFrameIntervalMs));
158 rtp_timestamp += kFrameIntervalMs * 90;
160 time_interval = testing_clock_.NowTicks() - start_time;
161 } while (time_interval.InSeconds() < kIntervalTime1S);
163 std::vector<FrameEvent> frame_events;
164 event_subscriber_.GetFrameEventsAndReset(&frame_events);
165 // Size of vector should be equal to the number of frames logged.
166 EXPECT_EQ(num_events, frame_events.size());
167 // Multiple events captured per frame.
170 TEST_F(LoggingImplTest, PacketLogging) {
171 const int kNumPacketsPerFrame = 10;
172 const int kBaseSize = 2500;
173 const int kSizeInterval = 100;
174 base::TimeTicks start_time = testing_clock_.NowTicks();
175 base::TimeTicks latest_time;
176 base::TimeDelta time_interval = testing_clock_.NowTicks() - start_time;
177 RtpTimestamp rtp_timestamp = 0;
182 for (int i = 0; i < kNumPacketsPerFrame; ++i) {
183 int size = kBaseSize + base::RandInt(-kSizeInterval, kSizeInterval);
185 latest_time = testing_clock_.NowTicks();
187 logging_.InsertPacketEvent(latest_time,
188 kDuplicateVideoPacketReceived,
195 testing_clock_.Advance(base::TimeDelta::FromMilliseconds(kFrameIntervalMs));
196 rtp_timestamp += kFrameIntervalMs * 90;
198 time_interval = testing_clock_.NowTicks() - start_time;
199 } while (time_interval.InSeconds() < kIntervalTime1S);
201 std::vector<PacketEvent> packet_events;
202 event_subscriber_.GetPacketEventsAndReset(&packet_events);
203 // Size of vector should be equal to the number of packets logged.
204 EXPECT_EQ(num_packets, static_cast<int>(packet_events.size()));
207 TEST_F(LoggingImplTest, MultipleRawEventSubscribers) {
208 SimpleEventSubscriber event_subscriber_2;
210 // Now logging_ has two subscribers.
211 logging_.AddRawEventSubscriber(&event_subscriber_2);
213 logging_.InsertFrameEvent(testing_clock_.NowTicks(),
214 kAudioFrameCaptureBegin,
215 /*rtp_timestamp*/ 0u,
218 std::vector<FrameEvent> frame_events;
219 event_subscriber_.GetFrameEventsAndReset(&frame_events);
220 EXPECT_EQ(1u, frame_events.size());
221 frame_events.clear();
222 event_subscriber_2.GetFrameEventsAndReset(&frame_events);
223 EXPECT_EQ(1u, frame_events.size());
225 logging_.RemoveRawEventSubscriber(&event_subscriber_2);