Index: base/waitable_event_unittest.cc |
diff --git a/base/waitable_event_unittest.cc b/base/waitable_event_unittest.cc |
index e7bab497b5ae75b07c577fef384c7b67b90faf6e..b2590a8491196ac47e8e2900b7b9bf91e25f3f70 100644 |
--- a/base/waitable_event_unittest.cc |
+++ b/base/waitable_event_unittest.cc |
@@ -4,6 +4,7 @@ |
#include "base/time.h" |
#include "base/waitable_event.h" |
+#include "base/platform_thread.h" |
#include "testing/gtest/include/gtest/gtest.h" |
using base::TimeDelta; |
@@ -52,3 +53,57 @@ TEST(WaitableEventTest, AutoBasics) { |
EXPECT_TRUE(event.TimedWait(TimeDelta::FromMilliseconds(10))); |
} |
+TEST(WaitableEventTest, WaitManyShortcut) { |
+ WaitableEvent* ev[5]; |
+ for (unsigned i = 0; i < 5; ++i) |
+ ev[i] = new WaitableEvent(false, false); |
+ |
+ ev[3]->Signal(); |
+ EXPECT_EQ(WaitableEvent::WaitMany(ev, 5), 3u); |
+ |
+ ev[3]->Signal(); |
+ EXPECT_EQ(WaitableEvent::WaitMany(ev, 5), 3u); |
+ |
+ ev[4]->Signal(); |
+ EXPECT_EQ(WaitableEvent::WaitMany(ev, 5), 4u); |
+ |
+ ev[0]->Signal(); |
+ EXPECT_EQ(WaitableEvent::WaitMany(ev, 5), 0u); |
+ |
+ for (unsigned i = 0; i < 5; ++i) |
+ delete ev[i]; |
+} |
+ |
+class WaitableEventSignaler : public PlatformThread::Delegate { |
+ public: |
+ WaitableEventSignaler(double seconds, WaitableEvent* ev) |
+ : seconds_(seconds), |
+ ev_(ev) { |
+ } |
+ |
+ void ThreadMain() { |
+ PlatformThread::Sleep(static_cast<int>(seconds_ * 1000)); |
+ ev_->Signal(); |
+ } |
+ |
+ private: |
+ const double seconds_; |
+ WaitableEvent *const ev_; |
+}; |
+ |
+TEST(WaitableEventTest, WaitMany) { |
+ WaitableEvent* ev[5]; |
+ for (unsigned i = 0; i < 5; ++i) |
+ ev[i] = new WaitableEvent(false, false); |
+ |
+ WaitableEventSignaler signaler(0.1, ev[2]); |
+ PlatformThreadHandle thread; |
+ PlatformThread::Create(0, &signaler, &thread); |
+ |
+ EXPECT_EQ(WaitableEvent::WaitMany(ev, 5), 2u); |
+ |
+ PlatformThread::Join(thread); |
+ |
+ for (unsigned i = 0; i < 5; ++i) |
+ delete ev[i]; |
+} |