package ru.qatools.gridrouter.utils; import org.junit.rules.TestWatcher; import org.junit.runner.Description; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.function.Consumer; import static ru.qatools.gridrouter.utils.SocketUtil.findFreePort; import static ru.qatools.gridrouter.utils.TestConfigRepository.changePort; import static ru.qatools.gridrouter.utils.TestConfigRepository.resetConfig; /** * @author Innokenty Shuvalov innokenty@yandex-team.ru */ public class HubEmulatorRule extends TestWatcher { static final Logger LOGGER = LoggerFactory.getLogger(HubEmulatorRule.class); private int fromPort; private int port; private HubEmulator hub; public HubEmulatorRule(int fromPort) { this(fromPort, hub -> { }); } public HubEmulatorRule(int fromPort, Consumer<HubEmulator> initializer) { this.fromPort = fromPort; port = findFreePort(); LOGGER.info("Selected new free port {}, starting emulator...", port); hub = new HubEmulator(port); if (initializer != null) { LOGGER.info("Running initializer..."); try { initializer.accept(hub); } catch (Exception e) { throw new RuntimeException(e); } } LOGGER.info("Waiting for config initialization..."); changePort(fromPort, port); } @Override protected void finished(Description description) { resetConfig(); hub.stop(); } public HubEmulator.HubEmulations emulate() { return hub.emulate(); } public HubEmulator.HubVerifications verify() { return hub.verify(); } public int getPort() { return port; } }