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/encoding_event_subscriber.h"
11 #include "media/cast/logging/logging_defines.h"
12 #include "media/cast/test/fake_single_thread_task_runner.h"
13 #include "testing/gtest/include/gtest/gtest.h"
15 using media::cast::proto::AggregatedFrameEvent;
16 using media::cast::proto::AggregatedPacketEvent;
17 using media::cast::proto::BasePacketEvent;
22 class EncodingEventSubscriberTest : public ::testing::Test {
24 EncodingEventSubscriberTest()
25 : testing_clock_(new base::SimpleTestTickClock()),
26 task_runner_(new test::FakeSingleThreadTaskRunner(testing_clock_)),
27 cast_environment_(new CastEnvironment(
28 scoped_ptr<base::TickClock>(testing_clock_).Pass(),
35 GetLoggingConfigWithRawEventsAndStatsEnabled())) {}
37 void Init(EventMediaType event_media_type) {
38 DCHECK(!event_subscriber_);
39 event_subscriber_.reset(new EncodingEventSubscriber(event_media_type, 10));
40 cast_environment_->Logging()->AddRawEventSubscriber(
41 event_subscriber_.get());
44 virtual ~EncodingEventSubscriberTest() {
45 if (event_subscriber_) {
46 cast_environment_->Logging()->RemoveRawEventSubscriber(
47 event_subscriber_.get());
51 base::SimpleTestTickClock* testing_clock_; // Owned by CastEnvironment.
52 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_;
53 scoped_refptr<CastEnvironment> cast_environment_;
54 scoped_ptr<EncodingEventSubscriber> event_subscriber_;
57 TEST_F(EncodingEventSubscriberTest, FrameEventTruncating) {
60 base::TimeTicks now(testing_clock_->NowTicks());
62 // Entry with RTP timestamp 0 should get dropped.
63 for (int i = 0; i < 11; i++) {
64 cast_environment_->Logging()->InsertFrameEvent(now,
68 cast_environment_->Logging()->InsertFrameEvent(now,
74 FrameEventMap frame_events;
75 event_subscriber_->GetFrameEventsAndReset(&frame_events);
77 ASSERT_EQ(10u, frame_events.size());
78 EXPECT_EQ(100u, frame_events.begin()->first);
79 EXPECT_EQ(1000u, frame_events.rbegin()->first);
82 TEST_F(EncodingEventSubscriberTest, PacketEventTruncating) {
85 base::TimeTicks now(testing_clock_->NowTicks());
87 // Entry with RTP timestamp 0 should get dropped.
88 for (int i = 0; i < 11; i++) {
89 cast_environment_->Logging()->InsertPacketEvent(now,
91 /*rtp_timestamp*/ i * 100,
98 PacketEventMap packet_events;
99 event_subscriber_->GetPacketEventsAndReset(&packet_events);
101 ASSERT_EQ(10u, packet_events.size());
102 EXPECT_EQ(100u, packet_events.begin()->first);
103 EXPECT_EQ(1000u, packet_events.rbegin()->first);
106 TEST_F(EncodingEventSubscriberTest, EventFiltering) {
109 base::TimeTicks now(testing_clock_->NowTicks());
110 RtpTimestamp rtp_timestamp = 100;
111 cast_environment_->Logging()->InsertFrameEvent(now,
116 // This is an AUDIO_EVENT and shouldn't be processed by the subscriber.
117 cast_environment_->Logging()->InsertFrameEvent(now,
122 FrameEventMap frame_events;
123 event_subscriber_->GetFrameEventsAndReset(&frame_events);
125 FrameEventMap::iterator frame_it = frame_events.find(rtp_timestamp);
126 ASSERT_TRUE(frame_it != frame_events.end());
128 linked_ptr<AggregatedFrameEvent> frame_event = frame_it->second;
130 ASSERT_EQ(1, frame_event->event_type_size());
131 EXPECT_EQ(media::cast::proto::VIDEO_FRAME_DECODED,
132 frame_event->event_type(0));
134 PacketEventMap packet_events;
135 event_subscriber_->GetPacketEventsAndReset(&packet_events);
136 EXPECT_TRUE(packet_events.empty());
139 TEST_F(EncodingEventSubscriberTest, FrameEvent) {
141 base::TimeTicks now(testing_clock_->NowTicks());
142 RtpTimestamp rtp_timestamp = 100;
143 cast_environment_->Logging()->InsertFrameEvent(now, kVideoFrameDecoded,
147 FrameEventMap frame_events;
148 event_subscriber_->GetFrameEventsAndReset(&frame_events);
150 ASSERT_EQ(1u, frame_events.size());
152 FrameEventMap::iterator it = frame_events.find(rtp_timestamp);
153 ASSERT_TRUE(it != frame_events.end());
155 linked_ptr<AggregatedFrameEvent> event = it->second;
157 EXPECT_EQ(rtp_timestamp, event->rtp_timestamp());
159 ASSERT_EQ(1, event->event_type_size());
160 EXPECT_EQ(media::cast::proto::VIDEO_FRAME_DECODED, event->event_type(0));
161 ASSERT_EQ(1, event->event_timestamp_micros_size());
162 EXPECT_EQ(now.ToInternalValue(), event->event_timestamp_micros(0));
164 EXPECT_EQ(0, event->encoded_frame_size());
165 EXPECT_EQ(0, event->delay_millis());
167 event_subscriber_->GetFrameEventsAndReset(&frame_events);
168 EXPECT_TRUE(frame_events.empty());
171 TEST_F(EncodingEventSubscriberTest, FrameEventDelay) {
173 base::TimeTicks now(testing_clock_->NowTicks());
174 RtpTimestamp rtp_timestamp = 100;
176 cast_environment_->Logging()->InsertFrameEventWithDelay(
177 now, kAudioPlayoutDelay, rtp_timestamp,
178 /*frame_id*/ 0, base::TimeDelta::FromMilliseconds(delay_ms));
180 FrameEventMap frame_events;
181 event_subscriber_->GetFrameEventsAndReset(&frame_events);
183 ASSERT_EQ(1u, frame_events.size());
185 FrameEventMap::iterator it = frame_events.find(rtp_timestamp);
186 ASSERT_TRUE(it != frame_events.end());
188 linked_ptr<AggregatedFrameEvent> event = it->second;
190 EXPECT_EQ(rtp_timestamp, event->rtp_timestamp());
192 ASSERT_EQ(1, event->event_type_size());
193 EXPECT_EQ(media::cast::proto::AUDIO_PLAYOUT_DELAY, event->event_type(0));
194 ASSERT_EQ(1, event->event_timestamp_micros_size());
195 EXPECT_EQ(now.ToInternalValue(), event->event_timestamp_micros(0));
197 EXPECT_EQ(0, event->encoded_frame_size());
198 EXPECT_EQ(100, event->delay_millis());
201 TEST_F(EncodingEventSubscriberTest, FrameEventSize) {
203 base::TimeTicks now(testing_clock_->NowTicks());
204 RtpTimestamp rtp_timestamp = 100;
206 cast_environment_->Logging()->InsertFrameEventWithSize(
207 now, kVideoFrameEncoded, rtp_timestamp,
208 /*frame_id*/ 0, size);
210 FrameEventMap frame_events;
211 event_subscriber_->GetFrameEventsAndReset(&frame_events);
213 ASSERT_EQ(1u, frame_events.size());
215 FrameEventMap::iterator it = frame_events.find(rtp_timestamp);
216 ASSERT_TRUE(it != frame_events.end());
218 linked_ptr<AggregatedFrameEvent> event = it->second;
220 EXPECT_EQ(rtp_timestamp, event->rtp_timestamp());
222 ASSERT_EQ(1, event->event_type_size());
223 EXPECT_EQ(media::cast::proto::VIDEO_FRAME_ENCODED, event->event_type(0));
224 ASSERT_EQ(1, event->event_timestamp_micros_size());
225 EXPECT_EQ(now.ToInternalValue(), event->event_timestamp_micros(0));
227 EXPECT_EQ(size, event->encoded_frame_size());
228 EXPECT_EQ(0, event->delay_millis());
231 TEST_F(EncodingEventSubscriberTest, MultipleFrameEvents) {
233 RtpTimestamp rtp_timestamp1 = 100;
234 RtpTimestamp rtp_timestamp2 = 200;
235 base::TimeTicks now1(testing_clock_->NowTicks());
236 cast_environment_->Logging()->InsertFrameEventWithDelay(
237 now1, kAudioPlayoutDelay, rtp_timestamp1,
238 /*frame_id*/ 0, /*delay*/ base::TimeDelta::FromMilliseconds(100));
240 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(20));
241 base::TimeTicks now2(testing_clock_->NowTicks());
242 cast_environment_->Logging()->InsertFrameEventWithSize(
243 now2, kAudioFrameEncoded, rtp_timestamp2,
244 /*frame_id*/ 0, /*size*/ 123);
246 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(20));
247 base::TimeTicks now3(testing_clock_->NowTicks());
248 cast_environment_->Logging()->InsertFrameEvent(
249 now3, kAudioFrameDecoded, rtp_timestamp1, /*frame_id*/ 0);
251 FrameEventMap frame_events;
252 event_subscriber_->GetFrameEventsAndReset(&frame_events);
254 ASSERT_EQ(2u, frame_events.size());
256 FrameEventMap::iterator it = frame_events.find(100);
257 ASSERT_TRUE(it != frame_events.end());
259 linked_ptr<AggregatedFrameEvent> event = it->second;
261 EXPECT_EQ(rtp_timestamp1, event->rtp_timestamp());
263 ASSERT_EQ(2, event->event_type_size());
264 EXPECT_EQ(media::cast::proto::AUDIO_PLAYOUT_DELAY, event->event_type(0));
265 EXPECT_EQ(media::cast::proto::AUDIO_FRAME_DECODED, event->event_type(1));
267 ASSERT_EQ(2, event->event_timestamp_micros_size());
268 EXPECT_EQ(now1.ToInternalValue(), event->event_timestamp_micros(0));
269 EXPECT_EQ(now3.ToInternalValue(), event->event_timestamp_micros(1));
271 it = frame_events.find(200);
272 ASSERT_TRUE(it != frame_events.end());
276 EXPECT_EQ(rtp_timestamp2, event->rtp_timestamp());
278 ASSERT_EQ(1, event->event_type_size());
279 EXPECT_EQ(media::cast::proto::AUDIO_FRAME_ENCODED, event->event_type(0));
281 ASSERT_EQ(1, event->event_timestamp_micros_size());
282 EXPECT_EQ(now2.ToInternalValue(), event->event_timestamp_micros(0));
285 TEST_F(EncodingEventSubscriberTest, PacketEvent) {
287 base::TimeTicks now(testing_clock_->NowTicks());
288 RtpTimestamp rtp_timestamp = 100;
291 cast_environment_->Logging()->InsertPacketEvent(
292 now, kAudioPacketReceived, rtp_timestamp, /*frame_id*/ 0, packet_id,
293 /*max_packet_id*/ 10, size);
295 PacketEventMap packet_events;
296 event_subscriber_->GetPacketEventsAndReset(&packet_events);
298 ASSERT_EQ(1u, packet_events.size());
300 PacketEventMap::iterator it = packet_events.find(rtp_timestamp);
301 ASSERT_TRUE(it != packet_events.end());
303 linked_ptr<AggregatedPacketEvent> event = it->second;
305 EXPECT_EQ(rtp_timestamp, event->rtp_timestamp());
307 ASSERT_EQ(1, event->base_packet_event_size());
308 const BasePacketEvent& base_event = event->base_packet_event(0);
309 EXPECT_EQ(packet_id, base_event.packet_id());
310 ASSERT_EQ(1, base_event.event_type_size());
311 EXPECT_EQ(media::cast::proto::AUDIO_PACKET_RECEIVED,
312 base_event.event_type(0));
313 ASSERT_EQ(1, base_event.event_timestamp_micros_size());
314 EXPECT_EQ(now.ToInternalValue(), base_event.event_timestamp_micros(0));
316 event_subscriber_->GetPacketEventsAndReset(&packet_events);
317 EXPECT_TRUE(packet_events.empty());
320 TEST_F(EncodingEventSubscriberTest, MultiplePacketEventsForPacket) {
322 base::TimeTicks now1(testing_clock_->NowTicks());
323 RtpTimestamp rtp_timestamp = 100;
326 cast_environment_->Logging()->InsertPacketEvent(
327 now1, kPacketSentToPacer, rtp_timestamp, /*frame_id*/ 0, packet_id,
328 /*max_packet_id*/ 10, size);
330 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(20));
331 base::TimeTicks now2(testing_clock_->NowTicks());
332 cast_environment_->Logging()->InsertPacketEvent(
333 now2, kPacketSentToNetwork, rtp_timestamp, /*frame_id*/ 0, packet_id,
334 /*max_packet_id*/ 10, size);
336 PacketEventMap packet_events;
337 event_subscriber_->GetPacketEventsAndReset(&packet_events);
339 ASSERT_EQ(1u, packet_events.size());
341 PacketEventMap::iterator it = packet_events.find(rtp_timestamp);
342 ASSERT_TRUE(it != packet_events.end());
344 linked_ptr<AggregatedPacketEvent> event = it->second;
346 EXPECT_EQ(rtp_timestamp, event->rtp_timestamp());
348 ASSERT_EQ(1, event->base_packet_event_size());
349 const BasePacketEvent& base_event = event->base_packet_event(0);
350 EXPECT_EQ(packet_id, base_event.packet_id());
351 ASSERT_EQ(2, base_event.event_type_size());
352 EXPECT_EQ(media::cast::proto::PACKET_SENT_TO_PACER, base_event.event_type(0));
353 EXPECT_EQ(media::cast::proto::PACKET_SENT_TO_NETWORK,
354 base_event.event_type(1));
355 ASSERT_EQ(2, base_event.event_timestamp_micros_size());
356 EXPECT_EQ(now1.ToInternalValue(), base_event.event_timestamp_micros(0));
357 EXPECT_EQ(now2.ToInternalValue(), base_event.event_timestamp_micros(1));
360 TEST_F(EncodingEventSubscriberTest, MultiplePacketEventsForFrame) {
362 base::TimeTicks now1(testing_clock_->NowTicks());
363 RtpTimestamp rtp_timestamp = 100;
367 cast_environment_->Logging()->InsertPacketEvent(
368 now1, kPacketSentToPacer, rtp_timestamp, /*frame_id*/ 0, packet_id_1,
369 /*max_packet_id*/ 10, size);
371 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(20));
372 base::TimeTicks now2(testing_clock_->NowTicks());
373 cast_environment_->Logging()->InsertPacketEvent(
374 now2, kPacketRetransmitted, rtp_timestamp, /*frame_id*/ 0, packet_id_2,
375 /*max_packet_id*/ 10, size);
377 PacketEventMap packet_events;
378 event_subscriber_->GetPacketEventsAndReset(&packet_events);
380 ASSERT_EQ(1u, packet_events.size());
382 PacketEventMap::iterator it = packet_events.find(rtp_timestamp);
383 ASSERT_TRUE(it != packet_events.end());
385 linked_ptr<AggregatedPacketEvent> event = it->second;
387 EXPECT_EQ(rtp_timestamp, event->rtp_timestamp());
389 ASSERT_EQ(2, event->base_packet_event_size());
390 const BasePacketEvent& base_event = event->base_packet_event(0);
391 EXPECT_EQ(packet_id_1, base_event.packet_id());
392 ASSERT_EQ(1, base_event.event_type_size());
393 EXPECT_EQ(media::cast::proto::PACKET_SENT_TO_PACER, base_event.event_type(0));
394 ASSERT_EQ(1, base_event.event_timestamp_micros_size());
395 EXPECT_EQ(now1.ToInternalValue(), base_event.event_timestamp_micros(0));
397 const BasePacketEvent& base_event_2 = event->base_packet_event(1);
398 EXPECT_EQ(packet_id_2, base_event_2.packet_id());
399 ASSERT_EQ(1, base_event_2.event_type_size());
400 EXPECT_EQ(media::cast::proto::PACKET_RETRANSMITTED,
401 base_event_2.event_type(0));
402 ASSERT_EQ(1, base_event_2.event_timestamp_micros_size());
403 EXPECT_EQ(now2.ToInternalValue(), base_event_2.event_timestamp_micros(0));
406 TEST_F(EncodingEventSubscriberTest, MultiplePacketEvents) {
408 base::TimeTicks now1(testing_clock_->NowTicks());
409 RtpTimestamp rtp_timestamp_1 = 100;
410 RtpTimestamp rtp_timestamp_2 = 200;
414 cast_environment_->Logging()->InsertPacketEvent(
415 now1, kPacketSentToPacer, rtp_timestamp_1, /*frame_id*/ 0, packet_id_1,
416 /*max_packet_id*/ 10, size);
418 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(20));
419 base::TimeTicks now2(testing_clock_->NowTicks());
420 cast_environment_->Logging()->InsertPacketEvent(
421 now2, kPacketRetransmitted, rtp_timestamp_2, /*frame_id*/ 0, packet_id_2,
422 /*max_packet_id*/ 10, size);
424 PacketEventMap packet_events;
425 event_subscriber_->GetPacketEventsAndReset(&packet_events);
427 ASSERT_EQ(2u, packet_events.size());
429 PacketEventMap::iterator it = packet_events.find(rtp_timestamp_1);
430 ASSERT_TRUE(it != packet_events.end());
432 linked_ptr<AggregatedPacketEvent> event = it->second;
434 EXPECT_EQ(rtp_timestamp_1, event->rtp_timestamp());
436 ASSERT_EQ(1, event->base_packet_event_size());
437 const BasePacketEvent& base_event = event->base_packet_event(0);
438 EXPECT_EQ(packet_id_1, base_event.packet_id());
439 ASSERT_EQ(1, base_event.event_type_size());
440 EXPECT_EQ(media::cast::proto::PACKET_SENT_TO_PACER, base_event.event_type(0));
441 ASSERT_EQ(1, base_event.event_timestamp_micros_size());
442 EXPECT_EQ(now1.ToInternalValue(), base_event.event_timestamp_micros(0));
444 it = packet_events.find(rtp_timestamp_2);
445 ASSERT_TRUE(it != packet_events.end());
449 EXPECT_EQ(rtp_timestamp_2, event->rtp_timestamp());
451 ASSERT_EQ(1, event->base_packet_event_size());
452 const BasePacketEvent& base_event_2 = event->base_packet_event(0);
453 EXPECT_EQ(packet_id_2, base_event_2.packet_id());
454 ASSERT_EQ(1, base_event_2.event_type_size());
455 EXPECT_EQ(media::cast::proto::PACKET_RETRANSMITTED,
456 base_event_2.event_type(0));
457 ASSERT_EQ(1, base_event_2.event_timestamp_micros_size());
458 EXPECT_EQ(now2.ToInternalValue(), base_event_2.event_timestamp_micros(0));