Home | History | Annotate | Download | only in media
      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   virtual ~RenderMediaLogTest() {}
     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
    105