tests: Fix issue with UnitTestClock-based event scheduling (extra sleep required)
Change-Id: I77f24f630697b6e41b3d935f0f1416e806516412
Refs: #2152
diff --git a/src/util/time-unit-test-clock.cpp b/src/util/time-unit-test-clock.cpp
index 73c30f7..7ed848d 100644
--- a/src/util/time-unit-test-clock.cpp
+++ b/src/util/time-unit-test-clock.cpp
@@ -20,10 +20,14 @@
*/
#include "time-unit-test-clock.hpp"
+#include "monotonic_deadline_timer.hpp"
+#include <thread>
namespace ndn {
namespace time {
+const std::chrono::microseconds SLEEP_AFTER_TIME_CHANGE(2);
+
template<class BaseClock>
UnitTestClock<BaseClock>::UnitTestClock(const nanoseconds& startTime)
: m_currentTime(startTime)
@@ -63,13 +67,31 @@
UnitTestClock<BaseClock>::advance(const nanoseconds& duration)
{
m_currentTime += duration;
+
+ // On some platforms, boost::asio::io_service for deadline_timer (e.g., the one used in
+ // Scheduler) will call time_traits<>::now() and will "sleep" for
+ // time_traits<>::to_posix_time(duration) period before calling time_traits<>::now()
+ // again. (Note that such "sleep" will occur even if there is no actual waiting and
+ // program is calling io_service.poll().)
+ //
+ // As a result, in order for the clock advancement to be effective, we must sleep for a
+ // period greater than time_traits<>::to_posix_time().
+ //
+ // See also http://blog.think-async.com/2007/08/time-travel.html
+ BOOST_ASSERT(boost::posix_time::microseconds(SLEEP_AFTER_TIME_CHANGE.count()) >
+ boost::asio::time_traits<steady_clock>::to_posix_duration(duration));
+ std::this_thread::sleep_for(SLEEP_AFTER_TIME_CHANGE);
}
template<class BaseClock>
void
UnitTestClock<BaseClock>::setNow(const nanoseconds& timeSinceEpoch)
{
+ BOOST_ASSERT(boost::posix_time::microseconds(SLEEP_AFTER_TIME_CHANGE.count()) >
+ boost::asio::time_traits<steady_clock>::to_posix_duration(timeSinceEpoch -
+ m_currentTime));
m_currentTime = timeSinceEpoch;
+ std::this_thread::sleep_for(SLEEP_AFTER_TIME_CHANGE);
}
template