| Index: media/cast/logging/stats_event_subscriber_unittest.cc
|
| diff --git a/media/cast/logging/stats_event_subscriber_unittest.cc b/media/cast/logging/stats_event_subscriber_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..9af336974a12e82c452792697d8476243e98c9ef
|
| --- /dev/null
|
| +++ b/media/cast/logging/stats_event_subscriber_unittest.cc
|
| @@ -0,0 +1,173 @@
|
| +// 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/logging_defines.h"
|
| +#include "media/cast/logging/stats_event_subscriber.h"
|
| +#include "media/cast/test/fake_single_thread_task_runner.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +namespace media {
|
| +namespace cast {
|
| +
|
| +class StatsEventSubscriberTest : public ::testing::Test {
|
| + protected:
|
| + StatsEventSubscriberTest()
|
| + : 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_)) {}
|
| +
|
| + virtual ~StatsEventSubscriberTest() {
|
| + if (subscriber_.get())
|
| + cast_environment_->Logging()->RemoveRawEventSubscriber(subscriber_.get());
|
| + }
|
| +
|
| + void Init(EventMediaType event_media_type) {
|
| + DCHECK(!subscriber_.get());
|
| + subscriber_.reset(new StatsEventSubscriber(event_media_type));
|
| + cast_environment_->Logging()->AddRawEventSubscriber(subscriber_.get());
|
| + }
|
| +
|
| + base::SimpleTestTickClock* testing_clock_; // Owned by CastEnvironment.
|
| + scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_;
|
| + scoped_refptr<CastEnvironment> cast_environment_;
|
| + scoped_ptr<StatsEventSubscriber> subscriber_;
|
| +};
|
| +
|
| +TEST_F(StatsEventSubscriberTest, FrameStats) {
|
| + Init(VIDEO_EVENT);
|
| + uint32 rtp_timestamp = 0;
|
| + uint32 frame_id = 0;
|
| + int num_frames = 10;
|
| + int frame_size = 123;
|
| + int delay_base_ms = 10;
|
| + base::TimeTicks now;
|
| + for (int i = 0; i < num_frames; i++) {
|
| + now = testing_clock_->NowTicks();
|
| + cast_environment_->Logging()->InsertFrameEvent(
|
| + now, kVideoFrameReceived, rtp_timestamp, frame_id);
|
| + testing_clock_->Advance(base::TimeDelta::FromMilliseconds(30));
|
| +
|
| + cast_environment_->Logging()->InsertFrameEventWithSize(
|
| + now, kVideoFrameEncoded, rtp_timestamp, i, frame_size);
|
| + testing_clock_->Advance(base::TimeDelta::FromMilliseconds(30));
|
| +
|
| + cast_environment_->Logging()->InsertFrameEventWithDelay(
|
| + now,
|
| + kVideoRenderDelay,
|
| + rtp_timestamp,
|
| + i,
|
| + base::TimeDelta::FromMilliseconds(i * delay_base_ms));
|
| + testing_clock_->Advance(base::TimeDelta::FromMilliseconds(30));
|
| +
|
| + rtp_timestamp += 90;
|
| + }
|
| +
|
| + // Verify stats.
|
| + FrameStatsMap frame_stats;
|
| + subscriber_->GetFrameStats(&frame_stats);
|
| +
|
| + // Size of stats equals the number of events.
|
| + EXPECT_EQ(3u, frame_stats.size());
|
| + FrameStatsMap::const_iterator it = frame_stats.find(kVideoFrameReceived);
|
| + ASSERT_TRUE(it != frame_stats.end());
|
| + EXPECT_EQ(num_frames, it->second.event_counter);
|
| +
|
| + it = frame_stats.find(kVideoFrameEncoded);
|
| + ASSERT_TRUE(it != frame_stats.end());
|
| +
|
| + EXPECT_EQ(num_frames * frame_size, static_cast<int>(it->second.sum_size));
|
| +
|
| + it = frame_stats.find(kVideoRenderDelay);
|
| + ASSERT_TRUE(it != frame_stats.end());
|
| +
|
| + EXPECT_EQ(0, it->second.min_delay.InMilliseconds());
|
| + EXPECT_EQ((num_frames - 1) * delay_base_ms,
|
| + it->second.max_delay.InMilliseconds());
|
| + EXPECT_EQ((num_frames - 1) * num_frames / 2 * delay_base_ms,
|
| + it->second.sum_delay.InMilliseconds());
|
| +}
|
| +
|
| +TEST_F(StatsEventSubscriberTest, PacketStats) {
|
| + Init(AUDIO_EVENT);
|
| + uint32 rtp_timestamp = 0;
|
| + uint32 frame_id = 0;
|
| + int num_packets = 10;
|
| + int packet_size = 123;
|
| + base::TimeTicks first_event_time = testing_clock_->NowTicks();
|
| + base::TimeTicks now;
|
| + for (int i = 0; i < num_packets; i++) {
|
| + now = testing_clock_->NowTicks();
|
| + cast_environment_->Logging()->InsertPacketEvent(now,
|
| + kAudioPacketSentToPacer,
|
| + rtp_timestamp,
|
| + frame_id,
|
| + 0,
|
| + 10,
|
| + packet_size);
|
| + testing_clock_->Advance(base::TimeDelta::FromMilliseconds(30));
|
| + }
|
| +
|
| + PacketStatsMap stats_map;
|
| + subscriber_->GetPacketStats(&stats_map);
|
| +
|
| + // Size of stats equals the number of event types.
|
| + EXPECT_EQ(1u, stats_map.size());
|
| + PacketStatsMap::const_iterator it = stats_map.find(kAudioPacketSentToPacer);
|
| + ASSERT_NE(stats_map.end(), it);
|
| +
|
| + EXPECT_EQ(first_event_time, it->second.first_event_time);
|
| + EXPECT_EQ(now, it->second.last_event_time);
|
| + EXPECT_EQ(num_packets, it->second.event_counter);
|
| + EXPECT_EQ(num_packets * packet_size, static_cast<int>(it->second.sum_size));
|
| +}
|
| +
|
| +TEST_F(StatsEventSubscriberTest, GenericStats) {
|
| + Init(OTHER_EVENT);
|
| + int num_generic_events = 10;
|
| + int value = 123;
|
| + for (int i = 0; i < num_generic_events; i++) {
|
| + cast_environment_->Logging()->InsertGenericEvent(
|
| + testing_clock_->NowTicks(), kRttMs, value);
|
| + }
|
| +
|
| + GenericStatsMap stats_map;
|
| + subscriber_->GetGenericStats(&stats_map);
|
| +
|
| + EXPECT_EQ(1u, stats_map.size());
|
| + GenericStatsMap::const_iterator it = stats_map.find(kRttMs);
|
| + ASSERT_NE(stats_map.end(), it);
|
| +
|
| + EXPECT_EQ(num_generic_events, it->second.event_counter);
|
| + EXPECT_EQ(num_generic_events * value, it->second.sum);
|
| + EXPECT_EQ(static_cast<uint64>(num_generic_events * value * value),
|
| + it->second.sum_squared);
|
| + EXPECT_LE(value, it->second.min);
|
| + EXPECT_GE(value, it->second.max);
|
| +}
|
| +
|
| +TEST_F(StatsEventSubscriberTest, Reset) {
|
| + Init(VIDEO_EVENT);
|
| + cast_environment_->Logging()->InsertFrameEvent(
|
| + testing_clock_->NowTicks(), kVideoFrameReceived, 0, 0);
|
| +
|
| + FrameStatsMap frame_stats;
|
| + subscriber_->GetFrameStats(&frame_stats);
|
| + EXPECT_EQ(1u, frame_stats.size());
|
| +
|
| + subscriber_->Reset();
|
| + subscriber_->GetFrameStats(&frame_stats);
|
| + EXPECT_TRUE(frame_stats.empty());
|
| +}
|
| +
|
| +} // namespace cast
|
| +} // namespace media
|
|
|