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

Unified 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 side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698