1effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Copyright (c) 2014 The Chromium Authors. All rights reserved. 2effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// found in the LICENSE file. 4effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 5effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/test/simple_test_tick_clock.h" 6effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/common/view_messages.h" 7effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/public/test/mock_render_thread.h" 8effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/renderer/media/render_media_log.h" 9effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "testing/gtest/include/gtest/gtest.h" 10effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 11effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace content { 12effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 13effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass RenderMediaLogTest : public testing::Test { 14effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch public: 15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch RenderMediaLogTest() 16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch : log_(new RenderMediaLog()), 17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch tick_clock_(new base::SimpleTestTickClock()) { 18effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch log_->SetTickClockForTesting(scoped_ptr<base::TickClock>(tick_clock_)); 19effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 20effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 21effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual ~RenderMediaLogTest() {} 22effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 23effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void AddEvent(media::MediaLogEvent::Type type) { 24effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch log_->AddEvent(log_->CreateEvent(type)); 25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void Advance(base::TimeDelta delta) { tick_clock_->Advance(delta); } 28effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch int message_count() { return render_thread_.sink().message_count(); } 30effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 31effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch std::vector<media::MediaLogEvent> GetMediaLogEvents() { 32effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const IPC::Message* msg = render_thread_.sink().GetFirstMessageMatching( 33effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ViewHostMsg_MediaLogEvents::ID); 34effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!msg) { 35effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ADD_FAILURE() << "Did not find ViewHostMsg_MediaLogEvents IPC message"; 36effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return std::vector<media::MediaLogEvent>(); 37effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 38effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 39effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Tuple1<std::vector<media::MediaLogEvent> > events; 40effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ViewHostMsg_MediaLogEvents::Read(msg, &events); 41effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return events.a; 42effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 44effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch private: 45effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch MockRenderThread render_thread_; 46effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_refptr<RenderMediaLog> log_; 47effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::SimpleTestTickClock* tick_clock_; // Owned by |log_|. 48effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 49effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DISALLOW_COPY_AND_ASSIGN(RenderMediaLogTest); 50effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}; 51effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 52effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(RenderMediaLogTest, ThrottleSendingEvents) { 53effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch AddEvent(media::MediaLogEvent::LOAD); 54effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(0, message_count()); 55effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 56effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Still shouldn't send anything. 57effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Advance(base::TimeDelta::FromMilliseconds(500)); 58effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch AddEvent(media::MediaLogEvent::SEEK); 59effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(0, message_count()); 60effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 61effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Now we should expect an IPC. 62effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Advance(base::TimeDelta::FromMilliseconds(500)); 63effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch AddEvent(media::MediaLogEvent::PLAY); 64effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(1, message_count()); 65effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 66effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Verify contents. 67effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch std::vector<media::MediaLogEvent> events = GetMediaLogEvents(); 68effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ASSERT_EQ(3u, events.size()); 69effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(media::MediaLogEvent::LOAD, events[0].type); 70effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(media::MediaLogEvent::SEEK, events[1].type); 71effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(media::MediaLogEvent::PLAY, events[2].type); 72effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 73effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Adding another event shouldn't send anything. 74effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch AddEvent(media::MediaLogEvent::PIPELINE_ERROR); 75effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(1, message_count()); 76effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 77effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 78effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(RenderMediaLogTest, BufferedExtents) { 79effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch AddEvent(media::MediaLogEvent::LOAD); 80effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch AddEvent(media::MediaLogEvent::SEEK); 81effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 82effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // This event is handled separately and should always appear last regardless 83effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // of how many times we see it. 84effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch AddEvent(media::MediaLogEvent::BUFFERED_EXTENTS_CHANGED); 85effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch AddEvent(media::MediaLogEvent::BUFFERED_EXTENTS_CHANGED); 86effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch AddEvent(media::MediaLogEvent::BUFFERED_EXTENTS_CHANGED); 87effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 88effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Trigger IPC message. 89effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(0, message_count()); 90effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Advance(base::TimeDelta::FromMilliseconds(1000)); 91effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch AddEvent(media::MediaLogEvent::PLAY); 92effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(1, message_count()); 93effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 94effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Verify contents. There should only be a single buffered extents changed 95effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // event. 96effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch std::vector<media::MediaLogEvent> events = GetMediaLogEvents(); 97effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ASSERT_EQ(4u, events.size()); 98effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(media::MediaLogEvent::LOAD, events[0].type); 99effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(media::MediaLogEvent::SEEK, events[1].type); 100effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(media::MediaLogEvent::PLAY, events[2].type); 101effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(media::MediaLogEvent::BUFFERED_EXTENTS_CHANGED, events[3].type); 102effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 103effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 104effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} // namespace content 105