/*
* 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.Vertx;
import io.vertx.core.json.JsonObject;
import io.vertx.test.fakecluster.FakeClusterManager;
import org.junit.After;
import org.junit.Test;
import java.io.File;
import java.io.IOException;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Check the redeployment behavior.
*/
public class RedeployTest extends CommandTestBase {
private void waitForTermination() {
waitUntil(() -> {
try {
RunCommandTest.getHttpCode();
return false;
} catch (IOException e) {
return true;
}
});
}
@After
public void tearDown() throws InterruptedException {
super.tearDown();
final RunCommand run = (RunCommand) cli.getExistingCommandInstance("run");
if (run != null) {
Vertx vertx = run.vertx;
close(vertx);
run.stopBackgroundApplication(null);
run.shutdownRedeployment();
}
FakeClusterManager.reset();
waitForTermination();
}
@Test
public void testStartingApplicationInRedeployMode() {
cli.dispatch(new Launcher(), new String[]{"run",
HttpTestVerticle.class.getName(), "--redeploy=**" + File.separator + "*.txt",
"--launcher-class=" + Launcher.class.getName()
});
waitUntil(() -> {
try {
return RunCommandTest.getHttpCode() == 200;
} catch (IOException e) {
return false;
}
});
}
@Test
public void testStartingApplicationInRedeployModeWithInlineConf() throws IOException {
int random = (int) (Math.random() * 100);
cli.dispatch(new Launcher(), new String[]{"run",
HttpTestVerticle.class.getName(), "--redeploy=**" + File.separator + "*.txt",
"--launcher-class=" + Launcher.class.getName(),
"--conf", "{\"random\":" + random + "}"
});
waitUntil(() -> {
try {
return RunCommandTest.getHttpCode() == 200;
} catch (IOException e) {
return false;
}
});
JsonObject conf = RunCommandTest.getContent().getJsonObject("conf");
assertThat(conf).isNotNull().isNotEmpty();
assertThat(conf.getInteger("random")).isEqualTo(random);
}
@Test
public void testStartingApplicationInRedeployModeWithInlineConf2() throws IOException {
int random = (int) (Math.random() * 100);
cli.dispatch(new Launcher(), new String[]{"run",
HttpTestVerticle.class.getName(), "--redeploy=**" + File.separator + "*.txt",
"--launcher-class=" + Launcher.class.getName(),
"--conf={\"random\":" + random + "}"
});
waitUntil(() -> {
try {
return RunCommandTest.getHttpCode() == 200;
} catch (IOException e) {
return false;
}
});
JsonObject conf = RunCommandTest.getContent().getJsonObject("conf");
assertThat(conf).isNotNull().isNotEmpty();
assertThat(conf.getInteger("random")).isEqualTo(random);
}
@Test
public void testStartingApplicationInRedeployModeWithFileConf() throws IOException {
cli.dispatch(new Launcher(), new String[]{"run",
HttpTestVerticle.class.getName(), "--redeploy=**" + File.separator + "*.txt",
"--launcher-class=" + Launcher.class.getName(),
"--conf", new File("src/test/resources/conf.json").getAbsolutePath()
});
waitUntil(() -> {
try {
return RunCommandTest.getHttpCode() == 200;
} catch (IOException e) {
return false;
}
});
JsonObject conf = RunCommandTest.getContent().getJsonObject("conf");
assertThat(conf).isNotNull().isNotEmpty();
assertThat(conf.getString("name")).isEqualTo("vertx");
}
@Test
public void testStartingApplicationInRedeployModeWithFileConf2() throws IOException {
cli.dispatch(new Launcher(), new String[]{"run",
HttpTestVerticle.class.getName(), "--redeploy=**" + File.separator + "*.txt",
"--launcher-class=" + Launcher.class.getName(),
"--conf=" + new File("src/test/resources/conf.json").getAbsolutePath()
});
waitUntil(() -> {
try {
return RunCommandTest.getHttpCode() == 200;
} catch (IOException e) {
return false;
}
});
JsonObject conf = RunCommandTest.getContent().getJsonObject("conf");
assertThat(conf).isNotNull().isNotEmpty();
assertThat(conf.getString("name")).isEqualTo("vertx");
}
@Test
public void testStartingApplicationInRedeployModeWithCluster() throws IOException {
cli.dispatch(new Launcher(), new String[]{"run",
HttpTestVerticle.class.getName(), "--redeploy=**" + File.separator + "*.txt",
"--launcher-class=" + Launcher.class.getName(),
"--cluster",
ExecUtils.isWindows() ? "--redeploy-termination-period=3000" : ""
});
waitUntil(() -> {
try {
return RunCommandTest.getHttpCode() == 200;
} catch (IOException e) {
return false;
}
}, 20000);
assertThat(RunCommandTest.getContent().getBoolean("clustered")).isTrue();
}
@Test
public void testRedeployment() throws IOException {
cli.dispatch(new Launcher(), new String[]{"run",
HttpTestVerticle.class.getName(), "--redeploy=**" + File.separator + "*.txt",
"--launcher-class=" + Launcher.class.getName(),
ExecUtils.isWindows() ? "--redeploy-termination-period=3000" : ""
});
waitUntil(() -> {
try {
return RunCommandTest.getHttpCode() == 200;
} catch (IOException e) {
return false;
}
});
long start1 = RunCommandTest.getContent().getLong("startTime");
File file = new File("target/test-classes/foo.txt");
if (file.exists()) {
file.delete();
}
file.createNewFile();
waitUntil(() -> {
try {
return RunCommandTest.getHttpCode() == 200 && start1 != RunCommandTest.getContent().getLong("startTime");
} catch (IOException e) {
return false;
}
}, 20000);
}
@Test
public void testRedeploymentWithSlash() throws IOException {
cli.dispatch(new Launcher(), new String[]{"run",
// Use "/", on windows it gets replaced.
HttpTestVerticle.class.getName(), "--redeploy=**" + "/" + "*.txt",
"--launcher-class=" + Launcher.class.getName(),
ExecUtils.isWindows() ? "--redeploy-termination-period=3000" : ""
});
waitUntil(() -> {
try {
return RunCommandTest.getHttpCode() == 200;
} catch (IOException e) {
return false;
}
});
long start1 = RunCommandTest.getContent().getLong("startTime");
File file = new File("target/test-classes/foo.txt");
if (file.exists()) {
file.delete();
}
file.createNewFile();
waitUntil(() -> {
try {
return RunCommandTest.getHttpCode() == 200 && start1 != RunCommandTest.getContent().getLong("startTime");
} catch (IOException e) {
return false;
}
}, 20000);
}
}