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
bool barricade(const std::string &clear_event, const int timeout_ms=-1)
Will block until the event given by clear_event is triggered or a timeout is reached. Unblocks immediately, if the event was on the waitlist.
std::condition_variable cv_
#define ROS_DEBUG_NAMED(name,...)
std::set< std::string > clear_events_
#define ROS_WARN_STREAM(args)
void triggerClearEvent(const std::string &event)
Triggeres a clear event. If a call to barricade is currently pending it will unblock as soon as all c...
Test class that allows the handling of asynchronous test objects.
std::set< std::string > waitlist_