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