wall_clock_time_source_unittest.cc 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. // Copyright 2014 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. #include <memory>
  5. #include "base/test/simple_test_tick_clock.h"
  6. #include "base/time/time.h"
  7. #include "media/base/wall_clock_time_source.h"
  8. #include "testing/gtest/include/gtest/gtest.h"
  9. namespace media {
  10. class WallClockTimeSourceTest : public testing::Test {
  11. public:
  12. WallClockTimeSourceTest() : tick_clock_(new base::SimpleTestTickClock()) {
  13. time_source_.SetTickClockForTesting(tick_clock_.get());
  14. AdvanceTimeInSeconds(1);
  15. }
  16. WallClockTimeSourceTest(const WallClockTimeSourceTest&) = delete;
  17. WallClockTimeSourceTest& operator=(const WallClockTimeSourceTest&) = delete;
  18. ~WallClockTimeSourceTest() override = default;
  19. void AdvanceTimeInSeconds(int seconds) {
  20. tick_clock_->Advance(base::Seconds(seconds));
  21. }
  22. int CurrentMediaTimeInSeconds() {
  23. return time_source_.CurrentMediaTime().InSeconds();
  24. }
  25. void SetMediaTimeInSeconds(int seconds) {
  26. return time_source_.SetMediaTime(base::Seconds(seconds));
  27. }
  28. base::TimeTicks ConvertMediaTime(base::TimeDelta timestamp,
  29. bool* is_time_moving) {
  30. std::vector<base::TimeTicks> wall_clock_times;
  31. *is_time_moving = time_source_.GetWallClockTimes(
  32. std::vector<base::TimeDelta>(1, timestamp), &wall_clock_times);
  33. return wall_clock_times[0];
  34. }
  35. bool IsWallClockNowForMediaTimeInSeconds(int seconds) {
  36. bool is_time_moving = false;
  37. return tick_clock_->NowTicks() ==
  38. ConvertMediaTime(base::Seconds(seconds), &is_time_moving);
  39. }
  40. bool IsTimeStopped() {
  41. bool is_time_moving = false;
  42. // Convert any random value, it shouldn't matter for this call.
  43. ConvertMediaTime(base::Seconds(1), &is_time_moving);
  44. return !is_time_moving;
  45. }
  46. protected:
  47. WallClockTimeSource time_source_;
  48. std::unique_ptr<base::SimpleTestTickClock> tick_clock_;
  49. };
  50. TEST_F(WallClockTimeSourceTest, InitialTimeIsZero) {
  51. EXPECT_EQ(0, CurrentMediaTimeInSeconds());
  52. EXPECT_TRUE(IsTimeStopped());
  53. }
  54. TEST_F(WallClockTimeSourceTest, InitialTimeIsNotTicking) {
  55. EXPECT_EQ(0, CurrentMediaTimeInSeconds());
  56. EXPECT_TRUE(IsTimeStopped());
  57. AdvanceTimeInSeconds(100);
  58. EXPECT_EQ(0, CurrentMediaTimeInSeconds());
  59. EXPECT_TRUE(IsTimeStopped());
  60. }
  61. TEST_F(WallClockTimeSourceTest, InitialPlaybackRateIsOne) {
  62. time_source_.StartTicking();
  63. EXPECT_EQ(0, CurrentMediaTimeInSeconds());
  64. EXPECT_TRUE(IsWallClockNowForMediaTimeInSeconds(0));
  65. AdvanceTimeInSeconds(100);
  66. EXPECT_EQ(100, CurrentMediaTimeInSeconds());
  67. EXPECT_TRUE(IsWallClockNowForMediaTimeInSeconds(100));
  68. }
  69. TEST_F(WallClockTimeSourceTest, SetMediaTime) {
  70. EXPECT_EQ(0, CurrentMediaTimeInSeconds());
  71. EXPECT_TRUE(IsTimeStopped());
  72. SetMediaTimeInSeconds(10);
  73. EXPECT_EQ(10, CurrentMediaTimeInSeconds());
  74. EXPECT_TRUE(IsTimeStopped());
  75. std::vector<base::TimeTicks> wall_clock_times;
  76. time_source_.GetWallClockTimes(std::vector<base::TimeDelta>(),
  77. &wall_clock_times);
  78. EXPECT_EQ(base::TimeTicks(), wall_clock_times[0]);
  79. }
  80. TEST_F(WallClockTimeSourceTest, SetPlaybackRate) {
  81. time_source_.StartTicking();
  82. time_source_.SetPlaybackRate(0.5);
  83. EXPECT_EQ(0, CurrentMediaTimeInSeconds());
  84. EXPECT_TRUE(IsWallClockNowForMediaTimeInSeconds(0));
  85. AdvanceTimeInSeconds(10);
  86. EXPECT_EQ(5, CurrentMediaTimeInSeconds());
  87. EXPECT_TRUE(IsWallClockNowForMediaTimeInSeconds(5));
  88. time_source_.SetPlaybackRate(2);
  89. EXPECT_EQ(5, CurrentMediaTimeInSeconds());
  90. EXPECT_TRUE(IsWallClockNowForMediaTimeInSeconds(5));
  91. AdvanceTimeInSeconds(10);
  92. EXPECT_EQ(25, CurrentMediaTimeInSeconds());
  93. EXPECT_TRUE(IsWallClockNowForMediaTimeInSeconds(25));
  94. }
  95. TEST_F(WallClockTimeSourceTest, StopTicking) {
  96. time_source_.StartTicking();
  97. EXPECT_EQ(0, CurrentMediaTimeInSeconds());
  98. EXPECT_TRUE(IsWallClockNowForMediaTimeInSeconds(0));
  99. AdvanceTimeInSeconds(10);
  100. EXPECT_EQ(10, CurrentMediaTimeInSeconds());
  101. EXPECT_TRUE(IsWallClockNowForMediaTimeInSeconds(10));
  102. time_source_.StopTicking();
  103. AdvanceTimeInSeconds(10);
  104. EXPECT_EQ(10, CurrentMediaTimeInSeconds());
  105. EXPECT_TRUE(IsTimeStopped());
  106. }
  107. TEST_F(WallClockTimeSourceTest, ConvertsTimestampsWhenStopped) {
  108. const base::TimeDelta kOneSecond = base::Seconds(1);
  109. bool is_time_moving = false;
  110. EXPECT_EQ(base::TimeTicks(),
  111. ConvertMediaTime(base::TimeDelta(), &is_time_moving));
  112. EXPECT_FALSE(is_time_moving);
  113. EXPECT_NE(base::TimeTicks(), ConvertMediaTime(kOneSecond, &is_time_moving));
  114. EXPECT_FALSE(is_time_moving);
  115. time_source_.StartTicking();
  116. time_source_.StopTicking();
  117. EXPECT_EQ(tick_clock_->NowTicks(),
  118. ConvertMediaTime(base::TimeDelta(), &is_time_moving));
  119. EXPECT_FALSE(is_time_moving);
  120. EXPECT_EQ(tick_clock_->NowTicks() + kOneSecond,
  121. ConvertMediaTime(kOneSecond, &is_time_moving));
  122. EXPECT_FALSE(is_time_moving);
  123. }
  124. TEST_F(WallClockTimeSourceTest, EmptyMediaTimestampsReturnMediaWallClockTime) {
  125. std::vector<base::TimeTicks> wall_clock_times;
  126. bool is_time_moving = time_source_.GetWallClockTimes(
  127. std::vector<base::TimeDelta>(), &wall_clock_times);
  128. EXPECT_FALSE(is_time_moving);
  129. EXPECT_EQ(base::TimeTicks(), wall_clock_times[0]);
  130. wall_clock_times.clear();
  131. time_source_.StartTicking();
  132. is_time_moving = time_source_.GetWallClockTimes(
  133. std::vector<base::TimeDelta>(), &wall_clock_times);
  134. EXPECT_TRUE(is_time_moving);
  135. EXPECT_EQ(tick_clock_->NowTicks(), wall_clock_times[0]);
  136. wall_clock_times.clear();
  137. time_source_.StopTicking();
  138. is_time_moving = time_source_.GetWallClockTimes(
  139. std::vector<base::TimeDelta>(), &wall_clock_times);
  140. EXPECT_FALSE(is_time_moving);
  141. EXPECT_EQ(tick_clock_->NowTicks(), wall_clock_times[0]);
  142. // Setting media time should clear reference time.
  143. SetMediaTimeInSeconds(5);
  144. wall_clock_times.clear();
  145. is_time_moving = time_source_.GetWallClockTimes(
  146. std::vector<base::TimeDelta>(), &wall_clock_times);
  147. EXPECT_FALSE(is_time_moving);
  148. EXPECT_EQ(base::TimeTicks(), wall_clock_times[0]);
  149. }
  150. } // namespace media