Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(954)

Side by Side Diff: media/base/clock_unittest.cc

Issue 9155003: Fix media timeline so that thumb never exceeds buffered data (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/logging.h" 5 #include "base/logging.h"
6 #include "base/test/mock_time_provider.h" 6 #include "base/test/mock_time_provider.h"
7 #include "media/base/clock.h" 7 #include "media/base/clock.h"
8 #include "testing/gmock/include/gmock/gmock.h" 8 #include "testing/gmock/include/gmock/gmock.h"
9 9
10 using ::testing::InSequence; 10 using ::testing::InSequence;
11 using ::testing::Return; 11 using ::testing::Return;
12 using ::testing::StrictMock; 12 using ::testing::StrictMock;
13 13
14 namespace base { 14 namespace base {
15 15
16 // Provide a stream output operator so we can use EXPECT_EQ(...) with TimeDelta. 16 // Provide a stream output operator so we can use EXPECT_EQ(...) with TimeDelta.
17 // 17 //
18 // TODO(scherkus): move this into the testing package. 18 // TODO(scherkus): move this into the testing package.
19 static std::ostream& operator<<(std::ostream& stream, const TimeDelta& time) { 19 static std::ostream& operator<<(std::ostream& stream, const TimeDelta& time) {
20 return (stream << time.ToInternalValue()); 20 return (stream << time.ToInternalValue());
21 } 21 }
22 22
23 } // namespace 23 } // namespace
24 24
25 namespace media { 25 namespace media {
26 26
27 TEST(ClockTest, Created) { 27 static const int kDurationInSeconds = 120;
28 StrictMock<base::MockTimeProvider> mock_time; 28
29 class ClockTest : public ::testing::Test {
30 public:
31 ClockTest()
32 : clock_(&base::MockTimeProvider::StaticNow) {
33 SetDuration();
34 EXPECT_CALL(mock_time_, Now())
35 .WillRepeatedly(Return(base::Time::UnixEpoch()));
36 }
37
38 protected:
39 void SetDuration() {
40 const base::TimeDelta kDuration =
41 base::TimeDelta::FromSeconds(kDurationInSeconds);
42 clock_.SetDuration(kDuration);
43 EXPECT_EQ(kDuration, clock_.Duration());
44 }
45
46 void AdvanceSystemTime(base::TimeDelta delta) {
47 time_elapsed_ += delta;
48 EXPECT_CALL(mock_time_, Now())
49 .WillRepeatedly(Return(base::Time::UnixEpoch() + time_elapsed_));
50 }
51
52 Clock clock_;
53 StrictMock<base::MockTimeProvider> mock_time_;
54 base::TimeDelta time_elapsed_;
55 };
56
57 TEST_F(ClockTest, Created) {
29 const base::TimeDelta kExpected = base::TimeDelta::FromSeconds(0); 58 const base::TimeDelta kExpected = base::TimeDelta::FromSeconds(0);
30 59 EXPECT_EQ(kExpected, clock_.Elapsed());
31 Clock clock(&base::MockTimeProvider::StaticNow); 60 }
32 EXPECT_EQ(kExpected, clock.Elapsed()); 61
33 } 62 TEST_F(ClockTest, Play_NormalSpeed) {
34 63 const base::TimeDelta kZero;
35 TEST(ClockTest, Play_NormalSpeed) { 64 const base::TimeDelta kTimeToAdvance = base::TimeDelta::FromSeconds(2);
36 InSequence s; 65
37 StrictMock<base::MockTimeProvider> mock_time; 66 EXPECT_EQ(kZero, clock_.Play());
38 EXPECT_CALL(mock_time, Now()) 67 AdvanceSystemTime(kTimeToAdvance);
39 .WillOnce(Return(base::Time::FromDoubleT(4))); 68 EXPECT_EQ(kTimeToAdvance, clock_.Elapsed());
40 EXPECT_CALL(mock_time, Now()) 69 }
41 .WillOnce(Return(base::Time::FromDoubleT(6))); 70
42 const base::TimeDelta kZero; 71 TEST_F(ClockTest, Play_DoubleSpeed) {
43 const base::TimeDelta kExpected = base::TimeDelta::FromSeconds(2); 72 const base::TimeDelta kZero;
44 73 const base::TimeDelta kTimeToAdvance = base::TimeDelta::FromSeconds(5);
45 Clock clock(&base::MockTimeProvider::StaticNow); 74
46 EXPECT_EQ(kZero, clock.Play()); 75 clock_.SetPlaybackRate(2.0f);
47 EXPECT_EQ(kExpected, clock.Elapsed()); 76 EXPECT_EQ(kZero, clock_.Play());
48 } 77 AdvanceSystemTime(kTimeToAdvance);
49 78 EXPECT_EQ(2 * kTimeToAdvance, clock_.Elapsed());
50 TEST(ClockTest, Play_DoubleSpeed) { 79 }
51 InSequence s; 80
52 StrictMock<base::MockTimeProvider> mock_time; 81 TEST_F(ClockTest, Play_HalfSpeed) {
53 EXPECT_CALL(mock_time, Now()) 82 const base::TimeDelta kZero;
54 .WillOnce(Return(base::Time::FromDoubleT(4))); 83 const base::TimeDelta kTimeToAdvance = base::TimeDelta::FromSeconds(4);
55 EXPECT_CALL(mock_time, Now()) 84
56 .WillOnce(Return(base::Time::FromDoubleT(9))); 85 clock_.SetPlaybackRate(0.5f);
57 const base::TimeDelta kZero; 86 EXPECT_EQ(kZero, clock_.Play());
58 const base::TimeDelta kExpected = base::TimeDelta::FromSeconds(10); 87 AdvanceSystemTime(kTimeToAdvance);
59 88 EXPECT_EQ(kTimeToAdvance / 2, clock_.Elapsed());
60 Clock clock(&base::MockTimeProvider::StaticNow); 89 }
61 clock.SetPlaybackRate(2.0f); 90
62 EXPECT_EQ(kZero, clock.Play()); 91 TEST_F(ClockTest, Play_ZeroSpeed) {
63 EXPECT_EQ(kExpected, clock.Elapsed());
64 }
65
66 TEST(ClockTest, Play_HalfSpeed) {
67 InSequence s;
68 StrictMock<base::MockTimeProvider> mock_time;
69 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
76 Clock clock(&base::MockTimeProvider::StaticNow);
77 clock.SetPlaybackRate(0.5f);
78 EXPECT_EQ(kZero, clock.Play());
79 EXPECT_EQ(kExpected, clock.Elapsed());
80 }
81
82 TEST(ClockTest, Play_ZeroSpeed) {
83 // We'll play for 2 seconds at normal speed, 4 seconds at zero speed, and 8 92 // We'll play for 2 seconds at normal speed, 4 seconds at zero speed, and 8
84 // seconds at normal speed: 93 // seconds at normal speed.
85 // (1.0 x 2) + (0.0 x 4) + (1.0 x 8) = 10 94 const base::TimeDelta kZero;
86 InSequence s; 95 const base::TimeDelta kPlayDuration1 = base::TimeDelta::FromSeconds(2);
87 StrictMock<base::MockTimeProvider> mock_time; 96 const base::TimeDelta kPlayDuration2 = base::TimeDelta::FromSeconds(4);
88 EXPECT_CALL(mock_time, Now()) 97 const base::TimeDelta kPlayDuration3 = base::TimeDelta::FromSeconds(8);
89 .WillOnce(Return(base::Time::FromDoubleT(4))); 98 const base::TimeDelta kExpected = kPlayDuration1 + kPlayDuration3;
90 EXPECT_CALL(mock_time, Now()) 99
91 .WillOnce(Return(base::Time::FromDoubleT(6))); 100 EXPECT_EQ(kZero, clock_.Play());
92 EXPECT_CALL(mock_time, Now()) 101
93 .WillOnce(Return(base::Time::FromDoubleT(10))); 102 AdvanceSystemTime(kPlayDuration1);
94 EXPECT_CALL(mock_time, Now()) 103 clock_.SetPlaybackRate(0.0f);
95 .WillOnce(Return(base::Time::FromDoubleT(18))); 104 AdvanceSystemTime(kPlayDuration2);
96 const base::TimeDelta kZero; 105 clock_.SetPlaybackRate(1.0f);
97 const base::TimeDelta kExpected = base::TimeDelta::FromSeconds(10); 106 AdvanceSystemTime(kPlayDuration3);
98 107
99 Clock clock(&base::MockTimeProvider::StaticNow); 108 EXPECT_EQ(kExpected, clock_.Elapsed());
100 EXPECT_EQ(kZero, clock.Play()); 109 }
101 clock.SetPlaybackRate(0.0f); 110
102 clock.SetPlaybackRate(1.0f); 111 TEST_F(ClockTest, Play_MultiSpeed) {
103 EXPECT_EQ(kExpected, clock.Elapsed());
104 }
105
106 TEST(ClockTest, Play_MultiSpeed) {
107 // We'll play for 2 seconds at half speed, 4 seconds at normal speed, and 8 112 // We'll play for 2 seconds at half speed, 4 seconds at normal speed, and 8
108 // seconds at double speed: 113 // seconds at double speed.
109 // (0.5 x 2) + (1.0 x 4) + (2.0 x 8) = 21 114 const base::TimeDelta kZero;
110 InSequence s; 115 const base::TimeDelta kPlayDuration1 = base::TimeDelta::FromSeconds(2);
111 StrictMock<base::MockTimeProvider> mock_time; 116 const base::TimeDelta kPlayDuration2 = base::TimeDelta::FromSeconds(4);
112 EXPECT_CALL(mock_time, Now()) 117 const base::TimeDelta kPlayDuration3 = base::TimeDelta::FromSeconds(8);
113 .WillOnce(Return(base::Time::FromDoubleT(4))); 118 const base::TimeDelta kExpected =
114 EXPECT_CALL(mock_time, Now()) 119 kPlayDuration1 / 2 + kPlayDuration2 + 2 * kPlayDuration3;
115 .WillOnce(Return(base::Time::FromDoubleT(6))); 120
116 EXPECT_CALL(mock_time, Now()) 121 clock_.SetPlaybackRate(0.5f);
117 .WillOnce(Return(base::Time::FromDoubleT(10))); 122 EXPECT_EQ(kZero, clock_.Play());
118 EXPECT_CALL(mock_time, Now()) 123 AdvanceSystemTime(kPlayDuration1);
119 .WillOnce(Return(base::Time::FromDoubleT(18))); 124
120 const base::TimeDelta kZero; 125 clock_.SetPlaybackRate(1.0f);
121 const base::TimeDelta kExpected = base::TimeDelta::FromSeconds(21); 126 AdvanceSystemTime(kPlayDuration2);
122 127
123 Clock clock(&base::MockTimeProvider::StaticNow); 128 clock_.SetPlaybackRate(2.0f);
124 clock.SetPlaybackRate(0.5f); 129 AdvanceSystemTime(kPlayDuration3);
125 EXPECT_EQ(kZero, clock.Play()); 130 EXPECT_EQ(kExpected, clock_.Elapsed());
126 clock.SetPlaybackRate(1.0f); 131 }
127 clock.SetPlaybackRate(2.0f); 132
128 EXPECT_EQ(kExpected, clock.Elapsed()); 133 TEST_F(ClockTest, Pause) {
129 } 134 const base::TimeDelta kZero;
130 135 const base::TimeDelta kPlayDuration = base::TimeDelta::FromSeconds(4);
131 TEST(ClockTest, Pause) { 136 const base::TimeDelta kPauseDuration = base::TimeDelta::FromSeconds(20);
132 InSequence s; 137 const base::TimeDelta kExpectedFirstPause = kPlayDuration;
133 StrictMock<base::MockTimeProvider> mock_time; 138 const base::TimeDelta kExpectedSecondPause = 2 * kPlayDuration;
134 EXPECT_CALL(mock_time, Now()) 139
135 .WillOnce(Return(base::Time::FromDoubleT(4))); 140 // Play for 4 seconds.
136 EXPECT_CALL(mock_time, Now()) 141 EXPECT_EQ(kZero, clock_.Play());
137 .WillOnce(Return(base::Time::FromDoubleT(8))); 142 AdvanceSystemTime(kPlayDuration);
138 EXPECT_CALL(mock_time, Now()) 143
139 .WillOnce(Return(base::Time::FromDoubleT(12))); 144 // Pause for 20 seconds.
140 EXPECT_CALL(mock_time, Now()) 145 EXPECT_EQ(kExpectedFirstPause, clock_.Pause());
141 .WillOnce(Return(base::Time::FromDoubleT(16))); 146 EXPECT_EQ(kExpectedFirstPause, clock_.Elapsed());
142 const base::TimeDelta kZero; 147 AdvanceSystemTime(kPauseDuration);
143 const base::TimeDelta kFirstPause = base::TimeDelta::FromSeconds(4); 148 EXPECT_EQ(kExpectedFirstPause, clock_.Elapsed());
144 const base::TimeDelta kSecondPause = base::TimeDelta::FromSeconds(8); 149
145 150 // Play again for 4 more seconds.
146 Clock clock(&base::MockTimeProvider::StaticNow); 151 EXPECT_EQ(kExpectedFirstPause, clock_.Play());
147 EXPECT_EQ(kZero, clock.Play()); 152 AdvanceSystemTime(kPlayDuration);
148 EXPECT_EQ(kFirstPause, clock.Pause()); 153 EXPECT_EQ(kExpectedSecondPause, clock_.Pause());
149 EXPECT_EQ(kFirstPause, clock.Elapsed()); 154 EXPECT_EQ(kExpectedSecondPause, clock_.Elapsed());
150 EXPECT_EQ(kFirstPause, clock.Play()); 155 }
151 EXPECT_EQ(kSecondPause, clock.Pause()); 156
152 EXPECT_EQ(kSecondPause, clock.Elapsed()); 157 TEST_F(ClockTest, SetTime_Paused) {
153 }
154
155 TEST(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;
159 StrictMock<base::MockTimeProvider> mock_time;
160 const base::TimeDelta kFirstTime = base::TimeDelta::FromSeconds(4); 158 const base::TimeDelta kFirstTime = base::TimeDelta::FromSeconds(4);
161 const base::TimeDelta kSecondTime = base::TimeDelta::FromSeconds(16); 159 const base::TimeDelta kSecondTime = base::TimeDelta::FromSeconds(16);
162 160
163 Clock clock(&base::MockTimeProvider::StaticNow); 161 clock_.SetTime(kFirstTime, clock_.Duration());
164 clock.SetTime(kFirstTime); 162 EXPECT_EQ(kFirstTime, clock_.Elapsed());
165 EXPECT_EQ(kFirstTime, clock.Elapsed()); 163 clock_.SetTime(kSecondTime, clock_.Duration());
166 clock.SetTime(kSecondTime); 164 EXPECT_EQ(kSecondTime, clock_.Elapsed());
167 EXPECT_EQ(kSecondTime, clock.Elapsed()); 165 }
168 } 166
169 167 TEST_F(ClockTest, SetTime_Playing) {
170 TEST(ClockTest, SetTime_Playing) {
171 // We'll play for 4 seconds, then set the time to 12, then play for 4 more 168 // 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. 169 // seconds.
173 InSequence s; 170 const base::TimeDelta kZero;
174 StrictMock<base::MockTimeProvider> mock_time; 171 const base::TimeDelta kPlayDuration = base::TimeDelta::FromSeconds(4);
175 EXPECT_CALL(mock_time, Now()) 172 const base::TimeDelta kUpdatedTime = base::TimeDelta::FromSeconds(12);
176 .WillOnce(Return(base::Time::FromDoubleT(4))); 173 const base::TimeDelta kExpected = kUpdatedTime + kPlayDuration;
177 EXPECT_CALL(mock_time, Now()) 174
178 .WillOnce(Return(base::Time::FromDoubleT(8))); 175 EXPECT_EQ(kZero, clock_.Play());
179 EXPECT_CALL(mock_time, Now()) 176 AdvanceSystemTime(kPlayDuration);
180 .WillOnce(Return(base::Time::FromDoubleT(12))); 177
181 const base::TimeDelta kZero; 178 clock_.SetTime(base::TimeDelta::FromSeconds(12), clock_.Duration());
acolwell GONE FROM CHROMIUM 2012/01/24 18:13:59 kUpdatedTime?
vrk (LEFT CHROMIUM) 2012/01/25 00:09:32 Done.
182 const base::TimeDelta kExepected = base::TimeDelta::FromSeconds(16); 179 AdvanceSystemTime(kPlayDuration);
183 180 EXPECT_EQ(kExpected, clock_.Elapsed());
184 Clock clock(&base::MockTimeProvider::StaticNow); 181 }
185 EXPECT_EQ(kZero, clock.Play()); 182
186 clock.SetTime(base::TimeDelta::FromSeconds(12)); 183 TEST_F(ClockTest, CapAtMediaDuration_Paused) {
187 EXPECT_EQ(kExepected, clock.Elapsed()); 184 const base::TimeDelta kDuration =
185 base::TimeDelta::FromSeconds(kDurationInSeconds);
186 const base::TimeDelta kTimeOverDuration =
187 base::TimeDelta::FromSeconds(kDurationInSeconds + 4);
188
189 // Elapsed time should always be capped at the duration of the media.
190 clock_.SetTime(kTimeOverDuration, kTimeOverDuration);
191 EXPECT_EQ(kDuration, clock_.Elapsed());
192 }
193
194 TEST_F(ClockTest, CapAtMediaDuration_Playing) {
195 const base::TimeDelta kZero;
196 const base::TimeDelta kDuration =
197 base::TimeDelta::FromSeconds(kDurationInSeconds);
198 const base::TimeDelta kTimeOverDuration =
199 base::TimeDelta::FromSeconds(kDurationInSeconds + 4);
200
201 // Play for twice as long as the duration of the media.
202 EXPECT_EQ(kZero, clock_.Play());
203 AdvanceSystemTime(2 * kDuration);
204 EXPECT_EQ(kDuration, clock_.Elapsed());
205
206 // Manually set the time past the duration.
207 clock_.SetTime(kTimeOverDuration, kTimeOverDuration);
208 EXPECT_EQ(kDuration, clock_.Elapsed());
209 }
210
211 TEST_F(ClockTest, SetMaxTime) {
212 const base::TimeDelta kZero;
213 const base::TimeDelta kTimeInterval = base::TimeDelta::FromSeconds(4);
214 const base::TimeDelta kMaxTime = base::TimeDelta::FromSeconds(6);
215
216 EXPECT_EQ(kZero, clock_.Play());
217 clock_.SetMaxTime(kMaxTime);
218 AdvanceSystemTime(kTimeInterval);
219 EXPECT_EQ(kTimeInterval, clock_.Elapsed());
220
221 AdvanceSystemTime(kTimeInterval);
222 EXPECT_EQ(kMaxTime, clock_.Elapsed());
223
224 AdvanceSystemTime(kTimeInterval);
225 EXPECT_EQ(kMaxTime, clock_.Elapsed());
226 }
227
228 TEST_F(ClockTest, SetMaxTime_MultipleTimes) {
229 const base::TimeDelta kZero;
230 const base::TimeDelta kTimeInterval = base::TimeDelta::FromSeconds(4);
231 const base::TimeDelta kMaxTime1 = base::TimeDelta::FromSeconds(6);
232 const base::TimeDelta kMaxTime2 = base::TimeDelta::FromSeconds(12);
233
234 EXPECT_EQ(kZero, clock_.Play());
235 clock_.SetMaxTime(clock_.Duration());
acolwell GONE FROM CHROMIUM 2012/01/24 18:13:59 Why Duration() here instead of kMaxTime1?
vrk (LEFT CHROMIUM) 2012/01/25 00:09:32 I wanted to test what happens if the MaxTime gets
acolwell GONE FROM CHROMIUM 2012/01/25 05:20:30 Ok that is what I thought might be the case. Just
236 AdvanceSystemTime(kTimeInterval);
237 EXPECT_EQ(kTimeInterval, clock_.Elapsed());
238
239 clock_.SetMaxTime(kMaxTime1);
240 AdvanceSystemTime(kTimeInterval);
241 EXPECT_EQ(kMaxTime1, clock_.Elapsed());
242
243 AdvanceSystemTime(kTimeInterval);
244 EXPECT_EQ(kMaxTime1, clock_.Elapsed());
245
246 clock_.SetMaxTime(kMaxTime2);
247 EXPECT_EQ(kMaxTime1, clock_.Elapsed());
248
249 AdvanceSystemTime(kTimeInterval);
250 EXPECT_EQ(kMaxTime1 + kTimeInterval, clock_.Elapsed());
251
252 AdvanceSystemTime(kTimeInterval);
253 EXPECT_EQ(kMaxTime2, clock_.Elapsed());
188 } 254 }
acolwell GONE FROM CHROMIUM 2012/01/24 18:13:59 \o/ these tests are so much clearer!!!
vrk (LEFT CHROMIUM) 2012/01/25 00:09:32 Yay!! :)
189 255
190 } // namespace media 256 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698