diff options
author | scherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-03-04 02:07:45 +0000 |
---|---|---|
committer | scherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-03-04 02:07:45 +0000 |
commit | 026b594cf4d3fc0bc22b0fa0ca5db2b6eae43c26 (patch) | |
tree | eea8e730b698b450092279a92b6c4c90e978f460 /media/base/clock_unittest.cc | |
parent | 0276b3bce9fe48c2e27890baa4524a9e38710593 (diff) | |
download | chromium_src-026b594cf4d3fc0bc22b0fa0ca5db2b6eae43c26.zip chromium_src-026b594cf4d3fc0bc22b0fa0ca5db2b6eae43c26.tar.gz chromium_src-026b594cf4d3fc0bc22b0fa0ca5db2b6eae43c26.tar.bz2 |
Fold ClockImpl into Clock and update corresponding clients and tests.
BUG=none
TEST=media_unittests --gtest_filter=ClockTest.*
Review URL: http://codereview.chromium.org/6609035
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@76863 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/base/clock_unittest.cc')
-rw-r--r-- | media/base/clock_unittest.cc | 217 |
1 files changed, 217 insertions, 0 deletions
diff --git a/media/base/clock_unittest.cc b/media/base/clock_unittest.cc new file mode 100644 index 0000000..1fe7416 --- /dev/null +++ b/media/base/clock_unittest.cc @@ -0,0 +1,217 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/logging.h" +#include "media/base/clock.h" +#include "testing/gmock/include/gmock/gmock.h" + +using ::testing::DefaultValue; +using ::testing::InSequence; +using ::testing::Return; +using ::testing::StrictMock; + +namespace base { + +// Provide a stream output operator so we can use EXPECT_EQ(...) with TimeDelta. +// +// TODO(scherkus): move this into the testing package. +static std::ostream& operator<<(std::ostream& stream, const TimeDelta& time) { + return (stream << time.ToInternalValue()); +} + +} // namespace + +namespace media { + +class MockTimeProvider { + public: + MockTimeProvider() { + DCHECK(!instance_) << "Only one instance of MockTimeProvider can exist"; + DCHECK(!DefaultValue<base::Time>::IsSet()); + instance_ = this; + DefaultValue<base::Time>::Set(base::Time::FromInternalValue(0)); + } + + ~MockTimeProvider() { + instance_ = NULL; + DefaultValue<base::Time>::Clear(); + } + + MOCK_METHOD0(Now, base::Time()); + + static base::Time StaticNow() { + return instance_->Now(); + } + + private: + static MockTimeProvider* instance_; + DISALLOW_COPY_AND_ASSIGN(MockTimeProvider); +}; + +MockTimeProvider* MockTimeProvider::instance_ = NULL; + +TEST(ClockTest, Created) { + StrictMock<MockTimeProvider> mock_time; + const base::TimeDelta kExpected = base::TimeDelta::FromSeconds(0); + + Clock clock(&MockTimeProvider::StaticNow); + EXPECT_EQ(kExpected, clock.Elapsed()); +} + +TEST(ClockTest, Play_NormalSpeed) { + InSequence s; + StrictMock<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))); + const base::TimeDelta kZero; + const base::TimeDelta kExpected = base::TimeDelta::FromSeconds(2); + + Clock clock(&MockTimeProvider::StaticNow); + EXPECT_EQ(kZero, clock.Play()); + EXPECT_EQ(kExpected, clock.Elapsed()); +} + +TEST(ClockTest, Play_DoubleSpeed) { + InSequence s; + StrictMock<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))); + const base::TimeDelta kZero; + const base::TimeDelta kExpected = base::TimeDelta::FromSeconds(10); + + Clock clock(&MockTimeProvider::StaticNow); + clock.SetPlaybackRate(2.0f); + EXPECT_EQ(kZero, clock.Play()); + EXPECT_EQ(kExpected, clock.Elapsed()); +} + +TEST(ClockTest, Play_HalfSpeed) { + InSequence s; + StrictMock<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))); + const base::TimeDelta kZero; + const base::TimeDelta kExpected = base::TimeDelta::FromSeconds(2); + + Clock clock(&MockTimeProvider::StaticNow); + clock.SetPlaybackRate(0.5f); + EXPECT_EQ(kZero, clock.Play()); + EXPECT_EQ(kExpected, clock.Elapsed()); +} + +TEST(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<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))); + const base::TimeDelta kZero; + const base::TimeDelta kExpected = base::TimeDelta::FromSeconds(10); + + Clock clock(&MockTimeProvider::StaticNow); + EXPECT_EQ(kZero, clock.Play()); + clock.SetPlaybackRate(0.0f); + clock.SetPlaybackRate(1.0f); + EXPECT_EQ(kExpected, clock.Elapsed()); +} + +TEST(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<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))); + const base::TimeDelta kZero; + const base::TimeDelta kExpected = base::TimeDelta::FromSeconds(21); + + Clock clock(&MockTimeProvider::StaticNow); + clock.SetPlaybackRate(0.5f); + EXPECT_EQ(kZero, clock.Play()); + clock.SetPlaybackRate(1.0f); + clock.SetPlaybackRate(2.0f); + EXPECT_EQ(kExpected, clock.Elapsed()); +} + +TEST(ClockTest, Pause) { + InSequence s; + StrictMock<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))); + const base::TimeDelta kZero; + const base::TimeDelta kFirstPause = base::TimeDelta::FromSeconds(4); + const base::TimeDelta kSecondPause = base::TimeDelta::FromSeconds(8); + + Clock clock(&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()); +} + +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<MockTimeProvider> mock_time; + const base::TimeDelta kFirstTime = base::TimeDelta::FromSeconds(4); + const base::TimeDelta kSecondTime = base::TimeDelta::FromSeconds(16); + + Clock clock(&MockTimeProvider::StaticNow); + clock.SetTime(kFirstTime); + EXPECT_EQ(kFirstTime, clock.Elapsed()); + clock.SetTime(kSecondTime); + EXPECT_EQ(kSecondTime, clock.Elapsed()); +} + +TEST(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<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))); + const base::TimeDelta kZero; + const base::TimeDelta kExepected = base::TimeDelta::FromSeconds(16); + + Clock clock(&MockTimeProvider::StaticNow); + EXPECT_EQ(kZero, clock.Play()); + clock.SetTime(base::TimeDelta::FromSeconds(12)); + EXPECT_EQ(kExepected, clock.Elapsed()); +} + +} // namespace media |