[util] allow scheduler to be mocked

Add MockForward method to the scheduler that mimics going into the future by rescheduling all items on the taskQueue to be sooner.
This commit is contained in:
Amiti Uttarwar 2020-01-28 15:26:32 -08:00
parent aabec94541
commit a6f63598ad
2 changed files with 29 additions and 0 deletions

View File

@ -114,6 +114,28 @@ void CScheduler::scheduleFromNow(CScheduler::Function f, int64_t deltaMilliSecon
schedule(f, boost::chrono::system_clock::now() + boost::chrono::milliseconds(deltaMilliSeconds));
}
void CScheduler::MockForward(boost::chrono::seconds delta_seconds)
{
assert(delta_seconds.count() > 0 && delta_seconds < boost::chrono::hours{1});
{
boost::unique_lock<boost::mutex> lock(newTaskMutex);
// use temp_queue to maintain updated schedule
std::multimap<boost::chrono::system_clock::time_point, Function> temp_queue;
for (const auto& element : taskQueue) {
temp_queue.emplace_hint(temp_queue.cend(), element.first - delta_seconds, element.second);
}
// point taskQueue to temp_queue
taskQueue = std::move(temp_queue);
}
// notify that the taskQueue needs to be processed
newTaskScheduled.notify_one();
}
static void Repeat(CScheduler* s, CScheduler::Function f, int64_t deltaMilliSeconds)
{
f();

View File

@ -55,6 +55,13 @@ public:
// need more accurate scheduling, don't use this method.
void scheduleEvery(Function f, int64_t deltaMilliSeconds);
/**
* Mock the scheduler to fast forward in time.
* Iterates through items on taskQueue and reschedules them
* to be delta_seconds sooner.
*/
void MockForward(boost::chrono::seconds delta_seconds);
// To keep things as simple as possible, there is no unschedule.
// Services the queue 'forever'. Should be run in a thread,