16#include "gtest/gtest.h"
30void SleepFor(TimeDelta duration) {
31 std::this_thread::sleep_for(
32 std::chrono::nanoseconds(duration.ToNanoseconds()));
35void EpsilonRandomSleep() {
43TEST(AutoResetWaitableEventTest, Basic) {
44 AutoResetWaitableEvent ev;
45 EXPECT_FALSE(ev.IsSignaledForTest());
47 EXPECT_TRUE(ev.IsSignaledForTest());
49 EXPECT_FALSE(ev.IsSignaledForTest());
51 EXPECT_FALSE(ev.IsSignaledForTest());
53 EXPECT_TRUE(ev.IsSignaledForTest());
55 EXPECT_FALSE(ev.IsSignaledForTest());
57 EXPECT_FALSE(ev.IsSignaledForTest());
59 EXPECT_FALSE(ev.IsSignaledForTest());
61 EXPECT_TRUE(ev.IsSignaledForTest());
63 EXPECT_FALSE(ev.IsSignaledForTest());
65 EXPECT_FALSE(ev.IsSignaledForTest());
68 EXPECT_FALSE(ev.IsSignaledForTest());
71TEST(AutoResetWaitableEventTest, MultipleWaiters) {
72 AutoResetWaitableEvent ev;
74 for (
size_t i = 0u;
i < 5u;
i++) {
75 std::atomic_uint wake_count(0u);
76 std::vector<std::thread> threads;
78 for (
size_t j = 0u; j < 4u; j++) {
79 threads.push_back(std::thread([&ev, &wake_count]() {
80 if (rand() % 2 == 0) {
83 EXPECT_FALSE(ev.WaitWithTimeout(kActionTimeout));
85 wake_count.fetch_add(1u);
94 SleepFor(kTinyTimeout + kTinyTimeout);
96 for (
size_t j = 0u; j < threads.size(); j++) {
97 unsigned old_wake_count = wake_count.load();
98 EXPECT_EQ(j, old_wake_count);
104 while (wake_count.load() == old_wake_count) {
105 SleepFor(kEpsilonTimeout);
108 EXPECT_FALSE(ev.IsSignaledForTest());
112 SleepFor(kEpsilonTimeout);
114 EXPECT_EQ(old_wake_count + 1u, wake_count.load());
116 EXPECT_FALSE(ev.IsSignaledForTest());
121 SleepFor(kEpsilonTimeout);
122 EXPECT_TRUE(ev.IsSignaledForTest());
124 for (
auto& thread : threads) {
134TEST(ManualResetWaitableEventTest, Basic) {
135 ManualResetWaitableEvent ev;
136 EXPECT_FALSE(ev.IsSignaledForTest());
138 EXPECT_TRUE(ev.IsSignaledForTest());
140 EXPECT_TRUE(ev.IsSignaledForTest());
142 EXPECT_FALSE(ev.IsSignaledForTest());
144 EXPECT_FALSE(ev.IsSignaledForTest());
146 EXPECT_FALSE(ev.IsSignaledForTest());
148 EXPECT_TRUE(ev.IsSignaledForTest());
150 EXPECT_TRUE(ev.IsSignaledForTest());
152 EXPECT_TRUE(ev.IsSignaledForTest());
155TEST(ManualResetWaitableEventTest, SignalMultiple) {
156 ManualResetWaitableEvent ev;
158 for (
size_t i = 0u;
i < 10u;
i++) {
159 for (
size_t num_waiters = 1u; num_waiters < 5u; num_waiters++) {
160 std::vector<std::thread> threads;
161 threads.reserve(num_waiters);
162 for (
size_t j = 0u; j < num_waiters; j++) {
163 threads.push_back(std::thread([&ev]() {
164 EpsilonRandomSleep();
166 if (rand() % 2 == 0) {
169 EXPECT_FALSE(ev.WaitWithTimeout(kActionTimeout));
174 EpsilonRandomSleep();
180 for (
auto& thread : threads) {
static constexpr TimeDelta FromMilliseconds(int64_t millis)
static constexpr TimeDelta Zero()
TEST(MallocMapping, EmptyContructor)