blob: dcf39ae6c1494441c3062878116bf03e4d28bda8 [file] [log] [blame]
[email protected]026b5942011-03-04 02:07:451// Copyright (c) 2011 The Chromium Authors. All rights reserved.
[email protected]46564212009-07-28 20:36:372// 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/logging.h"
[email protected]c4996f762011-06-28 14:29:066#include "base/test/mock_time_provider.h"
[email protected]026b5942011-03-04 02:07:457#include "media/base/clock.h"
[email protected]46564212009-07-28 20:36:378#include "testing/gmock/include/gmock/gmock.h"
9
[email protected]46564212009-07-28 20:36:3710using ::testing::InSequence;
11using ::testing::Return;
12using ::testing::StrictMock;
13
[email protected]34f40942010-10-04 00:34:0414namespace base {
[email protected]46564212009-07-28 20:36:3715
16// Provide a stream output operator so we can use EXPECT_EQ(...) with TimeDelta.
17//
18// TODO(scherkus): move this into the testing package.
[email protected]34f40942010-10-04 00:34:0419static std::ostream& operator<<(std::ostream& stream, const TimeDelta& time) {
[email protected]46564212009-07-28 20:36:3720 return (stream << time.ToInternalValue());
21}
22
23} // namespace
24
25namespace media {
26
[email protected]46564212009-07-28 20:36:3727TEST(ClockTest, Created) {
[email protected]c4996f762011-06-28 14:29:0628 StrictMock<base::MockTimeProvider> mock_time;
[email protected]46564212009-07-28 20:36:3729 const base::TimeDelta kExpected = base::TimeDelta::FromSeconds(0);
30
[email protected]c4996f762011-06-28 14:29:0631 Clock clock(&base::MockTimeProvider::StaticNow);
[email protected]46564212009-07-28 20:36:3732 EXPECT_EQ(kExpected, clock.Elapsed());
33}
34
35TEST(ClockTest, Play_NormalSpeed) {
36 InSequence s;
[email protected]c4996f762011-06-28 14:29:0637 StrictMock<base::MockTimeProvider> mock_time;
[email protected]46564212009-07-28 20:36:3738 EXPECT_CALL(mock_time, Now())
39 .WillOnce(Return(base::Time::FromDoubleT(4)));
40 EXPECT_CALL(mock_time, Now())
41 .WillOnce(Return(base::Time::FromDoubleT(6)));
42 const base::TimeDelta kZero;
43 const base::TimeDelta kExpected = base::TimeDelta::FromSeconds(2);
44
[email protected]c4996f762011-06-28 14:29:0645 Clock clock(&base::MockTimeProvider::StaticNow);
[email protected]46564212009-07-28 20:36:3746 EXPECT_EQ(kZero, clock.Play());
47 EXPECT_EQ(kExpected, clock.Elapsed());
48}
49
50TEST(ClockTest, Play_DoubleSpeed) {
51 InSequence s;
[email protected]c4996f762011-06-28 14:29:0652 StrictMock<base::MockTimeProvider> mock_time;
[email protected]46564212009-07-28 20:36:3753 EXPECT_CALL(mock_time, Now())
54 .WillOnce(Return(base::Time::FromDoubleT(4)));
55 EXPECT_CALL(mock_time, Now())
56 .WillOnce(Return(base::Time::FromDoubleT(9)));
57 const base::TimeDelta kZero;
58 const base::TimeDelta kExpected = base::TimeDelta::FromSeconds(10);
59
[email protected]c4996f762011-06-28 14:29:0660 Clock clock(&base::MockTimeProvider::StaticNow);
[email protected]46564212009-07-28 20:36:3761 clock.SetPlaybackRate(2.0f);
62 EXPECT_EQ(kZero, clock.Play());
63 EXPECT_EQ(kExpected, clock.Elapsed());
64}
65
66TEST(ClockTest, Play_HalfSpeed) {
67 InSequence s;
[email protected]c4996f762011-06-28 14:29:0668 StrictMock<base::MockTimeProvider> mock_time;
[email protected]46564212009-07-28 20:36:3769 EXPECT_CALL(mock_time, Now())
70 .WillOnce(Return(base::Time::FromDoubleT(4)));
71 EXPECT_CALL(mock_time, Now())
72 .WillOnce(Return(base::Time::FromDoubleT(8)));
73 const base::TimeDelta kZero;
74 const base::TimeDelta kExpected = base::TimeDelta::FromSeconds(2);
75
[email protected]c4996f762011-06-28 14:29:0676 Clock clock(&base::MockTimeProvider::StaticNow);
[email protected]46564212009-07-28 20:36:3777 clock.SetPlaybackRate(0.5f);
78 EXPECT_EQ(kZero, clock.Play());
79 EXPECT_EQ(kExpected, clock.Elapsed());
80}
81
82TEST(ClockTest, Play_ZeroSpeed) {
83 // We'll play for 2 seconds at normal speed, 4 seconds at zero speed, and 8
84 // seconds at normal speed:
85 // (1.0 x 2) + (0.0 x 4) + (1.0 x 8) = 10
86 InSequence s;
[email protected]c4996f762011-06-28 14:29:0687 StrictMock<base::MockTimeProvider> mock_time;
[email protected]46564212009-07-28 20:36:3788 EXPECT_CALL(mock_time, Now())
89 .WillOnce(Return(base::Time::FromDoubleT(4)));
90 EXPECT_CALL(mock_time, Now())
91 .WillOnce(Return(base::Time::FromDoubleT(6)));
92 EXPECT_CALL(mock_time, Now())
93 .WillOnce(Return(base::Time::FromDoubleT(10)));
94 EXPECT_CALL(mock_time, Now())
95 .WillOnce(Return(base::Time::FromDoubleT(18)));
96 const base::TimeDelta kZero;
97 const base::TimeDelta kExpected = base::TimeDelta::FromSeconds(10);
98
[email protected]c4996f762011-06-28 14:29:0699 Clock clock(&base::MockTimeProvider::StaticNow);
[email protected]46564212009-07-28 20:36:37100 EXPECT_EQ(kZero, clock.Play());
101 clock.SetPlaybackRate(0.0f);
102 clock.SetPlaybackRate(1.0f);
103 EXPECT_EQ(kExpected, clock.Elapsed());
104}
105
106TEST(ClockTest, Play_MultiSpeed) {
107 // We'll play for 2 seconds at half speed, 4 seconds at normal speed, and 8
108 // seconds at double speed:
109 // (0.5 x 2) + (1.0 x 4) + (2.0 x 8) = 21
110 InSequence s;
[email protected]c4996f762011-06-28 14:29:06111 StrictMock<base::MockTimeProvider> mock_time;
[email protected]46564212009-07-28 20:36:37112 EXPECT_CALL(mock_time, Now())
113 .WillOnce(Return(base::Time::FromDoubleT(4)));
114 EXPECT_CALL(mock_time, Now())
115 .WillOnce(Return(base::Time::FromDoubleT(6)));
116 EXPECT_CALL(mock_time, Now())
117 .WillOnce(Return(base::Time::FromDoubleT(10)));
118 EXPECT_CALL(mock_time, Now())
119 .WillOnce(Return(base::Time::FromDoubleT(18)));
120 const base::TimeDelta kZero;
121 const base::TimeDelta kExpected = base::TimeDelta::FromSeconds(21);
122
[email protected]c4996f762011-06-28 14:29:06123 Clock clock(&base::MockTimeProvider::StaticNow);
[email protected]46564212009-07-28 20:36:37124 clock.SetPlaybackRate(0.5f);
125 EXPECT_EQ(kZero, clock.Play());
126 clock.SetPlaybackRate(1.0f);
127 clock.SetPlaybackRate(2.0f);
128 EXPECT_EQ(kExpected, clock.Elapsed());
129}
130
131TEST(ClockTest, Pause) {
132 InSequence s;
[email protected]c4996f762011-06-28 14:29:06133 StrictMock<base::MockTimeProvider> mock_time;
[email protected]46564212009-07-28 20:36:37134 EXPECT_CALL(mock_time, Now())
135 .WillOnce(Return(base::Time::FromDoubleT(4)));
136 EXPECT_CALL(mock_time, Now())
137 .WillOnce(Return(base::Time::FromDoubleT(8)));
138 EXPECT_CALL(mock_time, Now())
139 .WillOnce(Return(base::Time::FromDoubleT(12)));
140 EXPECT_CALL(mock_time, Now())
141 .WillOnce(Return(base::Time::FromDoubleT(16)));
142 const base::TimeDelta kZero;
143 const base::TimeDelta kFirstPause = base::TimeDelta::FromSeconds(4);
144 const base::TimeDelta kSecondPause = base::TimeDelta::FromSeconds(8);
145
[email protected]c4996f762011-06-28 14:29:06146 Clock clock(&base::MockTimeProvider::StaticNow);
[email protected]46564212009-07-28 20:36:37147 EXPECT_EQ(kZero, clock.Play());
148 EXPECT_EQ(kFirstPause, clock.Pause());
149 EXPECT_EQ(kFirstPause, clock.Elapsed());
150 EXPECT_EQ(kFirstPause, clock.Play());
151 EXPECT_EQ(kSecondPause, clock.Pause());
152 EXPECT_EQ(kSecondPause, clock.Elapsed());
153}
154
155TEST(ClockTest, SetTime_Paused) {
156 // We'll remain paused while we set the time. The time should be simply
157 // updated without accessing the time provider.
158 InSequence s;
[email protected]c4996f762011-06-28 14:29:06159 StrictMock<base::MockTimeProvider> mock_time;
[email protected]46564212009-07-28 20:36:37160 const base::TimeDelta kFirstTime = base::TimeDelta::FromSeconds(4);
161 const base::TimeDelta kSecondTime = base::TimeDelta::FromSeconds(16);
162
[email protected]c4996f762011-06-28 14:29:06163 Clock clock(&base::MockTimeProvider::StaticNow);
[email protected]46564212009-07-28 20:36:37164 clock.SetTime(kFirstTime);
165 EXPECT_EQ(kFirstTime, clock.Elapsed());
166 clock.SetTime(kSecondTime);
167 EXPECT_EQ(kSecondTime, clock.Elapsed());
168}
169
170TEST(ClockTest, SetTime_Playing) {
171 // We'll play for 4 seconds, then set the time to 12, then play for 4 more
172 // seconds. We'll expect a media time of 16.
173 InSequence s;
[email protected]c4996f762011-06-28 14:29:06174 StrictMock<base::MockTimeProvider> mock_time;
[email protected]46564212009-07-28 20:36:37175 EXPECT_CALL(mock_time, Now())
176 .WillOnce(Return(base::Time::FromDoubleT(4)));
177 EXPECT_CALL(mock_time, Now())
178 .WillOnce(Return(base::Time::FromDoubleT(8)));
179 EXPECT_CALL(mock_time, Now())
180 .WillOnce(Return(base::Time::FromDoubleT(12)));
181 const base::TimeDelta kZero;
182 const base::TimeDelta kExepected = base::TimeDelta::FromSeconds(16);
183
[email protected]c4996f762011-06-28 14:29:06184 Clock clock(&base::MockTimeProvider::StaticNow);
[email protected]46564212009-07-28 20:36:37185 EXPECT_EQ(kZero, clock.Play());
186 clock.SetTime(base::TimeDelta::FromSeconds(12));
187 EXPECT_EQ(kExepected, clock.Elapsed());
188}
189
190} // namespace media