| Index: webrtc/base/timeutils_unittest.cc
|
| diff --git a/webrtc/base/timeutils_unittest.cc b/webrtc/base/timeutils_unittest.cc
|
| index 0971c037fa551a8c6bca1fe9403a839b6748460f..f183684e6ccf41d3c1e9801ac987da55f7f1426e 100644
|
| --- a/webrtc/base/timeutils_unittest.cc
|
| +++ b/webrtc/base/timeutils_unittest.cc
|
| @@ -9,6 +9,8 @@
|
| */
|
|
|
| #include "webrtc/base/common.h"
|
| +#include "webrtc/base/event.h"
|
| +#include "webrtc/base/fakeclock.h"
|
| #include "webrtc/base/gunit.h"
|
| #include "webrtc/base/helpers.h"
|
| #include "webrtc/base/thread.h"
|
| @@ -205,4 +207,176 @@ TEST_F(TmToSeconds, TestTmToSeconds) {
|
| TestTmToSeconds(100000);
|
| }
|
|
|
| +TEST(TimeDelta, FromAndTo) {
|
| + EXPECT_TRUE(TimeDelta::FromSeconds(2) == TimeDelta::FromMilliseconds(2000));
|
| + EXPECT_TRUE(TimeDelta::FromMilliseconds(3) ==
|
| + TimeDelta::FromMicroseconds(3000));
|
| + EXPECT_TRUE(TimeDelta::FromMicroseconds(4) ==
|
| + TimeDelta::FromNanoseconds(4000));
|
| + EXPECT_EQ(13, TimeDelta::FromSeconds(13).ToSeconds());
|
| + EXPECT_EQ(13, TimeDelta::FromMilliseconds(13).ToMilliseconds());
|
| + EXPECT_EQ(13, TimeDelta::FromMicroseconds(13).ToMicroseconds());
|
| + EXPECT_EQ(13, TimeDelta::FromNanoseconds(13).ToNanoseconds());
|
| +}
|
| +
|
| +TEST(TimeDelta, ComparisonOperators) {
|
| + EXPECT_LT(TimeDelta::FromSeconds(1), TimeDelta::FromSeconds(2));
|
| + EXPECT_EQ(TimeDelta::FromSeconds(3), TimeDelta::FromSeconds(3));
|
| + EXPECT_GT(TimeDelta::FromSeconds(5), TimeDelta::FromSeconds(4));
|
| +}
|
| +
|
| +TEST(TimeDelta, NumericOperators) {
|
| + double d = 0.5;
|
| + EXPECT_EQ(TimeDelta::FromMilliseconds(500),
|
| + TimeDelta::FromMilliseconds(1000) * d);
|
| + EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
|
| + TimeDelta::FromMilliseconds(1000) / d);
|
| + EXPECT_EQ(TimeDelta::FromMilliseconds(500),
|
| + TimeDelta::FromMilliseconds(1000) *= d);
|
| + EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
|
| + TimeDelta::FromMilliseconds(1000) /= d);
|
| + EXPECT_EQ(TimeDelta::FromMilliseconds(500),
|
| + d * TimeDelta::FromMilliseconds(1000));
|
| +
|
| + float f = 0.5;
|
| + EXPECT_EQ(TimeDelta::FromMilliseconds(500),
|
| + TimeDelta::FromMilliseconds(1000) * f);
|
| + EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
|
| + TimeDelta::FromMilliseconds(1000) / f);
|
| + EXPECT_EQ(TimeDelta::FromMilliseconds(500),
|
| + TimeDelta::FromMilliseconds(1000) *= f);
|
| + EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
|
| + TimeDelta::FromMilliseconds(1000) /= f);
|
| + EXPECT_EQ(TimeDelta::FromMilliseconds(500),
|
| + f * TimeDelta::FromMilliseconds(1000));
|
| +
|
| + int i = 2;
|
| + EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
|
| + TimeDelta::FromMilliseconds(1000) * i);
|
| + EXPECT_EQ(TimeDelta::FromMilliseconds(500),
|
| + TimeDelta::FromMilliseconds(1000) / i);
|
| + EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
|
| + TimeDelta::FromMilliseconds(1000) *= i);
|
| + EXPECT_EQ(TimeDelta::FromMilliseconds(500),
|
| + TimeDelta::FromMilliseconds(1000) /= i);
|
| + EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
|
| + i * TimeDelta::FromMilliseconds(1000));
|
| +
|
| + int64_t i64 = 2;
|
| + EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
|
| + TimeDelta::FromMilliseconds(1000) * i64);
|
| + EXPECT_EQ(TimeDelta::FromMilliseconds(500),
|
| + TimeDelta::FromMilliseconds(1000) / i64);
|
| + EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
|
| + TimeDelta::FromMilliseconds(1000) *= i64);
|
| + EXPECT_EQ(TimeDelta::FromMilliseconds(500),
|
| + TimeDelta::FromMilliseconds(1000) /= i64);
|
| + EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
|
| + i64 * TimeDelta::FromMilliseconds(1000));
|
| +
|
| + EXPECT_EQ(TimeDelta::FromMilliseconds(500),
|
| + TimeDelta::FromMilliseconds(1000) * 0.5);
|
| + EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
|
| + TimeDelta::FromMilliseconds(1000) / 0.5);
|
| + EXPECT_EQ(TimeDelta::FromMilliseconds(500),
|
| + TimeDelta::FromMilliseconds(1000) *= 0.5);
|
| + EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
|
| + TimeDelta::FromMilliseconds(1000) /= 0.5);
|
| + EXPECT_EQ(TimeDelta::FromMilliseconds(500),
|
| + 0.5 * TimeDelta::FromMilliseconds(1000));
|
| +
|
| + EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
|
| + TimeDelta::FromMilliseconds(1000) * 2);
|
| + EXPECT_EQ(TimeDelta::FromMilliseconds(500),
|
| + TimeDelta::FromMilliseconds(1000) / 2);
|
| + EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
|
| + TimeDelta::FromMilliseconds(1000) *= 2);
|
| + EXPECT_EQ(TimeDelta::FromMilliseconds(500),
|
| + TimeDelta::FromMilliseconds(1000) /= 2);
|
| + EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
|
| + 2 * TimeDelta::FromMilliseconds(1000));
|
| +}
|
| +
|
| +// Test that all the time functions exposed by TimeUtils get time from the
|
| +// fake clock when it's set.
|
| +TEST(FakeClock, TimeFunctionsUseFakeClock) {
|
| + FakeClock clock;
|
| + SetClock(&clock);
|
| +
|
| + clock.SetTimeNanos(987654321u);
|
| + EXPECT_EQ(987u, Time32());
|
| + EXPECT_EQ(987, TimeMillis());
|
| + EXPECT_EQ(987654u, TimeMicros());
|
| + EXPECT_EQ(987654321u, TimeNanos());
|
| + EXPECT_EQ(1000u, TimeAfter(13));
|
| +
|
| + SetClock(nullptr);
|
| + // After it's unset, we should get a normal time.
|
| + EXPECT_NE(987, TimeMillis());
|
| +}
|
| +
|
| +TEST(FakeClock, InitialTime) {
|
| + FakeClock clock;
|
| + EXPECT_EQ(0u, clock.TimeNanos());
|
| +}
|
| +
|
| +TEST(FakeClock, SetTimeNanos) {
|
| + FakeClock clock;
|
| + clock.SetTimeNanos(123u);
|
| + EXPECT_EQ(123u, clock.TimeNanos());
|
| + clock.SetTimeNanos(456u);
|
| + EXPECT_EQ(456u, clock.TimeNanos());
|
| +}
|
| +
|
| +TEST(FakeClock, AdvanceTime) {
|
| + FakeClock clock;
|
| + clock.AdvanceTime(TimeDelta::FromNanoseconds(1111u));
|
| + EXPECT_EQ(1111u, clock.TimeNanos());
|
| + clock.AdvanceTime(TimeDelta::FromMicroseconds(2222u));
|
| + EXPECT_EQ(2223111u, clock.TimeNanos());
|
| + clock.AdvanceTime(TimeDelta::FromMilliseconds(3333u));
|
| + EXPECT_EQ(3335223111u, clock.TimeNanos());
|
| + clock.AdvanceTime(TimeDelta::FromSeconds(4444u));
|
| + EXPECT_EQ(4447335223111u, clock.TimeNanos());
|
| +}
|
| +
|
| +// When the clock is advanced, threads that are waiting in a socket select
|
| +// should wake up and look at the new time. This allows tests using the
|
| +// fake clock to run much faster, if the test is bound by time constraints
|
| +// (such as a test for a STUN ping timeout).
|
| +TEST(FakeClock, SettingTimeWakesThreads) {
|
| + int64_t real_start_time_ms = TimeMillis();
|
| +
|
| + FakeClock clock;
|
| + SetClock(&clock);
|
| +
|
| + Thread worker;
|
| + worker.Start();
|
| +
|
| + // Post an event that won't be executed for 10 seconds.
|
| + Event message_handler_dispatched(false, false);
|
| + auto functor = [&message_handler_dispatched] {
|
| + message_handler_dispatched.Set();
|
| + };
|
| + FunctorMessageHandler<void, decltype(functor)> handler(functor);
|
| + worker.PostDelayed(10000, &handler);
|
| +
|
| + // Wait for a bit for the worker thread to be started and enter its socket
|
| + // select().
|
| + Thread::Current()->SleepMs(1000);
|
| +
|
| + // Advance the fake clock, expecting the worker thread to wake up
|
| + // and dispatch the message quickly.
|
| + clock.AdvanceTime(TimeDelta::FromSeconds(10u));
|
| + message_handler_dispatched.Wait(Event::kForever);
|
| + worker.Stop();
|
| +
|
| + SetClock(nullptr);
|
| +
|
| + // The message should have been dispatched long before the 10 seconds fully
|
| + // elapsed.
|
| + int64_t real_end_time_ms = TimeMillis();
|
| + EXPECT_LT(real_end_time_ms - real_start_time_ms, 2000);
|
| +}
|
| +
|
| } // namespace rtc
|
|
|