Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(67)

Unified Diff: media/cast/logging/encoding_event_subscriber_unittest.cc

Issue 138913014: Cast: Added a new RawEventSubscriber implementation for use in cast extension. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed miu's comments and changed targets Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « media/cast/logging/encoding_event_subscriber.cc ('k') | media/cast/logging/proto/proto_utils.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « media/cast/logging/encoding_event_subscriber.cc ('k') | media/cast/logging/proto/proto_utils.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698