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