17 #include <boost/container/flat_map.hpp> 25 using std::chrono::milliseconds;
39 template<
typename ...Args>
41 addTimeout(std::forward<Args>(args)...);
47 nextSets_.push_back(
set);
50 template<
typename ...Args>
53 addTimeout(std::forward<Args>(args)...);
57 timestamps.emplace_back(clock_->millisecondsSinceEpoch());
65 if (nextSets_.empty()) {
69 nextSets_.pop_front();
74 std::function<void()> fn;
92 setClock(milliseconds(0));
99 timeoutManager_.cancelTimeout(p);
101 timeouts_.emplace(t + timeoutClock_.millisecondsSinceEpoch(),
108 for (
auto it = timeouts_.begin(); it != timeouts_.end(); it++) {
109 if (it->second == p) {
118 for (
auto t = timeoutClock_.millisecondsSinceEpoch() + milliseconds(1);
119 !timeouts_.empty();
t++) {
126 .WillRepeatedly(
Return(ms));
128 while (!timeouts_.empty() &&
129 timeoutClock_.millisecondsSinceEpoch() >= timeouts_.begin()->first) {
131 timeouts_.erase(timeouts_.begin());
140 boost::container::flat_multimap<milliseconds, AsyncTimeout*>
timeouts_;
147 StackTimeoutSet ts10(&timeoutManager_, milliseconds(10), milliseconds(0),
149 StackTimeoutSet ts5(&timeoutManager_, milliseconds(5), milliseconds(0),
160 ts5.scheduleTimeout(&t1);
165 setClock(milliseconds(2));
167 ts5.scheduleTimeout(&t2);
168 ts10.scheduleTimeout(&t3);
173 setClock(milliseconds(5));
176 setClock(milliseconds(7));
182 setClock(milliseconds(12));
188 ASSERT_EQ(t1.timestamps[0], milliseconds(5));
198 StackTimeoutSet ts10(&timeoutManager_, milliseconds(10), milliseconds(0),
200 StackTimeoutSet ts5(&timeoutManager_, milliseconds(5), milliseconds(0),
207 ts5.scheduleTimeout(&t1);
227 ASSERT_EQ(timeoutClock_.millisecondsSinceEpoch(), milliseconds(25));
234 StackTimeoutSet ts5(&timeoutManager_, milliseconds(5), milliseconds(0),
236 StackTimeoutSet ts10(&timeoutManager_, milliseconds(10), milliseconds(0),
238 StackTimeoutSet ts20(&timeoutManager_, milliseconds(20), milliseconds(0),
275 ts5.scheduleTimeout(&t5_3);
309 ASSERT_EQ(timeoutClock_.millisecondsSinceEpoch(), milliseconds(10));
317 &timeoutManager_, milliseconds(5), milliseconds(0), &timeoutClock_));
319 &timeoutManager_, milliseconds(10), milliseconds(0), &timeoutClock_));
329 t5_1.
fn = [&] { ts10.reset(); };
333 t5_2.fn = [&] { ts5.reset(); };
338 ASSERT_EQ(t5_1.timestamps[0], milliseconds(5));
340 ASSERT_EQ(t5_2.timestamps[0], milliseconds(5));
345 ASSERT_EQ(timeoutClock_.millisecondsSinceEpoch(), milliseconds(5));
355 milliseconds interval(25);
356 milliseconds atMostEveryN(6);
362 std::vector<TestTimeout> timeouts(numTimeouts);
366 for (
uint32_t index = 0; index < numTimeouts; index++) {
367 setClock(milliseconds(index));
368 timeouts[index].timeoutExpired();
369 ts25.scheduleTimeout(&timeouts[index]);
381 for (
uint32_t idx = 0; idx < numTimeouts; ++idx) {
382 ASSERT_EQ(timeouts[idx].timestamps.size(), 2);
384 auto scheduledTime = timeouts[idx].timestamps[0] + interval;
385 auto firedTime = timeouts[idx].timestamps[1];
389 milliseconds tolerance = atMostEveryN;
391 ASSERT_LT(firedTime, scheduledTime + tolerance);
400 auto prev = timeouts[idx - 1].timestamps[1];
402 auto delta = firedTime - prev;
403 if (delta >= milliseconds(1)) {
407 ASSERT_LE(timeoutClock_.millisecondsSinceEpoch(),
408 milliseconds(numTimeouts) + interval + atMostEveryN);
boost::container::flat_multimap< milliseconds, AsyncTimeout * > timeouts_
#define ASSERT_GE(val1, val2)
void scheduleTimeout(Callback *callback)
#define ASSERT_EQ(val1, val2)
TestTimeout(Args &&...args)
#define ASSERT_LT(val1, val2)
MockTimeoutClock timeoutClock_
constexpr detail::Map< Move > move
static MockTimeoutClock * clock_
#define ASSERT_LE(val1, val2)
internal::ArgsMatcher< InnerMatcher > Args(const InnerMatcher &matcher)
requires E e noexcept(noexcept(s.error(std::move(e))))
struct event * getEvent()
auto event_ref_flags(struct event *ev) -> decltype(std::ref(ev->ev_flags))
std::deque< TimePoint > timestamps
PolymorphicAction< internal::InvokeAction< FunctionImpl > > Invoke(FunctionImpl function_impl)
std::deque< milliseconds > timestamps
void setClock(milliseconds ms)
static void setTimeoutClock(MockTimeoutClock &clock)
void timeoutExpired() noexceptoverride
virtual void timeoutExpired() noexcept=0
void addTimeout(AsyncTimeoutSet *set)
std::deque< AsyncTimeoutSet * > nextSets_
void addTimeout(AsyncTimeoutSet *set, Args &&...args)
#define EXPECT_CALL(obj, call)
const internal::AnythingMatcher _
TEST_F(HeaderTableTests, IndexTranslation)
MockTimeoutManager timeoutManager_
std::chrono::milliseconds millisecondsSinceEpoch()
std::unique_ptr< AsyncTimeoutSet, Destructor > UniquePtr
std::function< void()> fn
internal::ReturnAction< R > Return(R value)
#define MOCK_METHOD0(m,...)