Index: base/synchronization/waitable_event_unittest.cc |
diff --git a/base/synchronization/waitable_event_unittest.cc b/base/synchronization/waitable_event_unittest.cc |
index c0e280aa9740642058d3d3e9ee109b3a1c5e5e8a..3aa1af1619bdaf1a918118f23d6fb7c3493cc439 100644 |
--- a/base/synchronization/waitable_event_unittest.cc |
+++ b/base/synchronization/waitable_event_unittest.cc |
@@ -6,6 +6,8 @@ |
#include <stddef.h> |
+#include <algorithm> |
+ |
#include "base/compiler_specific.h" |
#include "base/threading/platform_thread.h" |
#include "base/time/time.h" |
@@ -78,6 +80,42 @@ TEST(WaitableEventTest, WaitManyShortcut) { |
delete ev[i]; |
} |
+TEST(WaitableEventTest, WaitManyLeftToRight) { |
+ WaitableEvent* ev[5]; |
+ for (size_t i = 0; i < 5; ++i) { |
+ ev[i] = new WaitableEvent(WaitableEvent::ResetPolicy::AUTOMATIC, |
+ WaitableEvent::InitialState::NOT_SIGNALED); |
+ } |
+ |
+ // Test for consistent left-to-right return behavior across all permutations |
+ // of the input array. This is to verify that only the indices -- and not |
+ // the WaitableEvents' addresses -- are relevant in determining who wins when |
+ // multiple events are signaled. |
+ |
+ std::sort(ev, ev + 5); |
+ do { |
+ ev[0]->Signal(); |
+ ev[1]->Signal(); |
+ EXPECT_EQ(0u, WaitableEvent::WaitMany(ev, 5)); |
+ |
+ ev[2]->Signal(); |
+ EXPECT_EQ(1u, WaitableEvent::WaitMany(ev, 5)); |
+ EXPECT_EQ(2u, WaitableEvent::WaitMany(ev, 5)); |
+ |
+ ev[3]->Signal(); |
+ ev[4]->Signal(); |
+ ev[0]->Signal(); |
+ EXPECT_EQ(0u, WaitableEvent::WaitMany(ev, 5)); |
+ EXPECT_EQ(3u, WaitableEvent::WaitMany(ev, 5)); |
+ ev[2]->Signal(); |
+ EXPECT_EQ(2u, WaitableEvent::WaitMany(ev, 5)); |
+ EXPECT_EQ(4u, WaitableEvent::WaitMany(ev, 5)); |
+ } while (std::next_permutation(ev, ev + 5)); |
+ |
+ for (size_t i = 0; i < 5; ++i) |
+ delete ev[i]; |
+} |
+ |
class WaitableEventSignaler : public PlatformThread::Delegate { |
public: |
WaitableEventSignaler(TimeDelta delay, WaitableEvent* event) |