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