#include <ableton/discovery/InterfaceScanner.hpp>
#include <ableton/test/CatchWrapper.hpp>
#include <ableton/test/serial_io/Fixture.hpp>
namespace ableton
{
namespace link
{
namespace
{
struct TestCallback
{
template <typename AddrRange>
void operator()(AddrRange addrs)
{
addrRanges.emplace_back(begin(addrs), end(addrs));
}
std::vector<std::vector<discovery::IpAddress>> addrRanges;
};
}
TEST_CASE("InterfaceScanner")
{
const auto addr1 = discovery::makeAddress("123.123.123.1");
const auto addr2 = discovery::makeAddress("123.123.123.2");
test::serial_io::Fixture io;
auto callback = TestCallback{};
SECTION("NoInterfacesThenOneThenTwo")
{
{
auto scanner = discovery::makeInterfaceScanner(std::chrono::seconds(2),
util::injectRef(callback),
util::injectVal(io.makeIoContext()));
scanner.enable(true);
CHECK(1 == callback.addrRanges.size());
io.setNetworkInterfaces({addr1});
io.advanceTime(std::chrono::seconds(3));
io.setNetworkInterfaces({addr1, addr2});
io.advanceTime(std::chrono::seconds(2));
}
REQUIRE(3 == callback.addrRanges.size());
CHECK(0 == callback.addrRanges[0].size());
REQUIRE(1 == callback.addrRanges[1].size());
CHECK(addr1 == callback.addrRanges[1].front());
REQUIRE(2 == callback.addrRanges[2].size());
CHECK(addr1 == callback.addrRanges[2].front());
CHECK(addr2 == callback.addrRanges[2].back());
}
SECTION("InterfaceGoesAway", "[InterfaceScanner]")
{
io.setNetworkInterfaces({addr1});
{
auto scanner = discovery::makeInterfaceScanner(std::chrono::seconds(2),
util::injectRef(callback),
util::injectVal(io.makeIoContext()));
scanner.enable(true);
io.setNetworkInterfaces({});
io.advanceTime(std::chrono::seconds(3));
}
REQUIRE(2 == callback.addrRanges.size());
REQUIRE(1 == callback.addrRanges[0].size());
CHECK(addr1 == callback.addrRanges[0].front());
CHECK(0 == callback.addrRanges[1].size());
}
}
} }