/* * Copyright (c) 2011-2015 The original author or authors * ------------------------------------------------------ * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * and Apache License v2.0 which accompanies this distribution. * * The Eclipse Public License is available at * http://www.eclipse.org/legal/epl-v10.html * * The Apache License v2.0 is available at * http://www.opensource.org/licenses/apache2.0.php * * You may elect to redistribute this code under either of these licenses. */ package io.vertx.core.impl.launcher.commands; import io.vertx.core.Launcher; import io.vertx.core.json.JsonObject; import org.junit.Before; import org.junit.Test; import java.io.File; import java.io.IOException; import java.net.HttpURLConnection; import java.net.URL; import java.util.Arrays; import static org.assertj.core.api.Assertions.assertThat; /** * Check the behavior of the start, stop and list commands. * * @author Clement Escoffier <clement@apache.org> */ public class StartStopListCommandsTest extends CommandTestBase { @Before public void setUp() throws IOException { File manifest = new File("target/test-classes/META-INF/MANIFEST.MF"); if (manifest.isFile()) { manifest.delete(); } super.setUp(); } @Test public void testStartListStop() throws InterruptedException { record(); cli.dispatch(new String[]{"start", "run", HttpTestVerticle.class.getName(), "--launcher-class", Launcher.class.getName()}); waitForStartup(); assertThat(output.toString()).contains("Starting vert.x application"); output.reset(); cli.dispatch(new String[]{"list"}); assertThat(output.toString()).hasLineCount(2); assertThat(output.toString()).contains("\t" + HttpTestVerticle.class.getName()); // Extract id. String[] lines = output.toString().split(System.lineSeparator()); String id = lines[1].trim().substring(0, lines[1].trim().indexOf("\t")); output.reset(); // pass --redeploy to not call system.exit cli.dispatch(new String[]{"stop", id, "--redeploy"}); assertThat(output.toString()) .contains("Stopping vert.x application '" + id + "'") .contains("Application '" + id + "' terminated with status 0"); waitForShutdown(); waitUntil(() -> { output.reset(); cli.dispatch(new String[]{"list"}); return !output.toString().contains(id); }); assertThat(output.toString()).hasLineCount(2).contains("No vert.x application found"); } @Test public void testStartListStopWithoutCommand() throws InterruptedException { record(); cli.dispatch(new String[]{"start", HttpTestVerticle.class.getName(), "--launcher-class", Launcher.class.getName()}); waitForStartup(); assertThat(output.toString()).contains("Starting vert.x application"); output.reset(); cli.dispatch(new String[]{"list"}); assertThat(output.toString()).hasLineCount(2); assertThat(output.toString()).contains("\t" + HttpTestVerticle.class.getName()); // Extract id. String[] lines = output.toString().split(System.lineSeparator()); String id = lines[1].trim().substring(0, lines[1].trim().indexOf("\t")); output.reset(); // pass --redeploy to not call system.exit cli.dispatch(new String[]{"stop", id, "--redeploy"}); assertThat(output.toString()) .contains("Stopping vert.x application '" + id + "'") .contains("Application '" + id + "' terminated with status 0"); waitForShutdown(); waitUntil(() -> { output.reset(); cli.dispatch(new String[]{"list"}); return !output.toString().contains(id); }); assertThat(output.toString()).hasLineCount(2).contains("No vert.x application found"); } @Test public void testStartListStopWithJVMOptions() throws InterruptedException, IOException { record(); cli.dispatch(new String[]{"start", "run", HttpTestVerticle.class.getName(), "--launcher-class", Launcher.class.getName(), "--java-opts=-Dfoo=bar -Dbaz=bar", "--redirect-output"}); waitForStartup(); assertThat(output.toString()).contains("Starting vert.x application"); JsonObject content = RunCommandTest.getContent(); assertThat(content.getString("foo")).isEqualToIgnoringCase("bar"); assertThat(content.getString("baz")).isEqualToIgnoringCase("bar"); output.reset(); cli.dispatch(new String[]{"list"}); assertThat(output.toString()).hasLineCount(2); // Extract id. String[] lines = output.toString().split(System.lineSeparator()); String id = lines[1].trim().substring(0, lines[1].trim().indexOf("\t")); output.reset(); // pass --redeploy to not call system.exit cli.dispatch(new String[]{"stop", id, "--redeploy"}); assertThat(output.toString()) .contains("Stopping vert.x application '" + id + "'") .contains("Application '" + id + "' terminated with status 0"); waitForShutdown(); waitUntil(() -> { output.reset(); cli.dispatch(new String[]{"list"}); return !output.toString().contains(id); }); assertThat(output.toString()).hasLineCount(2).contains("No vert.x application found"); } private void waitForShutdown() { waitUntil(() -> { try { getHttpCode(); } catch (IOException e) { return true; } return false; }); } private void waitForStartup() { waitUntil(() -> { try { return getHttpCode() == 200; } catch (IOException e) { // Ignore it. } return false; }); } @Test public void testStartListStopWithId() throws InterruptedException, IOException { record(); cli.dispatch(new String[]{"start", "run", HttpTestVerticle.class.getName(), "--launcher-class", Launcher.class.getName(), "--vertx-id=hello"}); waitForStartup(); assertThat(output.toString()).contains("Starting vert.x application").contains("hello"); output.reset(); cli.dispatch(new String[]{"list"}); assertThat(output.toString()).hasLineCount(2).contains("hello"); // Extract id. String[] lines = output.toString().split(System.lineSeparator()); String id = lines[1].trim().substring(0, lines[1].trim().indexOf("\t")); assertThat(id).isEqualToIgnoringCase("hello"); output.reset(); // pass --redeploy to not call system.exit cli.dispatch(new String[]{"stop", id, "--redeploy"}); assertThat(output.toString()) .contains("Stopping vert.x application '" + id + "'") .contains("Application '" + id + "' terminated with status 0"); waitForShutdown(); waitUntil(() -> { output.reset(); cli.dispatch(new String[]{"list"}); return !output.toString().contains(id); }); assertThat(output.toString()).hasLineCount(2).contains("No vert.x application found"); } @Test public void testStartListStopWithIdAndAnotherArgument() throws InterruptedException, IOException { record(); cli.dispatch(new String[]{"start", "run", HttpTestVerticle.class.getName(), "--launcher-class", Launcher.class.getName(), "--vertx-id=hello", "-cluster"}); waitForStartup(); assertThat(output.toString()).contains("Starting vert.x application").contains("hello"); assertThat(RunCommandTest.getContent().getBoolean("clustered")).isTrue(); output.reset(); cli.dispatch(new String[]{"list"}); assertThat(output.toString()).hasLineCount(2).contains("hello"); // Extract id. String[] lines = output.toString().split(System.lineSeparator()); String id = lines[1].trim().substring(0, lines[1].trim().indexOf("\t")); assertThat(id).isEqualToIgnoringCase("hello"); output.reset(); // pass --redeploy to not call system.exit cli.dispatch(new String[]{"stop", id, "--redeploy"}); assertThat(output.toString()) .contains("Stopping vert.x application '" + id + "'") .contains("Application '" + id + "' terminated with status 0"); waitForShutdown(); waitUntil(() -> { output.reset(); cli.dispatch(new String[]{"list"}); return !output.toString().contains(id); }); assertThat(output.toString()).hasLineCount(2).contains("No vert.x application found"); } @Test public void testStartListStopWithIdAndAnotherArgumentBeforeId() throws InterruptedException, IOException { record(); cli.dispatch(new String[]{"start", "run", HttpTestVerticle.class.getName(), "--launcher-class", Launcher.class.getName(), "-cluster", "--vertx-id=hello"}); waitForStartup(); assertThat(output.toString()).contains("Starting vert.x application").contains("hello"); assertThat(RunCommandTest.getContent().getBoolean("clustered")).isTrue(); output.reset(); cli.dispatch(new String[]{"list"}); assertThat(output.toString()).hasLineCount(2).contains("hello"); // Extract id. String[] lines = output.toString().split(System.lineSeparator()); String id = lines[1].trim().substring(0, lines[1].trim().indexOf("\t")); assertThat(id).isEqualToIgnoringCase("hello"); output.reset(); // pass --redeploy to not call system.exit cli.dispatch(new String[]{"stop", id, "--redeploy"}); assertThat(output.toString()) .contains("Stopping vert.x application '" + id + "'") .contains("Application '" + id + "' terminated with status 0"); waitForShutdown(); waitUntil(() -> { output.reset(); cli.dispatch(new String[]{"list"}); return !output.toString().contains(id); }); assertThat(output.toString()).hasLineCount(2).contains("No vert.x application found"); } private int getHttpCode() throws IOException { return ((HttpURLConnection) new URL("http://localhost:8080") .openConnection()).getResponseCode(); } @Test public void testFatJarExtraction() { String command = "java -jar fat.jar -Dvertx.id=xxx --cluster"; assertThat(ListCommand.extractApplicationDetails(command)).isEqualTo("fat.jar"); command = "java -jar bin/fat.jar -Dvertx.id=xxx --cluster"; assertThat(ListCommand.extractApplicationDetails(command)).isEqualTo("bin/fat.jar"); command = "java foo bar -Dvertx.id=xxx --cluster"; assertThat(ListCommand.extractApplicationDetails(command)).isEqualTo(""); } @Test public void testStoppingAnUnknownProcess() { if (ExecUtils.isWindows()) { // Test skipped on windows, because on windows we do not check whether or not the pid exists. return; } record(); String id = "this-process-does-not-exist"; output.reset(); // pass --redeploy to not call system.exit cli.dispatch(new String[]{"stop", id, "--redeploy"}); assertThat(output.toString()) .contains("Stopping vert.x application '" + id + "'") .contains("Cannot find process for application using the id"); } @Test public void testVerticleExtraction() { String command = "vertx run verticle test1 -Dvertx.id=xxx --cluster"; assertThat(ListCommand.extractApplicationDetails(command)).isEqualTo("verticle"); } }