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