/* Copyright 2016, Ableton AG, Berlin. All rights reserved.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
* If you would like to incorporate Link into a proprietary software application,
* please contact .
*/
#pragma once
#include
#include
#include
#include
namespace ableton
{
namespace test
{
namespace serial_io
{
class Fixture
{
public:
Fixture()
: mpScheduler(std::make_shared())
, mNow(std::chrono::milliseconds{123456789})
{
}
~Fixture()
{
flush();
}
Fixture(const Fixture&) = delete;
Fixture& operator=(const Fixture&) = delete;
Fixture(Fixture&&) = delete;
Fixture& operator=(Fixture&&) = delete;
void setNetworkInterfaces(std::vector<::asio::ip::address> ifAddrs)
{
mIfAddrs = std::move(ifAddrs);
}
Context makeIoContext()
{
return {mNow, mIfAddrs, mpScheduler};
}
void flush()
{
mpScheduler->run();
}
template
void advanceTime(std::chrono::duration duration)
{
const auto target = mNow + duration;
mpScheduler->run();
auto nextTimer = mpScheduler->nextTimerExpiration();
while (nextTimer <= target)
{
mNow = nextTimer;
mpScheduler->triggerTimersUntil(mNow);
mpScheduler->run();
nextTimer = mpScheduler->nextTimerExpiration();
}
mNow = target;
}
private:
std::shared_ptr mpScheduler;
SchedulerTree::TimePoint mNow;
std::vector<::asio::ip::address> mIfAddrs;
};
} // namespace serial_io
} // namespace test
} // namespace ableton