/* * Copyright (c) 2011-2013 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.Vertx; import io.vertx.core.json.JsonObject; import io.vertx.test.fakecluster.FakeClusterManager; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.nio.file.CopyOption; import java.nio.file.Files; import java.nio.file.StandardCopyOption; import java.util.Random; import static org.assertj.core.api.Assertions.assertThat; /** * Check the run command behavior. */ public class RunCommandTest extends CommandTestBase { private File manifest = new File("target/test-classes/META-INF/MANIFEST.MF"); @Before public void setUp() throws IOException { super.setUp(); if (manifest.isFile()) { manifest.delete(); } } @After public void tearDown() throws InterruptedException { super.tearDown(); final RunCommand run = (RunCommand) cli.getExistingCommandInstance("run"); if (run != null) { Vertx vertx = run.vertx; close(vertx); } FakeClusterManager.reset(); } private void setManifest(String name) throws IOException { File source = new File("target/test-classes/META-INF/" + name); Files.copy(source.toPath(), manifest.toPath(), StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.COPY_ATTRIBUTES); } @Test public void testDeploymentOfJavaVerticle() { cli.dispatch(new Launcher(), new String[] {"run", HttpTestVerticle.class.getName()}); waitUntil(() -> { try { return getHttpCode() == 200; } catch (IOException e) { return false; } }); } @Test public void testDeploymentOfJavaVerticleWithCluster() throws IOException { cli.dispatch(new Launcher(), new String[] {"run", HttpTestVerticle.class.getName(), "-cluster"}); waitUntil(() -> { try { return getHttpCode() == 200; } catch (IOException e) { return false; } }); assertThat(getContent().getBoolean("clustered")).isTrue(); } @Test public void testFatJarWithoutMainVerticle() throws IOException { setManifest("MANIFEST-Launcher-No-Main-Verticle.MF"); record(); cli.dispatch(new Launcher(), new String[0]); stop(); assertThat(output.toString()).contains("Usage:"); } @Test public void testFatJarWithMissingMainVerticle() throws IOException, InterruptedException { setManifest("MANIFEST-Launcher-Missing-Main-Verticle.MF"); record(); cli.dispatch(new Launcher(), new String[]{}); waitUntil(() -> error.toString().contains("ClassNotFoundException")); stop(); } @Test public void testFatJarWithHTTPVerticle() throws IOException, InterruptedException { setManifest("MANIFEST-Launcher-Http-Verticle.MF"); cli.dispatch(new Launcher(), new String[]{}); waitUntil(() -> { try { return getHttpCode() == 200; } catch (IOException e) { return false; } }); assertThat(getContent().getBoolean("clustered")).isFalse(); } @Test public void testFatJarWithHTTPVerticleWithCluster() throws IOException, InterruptedException { setManifest("MANIFEST-Launcher-Http-Verticle.MF"); cli.dispatch(new Launcher(), new String[]{"-cluster"}); waitUntil(() -> { try { return getHttpCode() == 200; } catch (IOException e) { return false; } }); assertThat(getContent().getBoolean("clustered")).isTrue(); } @Test public void testThatHADeploysVerticleWhenCombinedWithCluster() throws IOException { setManifest("MANIFEST-Launcher-Http-Verticle.MF"); cli.dispatch(new Launcher(), new String[] {"-ha", "-cluster"}); waitUntil(() -> { try { return getHttpCode() == 200; } catch (IOException e) { return false; } }); assertThat(getContent().getBoolean("clustered")).isTrue(); } @Test public void testThatHADeploysVerticle() throws IOException { setManifest("MANIFEST-Launcher-Http-Verticle.MF"); cli.dispatch(new Launcher(), new String[] {"-ha", "-cluster"}); waitUntil(() -> { try { return getHttpCode() == 200; } catch (IOException e) { return false; } }); assertThat(getContent().getBoolean("clustered")).isTrue(); } @Test public void testWithConfProvidedInline() throws IOException { long someNumber = new Random().nextLong(); setManifest("MANIFEST-Launcher-Http-Verticle.MF"); cli.dispatch(new Launcher(), new String[] {"--conf={\"random\":" + someNumber + "}"}); waitUntil(() -> { try { return getHttpCode() == 200; } catch (IOException e) { return false; } }); assertThat(getContent().getJsonObject("conf").getLong("random")).isEqualTo(someNumber); } @Test public void testWithBrokenConfProvidedInline() throws IOException { setManifest("MANIFEST-Launcher-Http-Verticle.MF"); // There is a missing `}` in the json fragment. This is normal, as the test check that the configuration is not // read in this case. cli.dispatch(new Launcher(), new String[] {"--conf={\"name\":\"vertx\""}); waitUntil(() -> { try { return getHttpCode() == 200; } catch (IOException e) { return false; } }); assertThat(getContent().getJsonObject("conf").toString()).isEqualToIgnoringCase("{}"); } @Test public void testWithConfProvidedAsFile() throws IOException { setManifest("MANIFEST-Launcher-Http-Verticle.MF"); cli.dispatch(new Launcher(), new String[] {"--conf", "target/test-classes/conf.json"}); waitUntil(() -> { try { return getHttpCode() == 200; } catch (IOException e) { return false; } }); assertThat(getContent().getJsonObject("conf").getString("name")).isEqualToIgnoringCase("vertx"); } @Test public void testMetricsEnabledFromCommandLine() throws IOException { setManifest("MANIFEST-Launcher-Http-Verticle.MF"); cli.dispatch(new Launcher(), new String[] {"-Dvertx.metrics.options.enabled=true"}); waitUntil(() -> { try { return getHttpCode() == 200; } catch (IOException e) { return false; } }); // Check that the metrics are enabled // We cannot use the response from the verticle as it uses the DymmyVertxMetrics (no metrics provider) assertThat(((RunCommand)cli.getExistingCommandInstance("run")).options.getMetricsOptions().isEnabled()).isTrue(); } public static int getHttpCode() throws IOException { return ((HttpURLConnection) new URL("http://localhost:8080") .openConnection()).getResponseCode(); } public static JsonObject getContent() throws IOException { URL url = new URL("http://localhost:8080"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.connect(); InputStreamReader in = new InputStreamReader((InputStream) conn.getContent()); BufferedReader buff = new BufferedReader(in); String line; StringBuilder builder = new StringBuilder(); do { line = buff.readLine(); builder.append(line).append("\n"); } while (line != null); buff.close(); return new JsonObject(builder.toString()); } }