xref: /aosp_15_r20/external/libchrome/base/synchronization/waitable_event_unittest.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker 
5*635a8641SAndroid Build Coastguard Worker #include "base/synchronization/waitable_event.h"
6*635a8641SAndroid Build Coastguard Worker 
7*635a8641SAndroid Build Coastguard Worker #include <stddef.h>
8*635a8641SAndroid Build Coastguard Worker 
9*635a8641SAndroid Build Coastguard Worker #include <algorithm>
10*635a8641SAndroid Build Coastguard Worker 
11*635a8641SAndroid Build Coastguard Worker #include "base/compiler_specific.h"
12*635a8641SAndroid Build Coastguard Worker #include "base/threading/platform_thread.h"
13*635a8641SAndroid Build Coastguard Worker #include "base/time/time.h"
14*635a8641SAndroid Build Coastguard Worker #include "build/build_config.h"
15*635a8641SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
16*635a8641SAndroid Build Coastguard Worker 
17*635a8641SAndroid Build Coastguard Worker namespace base {
18*635a8641SAndroid Build Coastguard Worker 
TEST(WaitableEventTest,ManualBasics)19*635a8641SAndroid Build Coastguard Worker TEST(WaitableEventTest, ManualBasics) {
20*635a8641SAndroid Build Coastguard Worker   WaitableEvent event(WaitableEvent::ResetPolicy::MANUAL,
21*635a8641SAndroid Build Coastguard Worker                       WaitableEvent::InitialState::NOT_SIGNALED);
22*635a8641SAndroid Build Coastguard Worker 
23*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(event.IsSignaled());
24*635a8641SAndroid Build Coastguard Worker 
25*635a8641SAndroid Build Coastguard Worker   event.Signal();
26*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(event.IsSignaled());
27*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(event.IsSignaled());
28*635a8641SAndroid Build Coastguard Worker 
29*635a8641SAndroid Build Coastguard Worker   event.Reset();
30*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(event.IsSignaled());
31*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(event.TimedWait(TimeDelta::FromMilliseconds(10)));
32*635a8641SAndroid Build Coastguard Worker 
33*635a8641SAndroid Build Coastguard Worker   event.Signal();
34*635a8641SAndroid Build Coastguard Worker   event.Wait();
35*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(event.TimedWait(TimeDelta::FromMilliseconds(10)));
36*635a8641SAndroid Build Coastguard Worker }
37*635a8641SAndroid Build Coastguard Worker 
TEST(WaitableEventTest,ManualInitiallySignaled)38*635a8641SAndroid Build Coastguard Worker TEST(WaitableEventTest, ManualInitiallySignaled) {
39*635a8641SAndroid Build Coastguard Worker   WaitableEvent event(WaitableEvent::ResetPolicy::MANUAL,
40*635a8641SAndroid Build Coastguard Worker                       WaitableEvent::InitialState::SIGNALED);
41*635a8641SAndroid Build Coastguard Worker 
42*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(event.IsSignaled());
43*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(event.IsSignaled());
44*635a8641SAndroid Build Coastguard Worker 
45*635a8641SAndroid Build Coastguard Worker   event.Reset();
46*635a8641SAndroid Build Coastguard Worker 
47*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(event.IsSignaled());
48*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(event.IsSignaled());
49*635a8641SAndroid Build Coastguard Worker 
50*635a8641SAndroid Build Coastguard Worker   event.Signal();
51*635a8641SAndroid Build Coastguard Worker 
52*635a8641SAndroid Build Coastguard Worker   event.Wait();
53*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(event.IsSignaled());
54*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(event.IsSignaled());
55*635a8641SAndroid Build Coastguard Worker }
56*635a8641SAndroid Build Coastguard Worker 
TEST(WaitableEventTest,AutoBasics)57*635a8641SAndroid Build Coastguard Worker TEST(WaitableEventTest, AutoBasics) {
58*635a8641SAndroid Build Coastguard Worker   WaitableEvent event(WaitableEvent::ResetPolicy::AUTOMATIC,
59*635a8641SAndroid Build Coastguard Worker                       WaitableEvent::InitialState::NOT_SIGNALED);
60*635a8641SAndroid Build Coastguard Worker 
61*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(event.IsSignaled());
62*635a8641SAndroid Build Coastguard Worker 
63*635a8641SAndroid Build Coastguard Worker   event.Signal();
64*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(event.IsSignaled());
65*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(event.IsSignaled());
66*635a8641SAndroid Build Coastguard Worker 
67*635a8641SAndroid Build Coastguard Worker   event.Reset();
68*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(event.IsSignaled());
69*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(event.TimedWait(TimeDelta::FromMilliseconds(10)));
70*635a8641SAndroid Build Coastguard Worker 
71*635a8641SAndroid Build Coastguard Worker   event.Signal();
72*635a8641SAndroid Build Coastguard Worker   event.Wait();
73*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(event.TimedWait(TimeDelta::FromMilliseconds(10)));
74*635a8641SAndroid Build Coastguard Worker 
75*635a8641SAndroid Build Coastguard Worker   event.Signal();
76*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(event.TimedWait(TimeDelta::FromMilliseconds(10)));
77*635a8641SAndroid Build Coastguard Worker }
78*635a8641SAndroid Build Coastguard Worker 
TEST(WaitableEventTest,AutoInitiallySignaled)79*635a8641SAndroid Build Coastguard Worker TEST(WaitableEventTest, AutoInitiallySignaled) {
80*635a8641SAndroid Build Coastguard Worker   WaitableEvent event(WaitableEvent::ResetPolicy::AUTOMATIC,
81*635a8641SAndroid Build Coastguard Worker                       WaitableEvent::InitialState::SIGNALED);
82*635a8641SAndroid Build Coastguard Worker 
83*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(event.IsSignaled());
84*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(event.IsSignaled());
85*635a8641SAndroid Build Coastguard Worker 
86*635a8641SAndroid Build Coastguard Worker   event.Signal();
87*635a8641SAndroid Build Coastguard Worker 
88*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(event.IsSignaled());
89*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(event.IsSignaled());
90*635a8641SAndroid Build Coastguard Worker }
91*635a8641SAndroid Build Coastguard Worker 
TEST(WaitableEventTest,WaitManyShortcut)92*635a8641SAndroid Build Coastguard Worker TEST(WaitableEventTest, WaitManyShortcut) {
93*635a8641SAndroid Build Coastguard Worker   WaitableEvent* ev[5];
94*635a8641SAndroid Build Coastguard Worker   for (unsigned i = 0; i < 5; ++i) {
95*635a8641SAndroid Build Coastguard Worker     ev[i] = new WaitableEvent(WaitableEvent::ResetPolicy::AUTOMATIC,
96*635a8641SAndroid Build Coastguard Worker                               WaitableEvent::InitialState::NOT_SIGNALED);
97*635a8641SAndroid Build Coastguard Worker   }
98*635a8641SAndroid Build Coastguard Worker 
99*635a8641SAndroid Build Coastguard Worker   ev[3]->Signal();
100*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(WaitableEvent::WaitMany(ev, 5), 3u);
101*635a8641SAndroid Build Coastguard Worker 
102*635a8641SAndroid Build Coastguard Worker   ev[3]->Signal();
103*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(WaitableEvent::WaitMany(ev, 5), 3u);
104*635a8641SAndroid Build Coastguard Worker 
105*635a8641SAndroid Build Coastguard Worker   ev[4]->Signal();
106*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(WaitableEvent::WaitMany(ev, 5), 4u);
107*635a8641SAndroid Build Coastguard Worker 
108*635a8641SAndroid Build Coastguard Worker   ev[0]->Signal();
109*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(WaitableEvent::WaitMany(ev, 5), 0u);
110*635a8641SAndroid Build Coastguard Worker 
111*635a8641SAndroid Build Coastguard Worker   for (unsigned i = 0; i < 5; ++i)
112*635a8641SAndroid Build Coastguard Worker     delete ev[i];
113*635a8641SAndroid Build Coastguard Worker }
114*635a8641SAndroid Build Coastguard Worker 
TEST(WaitableEventTest,WaitManyLeftToRight)115*635a8641SAndroid Build Coastguard Worker TEST(WaitableEventTest, WaitManyLeftToRight) {
116*635a8641SAndroid Build Coastguard Worker   WaitableEvent* ev[5];
117*635a8641SAndroid Build Coastguard Worker   for (size_t i = 0; i < 5; ++i) {
118*635a8641SAndroid Build Coastguard Worker     ev[i] = new WaitableEvent(WaitableEvent::ResetPolicy::AUTOMATIC,
119*635a8641SAndroid Build Coastguard Worker                               WaitableEvent::InitialState::NOT_SIGNALED);
120*635a8641SAndroid Build Coastguard Worker   }
121*635a8641SAndroid Build Coastguard Worker 
122*635a8641SAndroid Build Coastguard Worker   // Test for consistent left-to-right return behavior across all permutations
123*635a8641SAndroid Build Coastguard Worker   // of the input array. This is to verify that only the indices -- and not
124*635a8641SAndroid Build Coastguard Worker   // the WaitableEvents' addresses -- are relevant in determining who wins when
125*635a8641SAndroid Build Coastguard Worker   // multiple events are signaled.
126*635a8641SAndroid Build Coastguard Worker 
127*635a8641SAndroid Build Coastguard Worker   std::sort(ev, ev + 5);
128*635a8641SAndroid Build Coastguard Worker   do {
129*635a8641SAndroid Build Coastguard Worker     ev[0]->Signal();
130*635a8641SAndroid Build Coastguard Worker     ev[1]->Signal();
131*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(0u, WaitableEvent::WaitMany(ev, 5));
132*635a8641SAndroid Build Coastguard Worker 
133*635a8641SAndroid Build Coastguard Worker     ev[2]->Signal();
134*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(1u, WaitableEvent::WaitMany(ev, 5));
135*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(2u, WaitableEvent::WaitMany(ev, 5));
136*635a8641SAndroid Build Coastguard Worker 
137*635a8641SAndroid Build Coastguard Worker     ev[3]->Signal();
138*635a8641SAndroid Build Coastguard Worker     ev[4]->Signal();
139*635a8641SAndroid Build Coastguard Worker     ev[0]->Signal();
140*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(0u, WaitableEvent::WaitMany(ev, 5));
141*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(3u, WaitableEvent::WaitMany(ev, 5));
142*635a8641SAndroid Build Coastguard Worker     ev[2]->Signal();
143*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(2u, WaitableEvent::WaitMany(ev, 5));
144*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(4u, WaitableEvent::WaitMany(ev, 5));
145*635a8641SAndroid Build Coastguard Worker   } while (std::next_permutation(ev, ev + 5));
146*635a8641SAndroid Build Coastguard Worker 
147*635a8641SAndroid Build Coastguard Worker   for (size_t i = 0; i < 5; ++i)
148*635a8641SAndroid Build Coastguard Worker     delete ev[i];
149*635a8641SAndroid Build Coastguard Worker }
150*635a8641SAndroid Build Coastguard Worker 
151*635a8641SAndroid Build Coastguard Worker class WaitableEventSignaler : public PlatformThread::Delegate {
152*635a8641SAndroid Build Coastguard Worker  public:
WaitableEventSignaler(TimeDelta delay,WaitableEvent * event)153*635a8641SAndroid Build Coastguard Worker   WaitableEventSignaler(TimeDelta delay, WaitableEvent* event)
154*635a8641SAndroid Build Coastguard Worker       : delay_(delay),
155*635a8641SAndroid Build Coastguard Worker         event_(event) {
156*635a8641SAndroid Build Coastguard Worker   }
157*635a8641SAndroid Build Coastguard Worker 
ThreadMain()158*635a8641SAndroid Build Coastguard Worker   void ThreadMain() override {
159*635a8641SAndroid Build Coastguard Worker     PlatformThread::Sleep(delay_);
160*635a8641SAndroid Build Coastguard Worker     event_->Signal();
161*635a8641SAndroid Build Coastguard Worker   }
162*635a8641SAndroid Build Coastguard Worker 
163*635a8641SAndroid Build Coastguard Worker  private:
164*635a8641SAndroid Build Coastguard Worker   const TimeDelta delay_;
165*635a8641SAndroid Build Coastguard Worker   WaitableEvent* event_;
166*635a8641SAndroid Build Coastguard Worker };
167*635a8641SAndroid Build Coastguard Worker 
168*635a8641SAndroid Build Coastguard Worker // Tests that a WaitableEvent can be safely deleted when |Wait| is done without
169*635a8641SAndroid Build Coastguard Worker // additional synchronization.
TEST(WaitableEventTest,WaitAndDelete)170*635a8641SAndroid Build Coastguard Worker TEST(WaitableEventTest, WaitAndDelete) {
171*635a8641SAndroid Build Coastguard Worker   WaitableEvent* ev =
172*635a8641SAndroid Build Coastguard Worker       new WaitableEvent(WaitableEvent::ResetPolicy::AUTOMATIC,
173*635a8641SAndroid Build Coastguard Worker                         WaitableEvent::InitialState::NOT_SIGNALED);
174*635a8641SAndroid Build Coastguard Worker 
175*635a8641SAndroid Build Coastguard Worker   WaitableEventSignaler signaler(TimeDelta::FromMilliseconds(10), ev);
176*635a8641SAndroid Build Coastguard Worker   PlatformThreadHandle thread;
177*635a8641SAndroid Build Coastguard Worker   PlatformThread::Create(0, &signaler, &thread);
178*635a8641SAndroid Build Coastguard Worker 
179*635a8641SAndroid Build Coastguard Worker   ev->Wait();
180*635a8641SAndroid Build Coastguard Worker   delete ev;
181*635a8641SAndroid Build Coastguard Worker 
182*635a8641SAndroid Build Coastguard Worker   PlatformThread::Join(thread);
183*635a8641SAndroid Build Coastguard Worker }
184*635a8641SAndroid Build Coastguard Worker 
185*635a8641SAndroid Build Coastguard Worker // Tests that a WaitableEvent can be safely deleted when |WaitMany| is done
186*635a8641SAndroid Build Coastguard Worker // without additional synchronization.
TEST(WaitableEventTest,WaitMany)187*635a8641SAndroid Build Coastguard Worker TEST(WaitableEventTest, WaitMany) {
188*635a8641SAndroid Build Coastguard Worker   WaitableEvent* ev[5];
189*635a8641SAndroid Build Coastguard Worker   for (unsigned i = 0; i < 5; ++i) {
190*635a8641SAndroid Build Coastguard Worker     ev[i] = new WaitableEvent(WaitableEvent::ResetPolicy::AUTOMATIC,
191*635a8641SAndroid Build Coastguard Worker                               WaitableEvent::InitialState::NOT_SIGNALED);
192*635a8641SAndroid Build Coastguard Worker   }
193*635a8641SAndroid Build Coastguard Worker 
194*635a8641SAndroid Build Coastguard Worker   WaitableEventSignaler signaler(TimeDelta::FromMilliseconds(10), ev[2]);
195*635a8641SAndroid Build Coastguard Worker   PlatformThreadHandle thread;
196*635a8641SAndroid Build Coastguard Worker   PlatformThread::Create(0, &signaler, &thread);
197*635a8641SAndroid Build Coastguard Worker 
198*635a8641SAndroid Build Coastguard Worker   size_t index = WaitableEvent::WaitMany(ev, 5);
199*635a8641SAndroid Build Coastguard Worker 
200*635a8641SAndroid Build Coastguard Worker   for (unsigned i = 0; i < 5; ++i)
201*635a8641SAndroid Build Coastguard Worker     delete ev[i];
202*635a8641SAndroid Build Coastguard Worker 
203*635a8641SAndroid Build Coastguard Worker   PlatformThread::Join(thread);
204*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(2u, index);
205*635a8641SAndroid Build Coastguard Worker }
206*635a8641SAndroid Build Coastguard Worker 
207*635a8641SAndroid Build Coastguard Worker // Tests that using TimeDelta::Max() on TimedWait() is not the same as passing
208*635a8641SAndroid Build Coastguard Worker // a timeout of 0. (crbug.com/465948)
TEST(WaitableEventTest,TimedWait)209*635a8641SAndroid Build Coastguard Worker TEST(WaitableEventTest, TimedWait) {
210*635a8641SAndroid Build Coastguard Worker   WaitableEvent* ev =
211*635a8641SAndroid Build Coastguard Worker       new WaitableEvent(WaitableEvent::ResetPolicy::AUTOMATIC,
212*635a8641SAndroid Build Coastguard Worker                         WaitableEvent::InitialState::NOT_SIGNALED);
213*635a8641SAndroid Build Coastguard Worker 
214*635a8641SAndroid Build Coastguard Worker   TimeDelta thread_delay = TimeDelta::FromMilliseconds(10);
215*635a8641SAndroid Build Coastguard Worker   WaitableEventSignaler signaler(thread_delay, ev);
216*635a8641SAndroid Build Coastguard Worker   PlatformThreadHandle thread;
217*635a8641SAndroid Build Coastguard Worker   TimeTicks start = TimeTicks::Now();
218*635a8641SAndroid Build Coastguard Worker   PlatformThread::Create(0, &signaler, &thread);
219*635a8641SAndroid Build Coastguard Worker 
220*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(ev->TimedWait(TimeDelta::Max()));
221*635a8641SAndroid Build Coastguard Worker   EXPECT_GE(TimeTicks::Now() - start, thread_delay);
222*635a8641SAndroid Build Coastguard Worker   delete ev;
223*635a8641SAndroid Build Coastguard Worker 
224*635a8641SAndroid Build Coastguard Worker   PlatformThread::Join(thread);
225*635a8641SAndroid Build Coastguard Worker }
226*635a8641SAndroid Build Coastguard Worker 
227*635a8641SAndroid Build Coastguard Worker // Tests that a sub-ms TimedWait doesn't time out promptly.
TEST(WaitableEventTest,SubMsTimedWait)228*635a8641SAndroid Build Coastguard Worker TEST(WaitableEventTest, SubMsTimedWait) {
229*635a8641SAndroid Build Coastguard Worker   WaitableEvent ev(WaitableEvent::ResetPolicy::AUTOMATIC,
230*635a8641SAndroid Build Coastguard Worker                    WaitableEvent::InitialState::NOT_SIGNALED);
231*635a8641SAndroid Build Coastguard Worker 
232*635a8641SAndroid Build Coastguard Worker   TimeDelta delay = TimeDelta::FromMicroseconds(900);
233*635a8641SAndroid Build Coastguard Worker   TimeTicks start_time = TimeTicks::Now();
234*635a8641SAndroid Build Coastguard Worker   ev.TimedWait(delay);
235*635a8641SAndroid Build Coastguard Worker   EXPECT_GE(TimeTicks::Now() - start_time, delay);
236*635a8641SAndroid Build Coastguard Worker }
237*635a8641SAndroid Build Coastguard Worker 
238*635a8641SAndroid Build Coastguard Worker // Tests that TimedWaitUntil can be safely used with various end_time deadline
239*635a8641SAndroid Build Coastguard Worker // values.
TEST(WaitableEventTest,TimedWaitUntil)240*635a8641SAndroid Build Coastguard Worker TEST(WaitableEventTest, TimedWaitUntil) {
241*635a8641SAndroid Build Coastguard Worker   WaitableEvent ev(WaitableEvent::ResetPolicy::AUTOMATIC,
242*635a8641SAndroid Build Coastguard Worker                    WaitableEvent::InitialState::NOT_SIGNALED);
243*635a8641SAndroid Build Coastguard Worker 
244*635a8641SAndroid Build Coastguard Worker   TimeTicks start_time(TimeTicks::Now());
245*635a8641SAndroid Build Coastguard Worker   TimeDelta delay = TimeDelta::FromMilliseconds(10);
246*635a8641SAndroid Build Coastguard Worker 
247*635a8641SAndroid Build Coastguard Worker   // Should be OK to wait for the current time or time in the past.
248*635a8641SAndroid Build Coastguard Worker   // That should end promptly and be equivalent to IsSignalled.
249*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(ev.TimedWaitUntil(start_time));
250*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(ev.TimedWaitUntil(start_time - delay));
251*635a8641SAndroid Build Coastguard Worker 
252*635a8641SAndroid Build Coastguard Worker   // Should be OK to wait for zero TimeTicks().
253*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(ev.TimedWaitUntil(TimeTicks()));
254*635a8641SAndroid Build Coastguard Worker 
255*635a8641SAndroid Build Coastguard Worker   // Waiting for a time in the future shouldn't end before the deadline
256*635a8641SAndroid Build Coastguard Worker   // if the event isn't signalled.
257*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(ev.TimedWaitUntil(start_time + delay));
258*635a8641SAndroid Build Coastguard Worker   EXPECT_GE(TimeTicks::Now() - start_time, delay);
259*635a8641SAndroid Build Coastguard Worker 
260*635a8641SAndroid Build Coastguard Worker   // Test that passing TimeTicks::Max to TimedWaitUntil is valid and isn't
261*635a8641SAndroid Build Coastguard Worker   // the same as passing TimeTicks(). Also verifies that signaling event
262*635a8641SAndroid Build Coastguard Worker   // ends the wait promptly.
263*635a8641SAndroid Build Coastguard Worker   WaitableEventSignaler signaler(delay, &ev);
264*635a8641SAndroid Build Coastguard Worker   PlatformThreadHandle thread;
265*635a8641SAndroid Build Coastguard Worker   start_time = TimeTicks::Now();
266*635a8641SAndroid Build Coastguard Worker   PlatformThread::Create(0, &signaler, &thread);
267*635a8641SAndroid Build Coastguard Worker 
268*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(ev.TimedWaitUntil(TimeTicks::Max()));
269*635a8641SAndroid Build Coastguard Worker   EXPECT_GE(TimeTicks::Now() - start_time, delay);
270*635a8641SAndroid Build Coastguard Worker 
271*635a8641SAndroid Build Coastguard Worker   PlatformThread::Join(thread);
272*635a8641SAndroid Build Coastguard Worker }
273*635a8641SAndroid Build Coastguard Worker 
274*635a8641SAndroid Build Coastguard Worker }  // namespace base
275