Chromium Code Reviews| Index: media/base/clock_unittest.cc |
| diff --git a/media/base/clock_unittest.cc b/media/base/clock_unittest.cc |
| index dcf39ae6c1494441c3062878116bf03e4d28bda8..733f409b5b8a6c1f7379b2ecabad9c1ea9179cfc 100644 |
| --- a/media/base/clock_unittest.cc |
| +++ b/media/base/clock_unittest.cc |
| @@ -24,167 +24,233 @@ static std::ostream& operator<<(std::ostream& stream, const TimeDelta& time) { |
| namespace media { |
| -TEST(ClockTest, Created) { |
| - StrictMock<base::MockTimeProvider> mock_time; |
| - const base::TimeDelta kExpected = base::TimeDelta::FromSeconds(0); |
| +static const int kDurationInSeconds = 120; |
| + |
| +class ClockTest : public ::testing::Test { |
| + public: |
| + ClockTest() |
| + : clock_(&base::MockTimeProvider::StaticNow) { |
| + SetDuration(); |
| + EXPECT_CALL(mock_time_, Now()) |
| + .WillRepeatedly(Return(base::Time::UnixEpoch())); |
| + } |
| + |
| + protected: |
| + void SetDuration() { |
| + const base::TimeDelta kDuration = |
| + base::TimeDelta::FromSeconds(kDurationInSeconds); |
| + clock_.SetDuration(kDuration); |
| + EXPECT_EQ(kDuration, clock_.Duration()); |
| + } |
| + |
| + void AdvanceSystemTime(base::TimeDelta delta) { |
| + time_elapsed_ += delta; |
| + EXPECT_CALL(mock_time_, Now()) |
| + .WillRepeatedly(Return(base::Time::UnixEpoch() + time_elapsed_)); |
| + } |
| + |
| + Clock clock_; |
| + StrictMock<base::MockTimeProvider> mock_time_; |
| + base::TimeDelta time_elapsed_; |
| +}; |
| - Clock clock(&base::MockTimeProvider::StaticNow); |
| - EXPECT_EQ(kExpected, clock.Elapsed()); |
| +TEST_F(ClockTest, Created) { |
| + const base::TimeDelta kExpected = base::TimeDelta::FromSeconds(0); |
| + EXPECT_EQ(kExpected, clock_.Elapsed()); |
| } |
| -TEST(ClockTest, Play_NormalSpeed) { |
| - InSequence s; |
| - StrictMock<base::MockTimeProvider> mock_time; |
| - EXPECT_CALL(mock_time, Now()) |
| - .WillOnce(Return(base::Time::FromDoubleT(4))); |
| - EXPECT_CALL(mock_time, Now()) |
| - .WillOnce(Return(base::Time::FromDoubleT(6))); |
| +TEST_F(ClockTest, Play_NormalSpeed) { |
| const base::TimeDelta kZero; |
| - const base::TimeDelta kExpected = base::TimeDelta::FromSeconds(2); |
| + const base::TimeDelta kTimeToAdvance = base::TimeDelta::FromSeconds(2); |
| - Clock clock(&base::MockTimeProvider::StaticNow); |
| - EXPECT_EQ(kZero, clock.Play()); |
| - EXPECT_EQ(kExpected, clock.Elapsed()); |
| + EXPECT_EQ(kZero, clock_.Play()); |
| + AdvanceSystemTime(kTimeToAdvance); |
| + EXPECT_EQ(kTimeToAdvance, clock_.Elapsed()); |
| } |
| -TEST(ClockTest, Play_DoubleSpeed) { |
| - InSequence s; |
| - StrictMock<base::MockTimeProvider> mock_time; |
| - EXPECT_CALL(mock_time, Now()) |
| - .WillOnce(Return(base::Time::FromDoubleT(4))); |
| - EXPECT_CALL(mock_time, Now()) |
| - .WillOnce(Return(base::Time::FromDoubleT(9))); |
| +TEST_F(ClockTest, Play_DoubleSpeed) { |
| const base::TimeDelta kZero; |
| - const base::TimeDelta kExpected = base::TimeDelta::FromSeconds(10); |
| + const base::TimeDelta kTimeToAdvance = base::TimeDelta::FromSeconds(5); |
| - Clock clock(&base::MockTimeProvider::StaticNow); |
| - clock.SetPlaybackRate(2.0f); |
| - EXPECT_EQ(kZero, clock.Play()); |
| - EXPECT_EQ(kExpected, clock.Elapsed()); |
| + clock_.SetPlaybackRate(2.0f); |
| + EXPECT_EQ(kZero, clock_.Play()); |
| + AdvanceSystemTime(kTimeToAdvance); |
| + EXPECT_EQ(2 * kTimeToAdvance, clock_.Elapsed()); |
| } |
| -TEST(ClockTest, Play_HalfSpeed) { |
| - InSequence s; |
| - StrictMock<base::MockTimeProvider> mock_time; |
| - EXPECT_CALL(mock_time, Now()) |
| - .WillOnce(Return(base::Time::FromDoubleT(4))); |
| - EXPECT_CALL(mock_time, Now()) |
| - .WillOnce(Return(base::Time::FromDoubleT(8))); |
| +TEST_F(ClockTest, Play_HalfSpeed) { |
| const base::TimeDelta kZero; |
| - const base::TimeDelta kExpected = base::TimeDelta::FromSeconds(2); |
| + const base::TimeDelta kTimeToAdvance = base::TimeDelta::FromSeconds(4); |
| - Clock clock(&base::MockTimeProvider::StaticNow); |
| - clock.SetPlaybackRate(0.5f); |
| - EXPECT_EQ(kZero, clock.Play()); |
| - EXPECT_EQ(kExpected, clock.Elapsed()); |
| + clock_.SetPlaybackRate(0.5f); |
| + EXPECT_EQ(kZero, clock_.Play()); |
| + AdvanceSystemTime(kTimeToAdvance); |
| + EXPECT_EQ(kTimeToAdvance / 2, clock_.Elapsed()); |
| } |
| -TEST(ClockTest, Play_ZeroSpeed) { |
| +TEST_F(ClockTest, Play_ZeroSpeed) { |
| // We'll play for 2 seconds at normal speed, 4 seconds at zero speed, and 8 |
| - // seconds at normal speed: |
| - // (1.0 x 2) + (0.0 x 4) + (1.0 x 8) = 10 |
| - InSequence s; |
| - StrictMock<base::MockTimeProvider> mock_time; |
| - EXPECT_CALL(mock_time, Now()) |
| - .WillOnce(Return(base::Time::FromDoubleT(4))); |
| - EXPECT_CALL(mock_time, Now()) |
| - .WillOnce(Return(base::Time::FromDoubleT(6))); |
| - EXPECT_CALL(mock_time, Now()) |
| - .WillOnce(Return(base::Time::FromDoubleT(10))); |
| - EXPECT_CALL(mock_time, Now()) |
| - .WillOnce(Return(base::Time::FromDoubleT(18))); |
| + // seconds at normal speed. |
| const base::TimeDelta kZero; |
| - const base::TimeDelta kExpected = base::TimeDelta::FromSeconds(10); |
| + const base::TimeDelta kPlayDuration1 = base::TimeDelta::FromSeconds(2); |
| + const base::TimeDelta kPlayDuration2 = base::TimeDelta::FromSeconds(4); |
| + const base::TimeDelta kPlayDuration3 = base::TimeDelta::FromSeconds(8); |
| + const base::TimeDelta kExpected = kPlayDuration1 + kPlayDuration3; |
| + |
| + EXPECT_EQ(kZero, clock_.Play()); |
| + |
| + AdvanceSystemTime(kPlayDuration1); |
| + clock_.SetPlaybackRate(0.0f); |
| + AdvanceSystemTime(kPlayDuration2); |
| + clock_.SetPlaybackRate(1.0f); |
| + AdvanceSystemTime(kPlayDuration3); |
| - Clock clock(&base::MockTimeProvider::StaticNow); |
| - EXPECT_EQ(kZero, clock.Play()); |
| - clock.SetPlaybackRate(0.0f); |
| - clock.SetPlaybackRate(1.0f); |
| - EXPECT_EQ(kExpected, clock.Elapsed()); |
| + EXPECT_EQ(kExpected, clock_.Elapsed()); |
| } |
| -TEST(ClockTest, Play_MultiSpeed) { |
| +TEST_F(ClockTest, Play_MultiSpeed) { |
| // We'll play for 2 seconds at half speed, 4 seconds at normal speed, and 8 |
| - // seconds at double speed: |
| - // (0.5 x 2) + (1.0 x 4) + (2.0 x 8) = 21 |
| - InSequence s; |
| - StrictMock<base::MockTimeProvider> mock_time; |
| - EXPECT_CALL(mock_time, Now()) |
| - .WillOnce(Return(base::Time::FromDoubleT(4))); |
| - EXPECT_CALL(mock_time, Now()) |
| - .WillOnce(Return(base::Time::FromDoubleT(6))); |
| - EXPECT_CALL(mock_time, Now()) |
| - .WillOnce(Return(base::Time::FromDoubleT(10))); |
| - EXPECT_CALL(mock_time, Now()) |
| - .WillOnce(Return(base::Time::FromDoubleT(18))); |
| + // seconds at double speed. |
| const base::TimeDelta kZero; |
| - const base::TimeDelta kExpected = base::TimeDelta::FromSeconds(21); |
| - |
| - Clock clock(&base::MockTimeProvider::StaticNow); |
| - clock.SetPlaybackRate(0.5f); |
| - EXPECT_EQ(kZero, clock.Play()); |
| - clock.SetPlaybackRate(1.0f); |
| - clock.SetPlaybackRate(2.0f); |
| - EXPECT_EQ(kExpected, clock.Elapsed()); |
| + const base::TimeDelta kPlayDuration1 = base::TimeDelta::FromSeconds(2); |
| + const base::TimeDelta kPlayDuration2 = base::TimeDelta::FromSeconds(4); |
| + const base::TimeDelta kPlayDuration3 = base::TimeDelta::FromSeconds(8); |
| + const base::TimeDelta kExpected = |
| + kPlayDuration1 / 2 + kPlayDuration2 + 2 * kPlayDuration3; |
| + |
| + clock_.SetPlaybackRate(0.5f); |
| + EXPECT_EQ(kZero, clock_.Play()); |
| + AdvanceSystemTime(kPlayDuration1); |
| + |
| + clock_.SetPlaybackRate(1.0f); |
| + AdvanceSystemTime(kPlayDuration2); |
| + |
| + clock_.SetPlaybackRate(2.0f); |
| + AdvanceSystemTime(kPlayDuration3); |
| + EXPECT_EQ(kExpected, clock_.Elapsed()); |
| } |
| -TEST(ClockTest, Pause) { |
| - InSequence s; |
| - StrictMock<base::MockTimeProvider> mock_time; |
| - EXPECT_CALL(mock_time, Now()) |
| - .WillOnce(Return(base::Time::FromDoubleT(4))); |
| - EXPECT_CALL(mock_time, Now()) |
| - .WillOnce(Return(base::Time::FromDoubleT(8))); |
| - EXPECT_CALL(mock_time, Now()) |
| - .WillOnce(Return(base::Time::FromDoubleT(12))); |
| - EXPECT_CALL(mock_time, Now()) |
| - .WillOnce(Return(base::Time::FromDoubleT(16))); |
| +TEST_F(ClockTest, Pause) { |
| const base::TimeDelta kZero; |
| - const base::TimeDelta kFirstPause = base::TimeDelta::FromSeconds(4); |
| - const base::TimeDelta kSecondPause = base::TimeDelta::FromSeconds(8); |
| - |
| - Clock clock(&base::MockTimeProvider::StaticNow); |
| - EXPECT_EQ(kZero, clock.Play()); |
| - EXPECT_EQ(kFirstPause, clock.Pause()); |
| - EXPECT_EQ(kFirstPause, clock.Elapsed()); |
| - EXPECT_EQ(kFirstPause, clock.Play()); |
| - EXPECT_EQ(kSecondPause, clock.Pause()); |
| - EXPECT_EQ(kSecondPause, clock.Elapsed()); |
| + const base::TimeDelta kPlayDuration = base::TimeDelta::FromSeconds(4); |
| + const base::TimeDelta kPauseDuration = base::TimeDelta::FromSeconds(20); |
| + const base::TimeDelta kExpectedFirstPause = kPlayDuration; |
| + const base::TimeDelta kExpectedSecondPause = 2 * kPlayDuration; |
| + |
| + // Play for 4 seconds. |
| + EXPECT_EQ(kZero, clock_.Play()); |
| + AdvanceSystemTime(kPlayDuration); |
| + |
| + // Pause for 20 seconds. |
| + EXPECT_EQ(kExpectedFirstPause, clock_.Pause()); |
| + EXPECT_EQ(kExpectedFirstPause, clock_.Elapsed()); |
| + AdvanceSystemTime(kPauseDuration); |
| + EXPECT_EQ(kExpectedFirstPause, clock_.Elapsed()); |
| + |
| + // Play again for 4 more seconds. |
| + EXPECT_EQ(kExpectedFirstPause, clock_.Play()); |
| + AdvanceSystemTime(kPlayDuration); |
| + EXPECT_EQ(kExpectedSecondPause, clock_.Pause()); |
| + EXPECT_EQ(kExpectedSecondPause, clock_.Elapsed()); |
| } |
| -TEST(ClockTest, SetTime_Paused) { |
| - // We'll remain paused while we set the time. The time should be simply |
| - // updated without accessing the time provider. |
| - InSequence s; |
| - StrictMock<base::MockTimeProvider> mock_time; |
| +TEST_F(ClockTest, SetTime_Paused) { |
| const base::TimeDelta kFirstTime = base::TimeDelta::FromSeconds(4); |
| const base::TimeDelta kSecondTime = base::TimeDelta::FromSeconds(16); |
| - Clock clock(&base::MockTimeProvider::StaticNow); |
| - clock.SetTime(kFirstTime); |
| - EXPECT_EQ(kFirstTime, clock.Elapsed()); |
| - clock.SetTime(kSecondTime); |
| - EXPECT_EQ(kSecondTime, clock.Elapsed()); |
| + clock_.SetTime(kFirstTime, clock_.Duration()); |
| + EXPECT_EQ(kFirstTime, clock_.Elapsed()); |
| + clock_.SetTime(kSecondTime, clock_.Duration()); |
| + EXPECT_EQ(kSecondTime, clock_.Elapsed()); |
| } |
| -TEST(ClockTest, SetTime_Playing) { |
| +TEST_F(ClockTest, SetTime_Playing) { |
| // We'll play for 4 seconds, then set the time to 12, then play for 4 more |
| - // seconds. We'll expect a media time of 16. |
| - InSequence s; |
| - StrictMock<base::MockTimeProvider> mock_time; |
| - EXPECT_CALL(mock_time, Now()) |
| - .WillOnce(Return(base::Time::FromDoubleT(4))); |
| - EXPECT_CALL(mock_time, Now()) |
| - .WillOnce(Return(base::Time::FromDoubleT(8))); |
| - EXPECT_CALL(mock_time, Now()) |
| - .WillOnce(Return(base::Time::FromDoubleT(12))); |
| + // seconds. |
| + const base::TimeDelta kZero; |
| + const base::TimeDelta kPlayDuration = base::TimeDelta::FromSeconds(4); |
| + const base::TimeDelta kUpdatedTime = base::TimeDelta::FromSeconds(12); |
| + const base::TimeDelta kExpected = kUpdatedTime + kPlayDuration; |
| + |
| + EXPECT_EQ(kZero, clock_.Play()); |
| + AdvanceSystemTime(kPlayDuration); |
| + |
| + 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.
|
| + AdvanceSystemTime(kPlayDuration); |
| + EXPECT_EQ(kExpected, clock_.Elapsed()); |
| +} |
| + |
| +TEST_F(ClockTest, CapAtMediaDuration_Paused) { |
| + const base::TimeDelta kDuration = |
| + base::TimeDelta::FromSeconds(kDurationInSeconds); |
| + const base::TimeDelta kTimeOverDuration = |
| + base::TimeDelta::FromSeconds(kDurationInSeconds + 4); |
| + |
| + // Elapsed time should always be capped at the duration of the media. |
| + clock_.SetTime(kTimeOverDuration, kTimeOverDuration); |
| + EXPECT_EQ(kDuration, clock_.Elapsed()); |
| +} |
| + |
| +TEST_F(ClockTest, CapAtMediaDuration_Playing) { |
| + const base::TimeDelta kZero; |
| + const base::TimeDelta kDuration = |
| + base::TimeDelta::FromSeconds(kDurationInSeconds); |
| + const base::TimeDelta kTimeOverDuration = |
| + base::TimeDelta::FromSeconds(kDurationInSeconds + 4); |
| + |
| + // Play for twice as long as the duration of the media. |
| + EXPECT_EQ(kZero, clock_.Play()); |
| + AdvanceSystemTime(2 * kDuration); |
| + EXPECT_EQ(kDuration, clock_.Elapsed()); |
| + |
| + // Manually set the time past the duration. |
| + clock_.SetTime(kTimeOverDuration, kTimeOverDuration); |
| + EXPECT_EQ(kDuration, clock_.Elapsed()); |
| +} |
| + |
| +TEST_F(ClockTest, SetMaxTime) { |
| const base::TimeDelta kZero; |
| - const base::TimeDelta kExepected = base::TimeDelta::FromSeconds(16); |
| + const base::TimeDelta kTimeInterval = base::TimeDelta::FromSeconds(4); |
| + const base::TimeDelta kMaxTime = base::TimeDelta::FromSeconds(6); |
| + |
| + EXPECT_EQ(kZero, clock_.Play()); |
| + clock_.SetMaxTime(kMaxTime); |
| + AdvanceSystemTime(kTimeInterval); |
| + EXPECT_EQ(kTimeInterval, clock_.Elapsed()); |
| + |
| + AdvanceSystemTime(kTimeInterval); |
| + EXPECT_EQ(kMaxTime, clock_.Elapsed()); |
| + |
| + AdvanceSystemTime(kTimeInterval); |
| + EXPECT_EQ(kMaxTime, clock_.Elapsed()); |
| +} |
| + |
| +TEST_F(ClockTest, SetMaxTime_MultipleTimes) { |
| + const base::TimeDelta kZero; |
| + const base::TimeDelta kTimeInterval = base::TimeDelta::FromSeconds(4); |
| + const base::TimeDelta kMaxTime1 = base::TimeDelta::FromSeconds(6); |
| + const base::TimeDelta kMaxTime2 = base::TimeDelta::FromSeconds(12); |
| + |
| + EXPECT_EQ(kZero, clock_.Play()); |
| + 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
|
| + AdvanceSystemTime(kTimeInterval); |
| + EXPECT_EQ(kTimeInterval, clock_.Elapsed()); |
| + |
| + clock_.SetMaxTime(kMaxTime1); |
| + AdvanceSystemTime(kTimeInterval); |
| + EXPECT_EQ(kMaxTime1, clock_.Elapsed()); |
| + |
| + AdvanceSystemTime(kTimeInterval); |
| + EXPECT_EQ(kMaxTime1, clock_.Elapsed()); |
| + |
| + clock_.SetMaxTime(kMaxTime2); |
| + EXPECT_EQ(kMaxTime1, clock_.Elapsed()); |
| + |
| + AdvanceSystemTime(kTimeInterval); |
| + EXPECT_EQ(kMaxTime1 + kTimeInterval, clock_.Elapsed()); |
| - Clock clock(&base::MockTimeProvider::StaticNow); |
| - EXPECT_EQ(kZero, clock.Play()); |
| - clock.SetTime(base::TimeDelta::FromSeconds(12)); |
| - EXPECT_EQ(kExepected, clock.Elapsed()); |
| + AdvanceSystemTime(kTimeInterval); |
| + EXPECT_EQ(kMaxTime2, clock_.Elapsed()); |
| } |
|
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!! :)
|
| } // namespace media |