summaryrefslogtreecommitdiffstats
path: root/media/base/clock_unittest.cc
diff options
context:
space:
mode:
authorscherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-03-04 02:07:45 +0000
committerscherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-03-04 02:07:45 +0000
commit026b594cf4d3fc0bc22b0fa0ca5db2b6eae43c26 (patch)
treeeea8e730b698b450092279a92b6c4c90e978f460 /media/base/clock_unittest.cc
parent0276b3bce9fe48c2e27890baa4524a9e38710593 (diff)
downloadchromium_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.cc217
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