/*
* 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;
import io.vertx.core.Launcher;
import io.vertx.core.Vertx;
import io.vertx.core.VertxOptions;
import io.vertx.core.cli.CLIException;
import io.vertx.core.cli.annotations.Name;
import io.vertx.core.impl.launcher.commands.CommandTestBase;
import io.vertx.core.impl.launcher.commands.HttpTestVerticle;
import io.vertx.core.impl.launcher.commands.RunCommandTest;
import io.vertx.core.json.JsonObject;
import io.vertx.core.spi.launcher.CommandFactory;
import io.vertx.core.spi.launcher.DefaultCommand;
import io.vertx.core.spi.launcher.DefaultCommandFactory;
import org.junit.After;
import org.junit.Test;
import java.io.IOException;
import java.util.concurrent.atomic.AtomicReference;
import static org.assertj.core.api.Assertions.assertThat;
/**
* @author <a href="http://escoffier.me">Clement Escoffier</a>
*/
public class LauncherExtensibilityTest extends CommandTestBase {
private static AtomicReference<Boolean> spy = new AtomicReference<>();
private Vertx vertx;
@After
public void tearDown() throws InterruptedException {
spy.set(false);
super.tearDown();
close(vertx);
}
@Test
public void testExtendingMainVerticle() {
Launcher myLauncher = new Launcher() {
@Override
protected String getMainVerticle() {
return HttpTestVerticle.class.getName();
}
@Override
public void afterStartingVertx(Vertx vertx) {
LauncherExtensibilityTest.this.vertx = vertx;
}
};
myLauncher.dispatch(new String[0]);
waitUntil(() -> {
try {
return RunCommandTest.getHttpCode() == 200;
} catch (IOException e) {
return false;
}
});
}
@Test
public void testThatALauncherCanAddACommand() {
Launcher myLauncher = new Launcher() {
@Override
protected void load() {
super.load();
register(FooCommand.class);
}
};
myLauncher.dispatch(new String[]{"foo"});
assertThat(myLauncher.getCommandNames()).contains("foo");
waitUntil(spy::get);
}
@Test
public void testThatALauncherCanHideACommand() {
Launcher myLauncher = new Launcher() {
@Override
protected void load() {
super.load();
unregister("start");
}
};
record();
myLauncher.dispatch(new String[]{"start"});
stop();
assertThat(output.toString()).contains("The command 'start' is not a valid command.");
assertThat(myLauncher.getCommandNames()).doesNotContain("start");
}
@Test
public void testThatCustomLauncherCanCustomizeTheClusteredOption() {
Launcher myLauncher = new Launcher() {
@Override
protected String getMainVerticle() {
return HttpTestVerticle.class.getName();
}
@Override
public void afterStartingVertx(Vertx vertx) {
LauncherExtensibilityTest.this.vertx = vertx;
}
@Override
public void beforeStartingVertx(VertxOptions options) {
options.setClustered(true);
}
};
myLauncher.dispatch(new String[0]);
waitUntil(() -> {
try {
return RunCommandTest.getHttpCode() == 200;
} catch (IOException e) {
return false;
}
});
assertThat(this.vertx.isClustered()).isTrue();
}
@Test
public void testThatCustomLauncherCanUpdateConfigurationWhenNoneArePassed() throws IOException {
long time = System.nanoTime();
Launcher myLauncher = new Launcher() {
@Override
protected String getMainVerticle() {
return HttpTestVerticle.class.getName();
}
@Override
public void afterStartingVertx(Vertx vertx) {
LauncherExtensibilityTest.this.vertx = vertx;
}
@Override
public void afterConfigParsed(JsonObject config) {
config.put("time", time);
}
};
myLauncher.dispatch(new String[0]);
waitUntil(() -> {
try {
return RunCommandTest.getHttpCode() == 200;
} catch (IOException e) {
return false;
}
});
assertThat(RunCommandTest.getContent().getJsonObject("conf").getLong("time")).isEqualTo(time);
}
@Test
public void testThatCustomLauncherCanUpdateConfiguration() throws IOException {
long time = System.nanoTime();
Launcher myLauncher = new Launcher() {
@Override
protected String getMainVerticle() {
return HttpTestVerticle.class.getName();
}
@Override
public void afterStartingVertx(Vertx vertx) {
LauncherExtensibilityTest.this.vertx = vertx;
}
@Override
public void afterConfigParsed(JsonObject config) {
config.put("time", time);
}
};
myLauncher.dispatch(new String[] {"-conf=\"{\"time\":345667}"});
waitUntil(() -> {
try {
return RunCommandTest.getHttpCode() == 200;
} catch (IOException e) {
return false;
}
});
assertThat(RunCommandTest.getContent().getJsonObject("conf").getLong("time")).isEqualTo(time);
}
@Name("foo")
public static class FooCommand extends DefaultCommand {
@Override
public void run() throws CLIException {
spy.set(true);
}
}
}