Index: media/cast/logging/encoding_event_subscriber_unittest.cc |
diff --git a/media/cast/logging/encoding_event_subscriber_unittest.cc b/media/cast/logging/encoding_event_subscriber_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..831bea7e4052130ce1a2ba88a1d4269ea5d09334 |
--- /dev/null |
+++ b/media/cast/logging/encoding_event_subscriber_unittest.cc |
@@ -0,0 +1,414 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "base/memory/ref_counted.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "base/test/simple_test_tick_clock.h" |
+#include "base/time/tick_clock.h" |
+#include "media/cast/cast_environment.h" |
+#include "media/cast/logging/encoding_event_subscriber.h" |
+#include "media/cast/logging/logging_defines.h" |
+#include "media/cast/test/fake_single_thread_task_runner.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+using media::cast::proto::AggregatedFrameEvent; |
+using media::cast::proto::AggregatedGenericEvent; |
+using media::cast::proto::AggregatedPacketEvent; |
+using media::cast::proto::BasePacketEvent; |
+ |
+namespace media { |
+namespace cast { |
+ |
+class EncodingEventSubscriberTest : public ::testing::Test { |
+ protected: |
+ EncodingEventSubscriberTest() |
+ : testing_clock_(new base::SimpleTestTickClock()), |
+ task_runner_(new test::FakeSingleThreadTaskRunner(testing_clock_)), |
+ cast_environment_(new CastEnvironment( |
+ scoped_ptr<base::TickClock>(testing_clock_).Pass(), task_runner_, |
+ task_runner_, task_runner_, task_runner_, task_runner_, |
+ task_runner_, GetLoggingConfigWithRawEventsAndStatsEnabled())) { |
+ cast_environment_->Logging()->AddRawEventSubscriber(&event_subscriber_); |
+ } |
+ |
+ virtual ~EncodingEventSubscriberTest() { |
+ cast_environment_->Logging()->RemoveRawEventSubscriber(&event_subscriber_); |
+ } |
+ |
+ base::SimpleTestTickClock* testing_clock_; // Owned by CastEnvironment. |
+ scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; |
+ scoped_refptr<CastEnvironment> cast_environment_; |
+ EncodingEventSubscriber event_subscriber_; |
+}; |
+ |
+TEST_F(EncodingEventSubscriberTest, FrameEvent) { |
+ base::TimeTicks now(testing_clock_->NowTicks()); |
+ RtpTimestamp rtp_timestamp = 100; |
+ cast_environment_->Logging()->InsertFrameEvent(now, kVideoFrameDecoded, |
+ rtp_timestamp, |
+ /*frame_id*/ 0); |
+ |
+ FrameEventMap frame_events; |
+ event_subscriber_.GetFrameEventsAndReset(&frame_events); |
+ |
+ ASSERT_EQ(1u, frame_events.size()); |
+ |
+ FrameEventMap::iterator it = frame_events.find(rtp_timestamp); |
+ ASSERT_TRUE(it != frame_events.end()); |
+ |
+ linked_ptr<AggregatedFrameEvent> event = it->second; |
+ |
+ EXPECT_EQ(rtp_timestamp, event->rtp_timestamp()); |
+ |
+ ASSERT_EQ(1, event->event_type_size()); |
+ EXPECT_EQ(media::cast::proto::VIDEO_FRAME_DECODED, event->event_type(0)); |
+ ASSERT_EQ(1, event->event_timestamp_micros_size()); |
+ EXPECT_EQ(now.ToInternalValue(), event->event_timestamp_micros(0)); |
+ |
+ EXPECT_EQ(0, event->encoded_frame_size()); |
+ EXPECT_EQ(0, event->delay_millis()); |
+ |
+ event_subscriber_.GetFrameEventsAndReset(&frame_events); |
+ EXPECT_TRUE(frame_events.empty()); |
+} |
+ |
+TEST_F(EncodingEventSubscriberTest, FrameEventDelay) { |
+ base::TimeTicks now(testing_clock_->NowTicks()); |
+ RtpTimestamp rtp_timestamp = 100; |
+ int delay_ms = 100; |
+ cast_environment_->Logging()->InsertFrameEventWithDelay( |
+ now, kAudioPlayoutDelay, rtp_timestamp, |
+ /*frame_id*/ 0, base::TimeDelta::FromMilliseconds(delay_ms)); |
+ |
+ FrameEventMap frame_events; |
+ event_subscriber_.GetFrameEventsAndReset(&frame_events); |
+ |
+ ASSERT_EQ(1u, frame_events.size()); |
+ |
+ FrameEventMap::iterator it = frame_events.find(rtp_timestamp); |
+ ASSERT_TRUE(it != frame_events.end()); |
+ |
+ linked_ptr<AggregatedFrameEvent> event = it->second; |
+ |
+ EXPECT_EQ(rtp_timestamp, event->rtp_timestamp()); |
+ |
+ ASSERT_EQ(1, event->event_type_size()); |
+ EXPECT_EQ(media::cast::proto::AUDIO_PLAYOUT_DELAY, event->event_type(0)); |
+ ASSERT_EQ(1, event->event_timestamp_micros_size()); |
+ EXPECT_EQ(now.ToInternalValue(), event->event_timestamp_micros(0)); |
+ |
+ EXPECT_EQ(0, event->encoded_frame_size()); |
+ EXPECT_EQ(100, event->delay_millis()); |
+} |
+ |
+TEST_F(EncodingEventSubscriberTest, FrameEventSize) { |
+ base::TimeTicks now(testing_clock_->NowTicks()); |
+ RtpTimestamp rtp_timestamp = 100; |
+ int size = 123; |
+ cast_environment_->Logging()->InsertFrameEventWithSize( |
+ now, kVideoFrameEncoded, rtp_timestamp, |
+ /*frame_id*/ 0, size); |
+ |
+ FrameEventMap frame_events; |
+ event_subscriber_.GetFrameEventsAndReset(&frame_events); |
+ |
+ ASSERT_EQ(1u, frame_events.size()); |
+ |
+ FrameEventMap::iterator it = frame_events.find(rtp_timestamp); |
+ ASSERT_TRUE(it != frame_events.end()); |
+ |
+ linked_ptr<AggregatedFrameEvent> event = it->second; |
+ |
+ EXPECT_EQ(rtp_timestamp, event->rtp_timestamp()); |
+ |
+ ASSERT_EQ(1, event->event_type_size()); |
+ EXPECT_EQ(media::cast::proto::VIDEO_FRAME_ENCODED, event->event_type(0)); |
+ ASSERT_EQ(1, event->event_timestamp_micros_size()); |
+ EXPECT_EQ(now.ToInternalValue(), event->event_timestamp_micros(0)); |
+ |
+ EXPECT_EQ(size, event->encoded_frame_size()); |
+ EXPECT_EQ(0, event->delay_millis()); |
+} |
+ |
+TEST_F(EncodingEventSubscriberTest, MultipleFrameEvents) { |
+ RtpTimestamp rtp_timestamp1 = 100; |
+ RtpTimestamp rtp_timestamp2 = 200; |
+ base::TimeTicks now1(testing_clock_->NowTicks()); |
+ cast_environment_->Logging()->InsertFrameEventWithDelay( |
+ now1, kAudioPlayoutDelay, rtp_timestamp1, |
+ /*frame_id*/ 0, /*delay*/ base::TimeDelta::FromMilliseconds(100)); |
+ |
+ testing_clock_->Advance(base::TimeDelta::FromMilliseconds(20)); |
+ base::TimeTicks now2(testing_clock_->NowTicks()); |
+ cast_environment_->Logging()->InsertFrameEventWithSize( |
+ now2, kAudioFrameEncoded, rtp_timestamp2, |
+ /*frame_id*/ 0, /*size*/ 123); |
+ |
+ testing_clock_->Advance(base::TimeDelta::FromMilliseconds(20)); |
+ base::TimeTicks now3(testing_clock_->NowTicks()); |
+ cast_environment_->Logging()->InsertFrameEvent( |
+ now3, kAudioFrameDecoded, rtp_timestamp1, /*frame_id*/ 0); |
+ |
+ FrameEventMap frame_events; |
+ event_subscriber_.GetFrameEventsAndReset(&frame_events); |
+ |
+ ASSERT_EQ(2u, frame_events.size()); |
+ |
+ FrameEventMap::iterator it = frame_events.find(100); |
+ ASSERT_TRUE(it != frame_events.end()); |
+ |
+ linked_ptr<AggregatedFrameEvent> event = it->second; |
+ |
+ EXPECT_EQ(rtp_timestamp1, event->rtp_timestamp()); |
+ |
+ ASSERT_EQ(2, event->event_type_size()); |
+ EXPECT_EQ(media::cast::proto::AUDIO_PLAYOUT_DELAY, event->event_type(0)); |
+ EXPECT_EQ(media::cast::proto::AUDIO_FRAME_DECODED, event->event_type(1)); |
+ |
+ ASSERT_EQ(2, event->event_timestamp_micros_size()); |
+ EXPECT_EQ(now1.ToInternalValue(), event->event_timestamp_micros(0)); |
+ EXPECT_EQ(now3.ToInternalValue(), event->event_timestamp_micros(1)); |
+ |
+ it = frame_events.find(200); |
+ ASSERT_TRUE(it != frame_events.end()); |
+ |
+ event = it->second; |
+ |
+ EXPECT_EQ(rtp_timestamp2, event->rtp_timestamp()); |
+ |
+ ASSERT_EQ(1, event->event_type_size()); |
+ EXPECT_EQ(media::cast::proto::AUDIO_FRAME_ENCODED, event->event_type(0)); |
+ |
+ ASSERT_EQ(1, event->event_timestamp_micros_size()); |
+ EXPECT_EQ(now2.ToInternalValue(), event->event_timestamp_micros(0)); |
+} |
+ |
+TEST_F(EncodingEventSubscriberTest, PacketEvent) { |
+ base::TimeTicks now(testing_clock_->NowTicks()); |
+ RtpTimestamp rtp_timestamp = 100; |
+ int packet_id = 2; |
+ int size = 100; |
+ cast_environment_->Logging()->InsertPacketEvent( |
+ now, kAudioPacketReceived, rtp_timestamp, /*frame_id*/ 0, packet_id, |
+ /*max_packet_id*/ 10, size); |
+ |
+ PacketEventMap packet_events; |
+ event_subscriber_.GetPacketEventsAndReset(&packet_events); |
+ |
+ ASSERT_EQ(1u, packet_events.size()); |
+ |
+ PacketEventMap::iterator it = packet_events.find(rtp_timestamp); |
+ ASSERT_TRUE(it != packet_events.end()); |
+ |
+ linked_ptr<AggregatedPacketEvent> event = it->second; |
+ |
+ EXPECT_EQ(rtp_timestamp, event->rtp_timestamp()); |
+ |
+ ASSERT_EQ(1, event->base_packet_event_size()); |
+ const BasePacketEvent& base_event = event->base_packet_event(0); |
+ EXPECT_EQ(packet_id, base_event.packet_id()); |
+ ASSERT_EQ(1, base_event.event_type_size()); |
+ EXPECT_EQ(media::cast::proto::AUDIO_PACKET_RECEIVED, |
+ base_event.event_type(0)); |
+ ASSERT_EQ(1, base_event.event_timestamp_micros_size()); |
+ EXPECT_EQ(now.ToInternalValue(), base_event.event_timestamp_micros(0)); |
+ |
+ event_subscriber_.GetPacketEventsAndReset(&packet_events); |
+ EXPECT_TRUE(packet_events.empty()); |
+} |
+ |
+TEST_F(EncodingEventSubscriberTest, MultiplePacketEventsForPacket) { |
+ base::TimeTicks now1(testing_clock_->NowTicks()); |
+ RtpTimestamp rtp_timestamp = 100; |
+ int packet_id = 2; |
+ int size = 100; |
+ cast_environment_->Logging()->InsertPacketEvent( |
+ now1, kPacketSentToPacer, rtp_timestamp, /*frame_id*/ 0, packet_id, |
+ /*max_packet_id*/ 10, size); |
+ |
+ testing_clock_->Advance(base::TimeDelta::FromMilliseconds(20)); |
+ base::TimeTicks now2(testing_clock_->NowTicks()); |
+ cast_environment_->Logging()->InsertPacketEvent( |
+ now2, kPacketSentToNetwork, rtp_timestamp, /*frame_id*/ 0, packet_id, |
+ /*max_packet_id*/ 10, size); |
+ |
+ PacketEventMap packet_events; |
+ event_subscriber_.GetPacketEventsAndReset(&packet_events); |
+ |
+ ASSERT_EQ(1u, packet_events.size()); |
+ |
+ PacketEventMap::iterator it = packet_events.find(rtp_timestamp); |
+ ASSERT_TRUE(it != packet_events.end()); |
+ |
+ linked_ptr<AggregatedPacketEvent> event = it->second; |
+ |
+ EXPECT_EQ(rtp_timestamp, event->rtp_timestamp()); |
+ |
+ ASSERT_EQ(1, event->base_packet_event_size()); |
+ const BasePacketEvent& base_event = event->base_packet_event(0); |
+ EXPECT_EQ(packet_id, base_event.packet_id()); |
+ ASSERT_EQ(2, base_event.event_type_size()); |
+ EXPECT_EQ(media::cast::proto::PACKET_SENT_TO_PACER, base_event.event_type(0)); |
+ EXPECT_EQ(media::cast::proto::PACKET_SENT_TO_NETWORK, |
+ base_event.event_type(1)); |
+ ASSERT_EQ(2, base_event.event_timestamp_micros_size()); |
+ EXPECT_EQ(now1.ToInternalValue(), base_event.event_timestamp_micros(0)); |
+ EXPECT_EQ(now2.ToInternalValue(), base_event.event_timestamp_micros(1)); |
+} |
+ |
+TEST_F(EncodingEventSubscriberTest, MultiplePacketEventsForFrame) { |
+ base::TimeTicks now1(testing_clock_->NowTicks()); |
+ RtpTimestamp rtp_timestamp = 100; |
+ int packet_id_1 = 2; |
+ int packet_id_2 = 3; |
+ int size = 100; |
+ cast_environment_->Logging()->InsertPacketEvent( |
+ now1, kPacketSentToPacer, rtp_timestamp, /*frame_id*/ 0, packet_id_1, |
+ /*max_packet_id*/ 10, size); |
+ |
+ testing_clock_->Advance(base::TimeDelta::FromMilliseconds(20)); |
+ base::TimeTicks now2(testing_clock_->NowTicks()); |
+ cast_environment_->Logging()->InsertPacketEvent( |
+ now2, kPacketRetransmitted, rtp_timestamp, /*frame_id*/ 0, packet_id_2, |
+ /*max_packet_id*/ 10, size); |
+ |
+ PacketEventMap packet_events; |
+ event_subscriber_.GetPacketEventsAndReset(&packet_events); |
+ |
+ ASSERT_EQ(1u, packet_events.size()); |
+ |
+ PacketEventMap::iterator it = packet_events.find(rtp_timestamp); |
+ ASSERT_TRUE(it != packet_events.end()); |
+ |
+ linked_ptr<AggregatedPacketEvent> event = it->second; |
+ |
+ EXPECT_EQ(rtp_timestamp, event->rtp_timestamp()); |
+ |
+ ASSERT_EQ(2, event->base_packet_event_size()); |
+ const BasePacketEvent& base_event = event->base_packet_event(0); |
+ EXPECT_EQ(packet_id_1, base_event.packet_id()); |
+ ASSERT_EQ(1, base_event.event_type_size()); |
+ EXPECT_EQ(media::cast::proto::PACKET_SENT_TO_PACER, base_event.event_type(0)); |
+ ASSERT_EQ(1, base_event.event_timestamp_micros_size()); |
+ EXPECT_EQ(now1.ToInternalValue(), base_event.event_timestamp_micros(0)); |
+ |
+ const BasePacketEvent& base_event_2 = event->base_packet_event(1); |
+ EXPECT_EQ(packet_id_2, base_event_2.packet_id()); |
+ ASSERT_EQ(1, base_event_2.event_type_size()); |
+ EXPECT_EQ(media::cast::proto::PACKET_RETRANSMITTED, |
+ base_event_2.event_type(0)); |
+ ASSERT_EQ(1, base_event_2.event_timestamp_micros_size()); |
+ EXPECT_EQ(now2.ToInternalValue(), base_event_2.event_timestamp_micros(0)); |
+} |
+ |
+TEST_F(EncodingEventSubscriberTest, MultiplePacketEvents) { |
+ base::TimeTicks now1(testing_clock_->NowTicks()); |
+ RtpTimestamp rtp_timestamp_1 = 100; |
+ RtpTimestamp rtp_timestamp_2 = 200; |
+ int packet_id_1 = 2; |
+ int packet_id_2 = 3; |
+ int size = 100; |
+ cast_environment_->Logging()->InsertPacketEvent( |
+ now1, kPacketSentToPacer, rtp_timestamp_1, /*frame_id*/ 0, packet_id_1, |
+ /*max_packet_id*/ 10, size); |
+ |
+ testing_clock_->Advance(base::TimeDelta::FromMilliseconds(20)); |
+ base::TimeTicks now2(testing_clock_->NowTicks()); |
+ cast_environment_->Logging()->InsertPacketEvent( |
+ now2, kPacketRetransmitted, rtp_timestamp_2, /*frame_id*/ 0, packet_id_2, |
+ /*max_packet_id*/ 10, size); |
+ |
+ PacketEventMap packet_events; |
+ event_subscriber_.GetPacketEventsAndReset(&packet_events); |
+ |
+ ASSERT_EQ(2u, packet_events.size()); |
+ |
+ PacketEventMap::iterator it = packet_events.find(rtp_timestamp_1); |
+ ASSERT_TRUE(it != packet_events.end()); |
+ |
+ linked_ptr<AggregatedPacketEvent> event = it->second; |
+ |
+ EXPECT_EQ(rtp_timestamp_1, event->rtp_timestamp()); |
+ |
+ ASSERT_EQ(1, event->base_packet_event_size()); |
+ const BasePacketEvent& base_event = event->base_packet_event(0); |
+ EXPECT_EQ(packet_id_1, base_event.packet_id()); |
+ ASSERT_EQ(1, base_event.event_type_size()); |
+ EXPECT_EQ(media::cast::proto::PACKET_SENT_TO_PACER, base_event.event_type(0)); |
+ ASSERT_EQ(1, base_event.event_timestamp_micros_size()); |
+ EXPECT_EQ(now1.ToInternalValue(), base_event.event_timestamp_micros(0)); |
+ |
+ it = packet_events.find(rtp_timestamp_2); |
+ ASSERT_TRUE(it != packet_events.end()); |
+ |
+ event = it->second; |
+ |
+ EXPECT_EQ(rtp_timestamp_2, event->rtp_timestamp()); |
+ |
+ ASSERT_EQ(1, event->base_packet_event_size()); |
+ const BasePacketEvent& base_event_2 = event->base_packet_event(0); |
+ EXPECT_EQ(packet_id_2, base_event_2.packet_id()); |
+ ASSERT_EQ(1, base_event_2.event_type_size()); |
+ EXPECT_EQ(media::cast::proto::PACKET_RETRANSMITTED, |
+ base_event_2.event_type(0)); |
+ ASSERT_EQ(1, base_event_2.event_timestamp_micros_size()); |
+ EXPECT_EQ(now2.ToInternalValue(), base_event_2.event_timestamp_micros(0)); |
+} |
+ |
+TEST_F(EncodingEventSubscriberTest, GenericEvent) { |
+ base::TimeTicks now(testing_clock_->NowTicks()); |
+ int value = 123; |
+ cast_environment_->Logging()->InsertGenericEvent(now, kJitterMs, value); |
+ |
+ GenericEventMap generic_events; |
+ event_subscriber_.GetGenericEventsAndReset(&generic_events); |
+ |
+ ASSERT_EQ(1u, generic_events.size()); |
+ |
+ GenericEventMap::iterator it = generic_events.find(kJitterMs); |
+ ASSERT_TRUE(it != generic_events.end()); |
+ |
+ linked_ptr<AggregatedGenericEvent> event = it->second; |
+ |
+ ASSERT_EQ(media::cast::proto::JITTER_MS, event->event_type()); |
+ ASSERT_EQ(1, event->event_timestamp_micros_size()); |
+ EXPECT_EQ(now.ToInternalValue(), event->event_timestamp_micros(0)); |
+ ASSERT_EQ(1, event->value_size()); |
+ EXPECT_EQ(value, event->value(0)); |
+ |
+ event_subscriber_.GetGenericEventsAndReset(&generic_events); |
+ EXPECT_TRUE(generic_events.empty()); |
+} |
+ |
+TEST_F(EncodingEventSubscriberTest, MultipleGenericEventsForType) { |
+ base::TimeTicks now1(testing_clock_->NowTicks()); |
+ int value1 = 123; |
+ cast_environment_->Logging()->InsertGenericEvent(now1, kJitterMs, value1); |
+ |
+ testing_clock_->Advance(base::TimeDelta::FromMilliseconds(20)); |
+ base::TimeTicks now2(testing_clock_->NowTicks()); |
+ int value2 = 456; |
+ cast_environment_->Logging()->InsertGenericEvent(now2, kJitterMs, value2); |
+ |
+ GenericEventMap generic_events; |
+ event_subscriber_.GetGenericEventsAndReset(&generic_events); |
+ |
+ ASSERT_EQ(1u, generic_events.size()); |
+ |
+ GenericEventMap::iterator it = generic_events.find(kJitterMs); |
+ ASSERT_TRUE(it != generic_events.end()); |
+ |
+ linked_ptr<AggregatedGenericEvent> event = it->second; |
+ |
+ ASSERT_EQ(media::cast::proto::JITTER_MS, event->event_type()); |
+ ASSERT_EQ(2, event->event_timestamp_micros_size()); |
+ EXPECT_EQ(now1.ToInternalValue(), event->event_timestamp_micros(0)); |
+ EXPECT_EQ(now2.ToInternalValue(), event->event_timestamp_micros(1)); |
+ ASSERT_EQ(2, event->value_size()); |
+ EXPECT_EQ(value1, event->value(0)); |
+ EXPECT_EQ(value2, event->value(1)); |
+} |
+ |
+} // namespace cast |
+} // namespace media |