// Copyright (c) 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/test/simple_test_tick_clock.h" #include "content/common/view_messages.h" #include "content/public/test/mock_render_thread.h" #include "content/renderer/media/render_media_log.h" #include "testing/gtest/include/gtest/gtest.h" namespace content { class RenderMediaLogTest : public testing::Test { public: RenderMediaLogTest() : log_(new RenderMediaLog()), tick_clock_(new base::SimpleTestTickClock()) { log_->SetTickClockForTesting(scoped_ptr(tick_clock_)); } ~RenderMediaLogTest() override {} void AddEvent(media::MediaLogEvent::Type type) { log_->AddEvent(log_->CreateEvent(type)); } void Advance(base::TimeDelta delta) { tick_clock_->Advance(delta); } int message_count() { return render_thread_.sink().message_count(); } std::vector GetMediaLogEvents() { const IPC::Message* msg = render_thread_.sink().GetFirstMessageMatching( ViewHostMsg_MediaLogEvents::ID); if (!msg) { ADD_FAILURE() << "Did not find ViewHostMsg_MediaLogEvents IPC message"; return std::vector(); } Tuple> events; ViewHostMsg_MediaLogEvents::Read(msg, &events); return get<0>(events); } private: MockRenderThread render_thread_; scoped_refptr log_; base::SimpleTestTickClock* tick_clock_; // Owned by |log_|. DISALLOW_COPY_AND_ASSIGN(RenderMediaLogTest); }; TEST_F(RenderMediaLogTest, ThrottleSendingEvents) { AddEvent(media::MediaLogEvent::LOAD); EXPECT_EQ(0, message_count()); // Still shouldn't send anything. Advance(base::TimeDelta::FromMilliseconds(500)); AddEvent(media::MediaLogEvent::SEEK); EXPECT_EQ(0, message_count()); // Now we should expect an IPC. Advance(base::TimeDelta::FromMilliseconds(500)); AddEvent(media::MediaLogEvent::PLAY); EXPECT_EQ(1, message_count()); // Verify contents. std::vector events = GetMediaLogEvents(); ASSERT_EQ(3u, events.size()); EXPECT_EQ(media::MediaLogEvent::LOAD, events[0].type); EXPECT_EQ(media::MediaLogEvent::SEEK, events[1].type); EXPECT_EQ(media::MediaLogEvent::PLAY, events[2].type); // Adding another event shouldn't send anything. AddEvent(media::MediaLogEvent::PIPELINE_ERROR); EXPECT_EQ(1, message_count()); } TEST_F(RenderMediaLogTest, BufferedExtents) { AddEvent(media::MediaLogEvent::LOAD); AddEvent(media::MediaLogEvent::SEEK); // This event is handled separately and should always appear last regardless // of how many times we see it. AddEvent(media::MediaLogEvent::BUFFERED_EXTENTS_CHANGED); AddEvent(media::MediaLogEvent::BUFFERED_EXTENTS_CHANGED); AddEvent(media::MediaLogEvent::BUFFERED_EXTENTS_CHANGED); // Trigger IPC message. EXPECT_EQ(0, message_count()); Advance(base::TimeDelta::FromMilliseconds(1000)); AddEvent(media::MediaLogEvent::PLAY); EXPECT_EQ(1, message_count()); // Verify contents. There should only be a single buffered extents changed // event. std::vector events = GetMediaLogEvents(); ASSERT_EQ(4u, events.size()); EXPECT_EQ(media::MediaLogEvent::LOAD, events[0].type); EXPECT_EQ(media::MediaLogEvent::SEEK, events[1].type); EXPECT_EQ(media::MediaLogEvent::PLAY, events[2].type); EXPECT_EQ(media::MediaLogEvent::BUFFERED_EXTENTS_CHANGED, events[3].type); } } // namespace content