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