commit
323b097623
@ -0,0 +1,120 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2012-2020 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.springframework.boot.launchscript;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.time.Duration;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.assertj.core.api.Condition;
|
||||||
|
import org.testcontainers.containers.GenericContainer;
|
||||||
|
import org.testcontainers.containers.output.ToStringConsumer;
|
||||||
|
import org.testcontainers.containers.startupcheck.OneShotStartupCheckStrategy;
|
||||||
|
import org.testcontainers.images.builder.ImageFromDockerfile;
|
||||||
|
import org.testcontainers.utility.MountableFile;
|
||||||
|
|
||||||
|
import org.springframework.boot.ansi.AnsiColor;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
import static org.hamcrest.Matchers.containsString;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Abstract base class for testing the launch script.
|
||||||
|
*
|
||||||
|
* @author Andy Wilkinson
|
||||||
|
* @author Ali Shahbour
|
||||||
|
* @author Alexey Vinogradov
|
||||||
|
*/
|
||||||
|
abstract class AbstractLaunchScriptIntegrationTests {
|
||||||
|
|
||||||
|
protected static final char ESC = 27;
|
||||||
|
|
||||||
|
private final String scriptsDir;
|
||||||
|
|
||||||
|
protected AbstractLaunchScriptIntegrationTests(String scriptsDir) {
|
||||||
|
this.scriptsDir = scriptsDir;
|
||||||
|
}
|
||||||
|
|
||||||
|
static List<Object[]> parameters() {
|
||||||
|
List<Object[]> parameters = new ArrayList<>();
|
||||||
|
for (File os : new File("src/intTest/resources/conf").listFiles()) {
|
||||||
|
for (File version : os.listFiles()) {
|
||||||
|
parameters.add(new Object[] { os.getName(), version.getName() });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return parameters;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Condition<String> coloredString(AnsiColor color, String string) {
|
||||||
|
String colorString = ESC + "[0;" + color + "m" + string + ESC + "[0m";
|
||||||
|
return new Condition<String>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean matches(String value) {
|
||||||
|
return containsString(colorString).matches(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void doLaunch(String os, String version, String script) throws Exception {
|
||||||
|
assertThat(doTest(os, version, script)).contains("Launched");
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String doTest(String os, String version, String script) throws Exception {
|
||||||
|
ToStringConsumer consumer = new ToStringConsumer().withRemoveAnsiCodes(false);
|
||||||
|
try (LaunchScriptTestContainer container = new LaunchScriptTestContainer(os, version, this.scriptsDir,
|
||||||
|
script)) {
|
||||||
|
container.withLogConsumer(consumer);
|
||||||
|
container.start();
|
||||||
|
while (container.isRunning()) {
|
||||||
|
Thread.sleep(100);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return consumer.toUtf8String();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final class LaunchScriptTestContainer extends GenericContainer<LaunchScriptTestContainer> {
|
||||||
|
|
||||||
|
private LaunchScriptTestContainer(String os, String version, String scriptsDir, String testScript) {
|
||||||
|
super(new ImageFromDockerfile("spring-boot-launch-script/" + os.toLowerCase() + "-" + version)
|
||||||
|
.withFileFromFile("Dockerfile",
|
||||||
|
new File("src/intTest/resources/conf/" + os + "/" + version + "/Dockerfile")));
|
||||||
|
withCopyFileToContainer(MountableFile.forHostPath(findApplication().getAbsolutePath()), "/app.jar");
|
||||||
|
withCopyFileToContainer(
|
||||||
|
MountableFile.forHostPath("src/intTest/resources/scripts/" + scriptsDir + "test-functions.sh"),
|
||||||
|
"/test-functions.sh");
|
||||||
|
withCopyFileToContainer(
|
||||||
|
MountableFile.forHostPath("src/intTest/resources/scripts/" + scriptsDir + testScript),
|
||||||
|
"/" + testScript);
|
||||||
|
withCommand("/bin/bash", "-c", "chmod +x " + testScript + " && ./" + testScript);
|
||||||
|
withStartupCheckStrategy(new OneShotStartupCheckStrategy().withTimeout(Duration.ofMinutes(5)));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static File findApplication() {
|
||||||
|
File appJar = new File("build/app/build/libs/app.jar");
|
||||||
|
if (appJar.isFile()) {
|
||||||
|
return appJar;
|
||||||
|
}
|
||||||
|
throw new IllegalStateException(
|
||||||
|
"Could not find test application in build/app/build/libs directory. Have you built it?");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,93 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2012-2020 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.springframework.boot.launchscript;
|
||||||
|
|
||||||
|
import org.junit.jupiter.params.ParameterizedTest;
|
||||||
|
import org.junit.jupiter.params.provider.MethodSource;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Integration tests of Spring Boot's launch script when executing the jar directly.
|
||||||
|
*
|
||||||
|
* @author Alexey Vinogradov
|
||||||
|
* @author Andy Wilkinson
|
||||||
|
*/
|
||||||
|
class JarLaunchScriptIntegrationTests extends AbstractLaunchScriptIntegrationTests {
|
||||||
|
|
||||||
|
JarLaunchScriptIntegrationTests() {
|
||||||
|
super("jar/");
|
||||||
|
}
|
||||||
|
|
||||||
|
@ParameterizedTest(name = "{0} {1}")
|
||||||
|
@MethodSource("parameters")
|
||||||
|
void basicLaunch(String os, String version) throws Exception {
|
||||||
|
doLaunch(os, version, "basic-launch.sh");
|
||||||
|
}
|
||||||
|
|
||||||
|
@ParameterizedTest(name = "{0} {1}")
|
||||||
|
@MethodSource("parameters")
|
||||||
|
void launchWithDebugEnv(String os, String version) throws Exception {
|
||||||
|
final String output = doTest(os, version, "launch-with-debug.sh");
|
||||||
|
assertThat(output).contains("++ pwd");
|
||||||
|
}
|
||||||
|
|
||||||
|
@ParameterizedTest(name = "{0} {1}")
|
||||||
|
@MethodSource("parameters")
|
||||||
|
void launchWithDifferentJarFileEnv(String os, String version) throws Exception {
|
||||||
|
final String output = doTest(os, version, "launch-with-jarfile.sh");
|
||||||
|
assertThat(output).contains("app-another.jar");
|
||||||
|
assertThat(output).doesNotContain("spring-boot-launch-script-tests.jar");
|
||||||
|
}
|
||||||
|
|
||||||
|
@ParameterizedTest(name = "{0} {1}")
|
||||||
|
@MethodSource("parameters")
|
||||||
|
void launchWithSingleCommandLineArgument(String os, String version) throws Exception {
|
||||||
|
doLaunch(os, version, "launch-with-single-command-line-argument.sh");
|
||||||
|
}
|
||||||
|
|
||||||
|
@ParameterizedTest(name = "{0} {1}")
|
||||||
|
@MethodSource("parameters")
|
||||||
|
void launchWithMultipleCommandLineArguments(String os, String version) throws Exception {
|
||||||
|
doLaunch(os, version, "launch-with-multiple-command-line-arguments.sh");
|
||||||
|
}
|
||||||
|
|
||||||
|
@ParameterizedTest(name = "{0} {1}")
|
||||||
|
@MethodSource("parameters")
|
||||||
|
void launchWithSingleRunArg(String os, String version) throws Exception {
|
||||||
|
doLaunch(os, version, "launch-with-single-run-arg.sh");
|
||||||
|
}
|
||||||
|
|
||||||
|
@ParameterizedTest(name = "{0} {1}")
|
||||||
|
@MethodSource("parameters")
|
||||||
|
void launchWithMultipleRunArgs(String os, String version) throws Exception {
|
||||||
|
doLaunch(os, version, "launch-with-multiple-run-args.sh");
|
||||||
|
}
|
||||||
|
|
||||||
|
@ParameterizedTest(name = "{0} {1}")
|
||||||
|
@MethodSource("parameters")
|
||||||
|
void launchWithSingleJavaOpt(String os, String version) throws Exception {
|
||||||
|
doLaunch(os, version, "launch-with-single-java-opt.sh");
|
||||||
|
}
|
||||||
|
|
||||||
|
@ParameterizedTest(name = "{0} {1}")
|
||||||
|
@MethodSource("parameters")
|
||||||
|
void launchWithMultipleJavaOpts(String os, String version) throws Exception {
|
||||||
|
doLaunch(os, version, "launch-with-multiple-java-opts.sh");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,4 @@
|
|||||||
|
source ./test-functions.sh
|
||||||
|
launch_jar
|
||||||
|
await_app
|
||||||
|
curl -s http://127.0.0.1:8080/
|
@ -0,0 +1,5 @@
|
|||||||
|
export DEBUG=true
|
||||||
|
source ./test-functions.sh
|
||||||
|
launch_jar
|
||||||
|
await_app
|
||||||
|
curl -s http://127.0.0.1:8080/
|
@ -0,0 +1,6 @@
|
|||||||
|
source ./test-functions.sh
|
||||||
|
cp app.jar app-another.jar
|
||||||
|
export JARFILE=app-another.jar
|
||||||
|
launch_jar
|
||||||
|
await_app
|
||||||
|
curl -s http://127.0.0.1:8080/
|
@ -0,0 +1,4 @@
|
|||||||
|
source ./test-functions.sh
|
||||||
|
launch_jar --server.port=8081 --server.servlet.context-path=/test
|
||||||
|
await_app http://127.0.0.1:8081/test/
|
||||||
|
curl -s http://127.0.0.1:8081/test/
|
@ -0,0 +1,5 @@
|
|||||||
|
source ./test-functions.sh
|
||||||
|
echo 'JAVA_OPTS="-Dserver.port=8081 -Dserver.servlet.context-path=/test"' > app.conf
|
||||||
|
launch_jar
|
||||||
|
await_app http://127.0.0.1:8081/test/
|
||||||
|
curl -s http://127.0.0.1:8081/test/
|
@ -0,0 +1,5 @@
|
|||||||
|
source ./test-functions.sh
|
||||||
|
echo 'RUN_ARGS="--server.port=8081 --server.servlet.context-path=/test"' > app.conf
|
||||||
|
launch_jar
|
||||||
|
await_app http://127.0.0.1:8081/test/
|
||||||
|
curl -s http://127.0.0.1:8081/test/
|
@ -0,0 +1,4 @@
|
|||||||
|
source ./test-functions.sh
|
||||||
|
launch_jar --server.port=8081
|
||||||
|
await_app http://127.0.0.1:8081/
|
||||||
|
curl -s http://127.0.0.1:8081/
|
@ -0,0 +1,5 @@
|
|||||||
|
source ./test-functions.sh
|
||||||
|
echo 'JAVA_OPTS=-Dserver.port=8081' > app.conf
|
||||||
|
launch_jar
|
||||||
|
await_app http://127.0.0.1:8081/
|
||||||
|
curl -s http://127.0.0.1:8081/
|
@ -0,0 +1,5 @@
|
|||||||
|
source ./test-functions.sh
|
||||||
|
echo 'RUN_ARGS=--server.port=8081' > app.conf
|
||||||
|
launch_jar
|
||||||
|
await_app http://127.0.0.1:8081/
|
||||||
|
curl -s http://127.0.0.1:8081/
|
@ -0,0 +1,22 @@
|
|||||||
|
await_app() {
|
||||||
|
if [ -z $1 ]
|
||||||
|
then
|
||||||
|
url=http://127.0.0.1:8080
|
||||||
|
else
|
||||||
|
url=$1
|
||||||
|
fi
|
||||||
|
end=$(date +%s)
|
||||||
|
let "end+=30"
|
||||||
|
until curl -s $url > /dev/null
|
||||||
|
do
|
||||||
|
now=$(date +%s)
|
||||||
|
if [[ $now -ge $end ]]; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
launch_jar() {
|
||||||
|
./app.jar $@ &
|
||||||
|
}
|
Loading…
Reference in New Issue