package main.server; import base.CaseConfig; import base.CaseServer; import base.TestException; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.Date; import java.util.concurrent.atomic.AtomicBoolean; /** * @author v.chibrikov */ public class CaseServerImpl implements CaseServer { private static final int TICK = 10; private final StringBuffer out = new StringBuffer(); private final AtomicBoolean serverStarted = new AtomicBoolean(false); private final CaseConfig cfg; private Process process; public CaseServerImpl(CaseConfig cfg) { this.cfg = cfg; } public void run() { process = runServerProcess(); } public void stop() { process.destroy(); } public String getOut() { return out.toString(); } public boolean joinTillStarted() { long startTime = (new Date()).getTime(); int waitPeriod = cfg.getStartWaitPeriod(); try { while (!serverStarted.get()) { Thread.sleep(TICK); long currentTime = (new Date()).getTime(); if (currentTime > startTime + waitPeriod) return false; } } catch (InterruptedException e) { throw new TestException(e); } return true; } private Process runServerProcess() { try { ProcessBuilder pb = new ProcessBuilder(cfg.getServerStartCommand().split(" ")); pb.redirectErrorStream(true); Process p = pb.start(); StreamGobbler errorGobbler = new StreamGobbler(p.getErrorStream(), "ERROR"); StreamGobbler outputGobbler = new StreamGobbler(p.getInputStream(), "OUTPUT"); outputGobbler.start(); errorGobbler.start(); return p; } catch (IOException e) { throw new TestException(e); } } private class StreamGobbler extends Thread { private final InputStream is; private final String type; private StreamGobbler(InputStream is, String type) { this.is = is; this.type = type; } @Override public void run() { try { InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String line; while ((line = br.readLine()) != null) { out.append(type).append('>').append(line).append('\n'); if (line.contains(cfg.getStartedMessage())) { serverStarted.set(true); } } } catch (IOException e) { throw new TestException(e); } } } }