buffering_controller_unittest.cc revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
1bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea// Copyright 2014 The Chromium Authors. All rights reserved. 2bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea// Use of this source code is governed by a BSD-style license that can be 3bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea// found in the LICENSE file. 4bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea 5bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea#include "base/bind.h" 6bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea#include "base/callback_helpers.h" 7bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea#include "base/logging.h" 8bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea#include "base/memory/scoped_ptr.h" 9bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea#include "base/time/time.h" 10bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea#include "chromecast/media/cma/base/buffering_controller.h" 11bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea#include "chromecast/media/cma/base/buffering_state.h" 12bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea#include "testing/gmock/include/gmock/gmock.h" 13bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea#include "testing/gtest/include/gtest/gtest.h" 14bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea 15bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Maleanamespace chromecast { 16bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Maleanamespace media { 17bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea 18bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Maleanamespace { 19bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea 20bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Maleaclass MockBufferingControllerClient { 21bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea public: 22bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea MockBufferingControllerClient(); 23bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea ~MockBufferingControllerClient(); 24bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea 25bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea MOCK_METHOD1(OnBufferingNotification, void(bool is_buffering)); 26bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea 27bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea private: 28bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea DISALLOW_COPY_AND_ASSIGN(MockBufferingControllerClient); 29bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea}; 30bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea 31bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel MaleaMockBufferingControllerClient::MockBufferingControllerClient() { 32bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea} 33bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea 34bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel MaleaMockBufferingControllerClient::~MockBufferingControllerClient() { 35bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea} 36bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea 37bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea} // namespace 38bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea 39bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Maleaclass BufferingControllerTest : public testing::Test { 40bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea public: 41bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea BufferingControllerTest(); 42bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea virtual ~BufferingControllerTest(); 43bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea 44bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea protected: 45bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea scoped_ptr<BufferingController> buffering_controller_; 46bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea 47bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea MockBufferingControllerClient client_; 48bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea 49bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea // Buffer level under the low level threshold. 50bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea base::TimeDelta d1_; 51bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea 52bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea // Buffer level between the low and the high level. 53bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea base::TimeDelta d2_; 54bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea 55bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea // Buffer level above the high level. 56bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea base::TimeDelta d3_; 57bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea 58bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea private: 59bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea DISALLOW_COPY_AND_ASSIGN(BufferingControllerTest); 60bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea}; 61bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea 62bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel MaleaBufferingControllerTest::BufferingControllerTest() { 63bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea base::TimeDelta low_level_threshold( 64bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea base::TimeDelta::FromMilliseconds(2000)); 65bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea base::TimeDelta high_level_threshold( 66bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea base::TimeDelta::FromMilliseconds(6000)); 67bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea 68bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea d1_ = low_level_threshold - base::TimeDelta::FromMilliseconds(50); 69bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea d2_ = (low_level_threshold + high_level_threshold) / 2; 70bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea d3_ = high_level_threshold + base::TimeDelta::FromMilliseconds(50); 71bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea 72bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea scoped_refptr<BufferingConfig> buffering_config( 73bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea new BufferingConfig(low_level_threshold, high_level_threshold)); 74bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea buffering_controller_.reset(new BufferingController( 75bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea buffering_config, 76bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea base::Bind(&MockBufferingControllerClient::OnBufferingNotification, 77bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea base::Unretained(&client_)))); 78bdcd07921b76d3df2cc7e6563718dde79876b0adDaniel Malea} 79 80BufferingControllerTest::~BufferingControllerTest() { 81} 82 83TEST_F(BufferingControllerTest, OneStream_Typical) { 84 EXPECT_CALL(client_, OnBufferingNotification(true)).Times(1); 85 scoped_refptr<BufferingState> buffering_state = 86 buffering_controller_->AddStream(); 87 buffering_state->SetMediaTime(base::TimeDelta()); 88 89 // Simulate pre-buffering. 90 buffering_state->SetBufferedTime(d2_); 91 EXPECT_EQ(buffering_state->GetState(), BufferingState::kMediumLevel); 92 93 EXPECT_CALL(client_, OnBufferingNotification(false)).Times(1); 94 buffering_state->SetBufferedTime(d3_); 95 EXPECT_EQ(buffering_state->GetState(), BufferingState::kHighLevel); 96 97 // Simulate some fluctuations of the buffering level. 98 buffering_state->SetBufferedTime(d2_); 99 EXPECT_EQ(buffering_state->GetState(), BufferingState::kMediumLevel); 100 101 // Simulate an underrun. 102 EXPECT_CALL(client_, OnBufferingNotification(true)).Times(1); 103 buffering_state->SetBufferedTime(d1_); 104 EXPECT_EQ(buffering_state->GetState(), BufferingState::kLowLevel); 105 106 EXPECT_CALL(client_, OnBufferingNotification(false)).Times(1); 107 buffering_state->SetBufferedTime(d3_); 108 EXPECT_EQ(buffering_state->GetState(), BufferingState::kHighLevel); 109 110 // Simulate the end of stream. 111 buffering_state->NotifyEos(); 112 EXPECT_EQ(buffering_state->GetState(), BufferingState::kEosReached); 113 114 buffering_state->SetBufferedTime(d2_); 115 EXPECT_EQ(buffering_state->GetState(), BufferingState::kEosReached); 116 117 buffering_state->SetBufferedTime(d1_); 118 EXPECT_EQ(buffering_state->GetState(), BufferingState::kEosReached); 119} 120 121TEST_F(BufferingControllerTest, OneStream_LeaveBufferingOnEos) { 122 EXPECT_CALL(client_, OnBufferingNotification(true)).Times(1); 123 scoped_refptr<BufferingState> buffering_state = 124 buffering_controller_->AddStream(); 125 buffering_state->SetMediaTime(base::TimeDelta()); 126 127 EXPECT_CALL(client_, OnBufferingNotification(false)).Times(1); 128 buffering_state->NotifyEos(); 129 EXPECT_EQ(buffering_state->GetState(), BufferingState::kEosReached); 130} 131 132} // namespace media 133} // namespace chromecast 134