OLD | NEW |
| (Empty) |
1 // Copyright (c) 2010 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 | |
5 #include "base/time.h" | |
6 #include "base/waitable_event.h" | |
7 #include "base/threading/platform_thread.h" | |
8 #include "testing/gtest/include/gtest/gtest.h" | |
9 | |
10 using base::TimeDelta; | |
11 using base::WaitableEvent; | |
12 | |
13 namespace { | |
14 typedef testing::Test WaitableEventTest; | |
15 } | |
16 | |
17 TEST(WaitableEventTest, ManualBasics) { | |
18 WaitableEvent event(true, false); | |
19 | |
20 EXPECT_FALSE(event.IsSignaled()); | |
21 | |
22 event.Signal(); | |
23 EXPECT_TRUE(event.IsSignaled()); | |
24 EXPECT_TRUE(event.IsSignaled()); | |
25 | |
26 event.Reset(); | |
27 EXPECT_FALSE(event.IsSignaled()); | |
28 EXPECT_FALSE(event.TimedWait(TimeDelta::FromMilliseconds(10))); | |
29 | |
30 event.Signal(); | |
31 EXPECT_TRUE(event.Wait()); | |
32 EXPECT_TRUE(event.TimedWait(TimeDelta::FromMilliseconds(10))); | |
33 } | |
34 | |
35 TEST(WaitableEventTest, AutoBasics) { | |
36 WaitableEvent event(false, false); | |
37 | |
38 EXPECT_FALSE(event.IsSignaled()); | |
39 | |
40 event.Signal(); | |
41 EXPECT_TRUE(event.IsSignaled()); | |
42 EXPECT_FALSE(event.IsSignaled()); | |
43 | |
44 event.Reset(); | |
45 EXPECT_FALSE(event.IsSignaled()); | |
46 EXPECT_FALSE(event.TimedWait(TimeDelta::FromMilliseconds(10))); | |
47 | |
48 event.Signal(); | |
49 EXPECT_TRUE(event.Wait()); | |
50 EXPECT_FALSE(event.TimedWait(TimeDelta::FromMilliseconds(10))); | |
51 | |
52 event.Signal(); | |
53 EXPECT_TRUE(event.TimedWait(TimeDelta::FromMilliseconds(10))); | |
54 } | |
55 | |
56 TEST(WaitableEventTest, WaitManyShortcut) { | |
57 WaitableEvent* ev[5]; | |
58 for (unsigned i = 0; i < 5; ++i) | |
59 ev[i] = new WaitableEvent(false, false); | |
60 | |
61 ev[3]->Signal(); | |
62 EXPECT_EQ(WaitableEvent::WaitMany(ev, 5), 3u); | |
63 | |
64 ev[3]->Signal(); | |
65 EXPECT_EQ(WaitableEvent::WaitMany(ev, 5), 3u); | |
66 | |
67 ev[4]->Signal(); | |
68 EXPECT_EQ(WaitableEvent::WaitMany(ev, 5), 4u); | |
69 | |
70 ev[0]->Signal(); | |
71 EXPECT_EQ(WaitableEvent::WaitMany(ev, 5), 0u); | |
72 | |
73 for (unsigned i = 0; i < 5; ++i) | |
74 delete ev[i]; | |
75 } | |
76 | |
77 class WaitableEventSignaler : public base::PlatformThread::Delegate { | |
78 public: | |
79 WaitableEventSignaler(double seconds, WaitableEvent* ev) | |
80 : seconds_(seconds), | |
81 ev_(ev) { | |
82 } | |
83 | |
84 void ThreadMain() { | |
85 base::PlatformThread::Sleep(static_cast<int>(seconds_ * 1000)); | |
86 ev_->Signal(); | |
87 } | |
88 | |
89 private: | |
90 const double seconds_; | |
91 WaitableEvent *const ev_; | |
92 }; | |
93 | |
94 TEST(WaitableEventTest, WaitMany) { | |
95 WaitableEvent* ev[5]; | |
96 for (unsigned i = 0; i < 5; ++i) | |
97 ev[i] = new WaitableEvent(false, false); | |
98 | |
99 WaitableEventSignaler signaler(0.1, ev[2]); | |
100 base::PlatformThreadHandle thread; | |
101 base::PlatformThread::Create(0, &signaler, &thread); | |
102 | |
103 EXPECT_EQ(WaitableEvent::WaitMany(ev, 5), 2u); | |
104 | |
105 base::PlatformThread::Join(thread); | |
106 | |
107 for (unsigned i = 0; i < 5; ++i) | |
108 delete ev[i]; | |
109 } | |
OLD | NEW |