21 #include <condition_variable>
26 #include <gmock/gmock.h>
88 bool barricade(
const std::string& clear_event,
const int timeout_ms = -1);
98 bool barricade(std::initializer_list<std::string> clear_events,
const int timeout_ms = -1);
102 std::condition_variable
cv_;
108 #define BARRIER(...) EXPECT_TRUE(barricade(__VA_ARGS__))
109 #define BARRIER_FATAL(...) ASSERT_TRUE(barricade(__VA_ARGS__))
111 #define ACTION_OPEN_BARRIER(str) \
112 ::testing::InvokeWithoutArgs([this](void) { \
113 this->triggerClearEvent(str); \
116 #define ACTION_OPEN_BARRIER_VOID(str) ::testing::InvokeWithoutArgs([this]() { this->triggerClearEvent(str); })
120 std::lock_guard<std::mutex> lk(
m_);
129 ROS_WARN_STREAM(
"Triggered event " << event <<
" despite not waiting for it.");
136 return barricade({ clear_event }, timeout_ms);
141 std::unique_lock<std::mutex> lk(
m_);
143 std::stringstream events_stringstream;
144 for (
const auto& event : clear_events)
146 events_stringstream <<
event <<
", ";
148 ROS_DEBUG_NAMED(
"Test",
"Adding Barricade[%s]", events_stringstream.str().c_str());
151 [
this](
const std::string& event) { return this->waitlist_.count(event) == 0; });
154 auto end_time_point = std::chrono::system_clock::now() + std::chrono::milliseconds(timeout_ms);
164 std::cv_status status =
cv_.wait_for(lk, end_time_point - std::chrono::system_clock::now());
165 if (status == std::cv_status::timeout)
176 #endif // ASYNC_TEST_H