Home | History | Annotate | Download | only in base
      1 // Copyright (c) 2006-2008 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/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 PlatformThread::Delegate {
     78  public:
     79   WaitableEventSignaler(double seconds, WaitableEvent* ev)
     80       : seconds_(seconds),
     81         ev_(ev) {
     82   }
     83 
     84   void ThreadMain() {
     85     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   PlatformThreadHandle thread;
    101   PlatformThread::Create(0, &signaler, &thread);
    102 
    103   EXPECT_EQ(WaitableEvent::WaitMany(ev, 5), 2u);
    104 
    105   PlatformThread::Join(thread);
    106 
    107   for (unsigned i = 0; i < 5; ++i)
    108     delete ev[i];
    109 }
    110