22 #include <condition_variable>
26 #include <gmock/gmock.h>
97 bool barricade(
const std::string& clear_event,
const int timeout_ms = -1);
108 bool barricade(std::initializer_list<std::string> clear_events,
const int timeout_ms = -1);
112 std::condition_variable
cv_;
118 #define BARRIER(...) EXPECT_TRUE(barricade(__VA_ARGS__))
119 #define BARRIER_FATAL(...) ASSERT_TRUE(barricade(__VA_ARGS__))
121 #define ACTION_OPEN_BARRIER(str) \
122 ::testing::InvokeWithoutArgs([this](void) { \
123 this->triggerClearEvent(str); \
126 #define ACTION_OPEN_BARRIER_VOID(str) ::testing::InvokeWithoutArgs([this](void) { this->triggerClearEvent(str); })
130 std::lock_guard<std::mutex> lk(
m_);
139 ROS_WARN_STREAM(
"Triggered event " << event <<
" despite not waiting for it.");
146 return barricade({ clear_event }, timeout_ms);
151 std::unique_lock<std::mutex> lk(
m_);
153 std::stringstream events_stringstream;
154 for (
const auto& event : clear_events)
156 events_stringstream <<
event <<
", ";
158 ROS_DEBUG_NAMED(
"Test",
"Adding Barricade[%s]", events_stringstream.str().c_str());
160 std::copy_if(clear_events.begin(),
163 [
this](std::string event) { return this->waitlist_.count(event) == 0; });
166 auto end_time_point = std::chrono::system_clock::now() + std::chrono::milliseconds(timeout_ms);
176 std::cv_status status =
cv_.wait_for(lk, end_time_point - std::chrono::system_clock::now());
177 if (status == std::cv_status::timeout)
188 #endif // ASYNC_TEST_H