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