xref: /aosp_15_r20/external/webrtc/rtc_base/time_utils_unittest.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
3*d9f75844SAndroid Build Coastguard Worker  *
4*d9f75844SAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker  */
10*d9f75844SAndroid Build Coastguard Worker 
11*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/time_utils.h"
12*d9f75844SAndroid Build Coastguard Worker 
13*d9f75844SAndroid Build Coastguard Worker #include <memory>
14*d9f75844SAndroid Build Coastguard Worker 
15*d9f75844SAndroid Build Coastguard Worker #include "api/units/time_delta.h"
16*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/event.h"
17*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/fake_clock.h"
18*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/helpers.h"
19*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/thread.h"
20*d9f75844SAndroid Build Coastguard Worker #include "test/gtest.h"
21*d9f75844SAndroid Build Coastguard Worker 
22*d9f75844SAndroid Build Coastguard Worker namespace rtc {
23*d9f75844SAndroid Build Coastguard Worker using ::webrtc::TimeDelta;
24*d9f75844SAndroid Build Coastguard Worker 
TEST(TimeTest,TimeInMs)25*d9f75844SAndroid Build Coastguard Worker TEST(TimeTest, TimeInMs) {
26*d9f75844SAndroid Build Coastguard Worker   int64_t ts_earlier = TimeMillis();
27*d9f75844SAndroid Build Coastguard Worker   Thread::SleepMs(100);
28*d9f75844SAndroid Build Coastguard Worker   int64_t ts_now = TimeMillis();
29*d9f75844SAndroid Build Coastguard Worker   // Allow for the thread to wakeup ~20ms early.
30*d9f75844SAndroid Build Coastguard Worker   EXPECT_GE(ts_now, ts_earlier + 80);
31*d9f75844SAndroid Build Coastguard Worker   // Make sure the Time is not returning in smaller unit like microseconds.
32*d9f75844SAndroid Build Coastguard Worker   EXPECT_LT(ts_now, ts_earlier + 1000);
33*d9f75844SAndroid Build Coastguard Worker }
34*d9f75844SAndroid Build Coastguard Worker 
TEST(TimeTest,Intervals)35*d9f75844SAndroid Build Coastguard Worker TEST(TimeTest, Intervals) {
36*d9f75844SAndroid Build Coastguard Worker   int64_t ts_earlier = TimeMillis();
37*d9f75844SAndroid Build Coastguard Worker   int64_t ts_later = TimeAfter(500);
38*d9f75844SAndroid Build Coastguard Worker 
39*d9f75844SAndroid Build Coastguard Worker   // We can't depend on ts_later and ts_earlier to be exactly 500 apart
40*d9f75844SAndroid Build Coastguard Worker   // since time elapses between the calls to TimeMillis() and TimeAfter(500)
41*d9f75844SAndroid Build Coastguard Worker   EXPECT_LE(500, TimeDiff(ts_later, ts_earlier));
42*d9f75844SAndroid Build Coastguard Worker   EXPECT_GE(-500, TimeDiff(ts_earlier, ts_later));
43*d9f75844SAndroid Build Coastguard Worker 
44*d9f75844SAndroid Build Coastguard Worker   // Time has elapsed since ts_earlier
45*d9f75844SAndroid Build Coastguard Worker   EXPECT_GE(TimeSince(ts_earlier), 0);
46*d9f75844SAndroid Build Coastguard Worker 
47*d9f75844SAndroid Build Coastguard Worker   // ts_earlier is earlier than now, so TimeUntil ts_earlier is -ve
48*d9f75844SAndroid Build Coastguard Worker   EXPECT_LE(TimeUntil(ts_earlier), 0);
49*d9f75844SAndroid Build Coastguard Worker 
50*d9f75844SAndroid Build Coastguard Worker   // ts_later likely hasn't happened yet, so TimeSince could be -ve
51*d9f75844SAndroid Build Coastguard Worker   // but within 500
52*d9f75844SAndroid Build Coastguard Worker   EXPECT_GE(TimeSince(ts_later), -500);
53*d9f75844SAndroid Build Coastguard Worker 
54*d9f75844SAndroid Build Coastguard Worker   // TimeUntil ts_later is at most 500
55*d9f75844SAndroid Build Coastguard Worker   EXPECT_LE(TimeUntil(ts_later), 500);
56*d9f75844SAndroid Build Coastguard Worker }
57*d9f75844SAndroid Build Coastguard Worker 
TEST(TimeTest,TestTimeDiff64)58*d9f75844SAndroid Build Coastguard Worker TEST(TimeTest, TestTimeDiff64) {
59*d9f75844SAndroid Build Coastguard Worker   int64_t ts_diff = 100;
60*d9f75844SAndroid Build Coastguard Worker   int64_t ts_earlier = rtc::TimeMillis();
61*d9f75844SAndroid Build Coastguard Worker   int64_t ts_later = ts_earlier + ts_diff;
62*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(ts_diff, rtc::TimeDiff(ts_later, ts_earlier));
63*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(-ts_diff, rtc::TimeDiff(ts_earlier, ts_later));
64*d9f75844SAndroid Build Coastguard Worker }
65*d9f75844SAndroid Build Coastguard Worker 
66*d9f75844SAndroid Build Coastguard Worker class TimestampWrapAroundHandlerTest : public ::testing::Test {
67*d9f75844SAndroid Build Coastguard Worker  public:
TimestampWrapAroundHandlerTest()68*d9f75844SAndroid Build Coastguard Worker   TimestampWrapAroundHandlerTest() {}
69*d9f75844SAndroid Build Coastguard Worker 
70*d9f75844SAndroid Build Coastguard Worker  protected:
71*d9f75844SAndroid Build Coastguard Worker   TimestampWrapAroundHandler wraparound_handler_;
72*d9f75844SAndroid Build Coastguard Worker };
73*d9f75844SAndroid Build Coastguard Worker 
TEST_F(TimestampWrapAroundHandlerTest,Unwrap)74*d9f75844SAndroid Build Coastguard Worker TEST_F(TimestampWrapAroundHandlerTest, Unwrap) {
75*d9f75844SAndroid Build Coastguard Worker   // Start value.
76*d9f75844SAndroid Build Coastguard Worker   int64_t ts = 2;
77*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(ts,
78*d9f75844SAndroid Build Coastguard Worker             wraparound_handler_.Unwrap(static_cast<uint32_t>(ts & 0xffffffff)));
79*d9f75844SAndroid Build Coastguard Worker 
80*d9f75844SAndroid Build Coastguard Worker   // Wrap backwards.
81*d9f75844SAndroid Build Coastguard Worker   ts = -2;
82*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(ts,
83*d9f75844SAndroid Build Coastguard Worker             wraparound_handler_.Unwrap(static_cast<uint32_t>(ts & 0xffffffff)));
84*d9f75844SAndroid Build Coastguard Worker 
85*d9f75844SAndroid Build Coastguard Worker   // Forward to 2 again.
86*d9f75844SAndroid Build Coastguard Worker   ts = 2;
87*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(ts,
88*d9f75844SAndroid Build Coastguard Worker             wraparound_handler_.Unwrap(static_cast<uint32_t>(ts & 0xffffffff)));
89*d9f75844SAndroid Build Coastguard Worker 
90*d9f75844SAndroid Build Coastguard Worker   // Max positive skip ahead, until max value (0xffffffff).
91*d9f75844SAndroid Build Coastguard Worker   for (uint32_t i = 0; i <= 0xf; ++i) {
92*d9f75844SAndroid Build Coastguard Worker     ts = (i << 28) + 0x0fffffff;
93*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(
94*d9f75844SAndroid Build Coastguard Worker         ts, wraparound_handler_.Unwrap(static_cast<uint32_t>(ts & 0xffffffff)));
95*d9f75844SAndroid Build Coastguard Worker   }
96*d9f75844SAndroid Build Coastguard Worker 
97*d9f75844SAndroid Build Coastguard Worker   // Wrap around.
98*d9f75844SAndroid Build Coastguard Worker   ts += 2;
99*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(ts,
100*d9f75844SAndroid Build Coastguard Worker             wraparound_handler_.Unwrap(static_cast<uint32_t>(ts & 0xffffffff)));
101*d9f75844SAndroid Build Coastguard Worker 
102*d9f75844SAndroid Build Coastguard Worker   // Max wrap backward...
103*d9f75844SAndroid Build Coastguard Worker   ts -= 0x0fffffff;
104*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(ts,
105*d9f75844SAndroid Build Coastguard Worker             wraparound_handler_.Unwrap(static_cast<uint32_t>(ts & 0xffffffff)));
106*d9f75844SAndroid Build Coastguard Worker 
107*d9f75844SAndroid Build Coastguard Worker   // ...and back again.
108*d9f75844SAndroid Build Coastguard Worker   ts += 0x0fffffff;
109*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(ts,
110*d9f75844SAndroid Build Coastguard Worker             wraparound_handler_.Unwrap(static_cast<uint32_t>(ts & 0xffffffff)));
111*d9f75844SAndroid Build Coastguard Worker }
112*d9f75844SAndroid Build Coastguard Worker 
TEST_F(TimestampWrapAroundHandlerTest,NoNegativeStart)113*d9f75844SAndroid Build Coastguard Worker TEST_F(TimestampWrapAroundHandlerTest, NoNegativeStart) {
114*d9f75844SAndroid Build Coastguard Worker   int64_t ts = 0xfffffff0;
115*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(ts,
116*d9f75844SAndroid Build Coastguard Worker             wraparound_handler_.Unwrap(static_cast<uint32_t>(ts & 0xffffffff)));
117*d9f75844SAndroid Build Coastguard Worker }
118*d9f75844SAndroid Build Coastguard Worker 
119*d9f75844SAndroid Build Coastguard Worker class TmToSeconds : public ::testing::Test {
120*d9f75844SAndroid Build Coastguard Worker  public:
TmToSeconds()121*d9f75844SAndroid Build Coastguard Worker   TmToSeconds() {
122*d9f75844SAndroid Build Coastguard Worker     // Set use of the test RNG to get deterministic expiration timestamp.
123*d9f75844SAndroid Build Coastguard Worker     rtc::SetRandomTestMode(true);
124*d9f75844SAndroid Build Coastguard Worker   }
~TmToSeconds()125*d9f75844SAndroid Build Coastguard Worker   ~TmToSeconds() override {
126*d9f75844SAndroid Build Coastguard Worker     // Put it back for the next test.
127*d9f75844SAndroid Build Coastguard Worker     rtc::SetRandomTestMode(false);
128*d9f75844SAndroid Build Coastguard Worker   }
129*d9f75844SAndroid Build Coastguard Worker 
TestTmToSeconds(int times)130*d9f75844SAndroid Build Coastguard Worker   void TestTmToSeconds(int times) {
131*d9f75844SAndroid Build Coastguard Worker     static char mdays[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
132*d9f75844SAndroid Build Coastguard Worker     for (int i = 0; i < times; i++) {
133*d9f75844SAndroid Build Coastguard Worker       // First generate something correct and check that TmToSeconds is happy.
134*d9f75844SAndroid Build Coastguard Worker       int year = rtc::CreateRandomId() % 400 + 1970;
135*d9f75844SAndroid Build Coastguard Worker 
136*d9f75844SAndroid Build Coastguard Worker       bool leap_year = false;
137*d9f75844SAndroid Build Coastguard Worker       if (year % 4 == 0)
138*d9f75844SAndroid Build Coastguard Worker         leap_year = true;
139*d9f75844SAndroid Build Coastguard Worker       if (year % 100 == 0)
140*d9f75844SAndroid Build Coastguard Worker         leap_year = false;
141*d9f75844SAndroid Build Coastguard Worker       if (year % 400 == 0)
142*d9f75844SAndroid Build Coastguard Worker         leap_year = true;
143*d9f75844SAndroid Build Coastguard Worker 
144*d9f75844SAndroid Build Coastguard Worker       std::tm tm;
145*d9f75844SAndroid Build Coastguard Worker       tm.tm_year = year - 1900;  // std::tm is year 1900 based.
146*d9f75844SAndroid Build Coastguard Worker       tm.tm_mon = rtc::CreateRandomId() % 12;
147*d9f75844SAndroid Build Coastguard Worker       tm.tm_mday = rtc::CreateRandomId() % mdays[tm.tm_mon] + 1;
148*d9f75844SAndroid Build Coastguard Worker       tm.tm_hour = rtc::CreateRandomId() % 24;
149*d9f75844SAndroid Build Coastguard Worker       tm.tm_min = rtc::CreateRandomId() % 60;
150*d9f75844SAndroid Build Coastguard Worker       tm.tm_sec = rtc::CreateRandomId() % 60;
151*d9f75844SAndroid Build Coastguard Worker       int64_t t = rtc::TmToSeconds(tm);
152*d9f75844SAndroid Build Coastguard Worker       EXPECT_TRUE(t >= 0);
153*d9f75844SAndroid Build Coastguard Worker 
154*d9f75844SAndroid Build Coastguard Worker       // Now damage a random field and check that TmToSeconds is unhappy.
155*d9f75844SAndroid Build Coastguard Worker       switch (rtc::CreateRandomId() % 11) {
156*d9f75844SAndroid Build Coastguard Worker         case 0:
157*d9f75844SAndroid Build Coastguard Worker           tm.tm_year = 1969 - 1900;
158*d9f75844SAndroid Build Coastguard Worker           break;
159*d9f75844SAndroid Build Coastguard Worker         case 1:
160*d9f75844SAndroid Build Coastguard Worker           tm.tm_mon = -1;
161*d9f75844SAndroid Build Coastguard Worker           break;
162*d9f75844SAndroid Build Coastguard Worker         case 2:
163*d9f75844SAndroid Build Coastguard Worker           tm.tm_mon = 12;
164*d9f75844SAndroid Build Coastguard Worker           break;
165*d9f75844SAndroid Build Coastguard Worker         case 3:
166*d9f75844SAndroid Build Coastguard Worker           tm.tm_mday = 0;
167*d9f75844SAndroid Build Coastguard Worker           break;
168*d9f75844SAndroid Build Coastguard Worker         case 4:
169*d9f75844SAndroid Build Coastguard Worker           tm.tm_mday = mdays[tm.tm_mon] + (leap_year && tm.tm_mon == 1) + 1;
170*d9f75844SAndroid Build Coastguard Worker           break;
171*d9f75844SAndroid Build Coastguard Worker         case 5:
172*d9f75844SAndroid Build Coastguard Worker           tm.tm_hour = -1;
173*d9f75844SAndroid Build Coastguard Worker           break;
174*d9f75844SAndroid Build Coastguard Worker         case 6:
175*d9f75844SAndroid Build Coastguard Worker           tm.tm_hour = 24;
176*d9f75844SAndroid Build Coastguard Worker           break;
177*d9f75844SAndroid Build Coastguard Worker         case 7:
178*d9f75844SAndroid Build Coastguard Worker           tm.tm_min = -1;
179*d9f75844SAndroid Build Coastguard Worker           break;
180*d9f75844SAndroid Build Coastguard Worker         case 8:
181*d9f75844SAndroid Build Coastguard Worker           tm.tm_min = 60;
182*d9f75844SAndroid Build Coastguard Worker           break;
183*d9f75844SAndroid Build Coastguard Worker         case 9:
184*d9f75844SAndroid Build Coastguard Worker           tm.tm_sec = -1;
185*d9f75844SAndroid Build Coastguard Worker           break;
186*d9f75844SAndroid Build Coastguard Worker         case 10:
187*d9f75844SAndroid Build Coastguard Worker           tm.tm_sec = 60;
188*d9f75844SAndroid Build Coastguard Worker           break;
189*d9f75844SAndroid Build Coastguard Worker       }
190*d9f75844SAndroid Build Coastguard Worker       EXPECT_EQ(rtc::TmToSeconds(tm), -1);
191*d9f75844SAndroid Build Coastguard Worker     }
192*d9f75844SAndroid Build Coastguard Worker     // Check consistency with the system gmtime_r.  With time_t, we can only
193*d9f75844SAndroid Build Coastguard Worker     // portably test dates until 2038, which is achieved by the % 0x80000000.
194*d9f75844SAndroid Build Coastguard Worker     for (int i = 0; i < times; i++) {
195*d9f75844SAndroid Build Coastguard Worker       time_t t = rtc::CreateRandomId() % 0x80000000;
196*d9f75844SAndroid Build Coastguard Worker #if defined(WEBRTC_WIN)
197*d9f75844SAndroid Build Coastguard Worker       std::tm* tm = std::gmtime(&t);
198*d9f75844SAndroid Build Coastguard Worker       EXPECT_TRUE(tm);
199*d9f75844SAndroid Build Coastguard Worker       EXPECT_TRUE(rtc::TmToSeconds(*tm) == t);
200*d9f75844SAndroid Build Coastguard Worker #else
201*d9f75844SAndroid Build Coastguard Worker       std::tm tm;
202*d9f75844SAndroid Build Coastguard Worker       EXPECT_TRUE(gmtime_r(&t, &tm));
203*d9f75844SAndroid Build Coastguard Worker       EXPECT_TRUE(rtc::TmToSeconds(tm) == t);
204*d9f75844SAndroid Build Coastguard Worker #endif
205*d9f75844SAndroid Build Coastguard Worker     }
206*d9f75844SAndroid Build Coastguard Worker   }
207*d9f75844SAndroid Build Coastguard Worker };
208*d9f75844SAndroid Build Coastguard Worker 
TEST_F(TmToSeconds,TestTmToSeconds)209*d9f75844SAndroid Build Coastguard Worker TEST_F(TmToSeconds, TestTmToSeconds) {
210*d9f75844SAndroid Build Coastguard Worker   TestTmToSeconds(100000);
211*d9f75844SAndroid Build Coastguard Worker }
212*d9f75844SAndroid Build Coastguard Worker 
213*d9f75844SAndroid Build Coastguard Worker // Test that all the time functions exposed by TimeUtils get time from the
214*d9f75844SAndroid Build Coastguard Worker // fake clock when it's set.
TEST(FakeClock,TimeFunctionsUseFakeClock)215*d9f75844SAndroid Build Coastguard Worker TEST(FakeClock, TimeFunctionsUseFakeClock) {
216*d9f75844SAndroid Build Coastguard Worker   FakeClock clock;
217*d9f75844SAndroid Build Coastguard Worker   SetClockForTesting(&clock);
218*d9f75844SAndroid Build Coastguard Worker 
219*d9f75844SAndroid Build Coastguard Worker   clock.SetTime(webrtc::Timestamp::Micros(987654));
220*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(987u, Time32());
221*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(987, TimeMillis());
222*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(987654, TimeMicros());
223*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(987654000, TimeNanos());
224*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(1000u, TimeAfter(13));
225*d9f75844SAndroid Build Coastguard Worker 
226*d9f75844SAndroid Build Coastguard Worker   SetClockForTesting(nullptr);
227*d9f75844SAndroid Build Coastguard Worker   // After it's unset, we should get a normal time.
228*d9f75844SAndroid Build Coastguard Worker   EXPECT_NE(987, TimeMillis());
229*d9f75844SAndroid Build Coastguard Worker }
230*d9f75844SAndroid Build Coastguard Worker 
TEST(FakeClock,InitialTime)231*d9f75844SAndroid Build Coastguard Worker TEST(FakeClock, InitialTime) {
232*d9f75844SAndroid Build Coastguard Worker   FakeClock clock;
233*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(0, clock.TimeNanos());
234*d9f75844SAndroid Build Coastguard Worker }
235*d9f75844SAndroid Build Coastguard Worker 
TEST(FakeClock,SetTime)236*d9f75844SAndroid Build Coastguard Worker TEST(FakeClock, SetTime) {
237*d9f75844SAndroid Build Coastguard Worker   FakeClock clock;
238*d9f75844SAndroid Build Coastguard Worker   clock.SetTime(webrtc::Timestamp::Micros(123));
239*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(123000, clock.TimeNanos());
240*d9f75844SAndroid Build Coastguard Worker   clock.SetTime(webrtc::Timestamp::Micros(456));
241*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(456000, clock.TimeNanos());
242*d9f75844SAndroid Build Coastguard Worker }
243*d9f75844SAndroid Build Coastguard Worker 
TEST(FakeClock,AdvanceTime)244*d9f75844SAndroid Build Coastguard Worker TEST(FakeClock, AdvanceTime) {
245*d9f75844SAndroid Build Coastguard Worker   FakeClock clock;
246*d9f75844SAndroid Build Coastguard Worker   clock.AdvanceTime(webrtc::TimeDelta::Micros(1u));
247*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(1000, clock.TimeNanos());
248*d9f75844SAndroid Build Coastguard Worker   clock.AdvanceTime(webrtc::TimeDelta::Micros(2222u));
249*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(2223000, clock.TimeNanos());
250*d9f75844SAndroid Build Coastguard Worker   clock.AdvanceTime(webrtc::TimeDelta::Millis(3333u));
251*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(3335223000, clock.TimeNanos());
252*d9f75844SAndroid Build Coastguard Worker   clock.AdvanceTime(webrtc::TimeDelta::Seconds(4444u));
253*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(4447335223000, clock.TimeNanos());
254*d9f75844SAndroid Build Coastguard Worker }
255*d9f75844SAndroid Build Coastguard Worker 
256*d9f75844SAndroid Build Coastguard Worker // When the clock is advanced, threads that are waiting in a socket select
257*d9f75844SAndroid Build Coastguard Worker // should wake up and look at the new time. This allows tests using the
258*d9f75844SAndroid Build Coastguard Worker // fake clock to run much faster, if the test is bound by time constraints
259*d9f75844SAndroid Build Coastguard Worker // (such as a test for a STUN ping timeout).
TEST(FakeClock,SettingTimeWakesThreads)260*d9f75844SAndroid Build Coastguard Worker TEST(FakeClock, SettingTimeWakesThreads) {
261*d9f75844SAndroid Build Coastguard Worker   int64_t real_start_time_ms = TimeMillis();
262*d9f75844SAndroid Build Coastguard Worker 
263*d9f75844SAndroid Build Coastguard Worker   ThreadProcessingFakeClock clock;
264*d9f75844SAndroid Build Coastguard Worker   SetClockForTesting(&clock);
265*d9f75844SAndroid Build Coastguard Worker 
266*d9f75844SAndroid Build Coastguard Worker   std::unique_ptr<Thread> worker(Thread::CreateWithSocketServer());
267*d9f75844SAndroid Build Coastguard Worker   worker->Start();
268*d9f75844SAndroid Build Coastguard Worker 
269*d9f75844SAndroid Build Coastguard Worker   // Post an event that won't be executed for 10 seconds.
270*d9f75844SAndroid Build Coastguard Worker   Event message_handler_dispatched;
271*d9f75844SAndroid Build Coastguard Worker   worker->PostDelayedTask(
272*d9f75844SAndroid Build Coastguard Worker       [&message_handler_dispatched] { message_handler_dispatched.Set(); },
273*d9f75844SAndroid Build Coastguard Worker       TimeDelta::Seconds(60));
274*d9f75844SAndroid Build Coastguard Worker 
275*d9f75844SAndroid Build Coastguard Worker   // Wait for a bit for the worker thread to be started and enter its socket
276*d9f75844SAndroid Build Coastguard Worker   // select(). Otherwise this test would be trivial since the worker thread
277*d9f75844SAndroid Build Coastguard Worker   // would process the event as soon as it was started.
278*d9f75844SAndroid Build Coastguard Worker   Thread::Current()->SleepMs(1000);
279*d9f75844SAndroid Build Coastguard Worker 
280*d9f75844SAndroid Build Coastguard Worker   // Advance the fake clock, expecting the worker thread to wake up
281*d9f75844SAndroid Build Coastguard Worker   // and dispatch the message instantly.
282*d9f75844SAndroid Build Coastguard Worker   clock.AdvanceTime(webrtc::TimeDelta::Seconds(60u));
283*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(message_handler_dispatched.Wait(webrtc::TimeDelta::Zero()));
284*d9f75844SAndroid Build Coastguard Worker   worker->Stop();
285*d9f75844SAndroid Build Coastguard Worker 
286*d9f75844SAndroid Build Coastguard Worker   SetClockForTesting(nullptr);
287*d9f75844SAndroid Build Coastguard Worker 
288*d9f75844SAndroid Build Coastguard Worker   // The message should have been dispatched long before the 60 seconds fully
289*d9f75844SAndroid Build Coastguard Worker   // elapsed (just a sanity check).
290*d9f75844SAndroid Build Coastguard Worker   int64_t real_end_time_ms = TimeMillis();
291*d9f75844SAndroid Build Coastguard Worker   EXPECT_LT(real_end_time_ms - real_start_time_ms, 10000);
292*d9f75844SAndroid Build Coastguard Worker }
293*d9f75844SAndroid Build Coastguard Worker 
294*d9f75844SAndroid Build Coastguard Worker }  // namespace rtc
295