11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved. 21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be 31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file. 41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/bind.h" 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/callback_helpers.h" 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/logging.h" 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/scoped_ptr.h" 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/time/time.h" 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chromecast/media/cma/base/buffering_controller.h" 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chromecast/media/cma/base/buffering_state.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "testing/gmock/include/gmock/gmock.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "testing/gtest/include/gtest/gtest.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace chromecast { 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace media { 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace { 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass MockBufferingControllerClient { 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MockBufferingControllerClient(); 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ~MockBufferingControllerClient(); 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MOCK_METHOD1(OnBufferingNotification, void(bool is_buffering)); 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DISALLOW_COPY_AND_ASSIGN(MockBufferingControllerClient); 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciMockBufferingControllerClient::MockBufferingControllerClient() { 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciMockBufferingControllerClient::~MockBufferingControllerClient() { 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass BufferingControllerTest : public testing::Test { 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BufferingControllerTest(); 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual ~BufferingControllerTest(); 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protected: 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<BufferingController> buffering_controller_; 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MockBufferingControllerClient client_; 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Buffer level under the low level threshold. 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::TimeDelta d1_; 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Buffer level between the low and the high level. 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::TimeDelta d2_; 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Buffer level above the high level. 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::TimeDelta d3_; 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DISALLOW_COPY_AND_ASSIGN(BufferingControllerTest); 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciBufferingControllerTest::BufferingControllerTest() { 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::TimeDelta low_level_threshold( 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::TimeDelta::FromMilliseconds(2000)); 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::TimeDelta high_level_threshold( 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::TimeDelta::FromMilliseconds(6000)); 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci d1_ = low_level_threshold - base::TimeDelta::FromMilliseconds(50); 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci d2_ = (low_level_threshold + high_level_threshold) / 2; 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci d3_ = high_level_threshold + base::TimeDelta::FromMilliseconds(50); 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<BufferingConfig> buffering_config( 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new BufferingConfig(low_level_threshold, high_level_threshold)); 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffering_controller_.reset(new BufferingController( 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffering_config, 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(&MockBufferingControllerClient::OnBufferingNotification, 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Unretained(&client_)))); 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciBufferingControllerTest::~BufferingControllerTest() { 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(BufferingControllerTest, OneStream_Typical) { 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_CALL(client_, OnBufferingNotification(true)).Times(1); 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<BufferingState> buffering_state = 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffering_controller_->AddStream(); 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffering_state->SetMediaTime(base::TimeDelta()); 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Simulate pre-buffering. 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffering_state->SetBufferedTime(d2_); 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(buffering_state->GetState(), BufferingState::kMediumLevel); 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_CALL(client_, OnBufferingNotification(false)).Times(1); 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffering_state->SetBufferedTime(d3_); 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(buffering_state->GetState(), BufferingState::kHighLevel); 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Simulate some fluctuations of the buffering level. 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffering_state->SetBufferedTime(d2_); 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(buffering_state->GetState(), BufferingState::kMediumLevel); 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Simulate an underrun. 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_CALL(client_, OnBufferingNotification(true)).Times(1); 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffering_state->SetBufferedTime(d1_); 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(buffering_state->GetState(), BufferingState::kLowLevel); 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_CALL(client_, OnBufferingNotification(false)).Times(1); 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffering_state->SetBufferedTime(d3_); 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(buffering_state->GetState(), BufferingState::kHighLevel); 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Simulate the end of stream. 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffering_state->NotifyEos(); 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(buffering_state->GetState(), BufferingState::kEosReached); 1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffering_state->SetBufferedTime(d2_); 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(buffering_state->GetState(), BufferingState::kEosReached); 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffering_state->SetBufferedTime(d1_); 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(buffering_state->GetState(), BufferingState::kEosReached); 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(BufferingControllerTest, OneStream_LeaveBufferingOnEos) { 1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_CALL(client_, OnBufferingNotification(true)).Times(1); 1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<BufferingState> buffering_state = 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffering_controller_->AddStream(); 1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffering_state->SetMediaTime(base::TimeDelta()); 1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_CALL(client_, OnBufferingNotification(false)).Times(1); 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffering_state->NotifyEos(); 1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(buffering_state->GetState(), BufferingState::kEosReached); 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace media 1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace chromecast 134