Merge branch '2.0.x' into 2.1.x
Closes gh-17078
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2018 the original author or authors.
|
||||
* Copyright 2012-2019 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.
|
||||
@@ -40,21 +40,17 @@ public class ConfigurationProcessorIntegrationTests {
|
||||
|
||||
@BeforeClass
|
||||
public static void readMetadata() throws IOException {
|
||||
Resource resource = new ClassPathResource(
|
||||
"META-INF/spring-configuration-metadata.json");
|
||||
Resource resource = new ClassPathResource("META-INF/spring-configuration-metadata.json");
|
||||
assertThat(resource.exists()).isTrue();
|
||||
// Make sure the right file is detected
|
||||
assertThat(resource.getURL().toString())
|
||||
.contains("spring-boot-configuration-processor-tests");
|
||||
repository = ConfigurationMetadataRepositoryJsonBuilder
|
||||
.create(resource.getInputStream()).build();
|
||||
assertThat(resource.getURL().toString()).contains("spring-boot-configuration-processor-tests");
|
||||
repository = ConfigurationMetadataRepositoryJsonBuilder.create(resource.getInputStream()).build();
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void extractTypeFromAnnotatedGetter() {
|
||||
ConfigurationMetadataProperty property = repository.getAllProperties()
|
||||
.get("annotated.name");
|
||||
ConfigurationMetadataProperty property = repository.getAllProperties().get("annotated.name");
|
||||
assertThat(property).isNotNull();
|
||||
assertThat(property.getType()).isEqualTo("java.lang.String");
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2018 the original author or authors.
|
||||
* Copyright 2012-2019 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.
|
||||
@@ -67,8 +67,7 @@ public class DevToolsIntegrationTests {
|
||||
public void launchApplication() throws Exception {
|
||||
this.serverPortFile.delete();
|
||||
System.out.println("Launching " + this.javaLauncher.getClass());
|
||||
this.launchedApplication = this.applicationLauncher
|
||||
.launchApplication(this.javaLauncher);
|
||||
this.launchedApplication = this.applicationLauncher.launchApplication(this.javaLauncher);
|
||||
}
|
||||
|
||||
@After
|
||||
@@ -80,25 +79,20 @@ public class DevToolsIntegrationTests {
|
||||
public void addARequestMappingToAnExistingController() throws Exception {
|
||||
TestRestTemplate template = new TestRestTemplate();
|
||||
String urlBase = "http://localhost:" + awaitServerPort();
|
||||
assertThat(template.getForObject(urlBase + "/one", String.class))
|
||||
.isEqualTo("one");
|
||||
assertThat(template.getForObject(urlBase + "/one", String.class)).isEqualTo("one");
|
||||
assertThat(template.getForEntity(urlBase + "/two", String.class).getStatusCode())
|
||||
.isEqualTo(HttpStatus.NOT_FOUND);
|
||||
controller("com.example.ControllerOne").withRequestMapping("one")
|
||||
.withRequestMapping("two").build();
|
||||
controller("com.example.ControllerOne").withRequestMapping("one").withRequestMapping("two").build();
|
||||
urlBase = "http://localhost:" + awaitServerPort();
|
||||
assertThat(template.getForObject(urlBase + "/one", String.class))
|
||||
.isEqualTo("one");
|
||||
assertThat(template.getForObject(urlBase + "/two", String.class))
|
||||
.isEqualTo("two");
|
||||
assertThat(template.getForObject(urlBase + "/one", String.class)).isEqualTo("one");
|
||||
assertThat(template.getForObject(urlBase + "/two", String.class)).isEqualTo("two");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void removeARequestMappingFromAnExistingController() throws Exception {
|
||||
TestRestTemplate template = new TestRestTemplate();
|
||||
String urlBase = "http://localhost:" + awaitServerPort();
|
||||
assertThat(template.getForObject(urlBase + "/one", String.class))
|
||||
.isEqualTo("one");
|
||||
assertThat(template.getForObject(urlBase + "/one", String.class)).isEqualTo("one");
|
||||
controller("com.example.ControllerOne").build();
|
||||
urlBase = "http://localhost:" + awaitServerPort();
|
||||
assertThat(template.getForEntity(urlBase + "/one", String.class).getStatusCode())
|
||||
@@ -109,16 +103,13 @@ public class DevToolsIntegrationTests {
|
||||
public void createAController() throws Exception {
|
||||
TestRestTemplate template = new TestRestTemplate();
|
||||
String urlBase = "http://localhost:" + awaitServerPort();
|
||||
assertThat(template.getForObject(urlBase + "/one", String.class))
|
||||
.isEqualTo("one");
|
||||
assertThat(template.getForObject(urlBase + "/one", String.class)).isEqualTo("one");
|
||||
assertThat(template.getForEntity(urlBase + "/two", String.class).getStatusCode())
|
||||
.isEqualTo(HttpStatus.NOT_FOUND);
|
||||
controller("com.example.ControllerTwo").withRequestMapping("two").build();
|
||||
urlBase = "http://localhost:" + awaitServerPort();
|
||||
assertThat(template.getForObject(urlBase + "/one", String.class))
|
||||
.isEqualTo("one");
|
||||
assertThat(template.getForObject(urlBase + "/two", String.class))
|
||||
.isEqualTo("two");
|
||||
assertThat(template.getForObject(urlBase + "/one", String.class)).isEqualTo("one");
|
||||
assertThat(template.getForObject(urlBase + "/two", String.class)).isEqualTo("two");
|
||||
|
||||
}
|
||||
|
||||
@@ -126,57 +117,43 @@ public class DevToolsIntegrationTests {
|
||||
public void createAControllerAndThenAddARequestMapping() throws Exception {
|
||||
TestRestTemplate template = new TestRestTemplate();
|
||||
String urlBase = "http://localhost:" + awaitServerPort();
|
||||
assertThat(template.getForObject(urlBase + "/one", String.class))
|
||||
.isEqualTo("one");
|
||||
assertThat(template.getForObject(urlBase + "/one", String.class)).isEqualTo("one");
|
||||
assertThat(template.getForEntity(urlBase + "/two", String.class).getStatusCode())
|
||||
.isEqualTo(HttpStatus.NOT_FOUND);
|
||||
controller("com.example.ControllerTwo").withRequestMapping("two").build();
|
||||
urlBase = "http://localhost:" + awaitServerPort();
|
||||
assertThat(template.getForObject(urlBase + "/one", String.class))
|
||||
.isEqualTo("one");
|
||||
assertThat(template.getForObject(urlBase + "/two", String.class))
|
||||
.isEqualTo("two");
|
||||
controller("com.example.ControllerTwo").withRequestMapping("two")
|
||||
.withRequestMapping("three").build();
|
||||
assertThat(template.getForObject(urlBase + "/one", String.class)).isEqualTo("one");
|
||||
assertThat(template.getForObject(urlBase + "/two", String.class)).isEqualTo("two");
|
||||
controller("com.example.ControllerTwo").withRequestMapping("two").withRequestMapping("three").build();
|
||||
urlBase = "http://localhost:" + awaitServerPort();
|
||||
assertThat(template.getForObject(urlBase + "/three", String.class))
|
||||
.isEqualTo("three");
|
||||
assertThat(template.getForObject(urlBase + "/three", String.class)).isEqualTo("three");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void createAControllerAndThenAddARequestMappingToAnExistingController()
|
||||
throws Exception {
|
||||
public void createAControllerAndThenAddARequestMappingToAnExistingController() throws Exception {
|
||||
TestRestTemplate template = new TestRestTemplate();
|
||||
String urlBase = "http://localhost:" + awaitServerPort();
|
||||
assertThat(template.getForObject(urlBase + "/one", String.class))
|
||||
.isEqualTo("one");
|
||||
assertThat(template.getForObject(urlBase + "/one", String.class)).isEqualTo("one");
|
||||
assertThat(template.getForEntity(urlBase + "/two", String.class).getStatusCode())
|
||||
.isEqualTo(HttpStatus.NOT_FOUND);
|
||||
controller("com.example.ControllerTwo").withRequestMapping("two").build();
|
||||
urlBase = "http://localhost:" + awaitServerPort();
|
||||
assertThat(template.getForObject(urlBase + "/one", String.class))
|
||||
.isEqualTo("one");
|
||||
assertThat(template.getForObject(urlBase + "/two", String.class))
|
||||
.isEqualTo("two");
|
||||
controller("com.example.ControllerOne").withRequestMapping("one")
|
||||
.withRequestMapping("three").build();
|
||||
assertThat(template.getForObject(urlBase + "/one", String.class)).isEqualTo("one");
|
||||
assertThat(template.getForObject(urlBase + "/two", String.class)).isEqualTo("two");
|
||||
controller("com.example.ControllerOne").withRequestMapping("one").withRequestMapping("three").build();
|
||||
urlBase = "http://localhost:" + awaitServerPort();
|
||||
assertThat(template.getForObject(urlBase + "/one", String.class))
|
||||
.isEqualTo("one");
|
||||
assertThat(template.getForObject(urlBase + "/two", String.class))
|
||||
.isEqualTo("two");
|
||||
assertThat(template.getForObject(urlBase + "/three", String.class))
|
||||
.isEqualTo("three");
|
||||
assertThat(template.getForObject(urlBase + "/one", String.class)).isEqualTo("one");
|
||||
assertThat(template.getForObject(urlBase + "/two", String.class)).isEqualTo("two");
|
||||
assertThat(template.getForObject(urlBase + "/three", String.class)).isEqualTo("three");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void deleteAController() throws Exception {
|
||||
TestRestTemplate template = new TestRestTemplate();
|
||||
String urlBase = "http://localhost:" + awaitServerPort();
|
||||
assertThat(template.getForObject(urlBase + "/one", String.class))
|
||||
.isEqualTo("one");
|
||||
assertThat(new File(this.launchedApplication.getClassesDirectory(),
|
||||
"com/example/ControllerOne.class").delete()).isTrue();
|
||||
assertThat(template.getForObject(urlBase + "/one", String.class)).isEqualTo("one");
|
||||
assertThat(new File(this.launchedApplication.getClassesDirectory(), "com/example/ControllerOne.class").delete())
|
||||
.isTrue();
|
||||
urlBase = "http://localhost:" + awaitServerPort();
|
||||
assertThat(template.getForEntity(urlBase + "/one", String.class).getStatusCode())
|
||||
.isEqualTo(HttpStatus.NOT_FOUND);
|
||||
@@ -187,18 +164,15 @@ public class DevToolsIntegrationTests {
|
||||
public void createAControllerAndThenDeleteIt() throws Exception {
|
||||
TestRestTemplate template = new TestRestTemplate();
|
||||
String urlBase = "http://localhost:" + awaitServerPort();
|
||||
assertThat(template.getForObject(urlBase + "/one", String.class))
|
||||
.isEqualTo("one");
|
||||
assertThat(template.getForObject(urlBase + "/one", String.class)).isEqualTo("one");
|
||||
assertThat(template.getForEntity(urlBase + "/two", String.class).getStatusCode())
|
||||
.isEqualTo(HttpStatus.NOT_FOUND);
|
||||
controller("com.example.ControllerTwo").withRequestMapping("two").build();
|
||||
urlBase = "http://localhost:" + awaitServerPort();
|
||||
assertThat(template.getForObject(urlBase + "/one", String.class))
|
||||
.isEqualTo("one");
|
||||
assertThat(template.getForObject(urlBase + "/two", String.class))
|
||||
.isEqualTo("two");
|
||||
assertThat(new File(this.launchedApplication.getClassesDirectory(),
|
||||
"com/example/ControllerTwo.class").delete()).isTrue();
|
||||
assertThat(template.getForObject(urlBase + "/one", String.class)).isEqualTo("one");
|
||||
assertThat(template.getForObject(urlBase + "/two", String.class)).isEqualTo("two");
|
||||
assertThat(new File(this.launchedApplication.getClassesDirectory(), "com/example/ControllerTwo.class").delete())
|
||||
.isTrue();
|
||||
urlBase = "http://localhost:" + awaitServerPort();
|
||||
assertThat(template.getForEntity(urlBase + "/two", String.class).getStatusCode())
|
||||
.isEqualTo(HttpStatus.NOT_FOUND);
|
||||
@@ -210,12 +184,9 @@ public class DevToolsIntegrationTests {
|
||||
System.out.println("Getting server port " + this.serverPortFile.length());
|
||||
if (System.currentTimeMillis() > end) {
|
||||
throw new IllegalStateException(String.format(
|
||||
"server.port file was not written within 30 seconds. "
|
||||
+ "Application output:%n%s%s",
|
||||
FileCopyUtils.copyToString(new FileReader(
|
||||
this.launchedApplication.getStandardOut())),
|
||||
FileCopyUtils.copyToString(new FileReader(
|
||||
this.launchedApplication.getStandardError()))));
|
||||
"server.port file was not written within 30 seconds. " + "Application output:%n%s%s",
|
||||
FileCopyUtils.copyToString(new FileReader(this.launchedApplication.getStandardOut())),
|
||||
FileCopyUtils.copyToString(new FileReader(this.launchedApplication.getStandardError()))));
|
||||
}
|
||||
Thread.sleep(100);
|
||||
}
|
||||
@@ -229,8 +200,7 @@ public class DevToolsIntegrationTests {
|
||||
}
|
||||
|
||||
private ControllerBuilder controller(String name) {
|
||||
return new ControllerBuilder(name,
|
||||
this.launchedApplication.getClassesDirectory());
|
||||
return new ControllerBuilder(name, this.launchedApplication.getClassesDirectory());
|
||||
}
|
||||
|
||||
@Parameters(name = "{0}")
|
||||
@@ -259,14 +229,12 @@ public class DevToolsIntegrationTests {
|
||||
}
|
||||
|
||||
public void build() throws Exception {
|
||||
Builder<Object> builder = new ByteBuddy().subclass(Object.class)
|
||||
.name(this.name).annotateType(AnnotationDescription.Builder
|
||||
.ofType(RestController.class).build());
|
||||
Builder<Object> builder = new ByteBuddy().subclass(Object.class).name(this.name)
|
||||
.annotateType(AnnotationDescription.Builder.ofType(RestController.class).build());
|
||||
for (String mapping : this.mappings) {
|
||||
builder = builder.defineMethod(mapping, String.class, Visibility.PUBLIC)
|
||||
.intercept(FixedValue.value(mapping)).annotateMethod(
|
||||
AnnotationDescription.Builder.ofType(RequestMapping.class)
|
||||
.defineArray("value", mapping).build());
|
||||
.intercept(FixedValue.value(mapping)).annotateMethod(AnnotationDescription.Builder
|
||||
.ofType(RequestMapping.class).defineArray("value", mapping).build());
|
||||
}
|
||||
builder.make().saveIn(this.classesDirectory);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2017 the original author or authors.
|
||||
* Copyright 2012-2019 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.
|
||||
@@ -36,8 +36,7 @@ public class ExplodedRemoteApplicationLauncher extends RemoteApplicationLauncher
|
||||
File appDirectory = new File("target/app");
|
||||
FileSystemUtils.deleteRecursively(appDirectory);
|
||||
appDirectory.mkdirs();
|
||||
FileSystemUtils.copyRecursively(new File("target/test-classes/com"),
|
||||
new File("target/app/com"));
|
||||
FileSystemUtils.copyRecursively(new File("target/test-classes/com"), new File("target/app/com"));
|
||||
List<String> entries = new ArrayList<>();
|
||||
entries.add("target/app");
|
||||
for (File jar : new File("target/dependencies").listFiles()) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2017 the original author or authors.
|
||||
* Copyright 2012-2019 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.
|
||||
@@ -42,18 +42,14 @@ public class JarFileRemoteApplicationLauncher extends RemoteApplicationLauncher
|
||||
@Override
|
||||
protected String createApplicationClassPath() throws Exception {
|
||||
File appDirectory = new File("target/app");
|
||||
if (appDirectory.isDirectory()
|
||||
&& !FileSystemUtils.deleteRecursively(appDirectory.toPath())) {
|
||||
throw new IllegalStateException(
|
||||
"Failed to delete '" + appDirectory.getAbsolutePath() + "'");
|
||||
if (appDirectory.isDirectory() && !FileSystemUtils.deleteRecursively(appDirectory.toPath())) {
|
||||
throw new IllegalStateException("Failed to delete '" + appDirectory.getAbsolutePath() + "'");
|
||||
}
|
||||
appDirectory.mkdirs();
|
||||
Manifest manifest = new Manifest();
|
||||
manifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0");
|
||||
JarOutputStream output = new JarOutputStream(
|
||||
new FileOutputStream(new File(appDirectory, "app.jar")), manifest);
|
||||
FileSystemUtils.copyRecursively(new File("target/test-classes/com"),
|
||||
new File("target/app/com"));
|
||||
JarOutputStream output = new JarOutputStream(new FileOutputStream(new File(appDirectory, "app.jar")), manifest);
|
||||
FileSystemUtils.copyRecursively(new File("target/test-classes/com"), new File("target/app/com"));
|
||||
addToJar(output, new File("target/app/"), new File("target/app/"));
|
||||
output.close();
|
||||
List<String> entries = new ArrayList<>();
|
||||
@@ -61,20 +57,18 @@ public class JarFileRemoteApplicationLauncher extends RemoteApplicationLauncher
|
||||
for (File jar : new File("target/dependencies").listFiles()) {
|
||||
entries.add(jar.getAbsolutePath());
|
||||
}
|
||||
String classpath = StringUtils.collectionToDelimitedString(entries,
|
||||
File.pathSeparator);
|
||||
String classpath = StringUtils.collectionToDelimitedString(entries, File.pathSeparator);
|
||||
return classpath;
|
||||
}
|
||||
|
||||
private void addToJar(JarOutputStream output, File root, File current)
|
||||
throws IOException {
|
||||
private void addToJar(JarOutputStream output, File root, File current) throws IOException {
|
||||
for (File file : current.listFiles()) {
|
||||
if (file.isDirectory()) {
|
||||
addToJar(output, root, file);
|
||||
}
|
||||
output.putNextEntry(new ZipEntry(
|
||||
file.getAbsolutePath().substring(root.getAbsolutePath().length() + 1)
|
||||
.replace("\\", "/") + (file.isDirectory() ? "/" : "")));
|
||||
file.getAbsolutePath().substring(root.getAbsolutePath().length() + 1).replace("\\", "/")
|
||||
+ (file.isDirectory() ? "/" : "")));
|
||||
if (file.isFile()) {
|
||||
try (FileInputStream input = new FileInputStream(file)) {
|
||||
StreamUtils.copy(input, output);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2018 the original author or authors.
|
||||
* Copyright 2012-2019 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.
|
||||
@@ -43,20 +43,20 @@ class JvmLauncher implements TestRule {
|
||||
|
||||
@Override
|
||||
public Statement apply(Statement base, Description description) {
|
||||
this.outputDirectory = new File("target/output/" + NON_ALPHABET_PATTERN
|
||||
.matcher(description.getMethodName()).replaceAll(""));
|
||||
this.outputDirectory = new File(
|
||||
"target/output/" + NON_ALPHABET_PATTERN.matcher(description.getMethodName()).replaceAll(""));
|
||||
this.outputDirectory.mkdirs();
|
||||
return base;
|
||||
}
|
||||
|
||||
LaunchedJvm launch(String name, String classpath, String... args) throws IOException {
|
||||
List<String> command = new ArrayList<>(Arrays
|
||||
.asList(System.getProperty("java.home") + "/bin/java", "-cp", classpath));
|
||||
List<String> command = new ArrayList<>(
|
||||
Arrays.asList(System.getProperty("java.home") + "/bin/java", "-cp", classpath));
|
||||
command.addAll(Arrays.asList(args));
|
||||
File standardOut = new File(this.outputDirectory, name + ".out");
|
||||
File standardError = new File(this.outputDirectory, name + ".err");
|
||||
Process process = new ProcessBuilder(StringUtils.toStringArray(command))
|
||||
.redirectError(standardError).redirectOutput(standardOut).start();
|
||||
Process process = new ProcessBuilder(StringUtils.toStringArray(command)).redirectError(standardError)
|
||||
.redirectOutput(standardOut).start();
|
||||
return new LaunchedJvm(process, standardOut, standardError);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2018 the original author or authors.
|
||||
* Copyright 2012-2019 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.
|
||||
@@ -38,9 +38,8 @@ class LaunchedApplication {
|
||||
|
||||
private final BiFunction<Integer, File, Process> remoteProcessRestarter;
|
||||
|
||||
LaunchedApplication(File classesDirectory, File standardOut, File standardError,
|
||||
Process localProcess, Process remoteProcess,
|
||||
BiFunction<Integer, File, Process> remoteProcessRestarter) {
|
||||
LaunchedApplication(File classesDirectory, File standardOut, File standardError, Process localProcess,
|
||||
Process remoteProcess, BiFunction<Integer, File, Process> remoteProcessRestarter) {
|
||||
this.classesDirectory = classesDirectory;
|
||||
this.standardOut = standardOut;
|
||||
this.standardError = standardError;
|
||||
@@ -52,8 +51,7 @@ class LaunchedApplication {
|
||||
public void restartRemote(int port) throws InterruptedException {
|
||||
if (this.remoteProcessRestarter != null) {
|
||||
stop(this.remoteProcess);
|
||||
this.remoteProcess = this.remoteProcessRestarter.apply(port,
|
||||
this.classesDirectory);
|
||||
this.remoteProcess = this.remoteProcessRestarter.apply(port, this.classesDirectory);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2018 the original author or authors.
|
||||
* Copyright 2012-2019 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.
|
||||
@@ -32,20 +32,18 @@ import org.springframework.util.StringUtils;
|
||||
public class LocalApplicationLauncher implements ApplicationLauncher {
|
||||
|
||||
@Override
|
||||
public LaunchedApplication launchApplication(JvmLauncher jvmLauncher)
|
||||
throws Exception {
|
||||
public LaunchedApplication launchApplication(JvmLauncher jvmLauncher) throws Exception {
|
||||
LaunchedJvm jvm = jvmLauncher.launch("local", createApplicationClassPath(),
|
||||
"com.example.DevToolsTestApplication", "--server.port=0");
|
||||
return new LaunchedApplication(new File("target/app"), jvm.getStandardOut(),
|
||||
jvm.getStandardError(), jvm.getProcess(), null, null);
|
||||
return new LaunchedApplication(new File("target/app"), jvm.getStandardOut(), jvm.getStandardError(),
|
||||
jvm.getProcess(), null, null);
|
||||
}
|
||||
|
||||
protected String createApplicationClassPath() throws Exception {
|
||||
File appDirectory = new File("target/app");
|
||||
FileSystemUtils.deleteRecursively(appDirectory);
|
||||
appDirectory.mkdirs();
|
||||
FileSystemUtils.copyRecursively(new File("target/test-classes/com"),
|
||||
new File("target/app/com"));
|
||||
FileSystemUtils.copyRecursively(new File("target/test-classes/com"), new File("target/app/com"));
|
||||
List<String> entries = new ArrayList<>();
|
||||
entries.add("target/app");
|
||||
for (File jar : new File("target/dependencies").listFiles()) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2018 the original author or authors.
|
||||
* Copyright 2012-2019 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.
|
||||
@@ -37,29 +37,22 @@ import org.springframework.util.StringUtils;
|
||||
abstract class RemoteApplicationLauncher implements ApplicationLauncher {
|
||||
|
||||
@Override
|
||||
public LaunchedApplication launchApplication(JvmLauncher javaLauncher)
|
||||
throws Exception {
|
||||
LaunchedJvm applicationJvm = javaLauncher.launch("app",
|
||||
createApplicationClassPath(), "com.example.DevToolsTestApplication",
|
||||
"--server.port=0", "--spring.devtools.remote.secret=secret");
|
||||
public LaunchedApplication launchApplication(JvmLauncher javaLauncher) throws Exception {
|
||||
LaunchedJvm applicationJvm = javaLauncher.launch("app", createApplicationClassPath(),
|
||||
"com.example.DevToolsTestApplication", "--server.port=0", "--spring.devtools.remote.secret=secret");
|
||||
int port = awaitServerPort(applicationJvm.getStandardOut());
|
||||
BiFunction<Integer, File, Process> remoteRestarter = getRemoteRestarter(
|
||||
javaLauncher);
|
||||
return new LaunchedApplication(new File("target/remote"),
|
||||
applicationJvm.getStandardOut(), applicationJvm.getStandardError(),
|
||||
applicationJvm.getProcess(), remoteRestarter.apply(port, null),
|
||||
BiFunction<Integer, File, Process> remoteRestarter = getRemoteRestarter(javaLauncher);
|
||||
return new LaunchedApplication(new File("target/remote"), applicationJvm.getStandardOut(),
|
||||
applicationJvm.getStandardError(), applicationJvm.getProcess(), remoteRestarter.apply(port, null),
|
||||
remoteRestarter);
|
||||
}
|
||||
|
||||
private BiFunction<Integer, File, Process> getRemoteRestarter(
|
||||
JvmLauncher javaLauncher) {
|
||||
private BiFunction<Integer, File, Process> getRemoteRestarter(JvmLauncher javaLauncher) {
|
||||
return (port, classesDirectory) -> {
|
||||
try {
|
||||
LaunchedJvm remoteSpringApplicationJvm = javaLauncher.launch(
|
||||
"remote-spring-application",
|
||||
LaunchedJvm remoteSpringApplicationJvm = javaLauncher.launch("remote-spring-application",
|
||||
createRemoteSpringApplicationClassPath(classesDirectory),
|
||||
RemoteSpringApplication.class.getName(),
|
||||
"--spring.devtools.remote.secret=secret",
|
||||
RemoteSpringApplication.class.getName(), "--spring.devtools.remote.secret=secret",
|
||||
"http://localhost:" + port);
|
||||
awaitRemoteSpringApplication(remoteSpringApplicationJvm.getStandardOut());
|
||||
return remoteSpringApplicationJvm.getProcess();
|
||||
@@ -72,14 +65,12 @@ abstract class RemoteApplicationLauncher implements ApplicationLauncher {
|
||||
|
||||
protected abstract String createApplicationClassPath() throws Exception;
|
||||
|
||||
private String createRemoteSpringApplicationClassPath(File classesDirectory)
|
||||
throws Exception {
|
||||
private String createRemoteSpringApplicationClassPath(File classesDirectory) throws Exception {
|
||||
if (classesDirectory == null) {
|
||||
File remoteDirectory = new File("target/remote");
|
||||
FileSystemUtils.deleteRecursively(remoteDirectory);
|
||||
remoteDirectory.mkdirs();
|
||||
FileSystemUtils.copyRecursively(new File("target/test-classes/com"),
|
||||
new File("target/remote/com"));
|
||||
FileSystemUtils.copyRecursively(new File("target/test-classes/com"), new File("target/remote/com"));
|
||||
}
|
||||
List<String> entries = new ArrayList<>();
|
||||
entries.add("target/remote");
|
||||
@@ -95,8 +86,7 @@ abstract class RemoteApplicationLauncher implements ApplicationLauncher {
|
||||
while (serverPortFile.length() == 0) {
|
||||
if (System.currentTimeMillis() > end) {
|
||||
throw new IllegalStateException(String.format(
|
||||
"server.port file was not written within 30 seconds. "
|
||||
+ "Application output:%n%s",
|
||||
"server.port file was not written within 30 seconds. " + "Application output:%n%s",
|
||||
FileCopyUtils.copyToString(new FileReader(standardOut))));
|
||||
}
|
||||
Thread.sleep(100);
|
||||
@@ -110,16 +100,13 @@ abstract class RemoteApplicationLauncher implements ApplicationLauncher {
|
||||
long end = System.currentTimeMillis() + 30000;
|
||||
while (!standardOut.exists()) {
|
||||
if (System.currentTimeMillis() > end) {
|
||||
throw new IllegalStateException(
|
||||
"Standard out file was not written " + "within 30 seconds");
|
||||
throw new IllegalStateException("Standard out file was not written " + "within 30 seconds");
|
||||
}
|
||||
Thread.sleep(100);
|
||||
}
|
||||
while (!FileCopyUtils.copyToString(new FileReader(standardOut))
|
||||
.contains("Started RemoteSpringApplication")) {
|
||||
while (!FileCopyUtils.copyToString(new FileReader(standardOut)).contains("Started RemoteSpringApplication")) {
|
||||
if (System.currentTimeMillis() > end) {
|
||||
throw new IllegalStateException(
|
||||
"RemoteSpringApplication did not start within 30 seconds");
|
||||
throw new IllegalStateException("RemoteSpringApplication did not start within 30 seconds");
|
||||
}
|
||||
Thread.sleep(100);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2018 the original author or authors.
|
||||
* Copyright 2012-2019 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.
|
||||
@@ -103,70 +103,60 @@ public class SysVinitLaunchScriptIT {
|
||||
public void statusWhenStarted() throws Exception {
|
||||
String output = doTest("status-when-started.sh");
|
||||
assertThat(output).contains("Status: 0");
|
||||
assertThat(output).has(
|
||||
coloredString(AnsiColor.GREEN, "Started [" + extractPid(output) + "]"));
|
||||
assertThat(output).has(coloredString(AnsiColor.GREEN, "Started [" + extractPid(output) + "]"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void statusWhenKilled() throws Exception {
|
||||
String output = doTest("status-when-killed.sh");
|
||||
assertThat(output).contains("Status: 1");
|
||||
assertThat(output).has(coloredString(AnsiColor.RED,
|
||||
"Not running (process " + extractPid(output) + " not found)"));
|
||||
assertThat(output)
|
||||
.has(coloredString(AnsiColor.RED, "Not running (process " + extractPid(output) + " not found)"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void stopWhenStopped() throws Exception {
|
||||
String output = doTest("stop-when-stopped.sh");
|
||||
assertThat(output).contains("Status: 0");
|
||||
assertThat(output)
|
||||
.has(coloredString(AnsiColor.YELLOW, "Not running (pidfile not found)"));
|
||||
assertThat(output).has(coloredString(AnsiColor.YELLOW, "Not running (pidfile not found)"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void forceStopWhenStopped() throws Exception {
|
||||
String output = doTest("force-stop-when-stopped.sh");
|
||||
assertThat(output).contains("Status: 0");
|
||||
assertThat(output)
|
||||
.has(coloredString(AnsiColor.YELLOW, "Not running (pidfile not found)"));
|
||||
assertThat(output).has(coloredString(AnsiColor.YELLOW, "Not running (pidfile not found)"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void startWhenStarted() throws Exception {
|
||||
String output = doTest("start-when-started.sh");
|
||||
assertThat(output).contains("Status: 0");
|
||||
assertThat(output).has(coloredString(AnsiColor.YELLOW,
|
||||
"Already running [" + extractPid(output) + "]"));
|
||||
assertThat(output).has(coloredString(AnsiColor.YELLOW, "Already running [" + extractPid(output) + "]"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void restartWhenStopped() throws Exception {
|
||||
String output = doTest("restart-when-stopped.sh");
|
||||
assertThat(output).contains("Status: 0");
|
||||
assertThat(output)
|
||||
.has(coloredString(AnsiColor.YELLOW, "Not running (pidfile not found)"));
|
||||
assertThat(output).has(
|
||||
coloredString(AnsiColor.GREEN, "Started [" + extractPid(output) + "]"));
|
||||
assertThat(output).has(coloredString(AnsiColor.YELLOW, "Not running (pidfile not found)"));
|
||||
assertThat(output).has(coloredString(AnsiColor.GREEN, "Started [" + extractPid(output) + "]"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void restartWhenStarted() throws Exception {
|
||||
String output = doTest("restart-when-started.sh");
|
||||
assertThat(output).contains("Status: 0");
|
||||
assertThat(output).has(coloredString(AnsiColor.GREEN,
|
||||
"Started [" + extract("PID1", output) + "]"));
|
||||
assertThat(output).has(coloredString(AnsiColor.GREEN,
|
||||
"Stopped [" + extract("PID1", output) + "]"));
|
||||
assertThat(output).has(coloredString(AnsiColor.GREEN,
|
||||
"Started [" + extract("PID2", output) + "]"));
|
||||
assertThat(output).has(coloredString(AnsiColor.GREEN, "Started [" + extract("PID1", output) + "]"));
|
||||
assertThat(output).has(coloredString(AnsiColor.GREEN, "Stopped [" + extract("PID1", output) + "]"));
|
||||
assertThat(output).has(coloredString(AnsiColor.GREEN, "Started [" + extract("PID2", output) + "]"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void startWhenStopped() throws Exception {
|
||||
String output = doTest("start-when-stopped.sh");
|
||||
assertThat(output).contains("Status: 0");
|
||||
assertThat(output).has(
|
||||
coloredString(AnsiColor.GREEN, "Started [" + extractPid(output) + "]"));
|
||||
assertThat(output).has(coloredString(AnsiColor.GREEN, "Started [" + extractPid(output) + "]"));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -178,15 +168,15 @@ public class SysVinitLaunchScriptIT {
|
||||
@Test
|
||||
public void launchWithMissingLogFolderGeneratesAWarning() throws Exception {
|
||||
String output = doTest("launch-with-missing-log-folder.sh");
|
||||
assertThat(output).has(coloredString(AnsiColor.YELLOW,
|
||||
"LOG_FOLDER /does/not/exist does not exist. Falling back to /tmp"));
|
||||
assertThat(output).has(
|
||||
coloredString(AnsiColor.YELLOW, "LOG_FOLDER /does/not/exist does not exist. Falling back to /tmp"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void launchWithMissingPidFolderGeneratesAWarning() throws Exception {
|
||||
String output = doTest("launch-with-missing-pid-folder.sh");
|
||||
assertThat(output).has(coloredString(AnsiColor.YELLOW,
|
||||
"PID_FOLDER /does/not/exist does not exist. Falling back to /tmp"));
|
||||
assertThat(output).has(
|
||||
coloredString(AnsiColor.YELLOW, "PID_FOLDER /does/not/exist does not exist. Falling back to /tmp"));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -234,12 +224,9 @@ public class SysVinitLaunchScriptIT {
|
||||
@Test
|
||||
public void launchWithRelativePidFolder() throws Exception {
|
||||
String output = doTest("launch-with-relative-pid-folder.sh");
|
||||
assertThat(output).has(
|
||||
coloredString(AnsiColor.GREEN, "Started [" + extractPid(output) + "]"));
|
||||
assertThat(output).has(
|
||||
coloredString(AnsiColor.GREEN, "Running [" + extractPid(output) + "]"));
|
||||
assertThat(output).has(
|
||||
coloredString(AnsiColor.GREEN, "Stopped [" + extractPid(output) + "]"));
|
||||
assertThat(output).has(coloredString(AnsiColor.GREEN, "Started [" + extractPid(output) + "]"));
|
||||
assertThat(output).has(coloredString(AnsiColor.GREEN, "Running [" + extractPid(output) + "]"));
|
||||
assertThat(output).has(coloredString(AnsiColor.GREEN, "Stopped [" + extractPid(output) + "]"));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -290,10 +277,8 @@ public class SysVinitLaunchScriptIT {
|
||||
copyFilesToContainer(docker, container, script);
|
||||
docker.startContainerCmd(container).exec();
|
||||
StringBuilder output = new StringBuilder();
|
||||
AttachContainerResultCallback resultCallback = docker
|
||||
.attachContainerCmd(container).withStdOut(true).withStdErr(true)
|
||||
.withFollowStream(true).withLogs(true)
|
||||
.exec(new AttachContainerResultCallback() {
|
||||
AttachContainerResultCallback resultCallback = docker.attachContainerCmd(container).withStdOut(true)
|
||||
.withStdErr(true).withFollowStream(true).withLogs(true).exec(new AttachContainerResultCallback() {
|
||||
|
||||
@Override
|
||||
public void onNext(Frame item) {
|
||||
@@ -319,17 +304,14 @@ public class SysVinitLaunchScriptIT {
|
||||
}
|
||||
|
||||
private DockerClient createClient() {
|
||||
DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()
|
||||
.withApiVersion("1.19").build();
|
||||
return DockerClientBuilder.getInstance(config)
|
||||
.withDockerCmdExecFactory(this.commandExecFactory).build();
|
||||
DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder().withApiVersion("1.19")
|
||||
.build();
|
||||
return DockerClientBuilder.getInstance(config).withDockerCmdExecFactory(this.commandExecFactory).build();
|
||||
}
|
||||
|
||||
private String buildImage(DockerClient docker) {
|
||||
String dockerfile = "src/test/resources/conf/" + this.os + "/" + this.version
|
||||
+ "/Dockerfile";
|
||||
String tag = "spring-boot-it/" + this.os.toLowerCase(Locale.ENGLISH) + ":"
|
||||
+ this.version;
|
||||
String dockerfile = "src/test/resources/conf/" + this.os + "/" + this.version + "/Dockerfile";
|
||||
String tag = "spring-boot-it/" + this.os.toLowerCase(Locale.ENGLISH) + ":" + this.version;
|
||||
BuildImageResultCallback resultCallback = new BuildImageResultCallback() {
|
||||
|
||||
private List<BuildResponseItem> items = new ArrayList<>();
|
||||
@@ -346,8 +328,7 @@ public class SysVinitLaunchScriptIT {
|
||||
awaitCompletion();
|
||||
}
|
||||
catch (InterruptedException ex) {
|
||||
throw new DockerClientException(
|
||||
"Interrupted while waiting for image id", ex);
|
||||
throw new DockerClientException("Interrupted while waiting for image id", ex);
|
||||
}
|
||||
return getImageId();
|
||||
}
|
||||
@@ -359,8 +340,8 @@ public class SysVinitLaunchScriptIT {
|
||||
}
|
||||
String imageId = extractImageId();
|
||||
if (imageId == null) {
|
||||
throw new DockerClientException("Could not build image: "
|
||||
+ this.items.get(this.items.size() - 1).getError());
|
||||
throw new DockerClientException(
|
||||
"Could not build image: " + this.items.get(this.items.size() - 1).getError());
|
||||
}
|
||||
return imageId;
|
||||
}
|
||||
@@ -379,38 +360,30 @@ public class SysVinitLaunchScriptIT {
|
||||
}
|
||||
|
||||
};
|
||||
docker.buildImageCmd(new File(dockerfile))
|
||||
.withTags(new HashSet<>(Arrays.asList(tag))).exec(resultCallback);
|
||||
docker.buildImageCmd(new File(dockerfile)).withTags(new HashSet<>(Arrays.asList(tag))).exec(resultCallback);
|
||||
String imageId = resultCallback.awaitImageId();
|
||||
return imageId;
|
||||
}
|
||||
|
||||
private String createContainer(DockerClient docker, String imageId,
|
||||
String testScript) {
|
||||
return docker.createContainerCmd(imageId).withTty(false).withCmd("/bin/bash",
|
||||
"-c", "chmod +x " + testScript + " && ./" + testScript).exec().getId();
|
||||
private String createContainer(DockerClient docker, String imageId, String testScript) {
|
||||
return docker.createContainerCmd(imageId).withTty(false)
|
||||
.withCmd("/bin/bash", "-c", "chmod +x " + testScript + " && ./" + testScript).exec().getId();
|
||||
}
|
||||
|
||||
private void copyFilesToContainer(DockerClient docker, final String container,
|
||||
String script) {
|
||||
private void copyFilesToContainer(DockerClient docker, final String container, String script) {
|
||||
copyToContainer(docker, container, findApplication());
|
||||
copyToContainer(docker, container,
|
||||
new File("src/test/resources/scripts/test-functions.sh"));
|
||||
copyToContainer(docker, container,
|
||||
new File("src/test/resources/scripts/" + script));
|
||||
copyToContainer(docker, container, new File("src/test/resources/scripts/test-functions.sh"));
|
||||
copyToContainer(docker, container, new File("src/test/resources/scripts/" + script));
|
||||
}
|
||||
|
||||
private void copyToContainer(DockerClient docker, final String container,
|
||||
final File file) {
|
||||
this.commandExecFactory.createCopyToContainerCmdExec()
|
||||
.exec(new CopyToContainerCmd(container, file));
|
||||
private void copyToContainer(DockerClient docker, final String container, final File file) {
|
||||
this.commandExecFactory.createCopyToContainerCmdExec().exec(new CopyToContainerCmd(container, file));
|
||||
}
|
||||
|
||||
private File findApplication() {
|
||||
File targetDir = new File("target");
|
||||
for (File file : targetDir.listFiles()) {
|
||||
if (file.getName().startsWith("spring-boot-launch-script-tests")
|
||||
&& file.getName().endsWith(".jar")
|
||||
if (file.getName().startsWith("spring-boot-launch-script-tests") && file.getName().endsWith(".jar")
|
||||
&& !file.getName().endsWith("-sources.jar")) {
|
||||
return file;
|
||||
}
|
||||
@@ -441,15 +414,12 @@ public class SysVinitLaunchScriptIT {
|
||||
if (matcher.matches()) {
|
||||
return matcher.group(1);
|
||||
}
|
||||
throw new IllegalArgumentException(
|
||||
"Failed to extract " + label + " from output: " + output);
|
||||
throw new IllegalArgumentException("Failed to extract " + label + " from output: " + output);
|
||||
}
|
||||
|
||||
private static final class CopyToContainerCmdExec
|
||||
extends AbstrSyncDockerCmdExec<CopyToContainerCmd, Void> {
|
||||
private static final class CopyToContainerCmdExec extends AbstrSyncDockerCmdExec<CopyToContainerCmd, Void> {
|
||||
|
||||
private CopyToContainerCmdExec(WebTarget baseResource,
|
||||
DockerClientConfig dockerClientConfig) {
|
||||
private CopyToContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) {
|
||||
super(baseResource, dockerClientConfig);
|
||||
}
|
||||
|
||||
@@ -457,12 +427,10 @@ public class SysVinitLaunchScriptIT {
|
||||
protected Void execute(CopyToContainerCmd command) {
|
||||
try (InputStream streamToUpload = new FileInputStream(
|
||||
CompressArchiveUtil.archiveTARFiles(command.getFile().getParentFile(),
|
||||
Arrays.asList(command.getFile()),
|
||||
command.getFile().getName()))) {
|
||||
WebTarget webResource = getBaseResource().path("/containers/{id}/archive")
|
||||
.resolveTemplate("id", command.getContainer());
|
||||
webResource.queryParam("path", ".")
|
||||
.queryParam("noOverwriteDirNonDir", false).request()
|
||||
Arrays.asList(command.getFile()), command.getFile().getName()))) {
|
||||
WebTarget webResource = getBaseResource().path("/containers/{id}/archive").resolveTemplate("id",
|
||||
command.getContainer());
|
||||
webResource.queryParam("path", ".").queryParam("noOverwriteDirNonDir", false).request()
|
||||
.put(Entity.entity(streamToUpload, "application/x-tar")).close();
|
||||
return null;
|
||||
}
|
||||
@@ -499,8 +467,7 @@ public class SysVinitLaunchScriptIT {
|
||||
|
||||
}
|
||||
|
||||
private static final class SpringBootDockerCmdExecFactory
|
||||
extends JerseyDockerCmdExecFactory {
|
||||
private static final class SpringBootDockerCmdExecFactory extends JerseyDockerCmdExecFactory {
|
||||
|
||||
private CopyToContainerCmdExec createCopyToContainerCmdExec() {
|
||||
return new CopyToContainerCmdExec(getBaseResource(), getDockerClientConfig());
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2018 the original author or authors.
|
||||
* Copyright 2012-2019 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.
|
||||
@@ -39,31 +39,28 @@ import org.springframework.context.annotation.Bean;
|
||||
public class ResourceHandlingApplication {
|
||||
|
||||
public static void main(String[] args) {
|
||||
new SpringApplicationBuilder(ResourceHandlingApplication.class)
|
||||
.properties("server.port:0")
|
||||
new SpringApplicationBuilder(ResourceHandlingApplication.class).properties("server.port:0")
|
||||
.listeners(new WebServerPortFileWriter("target/server.port")).run(args);
|
||||
}
|
||||
|
||||
@Bean
|
||||
public ServletRegistrationBean<?> resourceServletRegistration() {
|
||||
ServletRegistrationBean<?> registration = new ServletRegistrationBean<HttpServlet>(
|
||||
new HttpServlet() {
|
||||
ServletRegistrationBean<?> registration = new ServletRegistrationBean<HttpServlet>(new HttpServlet() {
|
||||
|
||||
@Override
|
||||
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
|
||||
throws ServletException, IOException {
|
||||
URL resource = getServletContext()
|
||||
.getResource(req.getQueryString());
|
||||
if (resource == null) {
|
||||
resp.sendError(404);
|
||||
}
|
||||
else {
|
||||
resp.getWriter().println(resource);
|
||||
resp.getWriter().flush();
|
||||
}
|
||||
}
|
||||
@Override
|
||||
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
|
||||
throws ServletException, IOException {
|
||||
URL resource = getServletContext().getResource(req.getQueryString());
|
||||
if (resource == null) {
|
||||
resp.sendError(404);
|
||||
}
|
||||
else {
|
||||
resp.getWriter().println(resource);
|
||||
resp.getWriter().flush();
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
});
|
||||
registration.addUrlMappings("/servletContext");
|
||||
return registration;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2018 the original author or authors.
|
||||
* Copyright 2012-2019 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.
|
||||
@@ -70,16 +70,14 @@ abstract class AbstractApplicationLauncher extends ExternalResource {
|
||||
|
||||
private Process startApplication() throws Exception {
|
||||
File workingDirectory = getWorkingDirectory();
|
||||
File serverPortFile = (workingDirectory != null)
|
||||
? new File(workingDirectory, "target/server.port")
|
||||
File serverPortFile = (workingDirectory != null) ? new File(workingDirectory, "target/server.port")
|
||||
: new File("target/server.port");
|
||||
serverPortFile.delete();
|
||||
File archive = this.applicationBuilder.buildApplication();
|
||||
List<String> arguments = new ArrayList<>();
|
||||
arguments.add(System.getProperty("java.home") + "/bin/java");
|
||||
arguments.addAll(getArguments(archive));
|
||||
ProcessBuilder processBuilder = new ProcessBuilder(
|
||||
StringUtils.toStringArray(arguments));
|
||||
ProcessBuilder processBuilder = new ProcessBuilder(StringUtils.toStringArray(arguments));
|
||||
if (workingDirectory != null) {
|
||||
processBuilder.directory(workingDirectory);
|
||||
}
|
||||
@@ -94,16 +92,14 @@ abstract class AbstractApplicationLauncher extends ExternalResource {
|
||||
long end = System.currentTimeMillis() + 30000;
|
||||
while (serverPortFile.length() == 0) {
|
||||
if (System.currentTimeMillis() > end) {
|
||||
throw new IllegalStateException(
|
||||
"server.port file was not written within 30 seconds");
|
||||
throw new IllegalStateException("server.port file was not written within 30 seconds");
|
||||
}
|
||||
if (!process.isAlive()) {
|
||||
throw new IllegalStateException("Application failed to launch");
|
||||
}
|
||||
Thread.sleep(100);
|
||||
}
|
||||
return Integer
|
||||
.parseInt(FileCopyUtils.copyToString(new FileReader(serverPortFile)));
|
||||
return Integer.parseInt(FileCopyUtils.copyToString(new FileReader(serverPortFile)));
|
||||
}
|
||||
|
||||
private static class ConsoleCopy extends Thread {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2018 the original author or authors.
|
||||
* Copyright 2012-2019 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.
|
||||
@@ -65,15 +65,12 @@ public abstract class AbstractEmbeddedServletContainerIntegrationTests {
|
||||
private static List<Object> createParameters(String packaging, String container,
|
||||
List<Class<? extends AbstractApplicationLauncher>> applicationLaunchers) {
|
||||
List<Object> parameters = new ArrayList<>();
|
||||
ApplicationBuilder applicationBuilder = new ApplicationBuilder(temporaryFolder,
|
||||
packaging, container);
|
||||
ApplicationBuilder applicationBuilder = new ApplicationBuilder(temporaryFolder, packaging, container);
|
||||
for (Class<? extends AbstractApplicationLauncher> launcherClass : applicationLaunchers) {
|
||||
try {
|
||||
AbstractApplicationLauncher launcher = launcherClass
|
||||
.getDeclaredConstructor(ApplicationBuilder.class)
|
||||
AbstractApplicationLauncher launcher = launcherClass.getDeclaredConstructor(ApplicationBuilder.class)
|
||||
.newInstance(applicationBuilder);
|
||||
String name = StringUtils.capitalize(container) + ": "
|
||||
+ launcher.getDescription(packaging);
|
||||
String name = StringUtils.capitalize(container) + ": " + launcher.getDescription(packaging);
|
||||
parameters.add(new Object[] { name, launcher });
|
||||
}
|
||||
catch (Exception ex) {
|
||||
@@ -83,8 +80,7 @@ public abstract class AbstractEmbeddedServletContainerIntegrationTests {
|
||||
return parameters;
|
||||
}
|
||||
|
||||
protected AbstractEmbeddedServletContainerIntegrationTests(String name,
|
||||
AbstractApplicationLauncher launcher) {
|
||||
protected AbstractEmbeddedServletContainerIntegrationTests(String name, AbstractApplicationLauncher launcher) {
|
||||
this.launcher = launcher;
|
||||
this.rest.setErrorHandler(new ResponseErrorHandler() {
|
||||
|
||||
@@ -103,14 +99,12 @@ public abstract class AbstractEmbeddedServletContainerIntegrationTests {
|
||||
|
||||
@Override
|
||||
public URI expand(String uriTemplate, Object... uriVariables) {
|
||||
return URI.create(
|
||||
"http://localhost:" + launcher.getHttpPort() + uriTemplate);
|
||||
return URI.create("http://localhost:" + launcher.getHttpPort() + uriTemplate);
|
||||
}
|
||||
|
||||
@Override
|
||||
public URI expand(String uriTemplate, Map<String, ?> uriVariables) {
|
||||
return URI.create(
|
||||
"http://localhost:" + launcher.getHttpPort() + uriTemplate);
|
||||
return URI.create("http://localhost:" + launcher.getHttpPort() + uriTemplate);
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2018 the original author or authors.
|
||||
* Copyright 2012-2019 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.
|
||||
@@ -68,8 +68,7 @@ class ApplicationBuilder {
|
||||
return doBuildApplication(containerFolder);
|
||||
}
|
||||
|
||||
private File doBuildApplication(File containerFolder)
|
||||
throws IOException, MavenInvocationException {
|
||||
private File doBuildApplication(File containerFolder) throws IOException, MavenInvocationException {
|
||||
File resourcesJar = createResourcesJar();
|
||||
File appFolder = new File(containerFolder, "app");
|
||||
appFolder.mkdirs();
|
||||
@@ -85,12 +84,10 @@ class ApplicationBuilder {
|
||||
if (resourcesJar.exists()) {
|
||||
return resourcesJar;
|
||||
}
|
||||
try (JarOutputStream resourcesJarStream = new JarOutputStream(
|
||||
new FileOutputStream(resourcesJar))) {
|
||||
try (JarOutputStream resourcesJarStream = new JarOutputStream(new FileOutputStream(resourcesJar))) {
|
||||
resourcesJarStream.putNextEntry(new ZipEntry("META-INF/resources/"));
|
||||
resourcesJarStream.closeEntry();
|
||||
resourcesJarStream.putNextEntry(
|
||||
new ZipEntry("META-INF/resources/nested-meta-inf-resource.txt"));
|
||||
resourcesJarStream.putNextEntry(new ZipEntry("META-INF/resources/nested-meta-inf-resource.txt"));
|
||||
resourcesJarStream.write("nested".getBytes());
|
||||
resourcesJarStream.closeEntry();
|
||||
return resourcesJar;
|
||||
@@ -104,10 +101,8 @@ class ApplicationBuilder {
|
||||
context.put("bootVersion", Versions.getBootVersion());
|
||||
context.put("resourcesJarPath", resourcesJar.getAbsolutePath());
|
||||
try (FileWriter out = new FileWriter(new File(appFolder, "pom.xml"));
|
||||
FileReader templateReader = new FileReader(
|
||||
"src/test/resources/pom-template.xml")) {
|
||||
Mustache.compiler().escapeHTML(false).compile(templateReader).execute(context,
|
||||
out);
|
||||
FileReader templateReader = new FileReader("src/test/resources/pom-template.xml")) {
|
||||
Mustache.compiler().escapeHTML(false).compile(templateReader).execute(context, out);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -120,10 +115,8 @@ class ApplicationBuilder {
|
||||
context.put("repository", repository);
|
||||
File settingsXml = new File(appFolder, "settings.xml");
|
||||
try (FileWriter out = new FileWriter(settingsXml);
|
||||
FileReader templateReader = new FileReader(
|
||||
"src/test/resources/settings-template.xml")) {
|
||||
Mustache.compiler().escapeHTML(false).compile(templateReader).execute(context,
|
||||
out);
|
||||
FileReader templateReader = new FileReader("src/test/resources/settings-template.xml")) {
|
||||
Mustache.compiler().escapeHTML(false).compile(templateReader).execute(context, out);
|
||||
}
|
||||
return settingsXml;
|
||||
}
|
||||
@@ -131,19 +124,16 @@ class ApplicationBuilder {
|
||||
private void copyApplicationSource(File appFolder) throws IOException {
|
||||
File examplePackage = new File(appFolder, "src/main/java/com/example");
|
||||
examplePackage.mkdirs();
|
||||
FileCopyUtils.copy(
|
||||
new File("src/test/java/com/example/ResourceHandlingApplication.java"),
|
||||
FileCopyUtils.copy(new File("src/test/java/com/example/ResourceHandlingApplication.java"),
|
||||
new File(examplePackage, "ResourceHandlingApplication.java"));
|
||||
if ("war".equals(this.packaging)) {
|
||||
File srcMainWebapp = new File(appFolder, "src/main/webapp");
|
||||
srcMainWebapp.mkdirs();
|
||||
FileCopyUtils.copy("webapp resource",
|
||||
new FileWriter(new File(srcMainWebapp, "webapp-resource.txt")));
|
||||
FileCopyUtils.copy("webapp resource", new FileWriter(new File(srcMainWebapp, "webapp-resource.txt")));
|
||||
}
|
||||
}
|
||||
|
||||
private void packageApplication(File appFolder, File settingsXml)
|
||||
throws MavenInvocationException {
|
||||
private void packageApplication(File appFolder, File settingsXml) throws MavenInvocationException {
|
||||
InvocationRequest invocation = new DefaultInvocationRequest();
|
||||
invocation.setBaseDirectory(appFolder);
|
||||
invocation.setGoals(Collections.singletonList("package"));
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2017 the original author or authors.
|
||||
* Copyright 2012-2019 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.
|
||||
@@ -61,9 +61,7 @@ class BootRunApplicationLauncher extends AbstractApplicationLauncher {
|
||||
for (File dependency : dependencies.listFiles()) {
|
||||
classpath.add(dependency.getAbsolutePath());
|
||||
}
|
||||
return Arrays.asList("-cp",
|
||||
StringUtils.collectionToDelimitedString(classpath,
|
||||
File.pathSeparator),
|
||||
return Arrays.asList("-cp", StringUtils.collectionToDelimitedString(classpath, File.pathSeparator),
|
||||
"com.example.ResourceHandlingApplication");
|
||||
}
|
||||
catch (IOException ex) {
|
||||
@@ -107,13 +105,11 @@ class BootRunApplicationLauncher extends AbstractApplicationLauncher {
|
||||
}
|
||||
|
||||
private String getClassesPath(File archive) {
|
||||
return (archive.getName().endsWith(".jar") ? "BOOT-INF/classes"
|
||||
: "WEB-INF/classes");
|
||||
return (archive.getName().endsWith(".jar") ? "BOOT-INF/classes" : "WEB-INF/classes");
|
||||
}
|
||||
|
||||
private List<String> getLibPaths(File archive) {
|
||||
return (archive.getName().endsWith(".jar")
|
||||
? Collections.singletonList("BOOT-INF/lib")
|
||||
return (archive.getName().endsWith(".jar") ? Collections.singletonList("BOOT-INF/lib")
|
||||
: Arrays.asList("WEB-INF/lib", "WEB-INF/lib-provided"));
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2017 the original author or authors.
|
||||
* Copyright 2012-2019 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.
|
||||
@@ -40,26 +40,24 @@ public class EmbeddedServletContainerJarDevelopmentIntegrationTests
|
||||
|
||||
@Parameters(name = "{0}")
|
||||
public static Object[] parameters() {
|
||||
return AbstractEmbeddedServletContainerIntegrationTests.parameters("jar", Arrays
|
||||
.asList(BootRunApplicationLauncher.class, IdeApplicationLauncher.class));
|
||||
return AbstractEmbeddedServletContainerIntegrationTests.parameters("jar",
|
||||
Arrays.asList(BootRunApplicationLauncher.class, IdeApplicationLauncher.class));
|
||||
}
|
||||
|
||||
public EmbeddedServletContainerJarDevelopmentIntegrationTests(String name,
|
||||
AbstractApplicationLauncher launcher) {
|
||||
public EmbeddedServletContainerJarDevelopmentIntegrationTests(String name, AbstractApplicationLauncher launcher) {
|
||||
super(name, launcher);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void metaInfResourceFromDependencyIsAvailableViaHttp() {
|
||||
ResponseEntity<String> entity = this.rest
|
||||
.getForEntity("/nested-meta-inf-resource.txt", String.class);
|
||||
ResponseEntity<String> entity = this.rest.getForEntity("/nested-meta-inf-resource.txt", String.class);
|
||||
assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void metaInfResourceFromDependencyIsAvailableViaServletContext() {
|
||||
ResponseEntity<String> entity = this.rest.getForEntity(
|
||||
"/servletContext?/nested-meta-inf-resource.txt", String.class);
|
||||
ResponseEntity<String> entity = this.rest.getForEntity("/servletContext?/nested-meta-inf-resource.txt",
|
||||
String.class);
|
||||
assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2017 the original author or authors.
|
||||
* Copyright 2012-2019 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.
|
||||
@@ -41,48 +41,43 @@ public class EmbeddedServletContainerJarPackagingIntegrationTests
|
||||
@Parameters(name = "{0}")
|
||||
public static Object[] parameters() {
|
||||
return AbstractEmbeddedServletContainerIntegrationTests.parameters("jar",
|
||||
Arrays.asList(PackagedApplicationLauncher.class,
|
||||
ExplodedApplicationLauncher.class));
|
||||
Arrays.asList(PackagedApplicationLauncher.class, ExplodedApplicationLauncher.class));
|
||||
}
|
||||
|
||||
public EmbeddedServletContainerJarPackagingIntegrationTests(String name,
|
||||
AbstractApplicationLauncher launcher) {
|
||||
public EmbeddedServletContainerJarPackagingIntegrationTests(String name, AbstractApplicationLauncher launcher) {
|
||||
super(name, launcher);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void nestedMetaInfResourceIsAvailableViaHttp() {
|
||||
ResponseEntity<String> entity = this.rest
|
||||
.getForEntity("/nested-meta-inf-resource.txt", String.class);
|
||||
ResponseEntity<String> entity = this.rest.getForEntity("/nested-meta-inf-resource.txt", String.class);
|
||||
assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void nestedMetaInfResourceIsAvailableViaServletContext() {
|
||||
ResponseEntity<String> entity = this.rest.getForEntity(
|
||||
"/servletContext?/nested-meta-inf-resource.txt", String.class);
|
||||
ResponseEntity<String> entity = this.rest.getForEntity("/servletContext?/nested-meta-inf-resource.txt",
|
||||
String.class);
|
||||
assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void nestedJarIsNotAvailableViaHttp() {
|
||||
ResponseEntity<String> entity = this.rest
|
||||
.getForEntity("/BOOT-INF/lib/resources-1.0.jar", String.class);
|
||||
ResponseEntity<String> entity = this.rest.getForEntity("/BOOT-INF/lib/resources-1.0.jar", String.class);
|
||||
assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.NOT_FOUND);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void applicationClassesAreNotAvailableViaHttp() {
|
||||
ResponseEntity<String> entity = this.rest.getForEntity(
|
||||
"/BOOT-INF/classes/com/example/ResourceHandlingApplication.class",
|
||||
String.class);
|
||||
ResponseEntity<String> entity = this.rest
|
||||
.getForEntity("/BOOT-INF/classes/com/example/ResourceHandlingApplication.class", String.class);
|
||||
assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.NOT_FOUND);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void launcherIsNotAvailableViaHttp() {
|
||||
ResponseEntity<String> entity = this.rest.getForEntity(
|
||||
"/org/springframework/boot/loader/Launcher.class", String.class);
|
||||
ResponseEntity<String> entity = this.rest.getForEntity("/org/springframework/boot/loader/Launcher.class",
|
||||
String.class);
|
||||
assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.NOT_FOUND);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2017 the original author or authors.
|
||||
* Copyright 2012-2019 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.
|
||||
@@ -40,33 +40,30 @@ public class EmbeddedServletContainerWarDevelopmentIntegrationTests
|
||||
|
||||
@Parameters(name = "{0}")
|
||||
public static Object[] parameters() {
|
||||
return AbstractEmbeddedServletContainerIntegrationTests.parameters("war", Arrays
|
||||
.asList(BootRunApplicationLauncher.class, IdeApplicationLauncher.class));
|
||||
return AbstractEmbeddedServletContainerIntegrationTests.parameters("war",
|
||||
Arrays.asList(BootRunApplicationLauncher.class, IdeApplicationLauncher.class));
|
||||
}
|
||||
|
||||
public EmbeddedServletContainerWarDevelopmentIntegrationTests(String name,
|
||||
AbstractApplicationLauncher launcher) {
|
||||
public EmbeddedServletContainerWarDevelopmentIntegrationTests(String name, AbstractApplicationLauncher launcher) {
|
||||
super(name, launcher);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void metaInfResourceFromDependencyIsAvailableViaHttp() {
|
||||
ResponseEntity<String> entity = this.rest
|
||||
.getForEntity("/nested-meta-inf-resource.txt", String.class);
|
||||
ResponseEntity<String> entity = this.rest.getForEntity("/nested-meta-inf-resource.txt", String.class);
|
||||
assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void metaInfResourceFromDependencyIsAvailableViaServletContext() {
|
||||
ResponseEntity<String> entity = this.rest.getForEntity(
|
||||
"/servletContext?/nested-meta-inf-resource.txt", String.class);
|
||||
ResponseEntity<String> entity = this.rest.getForEntity("/servletContext?/nested-meta-inf-resource.txt",
|
||||
String.class);
|
||||
assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void webappResourcesAreAvailableViaHttp() {
|
||||
ResponseEntity<String> entity = this.rest.getForEntity("/webapp-resource.txt",
|
||||
String.class);
|
||||
ResponseEntity<String> entity = this.rest.getForEntity("/webapp-resource.txt", String.class);
|
||||
assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2017 the original author or authors.
|
||||
* Copyright 2012-2019 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.
|
||||
@@ -41,58 +41,51 @@ public class EmbeddedServletContainerWarPackagingIntegrationTests
|
||||
@Parameters(name = "{0}")
|
||||
public static Object[] parameters() {
|
||||
return AbstractEmbeddedServletContainerIntegrationTests.parameters("war",
|
||||
Arrays.asList(PackagedApplicationLauncher.class,
|
||||
ExplodedApplicationLauncher.class));
|
||||
Arrays.asList(PackagedApplicationLauncher.class, ExplodedApplicationLauncher.class));
|
||||
}
|
||||
|
||||
public EmbeddedServletContainerWarPackagingIntegrationTests(String name,
|
||||
AbstractApplicationLauncher launcher) {
|
||||
public EmbeddedServletContainerWarPackagingIntegrationTests(String name, AbstractApplicationLauncher launcher) {
|
||||
super(name, launcher);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void nestedMetaInfResourceIsAvailableViaHttp() {
|
||||
ResponseEntity<String> entity = this.rest
|
||||
.getForEntity("/nested-meta-inf-resource.txt", String.class);
|
||||
ResponseEntity<String> entity = this.rest.getForEntity("/nested-meta-inf-resource.txt", String.class);
|
||||
assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void nestedMetaInfResourceIsAvailableViaServletContext() {
|
||||
ResponseEntity<String> entity = this.rest.getForEntity(
|
||||
"/servletContext?/nested-meta-inf-resource.txt", String.class);
|
||||
ResponseEntity<String> entity = this.rest.getForEntity("/servletContext?/nested-meta-inf-resource.txt",
|
||||
String.class);
|
||||
assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void nestedJarIsNotAvailableViaHttp() {
|
||||
ResponseEntity<String> entity = this.rest
|
||||
.getForEntity("/WEB-INF/lib/resources-1.0.jar", String.class);
|
||||
ResponseEntity<String> entity = this.rest.getForEntity("/WEB-INF/lib/resources-1.0.jar", String.class);
|
||||
assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.NOT_FOUND);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void applicationClassesAreNotAvailableViaHttp() {
|
||||
ResponseEntity<String> entity = this.rest.getForEntity(
|
||||
"/WEB-INF/classes/com/example/ResourceHandlingApplication.class",
|
||||
String.class);
|
||||
ResponseEntity<String> entity = this.rest
|
||||
.getForEntity("/WEB-INF/classes/com/example/ResourceHandlingApplication.class", String.class);
|
||||
assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.NOT_FOUND);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void webappResourcesAreAvailableViaHttp() {
|
||||
ResponseEntity<String> entity = this.rest.getForEntity("/webapp-resource.txt",
|
||||
String.class);
|
||||
ResponseEntity<String> entity = this.rest.getForEntity("/webapp-resource.txt", String.class);
|
||||
assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void loaderClassesAreNotAvailableViaHttp() {
|
||||
ResponseEntity<String> entity = this.rest.getForEntity(
|
||||
"/org/springframework/boot/loader/Launcher.class", String.class);
|
||||
ResponseEntity<String> entity = this.rest.getForEntity("/org/springframework/boot/loader/Launcher.class",
|
||||
String.class);
|
||||
assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.NOT_FOUND);
|
||||
entity = this.rest.getForEntity(
|
||||
"/org/springframework/../springframework/boot/loader/Launcher.class",
|
||||
entity = this.rest.getForEntity("/org/springframework/../springframework/boot/loader/Launcher.class",
|
||||
String.class);
|
||||
assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.NOT_FOUND);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2017 the original author or authors.
|
||||
* Copyright 2012-2019 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.
|
||||
@@ -54,8 +54,7 @@ class ExplodedApplicationLauncher extends AbstractApplicationLauncher {
|
||||
|
||||
@Override
|
||||
protected List<String> getArguments(File archive) {
|
||||
String mainClass = (archive.getName().endsWith(".war")
|
||||
? "org.springframework.boot.loader.WarLauncher"
|
||||
String mainClass = (archive.getName().endsWith(".war") ? "org.springframework.boot.loader.WarLauncher"
|
||||
: "org.springframework.boot.loader.JarLauncher");
|
||||
try {
|
||||
explodeArchive(archive);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2018 the original author or authors.
|
||||
* Copyright 2012-2019 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.
|
||||
@@ -73,9 +73,7 @@ class IdeApplicationLauncher extends AbstractApplicationLauncher {
|
||||
classpath.add(dependency.getAbsolutePath());
|
||||
}
|
||||
classpath.add(resourcesProject.getAbsolutePath());
|
||||
return Arrays.asList("-cp",
|
||||
StringUtils.collectionToDelimitedString(classpath,
|
||||
File.pathSeparator),
|
||||
return Arrays.asList("-cp", StringUtils.collectionToDelimitedString(classpath, File.pathSeparator),
|
||||
"com.example.ResourceHandlingApplication");
|
||||
}
|
||||
catch (IOException ex) {
|
||||
@@ -107,8 +105,7 @@ class IdeApplicationLauncher extends AbstractApplicationLauncher {
|
||||
}
|
||||
|
||||
private File explodedResourcesProject(File dependencies) throws IOException {
|
||||
File resourcesProject = new File(this.exploded,
|
||||
"resources-project/target/classes");
|
||||
File resourcesProject = new File(this.exploded, "resources-project/target/classes");
|
||||
File resourcesJar = new File(dependencies, "resources-1.0.jar");
|
||||
explodeArchive(resourcesJar, resourcesProject);
|
||||
resourcesJar.delete();
|
||||
@@ -128,13 +125,11 @@ class IdeApplicationLauncher extends AbstractApplicationLauncher {
|
||||
}
|
||||
|
||||
private String getClassesPath(File archive) {
|
||||
return (archive.getName().endsWith(".jar") ? "BOOT-INF/classes"
|
||||
: "WEB-INF/classes");
|
||||
return (archive.getName().endsWith(".jar") ? "BOOT-INF/classes" : "WEB-INF/classes");
|
||||
}
|
||||
|
||||
private List<String> getLibPaths(File archive) {
|
||||
return (archive.getName().endsWith(".jar")
|
||||
? Collections.singletonList("BOOT-INF/lib")
|
||||
return (archive.getName().endsWith(".jar") ? Collections.singletonList("BOOT-INF/lib")
|
||||
: Arrays.asList("WEB-INF/lib", "WEB-INF/lib-provided"));
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2017 the original author or authors.
|
||||
* Copyright 2012-2019 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.
|
||||
@@ -40,11 +40,9 @@ final class Versions {
|
||||
|
||||
public static String getBootVersion() {
|
||||
String baseDir = StringUtils.cleanPath(new File(".").getAbsolutePath());
|
||||
String mainBaseDir = evaluateExpression("pom.xml",
|
||||
PROPERTIES + "/*[local-name()='main.basedir']/text()");
|
||||
String mainBaseDir = evaluateExpression("pom.xml", PROPERTIES + "/*[local-name()='main.basedir']/text()");
|
||||
mainBaseDir = mainBaseDir.replace("${basedir}", baseDir);
|
||||
return evaluateExpression(mainBaseDir + "/pom.xml",
|
||||
PROPERTIES + "/*[local-name()='revision']/text()");
|
||||
return evaluateExpression(mainBaseDir + "/pom.xml", PROPERTIES + "/*[local-name()='revision']/text()");
|
||||
}
|
||||
|
||||
private static String evaluateExpression(String file, String expression) {
|
||||
|
||||
Reference in New Issue
Block a user