| OLD | NEW |
| (Empty) | |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
| 2 // 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" |
| 6 #include "media/base/clock_impl.h" |
| 7 #include "testing/gmock/include/gmock/gmock.h" |
| 8 |
| 9 using ::testing::DefaultValue; |
| 10 using ::testing::InSequence; |
| 11 using ::testing::Return; |
| 12 using ::testing::StrictMock; |
| 13 |
| 14 namespace { |
| 15 |
| 16 // Provide a stream output operator so we can use EXPECT_EQ(...) with TimeDelta. |
| 17 // |
| 18 // TODO(scherkus): move this into the testing package. |
| 19 std::ostream& operator<<(std::ostream& stream, const base::TimeDelta& time) { |
| 20 return (stream << time.ToInternalValue()); |
| 21 } |
| 22 |
| 23 } // namespace |
| 24 |
| 25 namespace media { |
| 26 |
| 27 class MockTimeProvider { |
| 28 public: |
| 29 MockTimeProvider() { |
| 30 DCHECK(!instance_) << "Only one instance of MockTimeProvider can exist"; |
| 31 DCHECK(!DefaultValue<base::Time>::IsSet()); |
| 32 instance_ = this; |
| 33 DefaultValue<base::Time>::Set(base::Time::FromInternalValue(0)); |
| 34 } |
| 35 |
| 36 ~MockTimeProvider() { |
| 37 instance_ = NULL; |
| 38 DefaultValue<base::Time>::Clear(); |
| 39 } |
| 40 |
| 41 MOCK_METHOD0(Now, base::Time()); |
| 42 |
| 43 static base::Time StaticNow() { |
| 44 return instance_->Now(); |
| 45 } |
| 46 |
| 47 private: |
| 48 static MockTimeProvider* instance_; |
| 49 DISALLOW_COPY_AND_ASSIGN(MockTimeProvider); |
| 50 }; |
| 51 |
| 52 MockTimeProvider* MockTimeProvider::instance_ = NULL; |
| 53 |
| 54 TEST(ClockTest, Created) { |
| 55 StrictMock<MockTimeProvider> mock_time; |
| 56 const base::TimeDelta kExpected = base::TimeDelta::FromSeconds(0); |
| 57 |
| 58 ClockImpl clock(&MockTimeProvider::StaticNow); |
| 59 EXPECT_EQ(kExpected, clock.Elapsed()); |
| 60 } |
| 61 |
| 62 TEST(ClockTest, Play_NormalSpeed) { |
| 63 InSequence s; |
| 64 StrictMock<MockTimeProvider> mock_time; |
| 65 EXPECT_CALL(mock_time, Now()) |
| 66 .WillOnce(Return(base::Time::FromDoubleT(4))); |
| 67 EXPECT_CALL(mock_time, Now()) |
| 68 .WillOnce(Return(base::Time::FromDoubleT(6))); |
| 69 const base::TimeDelta kZero; |
| 70 const base::TimeDelta kExpected = base::TimeDelta::FromSeconds(2); |
| 71 |
| 72 ClockImpl clock(&MockTimeProvider::StaticNow); |
| 73 EXPECT_EQ(kZero, clock.Play()); |
| 74 EXPECT_EQ(kExpected, clock.Elapsed()); |
| 75 } |
| 76 |
| 77 TEST(ClockTest, Play_DoubleSpeed) { |
| 78 InSequence s; |
| 79 StrictMock<MockTimeProvider> mock_time; |
| 80 EXPECT_CALL(mock_time, Now()) |
| 81 .WillOnce(Return(base::Time::FromDoubleT(4))); |
| 82 EXPECT_CALL(mock_time, Now()) |
| 83 .WillOnce(Return(base::Time::FromDoubleT(9))); |
| 84 const base::TimeDelta kZero; |
| 85 const base::TimeDelta kExpected = base::TimeDelta::FromSeconds(10); |
| 86 |
| 87 ClockImpl clock(&MockTimeProvider::StaticNow); |
| 88 clock.SetPlaybackRate(2.0f); |
| 89 EXPECT_EQ(kZero, clock.Play()); |
| 90 EXPECT_EQ(kExpected, clock.Elapsed()); |
| 91 } |
| 92 |
| 93 TEST(ClockTest, Play_HalfSpeed) { |
| 94 InSequence s; |
| 95 StrictMock<MockTimeProvider> mock_time; |
| 96 EXPECT_CALL(mock_time, Now()) |
| 97 .WillOnce(Return(base::Time::FromDoubleT(4))); |
| 98 EXPECT_CALL(mock_time, Now()) |
| 99 .WillOnce(Return(base::Time::FromDoubleT(8))); |
| 100 const base::TimeDelta kZero; |
| 101 const base::TimeDelta kExpected = base::TimeDelta::FromSeconds(2); |
| 102 |
| 103 ClockImpl clock(&MockTimeProvider::StaticNow); |
| 104 clock.SetPlaybackRate(0.5f); |
| 105 EXPECT_EQ(kZero, clock.Play()); |
| 106 EXPECT_EQ(kExpected, clock.Elapsed()); |
| 107 } |
| 108 |
| 109 TEST(ClockTest, Play_ZeroSpeed) { |
| 110 // We'll play for 2 seconds at normal speed, 4 seconds at zero speed, and 8 |
| 111 // seconds at normal speed: |
| 112 // (1.0 x 2) + (0.0 x 4) + (1.0 x 8) = 10 |
| 113 InSequence s; |
| 114 StrictMock<MockTimeProvider> mock_time; |
| 115 EXPECT_CALL(mock_time, Now()) |
| 116 .WillOnce(Return(base::Time::FromDoubleT(4))); |
| 117 EXPECT_CALL(mock_time, Now()) |
| 118 .WillOnce(Return(base::Time::FromDoubleT(6))); |
| 119 EXPECT_CALL(mock_time, Now()) |
| 120 .WillOnce(Return(base::Time::FromDoubleT(10))); |
| 121 EXPECT_CALL(mock_time, Now()) |
| 122 .WillOnce(Return(base::Time::FromDoubleT(18))); |
| 123 const base::TimeDelta kZero; |
| 124 const base::TimeDelta kExpected = base::TimeDelta::FromSeconds(10); |
| 125 |
| 126 ClockImpl clock(&MockTimeProvider::StaticNow); |
| 127 EXPECT_EQ(kZero, clock.Play()); |
| 128 clock.SetPlaybackRate(0.0f); |
| 129 clock.SetPlaybackRate(1.0f); |
| 130 EXPECT_EQ(kExpected, clock.Elapsed()); |
| 131 } |
| 132 |
| 133 TEST(ClockTest, Play_MultiSpeed) { |
| 134 // We'll play for 2 seconds at half speed, 4 seconds at normal speed, and 8 |
| 135 // seconds at double speed: |
| 136 // (0.5 x 2) + (1.0 x 4) + (2.0 x 8) = 21 |
| 137 InSequence s; |
| 138 StrictMock<MockTimeProvider> mock_time; |
| 139 EXPECT_CALL(mock_time, Now()) |
| 140 .WillOnce(Return(base::Time::FromDoubleT(4))); |
| 141 EXPECT_CALL(mock_time, Now()) |
| 142 .WillOnce(Return(base::Time::FromDoubleT(6))); |
| 143 EXPECT_CALL(mock_time, Now()) |
| 144 .WillOnce(Return(base::Time::FromDoubleT(10))); |
| 145 EXPECT_CALL(mock_time, Now()) |
| 146 .WillOnce(Return(base::Time::FromDoubleT(18))); |
| 147 const base::TimeDelta kZero; |
| 148 const base::TimeDelta kExpected = base::TimeDelta::FromSeconds(21); |
| 149 |
| 150 ClockImpl clock(&MockTimeProvider::StaticNow); |
| 151 clock.SetPlaybackRate(0.5f); |
| 152 EXPECT_EQ(kZero, clock.Play()); |
| 153 clock.SetPlaybackRate(1.0f); |
| 154 clock.SetPlaybackRate(2.0f); |
| 155 EXPECT_EQ(kExpected, clock.Elapsed()); |
| 156 } |
| 157 |
| 158 TEST(ClockTest, Pause) { |
| 159 InSequence s; |
| 160 StrictMock<MockTimeProvider> mock_time; |
| 161 EXPECT_CALL(mock_time, Now()) |
| 162 .WillOnce(Return(base::Time::FromDoubleT(4))); |
| 163 EXPECT_CALL(mock_time, Now()) |
| 164 .WillOnce(Return(base::Time::FromDoubleT(8))); |
| 165 EXPECT_CALL(mock_time, Now()) |
| 166 .WillOnce(Return(base::Time::FromDoubleT(12))); |
| 167 EXPECT_CALL(mock_time, Now()) |
| 168 .WillOnce(Return(base::Time::FromDoubleT(16))); |
| 169 const base::TimeDelta kZero; |
| 170 const base::TimeDelta kFirstPause = base::TimeDelta::FromSeconds(4); |
| 171 const base::TimeDelta kSecondPause = base::TimeDelta::FromSeconds(8); |
| 172 |
| 173 ClockImpl clock(&MockTimeProvider::StaticNow); |
| 174 EXPECT_EQ(kZero, clock.Play()); |
| 175 EXPECT_EQ(kFirstPause, clock.Pause()); |
| 176 EXPECT_EQ(kFirstPause, clock.Elapsed()); |
| 177 EXPECT_EQ(kFirstPause, clock.Play()); |
| 178 EXPECT_EQ(kSecondPause, clock.Pause()); |
| 179 EXPECT_EQ(kSecondPause, clock.Elapsed()); |
| 180 } |
| 181 |
| 182 TEST(ClockTest, SetTime_Paused) { |
| 183 // We'll remain paused while we set the time. The time should be simply |
| 184 // updated without accessing the time provider. |
| 185 InSequence s; |
| 186 StrictMock<MockTimeProvider> mock_time; |
| 187 const base::TimeDelta kFirstTime = base::TimeDelta::FromSeconds(4); |
| 188 const base::TimeDelta kSecondTime = base::TimeDelta::FromSeconds(16); |
| 189 |
| 190 ClockImpl clock(&MockTimeProvider::StaticNow); |
| 191 clock.SetTime(kFirstTime); |
| 192 EXPECT_EQ(kFirstTime, clock.Elapsed()); |
| 193 clock.SetTime(kSecondTime); |
| 194 EXPECT_EQ(kSecondTime, clock.Elapsed()); |
| 195 } |
| 196 |
| 197 TEST(ClockTest, SetTime_Playing) { |
| 198 // We'll play for 4 seconds, then set the time to 12, then play for 4 more |
| 199 // seconds. We'll expect a media time of 16. |
| 200 InSequence s; |
| 201 StrictMock<MockTimeProvider> mock_time; |
| 202 EXPECT_CALL(mock_time, Now()) |
| 203 .WillOnce(Return(base::Time::FromDoubleT(4))); |
| 204 EXPECT_CALL(mock_time, Now()) |
| 205 .WillOnce(Return(base::Time::FromDoubleT(8))); |
| 206 EXPECT_CALL(mock_time, Now()) |
| 207 .WillOnce(Return(base::Time::FromDoubleT(12))); |
| 208 const base::TimeDelta kZero; |
| 209 const base::TimeDelta kExepected = base::TimeDelta::FromSeconds(16); |
| 210 |
| 211 ClockImpl clock(&MockTimeProvider::StaticNow); |
| 212 EXPECT_EQ(kZero, clock.Play()); |
| 213 clock.SetTime(base::TimeDelta::FromSeconds(12)); |
| 214 EXPECT_EQ(kExepected, clock.Elapsed()); |
| 215 } |
| 216 |
| 217 } // namespace media |
| OLD | NEW |