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