package com.github.dreamhead.moco.runner;
import com.github.dreamhead.moco.bootstrap.tasks.ShutdownTask;
import org.apache.http.conn.HttpHostConnectException;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ConnectException;
import java.net.InetAddress;
import java.net.Socket;
import static com.github.dreamhead.moco.bootstrap.arg.HttpArgs.httpArgs;
import static com.github.dreamhead.moco.helper.RemoteTestUtils.port;
import static com.github.dreamhead.moco.helper.RemoteTestUtils.root;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.fail;
public class ShutdownMonitorRunnerTest extends AbstractRunnerTest {
private static final String SHUTDOWN_MOCO_KEY = "_SHUTDOWN_MOCO_KEY";
private static final int SHUTDOWN_PORT = 9527;
@Before
public void setup() {
RunnerFactory factory = new RunnerFactory(SHUTDOWN_MOCO_KEY);
runner = factory.createRunner(httpArgs()
.withPort(port())
.withShutdownPort(SHUTDOWN_PORT)
.withConfigurationFile("src/test/resources/foo.json")
.build());
}
@Test(expected = HttpHostConnectException.class)
public void should_shutdown_runner_by_socket() throws IOException {
runner.run();
try {
assertThat(helper.get(root()), is("foo"));
} catch (HttpHostConnectException e) {
fail(e.getMessage());
}
shutdownMoco(SHUTDOWN_PORT, SHUTDOWN_MOCO_KEY);
waitChangeHappens();
helper.get(root());
}
@Test(expected = ConnectException.class)
public void should_stop_runner_directly() throws IOException {
runner.run();
try {
assertThat(helper.get(root()), is("foo"));
} catch (HttpHostConnectException e) {
fail(e.getMessage());
}
runner.stop();
shutdownMoco(SHUTDOWN_PORT, SHUTDOWN_MOCO_KEY);
}
@Test(expected = HttpHostConnectException.class)
public void should_stop_runner_via_shutdown_task() throws IOException {
runner.run();
try {
assertThat(helper.get(root()), is("foo"));
} catch (HttpHostConnectException e) {
fail(e.getMessage());
}
ShutdownTask task = new ShutdownTask(SHUTDOWN_MOCO_KEY);
task.run(new String[]{"-s", Integer.toString(SHUTDOWN_PORT)});
waitChangeHappens();
helper.get(root());
}
private void shutdownMoco(final int shutdownPort, final String shutdownMocoKey) throws IOException {
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), shutdownPort);
socket.setSoLinger(false, 0);
OutputStream outputStream = socket.getOutputStream();
outputStream.write((shutdownMocoKey + "\r\n").getBytes());
outputStream.flush();
socket.close();
}
@Test(expected = HttpHostConnectException.class)
public void should_shutdown_with_shutdown_port() throws IOException {
RunnerFactory factory = new RunnerFactory(SHUTDOWN_MOCO_KEY);
runner = factory.createRunner(httpArgs().withPort(port()).withConfigurationFile("src/test/resources/foo.json").build());
runner.run();
try {
assertThat(helper.get(root()), is("foo"));
} catch (HttpHostConnectException e) {
fail(e.getMessage());
}
ShutdownRunner shutdownRunner = (ShutdownRunner) runner;
int port = shutdownRunner.shutdownPort();
shutdownMoco(port, SHUTDOWN_MOCO_KEY);
waitChangeHappens();
helper.get(root());
}
}