diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/neo4j/Neo4jPropertiesTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/neo4j/Neo4jPropertiesTests.java index d83c28ea1c..827b574194 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/neo4j/Neo4jPropertiesTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/neo4j/Neo4jPropertiesTests.java @@ -141,10 +141,10 @@ public class Neo4jPropertiesTests { @Test public void embeddedModeWithRelativeLocation() { Neo4jProperties properties = load(true, - "spring.data.neo4j.uri=file:target/neo4j/my.db"); + "spring.data.neo4j.uri=file:relative/path/to/my.db"); Configuration configuration = properties.createConfiguration(); assertDriver(configuration, Neo4jProperties.EMBEDDED_DRIVER, - "file:target/neo4j/my.db"); + "file:relative/path/to/my.db"); } private static void assertDriver(Configuration actual, String driver, String uri) { diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/freemarker/FreeMarkerAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/freemarker/FreeMarkerAutoConfigurationTests.java index 74a51b2d05..fb7b56f7a8 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/freemarker/FreeMarkerAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/freemarker/FreeMarkerAutoConfigurationTests.java @@ -24,6 +24,7 @@ import org.junit.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import org.springframework.boot.testsupport.BuildOutput; import org.springframework.boot.testsupport.rule.OutputCapture; import static org.assertj.core.api.Assertions.assertThat; @@ -36,6 +37,8 @@ import static org.assertj.core.api.Assertions.assertThat; */ public class FreeMarkerAutoConfigurationTests { + private final BuildOutput buildOutput = new BuildOutput(getClass()); + private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withConfiguration(AutoConfigurations.of(FreeMarkerAutoConfiguration.class)); @@ -68,19 +71,24 @@ public class FreeMarkerAutoConfigurationTests { @Test public void emptyTemplateLocation() { - new File("target/test-classes/templates/empty-directory").mkdir(); - this.contextRunner.withPropertyValues("spring.freemarker.templateLoaderPath:" - + "classpath:/templates/empty-directory/").run((context) -> { - }); + File emptyDirectory = new File(this.buildOutput.getTestResourcesLocation(), + "empty-templates/empty-directory"); + emptyDirectory.mkdirs(); + this.contextRunner + .withPropertyValues("spring.freemarker.templateLoaderPath:" + + "classpath:/empty-templates/empty-directory/") + .run((context) -> assertThat(this.output.toString()) + .doesNotContain("Cannot find template location")); } @Test public void nonExistentLocationAndEmptyLocation() { - new File("target/test-classes/templates/empty-directory").mkdir(); + new File(this.buildOutput.getTestResourcesLocation(), + "empty-templates/empty-directory").mkdirs(); this.contextRunner.withPropertyValues("spring.freemarker.templateLoaderPath:" - + "classpath:/does-not-exist/,classpath:/templates/empty-directory/") - .run((context) -> { - }); + + "classpath:/does-not-exist/,classpath:/empty-templates/empty-directory/") + .run((context) -> assertThat(this.output.toString()) + .doesNotContain("Cannot find template location")); } } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/groovy/template/GroovyTemplateAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/groovy/template/GroovyTemplateAutoConfigurationTests.java index 11c87c1b30..99d45c2846 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/groovy/template/GroovyTemplateAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/groovy/template/GroovyTemplateAutoConfigurationTests.java @@ -31,6 +31,7 @@ import org.junit.Before; import org.junit.Test; import org.springframework.boot.test.util.TestPropertyValues; +import org.springframework.boot.testsupport.BuildOutput; import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.core.io.ClassPathResource; import org.springframework.mock.web.MockHttpServletRequest; @@ -53,6 +54,8 @@ import static org.assertj.core.api.Assertions.assertThat; */ public class GroovyTemplateAutoConfigurationTests { + private final BuildOutput buildOutput = new BuildOutput(getClass()); + private AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); @Before @@ -76,7 +79,8 @@ public class GroovyTemplateAutoConfigurationTests { @Test public void emptyTemplateLocation() { - new File("target/test-classes/templates/empty-directory").mkdir(); + new File(this.buildOutput.getTestResourcesLocation(), + "empty-templates/empty-directory").mkdirs(); registerAndRefreshContext("spring.groovy.template.resource-loader-path:" + "classpath:/templates/empty-directory/"); } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfigurationTests.java index 9dd159547f..f16dd6f56a 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfigurationTests.java @@ -244,7 +244,7 @@ public class DataSourceAutoConfigurationTests { public DataSource dataSource() { this.pool = new BasicDataSource(); this.pool.setDriverClassName("org.hsqldb.jdbcDriver"); - this.pool.setUrl("jdbc:hsqldb:target/overridedb"); + this.pool.setUrl("jdbc:hsqldb:mem:overridedb"); this.pool.setUsername("sa"); return this.pool; } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mongo/embedded/EmbeddedMongoAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mongo/embedded/EmbeddedMongoAutoConfigurationTests.java index bfe0e8855b..bb73d99013 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mongo/embedded/EmbeddedMongoAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mongo/embedded/EmbeddedMongoAutoConfigurationTests.java @@ -17,6 +17,7 @@ package org.springframework.boot.autoconfigure.mongo.embedded; import java.io.File; +import java.io.IOException; import java.util.EnumSet; import java.util.stream.Collectors; @@ -27,7 +28,9 @@ import de.flapdoodle.embed.mongo.distribution.Feature; import de.flapdoodle.embed.mongo.distribution.Version; import org.bson.Document; import org.junit.After; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TemporaryFolder; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration; @@ -52,6 +55,9 @@ import static org.assertj.core.api.Assertions.assertThat; */ public class EmbeddedMongoAutoConfigurationTests { + @Rule + public final TemporaryFolder temp = new TemporaryFolder(); + private AnnotationConfigApplicationContext context; @After @@ -143,8 +149,8 @@ public class EmbeddedMongoAutoConfigurationTests { } @Test - public void mongoWritesToCustomDatabaseDir() { - File customDatabaseDir = new File("target/custom-database-dir"); + public void mongoWritesToCustomDatabaseDir() throws IOException { + File customDatabaseDir = this.temp.newFolder("custom-database-dir"); FileSystemUtils.deleteRecursively(customDatabaseDir); load("spring.mongodb.embedded.storage.databaseDir=" + customDatabaseDir.getPath()); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafReactiveAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafReactiveAutoConfigurationTests.java index 47c2843e47..6719ecf1eb 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafReactiveAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafReactiveAutoConfigurationTests.java @@ -39,6 +39,7 @@ import org.thymeleaf.templateresolver.ITemplateResolver; import org.springframework.boot.autoconfigure.ImportAutoConfiguration; import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration; import org.springframework.boot.test.util.TestPropertyValues; +import org.springframework.boot.testsupport.BuildOutput; import org.springframework.boot.testsupport.rule.OutputCapture; import org.springframework.boot.web.reactive.context.AnnotationConfigReactiveWebApplicationContext; import org.springframework.context.annotation.Bean; @@ -61,6 +62,8 @@ import static org.assertj.core.api.Assertions.assertThat; */ public class ThymeleafReactiveAutoConfigurationTests { + private final BuildOutput buildOutput = new BuildOutput(getClass()); + @Rule public final OutputCapture output = new OutputCapture(); @@ -184,9 +187,10 @@ public class ThymeleafReactiveAutoConfigurationTests { @Test public void templateLocationEmpty() { - new File("target/test-classes/templates/empty-directory").mkdir(); + new File(this.buildOutput.getTestResourcesLocation(), + "empty-templates/empty-directory").mkdirs(); load(BaseConfiguration.class, - "spring.thymeleaf.prefix:classpath:/templates/empty-directory/"); + "spring.thymeleaf.prefix:classpath:/empty-templates/empty-directory/"); assertThat(this.output.toString()) .doesNotContain("Cannot find template location"); } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafServletAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafServletAutoConfigurationTests.java index a75c949f82..c1a212ec3e 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafServletAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafServletAutoConfigurationTests.java @@ -42,6 +42,7 @@ import org.springframework.boot.autoconfigure.ImportAutoConfiguration; import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration; import org.springframework.boot.test.rule.OutputCapture; import org.springframework.boot.test.util.TestPropertyValues; +import org.springframework.boot.testsupport.BuildOutput; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.boot.web.servlet.filter.OrderedCharacterEncodingFilter; import org.springframework.context.annotation.AnnotationConfigApplicationContext; @@ -75,6 +76,8 @@ import static org.hamcrest.Matchers.containsString; */ public class ThymeleafServletAutoConfigurationTests { + private final BuildOutput buildOutput = new BuildOutput(getClass()); + @Rule public OutputCapture output = new OutputCapture(); @@ -176,9 +179,10 @@ public class ThymeleafServletAutoConfigurationTests { @Test public void templateLocationEmpty() { - new File("target/test-classes/templates/empty-directory").mkdir(); + new File(this.buildOutput.getTestResourcesLocation(), + "empty-templates/empty-directory").mkdirs(); load(BaseConfiguration.class, - "spring.thymeleaf.prefix:classpath:/templates/empty-directory/"); + "spring.thymeleaf.prefix:classpath:/empty-templates/empty-directory/"); } @Test diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/transaction/jta/JtaAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/transaction/jta/JtaAutoConfigurationTests.java index 652667d514..8fb5f9226c 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/transaction/jta/JtaAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/transaction/jta/JtaAutoConfigurationTests.java @@ -17,6 +17,7 @@ package org.springframework.boot.autoconfigure.transaction.jta; import java.io.File; +import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; @@ -35,8 +36,9 @@ import com.atomikos.icatch.config.UserTransactionService; import com.atomikos.icatch.jta.UserTransactionManager; import com.atomikos.jms.AtomikosConnectionFactoryBean; import org.junit.After; -import org.junit.Before; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TemporaryFolder; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration; @@ -55,7 +57,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.jta.JtaTransactionManager; -import org.springframework.util.FileSystemUtils; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; @@ -72,12 +73,10 @@ import static org.mockito.Mockito.mock; */ public class JtaAutoConfigurationTests { - private AnnotationConfigApplicationContext context; + @Rule + public final TemporaryFolder temp = new TemporaryFolder(); - @Before - public void cleanUpLogs() { - FileSystemUtils.deleteRecursively(new File("target/transaction-logs")); - } + private AnnotationConfigApplicationContext context; @After public void closeContext() { @@ -155,15 +154,16 @@ public class JtaAutoConfigurationTests { } @Test - public void defaultAtomikosTransactionManagerName() { + public void defaultAtomikosTransactionManagerName() throws IOException { this.context = new AnnotationConfigApplicationContext(); - TestPropertyValues.of("spring.jta.logDir:target/transaction-logs") + File logs = this.temp.newFolder("jta"); + TestPropertyValues.of("spring.jta.logDir:" + logs.getAbsolutePath()) .applyTo(this.context); this.context.register(JtaPropertiesConfiguration.class, AtomikosJtaConfiguration.class); this.context.refresh(); - File epochFile = new File("target/transaction-logs/tmlog0.log"); + File epochFile = new File(logs, "tmlog0.log"); assertThat(epochFile.isFile()).isTrue(); } diff --git a/spring-boot-project/spring-boot-cli/src/it/java/org/springframework/boot/cli/CommandLineIT.java b/spring-boot-project/spring-boot-cli/src/it/java/org/springframework/boot/cli/CommandLineIT.java index 8bd6415782..438aa05b6d 100644 --- a/spring-boot-project/spring-boot-cli/src/it/java/org/springframework/boot/cli/CommandLineIT.java +++ b/spring-boot-project/spring-boot-cli/src/it/java/org/springframework/boot/cli/CommandLineIT.java @@ -18,7 +18,9 @@ package org.springframework.boot.cli; import java.io.IOException; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TemporaryFolder; import org.springframework.boot.cli.infrastructure.CommandLineInvoker; import org.springframework.boot.cli.infrastructure.CommandLineInvoker.Invocation; @@ -36,7 +38,10 @@ import static org.junit.Assert.assertThat; */ public class CommandLineIT { - private final CommandLineInvoker cli = new CommandLineInvoker(); + @Rule + public final TemporaryFolder temp = new TemporaryFolder(); + + private final CommandLineInvoker cli = new CommandLineInvoker(this.temp); @Test public void hintProducesListOfValidCommands() diff --git a/spring-boot-project/spring-boot-cli/src/it/java/org/springframework/boot/cli/JarCommandIT.java b/spring-boot-project/spring-boot-cli/src/it/java/org/springframework/boot/cli/JarCommandIT.java index 97481df052..ae20454c25 100644 --- a/spring-boot-project/spring-boot-cli/src/it/java/org/springframework/boot/cli/JarCommandIT.java +++ b/spring-boot-project/spring-boot-cli/src/it/java/org/springframework/boot/cli/JarCommandIT.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2017 the original author or authors. + * Copyright 2012-2018 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. @@ -18,7 +18,9 @@ package org.springframework.boot.cli; import java.io.File; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TemporaryFolder; import org.springframework.boot.cli.command.archive.JarCommand; import org.springframework.boot.cli.infrastructure.CommandLineInvoker; @@ -43,8 +45,11 @@ public class JarCommandIT { private static final boolean JAVA_9_OR_LATER = isClassPresent( "java.security.cert.URICertStoreParameters"); + @Rule + public final TemporaryFolder temp = new TemporaryFolder(); + private final CommandLineInvoker cli = new CommandLineInvoker( - new File("src/it/resources/jar-command")); + new File("src/it/resources/jar-command"), this.temp); @Test public void noArguments() throws Exception { @@ -66,7 +71,7 @@ public class JarCommandIT { @Test public void jarCreationWithGrabResolver() throws Exception { - File jar = new File("target/test-app.jar"); + File jar = new File(this.temp.getRoot(), "test-app.jar"); Invocation invocation = this.cli.invoke("run", jar.getAbsolutePath(), "bad.groovy"); invocation.await(); @@ -93,7 +98,7 @@ public class JarCommandIT { @Test public void jarCreation() throws Exception { - File jar = new File("target/test-app.jar"); + File jar = new File(this.temp.getRoot(), "test-app.jar"); Invocation invocation = this.cli.invoke("jar", jar.getAbsolutePath(), "jar.groovy"); invocation.await(); @@ -127,7 +132,7 @@ public class JarCommandIT { @Test public void jarCreationWithIncludes() throws Exception { - File jar = new File("target/test-app.jar"); + File jar = new File(this.temp.getRoot(), "test-app.jar"); Invocation invocation = this.cli.invoke("jar", jar.getAbsolutePath(), "--include", "-public/**,-resources/**", "jar.groovy"); invocation.await(); diff --git a/spring-boot-project/spring-boot-cli/src/it/java/org/springframework/boot/cli/WarCommandIT.java b/spring-boot-project/spring-boot-cli/src/it/java/org/springframework/boot/cli/WarCommandIT.java index 19e23836ec..8ec914dd28 100644 --- a/spring-boot-project/spring-boot-cli/src/it/java/org/springframework/boot/cli/WarCommandIT.java +++ b/spring-boot-project/spring-boot-cli/src/it/java/org/springframework/boot/cli/WarCommandIT.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2017 the original author or authors. + * Copyright 2012-2018 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. @@ -18,7 +18,9 @@ package org.springframework.boot.cli; import java.io.File; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TemporaryFolder; import org.springframework.boot.cli.command.archive.WarCommand; import org.springframework.boot.cli.infrastructure.CommandLineInvoker; @@ -35,12 +37,15 @@ import static org.assertj.core.api.Assertions.assertThat; */ public class WarCommandIT { + @Rule + public final TemporaryFolder temp = new TemporaryFolder(); + private final CommandLineInvoker cli = new CommandLineInvoker( - new File("src/it/resources/war-command")); + new File("src/it/resources/war-command"), this.temp); @Test public void warCreation() throws Exception { - File war = new File("target/test-app.war"); + File war = new File(this.temp.getRoot(), "test-app.war"); Invocation invocation = this.cli.invoke("war", war.getAbsolutePath(), "war.groovy"); invocation.await(); diff --git a/spring-boot-project/spring-boot-cli/src/it/java/org/springframework/boot/cli/infrastructure/CommandLineInvoker.java b/spring-boot-project/spring-boot-cli/src/it/java/org/springframework/boot/cli/infrastructure/CommandLineInvoker.java index 0b3e14644e..3d959e5893 100644 --- a/spring-boot-project/spring-boot-cli/src/it/java/org/springframework/boot/cli/infrastructure/CommandLineInvoker.java +++ b/spring-boot-project/spring-boot-cli/src/it/java/org/springframework/boot/cli/infrastructure/CommandLineInvoker.java @@ -32,6 +32,9 @@ import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; +import org.junit.rules.TemporaryFolder; + +import org.springframework.boot.testsupport.BuildOutput; import org.springframework.util.Assert; import org.springframework.util.StreamUtils; @@ -46,12 +49,15 @@ public final class CommandLineInvoker { private final File workingDirectory; - public CommandLineInvoker() { - this(new File(".")); + private final TemporaryFolder temp; + + public CommandLineInvoker(TemporaryFolder temp) { + this(new File("."), temp); } - public CommandLineInvoker(File workingDirectory) { + public CommandLineInvoker(File workingDirectory, TemporaryFolder temp) { this.workingDirectory = workingDirectory; + this.temp = temp; } public Invocation invoke(String... args) throws IOException { @@ -69,9 +75,9 @@ public final class CommandLineInvoker { } private File findLaunchScript() throws IOException { - File unpacked = new File("target/unpacked-cli"); + File unpacked = new File(this.temp.getRoot(), "unpacked-cli"); if (!unpacked.isDirectory()) { - File zip = new File("target") + File zip = new BuildOutput(getClass()).getRootLocation() .listFiles((pathname) -> pathname.getName().endsWith("-bin.zip"))[0]; try (ZipInputStream input = new ZipInputStream(new FileInputStream(zip))) { ZipEntry entry; diff --git a/spring-boot-project/spring-boot-cli/src/test/java/org/springframework/boot/cli/CliTester.java b/spring-boot-project/spring-boot-cli/src/test/java/org/springframework/boot/cli/CliTester.java index af218ce23a..160ab7f4a5 100644 --- a/spring-boot-project/spring-boot-cli/src/test/java/org/springframework/boot/cli/CliTester.java +++ b/spring-boot-project/spring-boot-cli/src/test/java/org/springframework/boot/cli/CliTester.java @@ -32,6 +32,7 @@ import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import org.junit.Assume; +import org.junit.rules.TemporaryFolder; import org.junit.rules.TestRule; import org.junit.runner.Description; import org.junit.runners.model.Statement; @@ -42,6 +43,7 @@ import org.springframework.boot.cli.command.archive.JarCommand; import org.springframework.boot.cli.command.grab.GrabCommand; import org.springframework.boot.cli.command.run.RunCommand; import org.springframework.boot.test.rule.OutputCapture; +import org.springframework.boot.testsupport.BuildOutput; import org.springframework.util.FileCopyUtils; import org.springframework.util.StringUtils; @@ -54,6 +56,10 @@ import org.springframework.util.StringUtils; */ public class CliTester implements TestRule { + private final TemporaryFolder temp = new TemporaryFolder(); + + private final BuildOutput buildOutput = new BuildOutput(getClass()); + private final OutputCapture outputCapture = new OutputCapture(); private long timeout = TimeUnit.MINUTES.toMillis(6); @@ -62,6 +68,8 @@ public class CliTester implements TestRule { private final String prefix; + private File serverPortFile; + public CliTester(String prefix) { this.prefix = prefix; } @@ -75,14 +83,15 @@ public class CliTester implements TestRule { boolean classpathUpdated = false; for (String arg : args) { if (arg.startsWith("--classpath=")) { - arg = arg + ":" + new File("target/test-classes").getAbsolutePath(); + arg = arg + ":" + + this.buildOutput.getTestClassesLocation().getAbsolutePath(); classpathUpdated = true; } updatedArgs.add(arg); } if (!classpathUpdated) { - updatedArgs.add( - "--classpath=.:" + new File("target/test-classes").getAbsolutePath()); + updatedArgs.add("--classpath=.:" + + this.buildOutput.getTestClassesLocation().getAbsolutePath()); } Future future = submitCommand(new RunCommand(), StringUtils.toStringArray(updatedArgs)); @@ -111,8 +120,8 @@ public class CliTester implements TestRule { System.setProperty("server.port", "0"); System.setProperty("spring.application.class.name", "org.springframework.boot.cli.CliTesterSpringApplication"); - System.setProperty("portfile", - new File("target/server.port").getAbsolutePath()); + this.serverPortFile = new File(this.temp.newFolder(), "server.port"); + System.setProperty("portfile", this.serverPortFile.getAbsolutePath()); try { command.run(sources); return command; @@ -168,8 +177,9 @@ public class CliTester implements TestRule { @Override public Statement apply(Statement base, Description description) { - final Statement statement = CliTester.this.outputCapture - .apply(new RunLauncherStatement(base), description); + final Statement statement = this.temp.apply( + this.outputCapture.apply(new RunLauncherStatement(base), description), + description); return new Statement() { @Override @@ -180,6 +190,7 @@ public class CliTester implements TestRule { .contains("integration")); statement.evaluate(); } + }; } @@ -190,7 +201,7 @@ public class CliTester implements TestRule { public String getHttpOutput(String uri) { try { int port = Integer.parseInt( - FileCopyUtils.copyToString(new FileReader("target/server.port"))); + FileCopyUtils.copyToString(new FileReader(this.serverPortFile))); InputStream stream = URI.create("http://localhost:" + port + uri).toURL() .openStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(stream)); diff --git a/spring-boot-project/spring-boot-cli/src/test/java/org/springframework/boot/cli/GrabCommandIntegrationTests.java b/spring-boot-project/spring-boot-cli/src/test/java/org/springframework/boot/cli/GrabCommandIntegrationTests.java index 037246b5b6..04a25953c9 100644 --- a/spring-boot-project/spring-boot-cli/src/test/java/org/springframework/boot/cli/GrabCommandIntegrationTests.java +++ b/spring-boot-project/spring-boot-cli/src/test/java/org/springframework/boot/cli/GrabCommandIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2017 the original author or authors. + * Copyright 2012-2018 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. @@ -22,6 +22,7 @@ import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TemporaryFolder; import org.springframework.boot.cli.command.grab.GrabCommand; import org.springframework.util.FileSystemUtils; @@ -37,13 +38,15 @@ import static org.junit.Assert.fail; */ public class GrabCommandIntegrationTests { + @Rule + public TemporaryFolder temp = new TemporaryFolder(); + @Rule public CliTester cli = new CliTester("src/test/resources/grab-samples/"); @Before @After public void deleteLocalRepository() { - FileSystemUtils.deleteRecursively(new File("target/repository")); System.clearProperty("grape.root"); System.clearProperty("groovy.grape.report.downloads"); } @@ -51,13 +54,13 @@ public class GrabCommandIntegrationTests { @Test public void grab() throws Exception { - System.setProperty("grape.root", "target"); + System.setProperty("grape.root", this.temp.getRoot().getAbsolutePath()); System.setProperty("groovy.grape.report.downloads", "true"); // Use --autoconfigure=false to limit the amount of downloaded dependencies String output = this.cli.grab("grab.groovy", "--autoconfigure=false"); - assertThat(new File("target/repository/joda-time/joda-time").isDirectory()) - .isTrue(); + assertThat(new File(this.temp.getRoot(), "repository/joda-time/joda-time")) + .isDirectory(); // Should be resolved from local repository cache assertThat(output.contains("Downloading: file:")).isTrue(); } @@ -76,13 +79,12 @@ public class GrabCommandIntegrationTests { @Test public void customMetadata() throws Exception { - System.setProperty("grape.root", "target"); + System.setProperty("grape.root", this.temp.getRoot().getAbsolutePath()); + File repository = new File(this.temp.getRoot().getAbsolutePath(), "repository"); FileSystemUtils.copyRecursively( - new File("src/test/resources/grab-samples/repository"), - new File("target/repository")); + new File("src/test/resources/grab-samples/repository"), repository); this.cli.grab("customDependencyManagement.groovy", "--autoconfigure=false"); - assertThat(new File("target/repository/javax/ejb/ejb-api/3.0").isDirectory()) - .isTrue(); + assertThat(new File(repository, "javax/ejb/ejb-api/3.0")).isDirectory(); } } diff --git a/spring-boot-project/spring-boot-cli/src/test/java/org/springframework/boot/cli/command/install/InstallerTests.java b/spring-boot-project/spring-boot-cli/src/test/java/org/springframework/boot/cli/command/install/InstallerTests.java index 8a79cd7237..85c2b5add8 100644 --- a/spring-boot-project/spring-boot-cli/src/test/java/org/springframework/boot/cli/command/install/InstallerTests.java +++ b/spring-boot-project/spring-boot-cli/src/test/java/org/springframework/boot/cli/command/install/InstallerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2017 the original author or authors. + * Copyright 2012-2018 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. @@ -28,8 +28,6 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; -import org.springframework.util.FileSystemUtils; - import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.mock; @@ -50,9 +48,7 @@ public class InstallerTests { @Before public void setUp() throws IOException { - System.setProperty("spring.home", "target"); - FileSystemUtils.deleteRecursively(new File("target/lib")); - + System.setProperty("spring.home", this.tempFolder.getRoot().getAbsolutePath()); this.installer = new Installer(this.resolver); } @@ -119,7 +115,7 @@ public class InstallerTests { private Set getNamesOfFilesInLibExt() { Set names = new HashSet<>(); - for (File file : new File("target/lib/ext").listFiles()) { + for (File file : new File(this.tempFolder.getRoot(), "lib/ext").listFiles()) { names.add(file.getName()); } return names; diff --git a/spring-boot-project/spring-boot-devtools/src/test/java/org/springframework/boot/devtools/autoconfigure/DevToolsPooledDataSourceAutoConfigurationTests.java b/spring-boot-project/spring-boot-devtools/src/test/java/org/springframework/boot/devtools/autoconfigure/DevToolsPooledDataSourceAutoConfigurationTests.java index 497b84ab53..c9d2a537fa 100644 --- a/spring-boot-project/spring-boot-devtools/src/test/java/org/springframework/boot/devtools/autoconfigure/DevToolsPooledDataSourceAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-devtools/src/test/java/org/springframework/boot/devtools/autoconfigure/DevToolsPooledDataSourceAutoConfigurationTests.java @@ -16,6 +16,7 @@ package org.springframework.boot.devtools.autoconfigure; +import java.io.IOException; import java.sql.SQLException; import java.sql.Statement; @@ -23,7 +24,9 @@ import javax.sql.DataSource; import org.junit.After; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TemporaryFolder; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.context.ConfigurableApplicationContext; @@ -40,9 +43,13 @@ import static org.mockito.Mockito.verify; public class DevToolsPooledDataSourceAutoConfigurationTests extends AbstractDevToolsDataSourceAutoConfigurationTests { + @Rule + public final TemporaryFolder temp = new TemporaryFolder(); + @Before - public void before() { - System.setProperty("derby.stream.error.file", "target/derby.log"); + public void before() throws IOException { + System.setProperty("derby.stream.error.file", + this.temp.newFile("derby.log").getAbsolutePath()); } @After diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/restdocs/MockMvcRestDocsAutoConfigurationAdvancedConfigurationIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/restdocs/MockMvcRestDocsAutoConfigurationAdvancedConfigurationIntegrationTests.java index 010603cabc..54bf1cdeaf 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/restdocs/MockMvcRestDocsAutoConfigurationAdvancedConfigurationIntegrationTests.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/restdocs/MockMvcRestDocsAutoConfigurationAdvancedConfigurationIntegrationTests.java @@ -26,6 +26,7 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.boot.testsupport.BuildOutput; import org.springframework.context.annotation.Bean; import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation; import org.springframework.restdocs.mockmvc.RestDocumentationResultHandler; @@ -55,23 +56,26 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder @AutoConfigureRestDocs public class MockMvcRestDocsAutoConfigurationAdvancedConfigurationIntegrationTests { - @Before - public void deleteSnippets() { - FileSystemUtils.deleteRecursively(new File("target/generated-snippets")); - } - @Autowired private MockMvc mvc; @Autowired private RestDocumentationResultHandler documentationHandler; + private File generatedSnippets; + + @Before + public void deleteSnippets() { + this.generatedSnippets = new File(new BuildOutput(getClass()).getRootLocation(), + "generated-snippets"); + FileSystemUtils.deleteRecursively(this.generatedSnippets); + } + @Test public void snippetGeneration() throws Exception { this.mvc.perform(get("/")).andDo(this.documentationHandler.document(links( linkWithRel("self").description("Canonical location of this resource")))); - File defaultSnippetsDir = new File( - "target/generated-snippets/snippet-generation"); + File defaultSnippetsDir = new File(this.generatedSnippets, "snippet-generation"); assertThat(defaultSnippetsDir).exists(); assertThat(new File(defaultSnippetsDir, "curl-request.md")) .has(contentContaining("'http://localhost:8080/'")); diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/restdocs/MockMvcRestDocsAutoConfigurationIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/restdocs/MockMvcRestDocsAutoConfigurationIntegrationTests.java index c385376012..905230c786 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/restdocs/MockMvcRestDocsAutoConfigurationIntegrationTests.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/restdocs/MockMvcRestDocsAutoConfigurationIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2017 the original author or authors. + * Copyright 2012-2018 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. @@ -25,6 +25,7 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.testsupport.BuildOutput; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.util.FileSystemUtils; @@ -43,18 +44,22 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder @AutoConfigureRestDocs(uriScheme = "https", uriHost = "api.example.com", uriPort = 443) public class MockMvcRestDocsAutoConfigurationIntegrationTests { - @Before - public void deleteSnippets() { - FileSystemUtils.deleteRecursively(new File("target/generated-snippets")); - } - @Autowired private MockMvc mvc; + private File generatedSnippets; + + @Before + public void deleteSnippets() { + this.generatedSnippets = new File(new BuildOutput(getClass()).getRootLocation(), + "generated-snippets"); + FileSystemUtils.deleteRecursively(this.generatedSnippets); + } + @Test public void defaultSnippetsAreWritten() throws Exception { this.mvc.perform(get("/")).andDo(document("default-snippets")); - File defaultSnippetsDir = new File("target/generated-snippets/default-snippets"); + File defaultSnippetsDir = new File(this.generatedSnippets, "default-snippets"); assertThat(defaultSnippetsDir).exists(); assertThat(new File(defaultSnippetsDir, "curl-request.adoc")) .has(contentContaining("'https://api.example.com/'")); diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/restdocs/RestAssuredRestDocsAutoConfigurationAdvancedConfigurationIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/restdocs/RestAssuredRestDocsAutoConfigurationAdvancedConfigurationIntegrationTests.java index c4f1dd846f..ce00d5bc7e 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/restdocs/RestAssuredRestDocsAutoConfigurationAdvancedConfigurationIntegrationTests.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/restdocs/RestAssuredRestDocsAutoConfigurationAdvancedConfigurationIntegrationTests.java @@ -28,6 +28,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.boot.testsupport.BuildOutput; import org.springframework.boot.web.server.LocalServerPort; import org.springframework.context.annotation.Bean; import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation; @@ -59,14 +60,18 @@ public class RestAssuredRestDocsAutoConfigurationAdvancedConfigurationIntegratio @LocalServerPort private int port; - @Before - public void deleteSnippets() { - FileSystemUtils.deleteRecursively(new File("target/generated-snippets")); - } - @Autowired private RequestSpecification documentationSpec; + private File generatedSnippets; + + @Before + public void deleteSnippets() { + this.generatedSnippets = new File(new BuildOutput(getClass()).getRootLocation(), + "generated-snippets"); + FileSystemUtils.deleteRecursively(this.generatedSnippets); + } + @Test public void snippetGeneration() { given(this.documentationSpec) @@ -74,7 +79,7 @@ public class RestAssuredRestDocsAutoConfigurationAdvancedConfigurationIntegratio preprocessRequest(modifyUris().scheme("https") .host("api.example.com").removePort()))) .when().port(this.port).get("/").then().assertThat().statusCode(is(200)); - File defaultSnippetsDir = new File("target/generated-snippets/default-snippets"); + File defaultSnippetsDir = new File(this.generatedSnippets, "default-snippets"); assertThat(defaultSnippetsDir).exists(); assertThat(new File(defaultSnippetsDir, "curl-request.md")) .has(contentContaining("'https://api.example.com/'")); diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/restdocs/RestAssuredRestDocsAutoConfigurationIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/restdocs/RestAssuredRestDocsAutoConfigurationIntegrationTests.java index 204b53f227..cd77333c13 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/restdocs/RestAssuredRestDocsAutoConfigurationIntegrationTests.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/restdocs/RestAssuredRestDocsAutoConfigurationIntegrationTests.java @@ -27,6 +27,7 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.testsupport.BuildOutput; import org.springframework.boot.web.server.LocalServerPort; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.util.FileSystemUtils; @@ -51,14 +52,18 @@ public class RestAssuredRestDocsAutoConfigurationIntegrationTests { @LocalServerPort private int port; - @Before - public void deleteSnippets() { - FileSystemUtils.deleteRecursively(new File("target/generated-snippets")); - } - @Autowired private RequestSpecification documentationSpec; + private File generatedSnippets; + + @Before + public void deleteSnippets() { + this.generatedSnippets = new File(new BuildOutput(getClass()).getRootLocation(), + "generated-snippets"); + FileSystemUtils.deleteRecursively(this.generatedSnippets); + } + @Test public void defaultSnippetsAreWritten() { given(this.documentationSpec) @@ -66,7 +71,7 @@ public class RestAssuredRestDocsAutoConfigurationIntegrationTests { preprocessRequest(modifyUris().scheme("https") .host("api.example.com").removePort()))) .when().port(this.port).get("/").then().assertThat().statusCode(is(200)); - File defaultSnippetsDir = new File("target/generated-snippets/default-snippets"); + File defaultSnippetsDir = new File(this.generatedSnippets, "default-snippets"); assertThat(defaultSnippetsDir).exists(); assertThat(new File(defaultSnippetsDir, "curl-request.adoc")) .has(contentContaining("'https://api.example.com/'")); diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/restdocs/WebTestClientRestDocsAutoConfigurationAdvancedConfigurationIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/restdocs/WebTestClientRestDocsAutoConfigurationAdvancedConfigurationIntegrationTests.java index 93d77fe0b9..7301b7c58f 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/restdocs/WebTestClientRestDocsAutoConfigurationAdvancedConfigurationIntegrationTests.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/restdocs/WebTestClientRestDocsAutoConfigurationAdvancedConfigurationIntegrationTests.java @@ -26,6 +26,7 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest; import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.boot.testsupport.BuildOutput; import org.springframework.context.annotation.Bean; import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation; import org.springframework.restdocs.mockmvc.RestDocumentationResultHandler; @@ -51,19 +52,23 @@ import static org.springframework.restdocs.webtestclient.WebTestClientRestDocume @AutoConfigureRestDocs(uriScheme = "https", uriHost = "api.example.com", uriPort = 443) public class WebTestClientRestDocsAutoConfigurationAdvancedConfigurationIntegrationTests { - @Before - public void deleteSnippets() { - FileSystemUtils.deleteRecursively(new File("target/generated-snippets")); - } - @Autowired private WebTestClient webTestClient; + private File generatedSnippets; + + @Before + public void deleteSnippets() { + this.generatedSnippets = new File(new BuildOutput(getClass()).getRootLocation(), + "generated-snippets"); + FileSystemUtils.deleteRecursively(this.generatedSnippets); + } + @Test public void defaultSnippetsAreWritten() throws Exception { this.webTestClient.get().uri("/").exchange().expectStatus().is2xxSuccessful() .expectBody().consumeWith(document("default-snippets")); - File defaultSnippetsDir = new File("target/generated-snippets/default-snippets"); + File defaultSnippetsDir = new File(this.generatedSnippets, "default-snippets"); assertThat(defaultSnippetsDir).exists(); assertThat(new File(defaultSnippetsDir, "curl-request.md")) .has(contentContaining("'https://api.example.com/'")); diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/restdocs/WebTestClientRestDocsAutoConfigurationIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/restdocs/WebTestClientRestDocsAutoConfigurationIntegrationTests.java index bbf8689b08..f98c46f817 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/restdocs/WebTestClientRestDocsAutoConfigurationIntegrationTests.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/restdocs/WebTestClientRestDocsAutoConfigurationIntegrationTests.java @@ -25,6 +25,7 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest; +import org.springframework.boot.testsupport.BuildOutput; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.reactive.server.WebTestClient; @@ -44,19 +45,23 @@ import static org.springframework.restdocs.webtestclient.WebTestClientRestDocume @AutoConfigureRestDocs(uriScheme = "https", uriHost = "api.example.com", uriPort = 443) public class WebTestClientRestDocsAutoConfigurationIntegrationTests { - @Before - public void deleteSnippets() { - FileSystemUtils.deleteRecursively(new File("target/generated-snippets")); - } - @Autowired private WebTestClient webTestClient; + private File generatedSnippets; + + @Before + public void deleteSnippets() { + this.generatedSnippets = new File(new BuildOutput(getClass()).getRootLocation(), + "generated-snippets"); + FileSystemUtils.deleteRecursively(this.generatedSnippets); + } + @Test public void defaultSnippetsAreWritten() throws Exception { this.webTestClient.get().uri("/").exchange().expectStatus().is2xxSuccessful() .expectBody().consumeWith(document("default-snippets")); - File defaultSnippetsDir = new File("target/generated-snippets/default-snippets"); + File defaultSnippetsDir = new File(this.generatedSnippets, "default-snippets"); assertThat(defaultSnippetsDir).exists(); assertThat(new File(defaultSnippetsDir, "curl-request.adoc")) .has(contentContaining("'https://api.example.com/'")); diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader-tools/src/test/java/org/springframework/boot/loader/tools/FileUtilsTests.java b/spring-boot-project/spring-boot-tools/spring-boot-loader-tools/src/test/java/org/springframework/boot/loader/tools/FileUtilsTests.java index 130bb63862..acd0f8caad 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader-tools/src/test/java/org/springframework/boot/loader/tools/FileUtilsTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-loader-tools/src/test/java/org/springframework/boot/loader/tools/FileUtilsTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2017 the original author or authors. + * Copyright 2012-2018 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. @@ -46,9 +46,9 @@ public class FileUtilsTests { private File originDirectory; @Before - public void init() { - this.outputDirectory = new File("target/test/remove"); - this.originDirectory = new File("target/test/keep"); + public void init() throws IOException { + this.outputDirectory = this.temporaryFolder.newFolder("remove"); + this.originDirectory = this.temporaryFolder.newFolder("keep"); FileSystemUtils.deleteRecursively(this.outputDirectory); FileSystemUtils.deleteRecursively(this.originDirectory); this.outputDirectory.mkdirs(); diff --git a/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/BuildOutput.java b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/BuildOutput.java new file mode 100644 index 0000000000..c6163cd336 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/BuildOutput.java @@ -0,0 +1,81 @@ +/* + * Copyright 2012-2018 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 + * + * http://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.testsupport; + +import java.io.File; +import java.net.URISyntaxException; + +/** + * Provides access to build output locations in a build system and IDE agnostic manner. + * + * @author Andy Wilkinson + */ +public class BuildOutput { + + private final Class testClass; + + public BuildOutput(Class testClass) { + this.testClass = testClass; + } + + /** + * Returns the location into which test classes have been built. + * @return test classes location + */ + public File getTestClassesLocation() { + try { + File location = new File(this.testClass.getProtectionDomain().getCodeSource() + .getLocation().toURI()); + if (location.getPath().endsWith(path("target", "test-classes"))) { + return location; + } + throw new IllegalStateException( + "Unexpected test classes location '" + location + "'"); + } + catch (URISyntaxException ex) { + throw new IllegalStateException("Invalid test class code source location", + ex); + } + } + + /** + * Returns the location into which test resources have been built. + * @return test resources location + */ + public File getTestResourcesLocation() { + File testClassesLocation = getTestClassesLocation(); + if (testClassesLocation.getPath().endsWith(path("target", "test-classes"))) { + return testClassesLocation; + } + throw new IllegalStateException( + "Cannot determine test resources location from classes location '" + + testClassesLocation + "'"); + } + + /** + * Returns the root location into which build output is written. + * @return root location + */ + public File getRootLocation() { + return getTestClassesLocation().getParentFile(); + } + + private String path(String... components) { + return File.separator + String.join(File.separator, components); + } + +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/context/AbstractConfigurationClassTests.java b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/context/AbstractConfigurationClassTests.java index c635ccb944..ff0e0cb37a 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/context/AbstractConfigurationClassTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/context/AbstractConfigurationClassTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2017 the original author or authors. + * Copyright 2012-2018 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. @@ -16,7 +16,6 @@ package org.springframework.boot.testsupport.context; -import java.io.File; import java.io.IOException; import java.util.HashSet; import java.util.Set; @@ -25,6 +24,7 @@ import org.junit.Test; import org.springframework.asm.Opcodes; import org.springframework.beans.DirectFieldAccessor; +import org.springframework.boot.testsupport.BuildOutput; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.Resource; @@ -44,6 +44,8 @@ import static org.assertj.core.api.Assertions.assertThat; */ public abstract class AbstractConfigurationClassTests { + private final BuildOutput buildOutput = new BuildOutput(getClass()); + private ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); @Test @@ -83,7 +85,7 @@ public abstract class AbstractConfigurationClassTests { private boolean isTestClass(Resource resource) throws IOException { return resource.getFile().getAbsolutePath() - .contains("target" + File.separator + "test-classes"); + .startsWith(this.buildOutput.getTestClassesLocation().getAbsolutePath()); } private boolean isPublic(MethodMetadata methodMetadata) { diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigFileApplicationListenerTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigFileApplicationListenerTests.java index 53d241826c..f3c77d28b6 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigFileApplicationListenerTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigFileApplicationListenerTests.java @@ -43,6 +43,7 @@ import org.springframework.boot.WebApplicationType; import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent; import org.springframework.boot.context.event.ApplicationPreparedEvent; import org.springframework.boot.env.EnvironmentPostProcessor; +import org.springframework.boot.testsupport.BuildOutput; import org.springframework.boot.testsupport.rule.OutputCapture; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; @@ -73,6 +74,8 @@ import static org.assertj.core.api.Assertions.assertThat; */ public class ConfigFileApplicationListenerTests { + private final BuildOutput buildOutput = new BuildOutput(getClass()); + private final StandardEnvironment environment = new StandardEnvironment(); private final SpringApplication application = new SpringApplication(); @@ -486,8 +489,9 @@ public class ConfigFileApplicationListenerTests { String suffix = (profile != null) ? "-" + profile : ""; String string = ".properties)"; return "Loaded config file '" - + new File("target/test-classes/application" + suffix + ".properties") - .getAbsoluteFile().toURI().toString() + + new File(this.buildOutput.getTestResourcesLocation(), + "application" + suffix + ".properties").getAbsoluteFile().toURI() + .toString() + "' (classpath:/application" + suffix + string; } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/logging/LoggingApplicationListenerTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/logging/LoggingApplicationListenerTests.java index cd59e5eea7..1a951789b0 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/logging/LoggingApplicationListenerTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/logging/LoggingApplicationListenerTests.java @@ -33,6 +33,7 @@ import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TemporaryFolder; import org.junit.runner.RunWith; import org.slf4j.bridge.SLF4JBridgeHandler; import org.slf4j.impl.StaticLoggerBinder; @@ -88,6 +89,9 @@ public class LoggingApplicationListenerTests { @Rule public OutputCapture outputCapture = new OutputCapture(); + @Rule + public final TemporaryFolder temp = new TemporaryFolder(); + private final LoggingApplicationListener initializer = new LoggingApplicationListener(); private final LoggerContext loggerContext = (LoggerContext) StaticLoggerBinder @@ -100,12 +104,14 @@ public class LoggingApplicationListenerTests { private final GenericApplicationContext context = new GenericApplicationContext(); + private File logFile; + @Before public void init() throws SecurityException, IOException { LogManager.getLogManager().readConfiguration( JavaLoggingSystem.class.getResourceAsStream("logging.properties")); multicastEvent(new ApplicationStartingEvent(new SpringApplication(), NO_ARGS)); - new File("target/foo.log").delete(); + this.logFile = new File(this.temp.getRoot(), "foo.log"); new File(tmpDir() + "/spring.log").delete(); ConfigurableEnvironment environment = this.context.getEnvironment(); ConfigurationPropertySources.attach(environment); @@ -216,7 +222,7 @@ public class LoggingApplicationListenerTests { public void addLogFileProperty() { TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.context, "logging.config=classpath:logback-nondefault.xml", - "logging.file.name=target/foo.log"); + "logging.file.name=" + this.logFile); this.initializer.initialize(this.context.getEnvironment(), this.context.getClassLoader()); Log logger = LogFactory.getLog(LoggingApplicationListenerTests.class); @@ -224,7 +230,7 @@ public class LoggingApplicationListenerTests { logger.info("Hello world"); String output = this.outputCapture.toString().substring(existingOutput.length()) .trim(); - assertThat(output).startsWith("target/foo.log"); + assertThat(output).startsWith(this.logFile.getAbsolutePath()); } @Test @@ -232,7 +238,7 @@ public class LoggingApplicationListenerTests { public void addLogFilePropertyWithDeprecatedProperty() { TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.context, "logging.config=classpath:logback-nondefault.xml", - "logging.file=target/foo.log"); + "logging.file=" + this.logFile); this.initializer.initialize(this.context.getEnvironment(), this.context.getClassLoader()); Log logger = LogFactory.getLog(LoggingApplicationListenerTests.class); @@ -240,39 +246,39 @@ public class LoggingApplicationListenerTests { logger.info("Hello world"); String output = this.outputCapture.toString().substring(existingOutput.length()) .trim(); - assertThat(output).startsWith("target/foo.log"); + assertThat(output).startsWith(this.logFile.getAbsolutePath()); } @Test public void addLogFilePropertyWithDefault() { - assertThat(new File("target/foo.log").exists()).isFalse(); + assertThat(this.logFile).doesNotExist(); TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.context, - "logging.file.name=target/foo.log"); + "logging.file.name=" + this.logFile); this.initializer.initialize(this.context.getEnvironment(), this.context.getClassLoader()); Log logger = LogFactory.getLog(LoggingApplicationListenerTests.class); logger.info("Hello world"); - assertThat(new File("target/foo.log").exists()).isTrue(); + assertThat(this.logFile).isFile(); } @Test @Deprecated public void addLogFilePropertyWithDefaultAndDeprecatedProperty() { - assertThat(new File("target/foo.log").exists()).isFalse(); + assertThat(this.logFile).doesNotExist(); TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.context, - "logging.file=target/foo.log"); + "logging.file=" + this.logFile); this.initializer.initialize(this.context.getEnvironment(), this.context.getClassLoader()); Log logger = LogFactory.getLog(LoggingApplicationListenerTests.class); logger.info("Hello world"); - assertThat(new File("target/foo.log").exists()).isTrue(); + assertThat(this.logFile).isFile(); } @Test public void addLogPathProperty() { TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.context, "logging.config=classpath:logback-nondefault.xml", - "logging.file.path=target/foo/"); + "logging.file.path=" + this.logFile); this.initializer.initialize(this.context.getEnvironment(), this.context.getClassLoader()); Log logger = LogFactory.getLog(LoggingApplicationListenerTests.class); @@ -280,14 +286,14 @@ public class LoggingApplicationListenerTests { logger.info("Hello world"); String output = this.outputCapture.toString().substring(existingOutput.length()) .trim(); - assertThat(output).startsWith("target/foo/spring.log"); + assertThat(output).startsWith(this.logFile.getAbsolutePath()); } @Test public void addLogPathPropertyWithDeprecatedProperty() { TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.context, "logging.config=classpath:logback-nondefault.xml", - "logging.path=target/foo/"); + "logging.path=" + this.temp.getRoot()); this.initializer.initialize(this.context.getEnvironment(), this.context.getClassLoader()); Log logger = LogFactory.getLog(LoggingApplicationListenerTests.class); @@ -295,7 +301,8 @@ public class LoggingApplicationListenerTests { logger.info("Hello world"); String output = this.outputCapture.toString().substring(existingOutput.length()) .trim(); - assertThat(output).startsWith("target/foo/spring.log"); + assertThat(output).startsWith( + new File(this.temp.getRoot(), "spring.log").getAbsolutePath()); } @Test @@ -539,7 +546,7 @@ public class LoggingApplicationListenerTests { public void systemPropertiesAreSetForLoggingConfiguration() { TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.context, "logging.exception-conversion-word=conversion", - "logging.file.name=target/log", "logging.file.path=path", + "logging.file.name=" + this.logFile, "logging.file.path=path", "logging.pattern.console=console", "logging.pattern.file=file", "logging.pattern.level=level"); this.initializer.initialize(this.context.getEnvironment(), @@ -551,7 +558,7 @@ public class LoggingApplicationListenerTests { assertThat(System.getProperty(LoggingSystemProperties.EXCEPTION_CONVERSION_WORD)) .isEqualTo("conversion"); assertThat(System.getProperty(LoggingSystemProperties.LOG_FILE)) - .isEqualTo("target/log"); + .isEqualTo(this.logFile.getAbsolutePath()); assertThat(System.getProperty(LoggingSystemProperties.LOG_LEVEL_PATTERN)) .isEqualTo("level"); assertThat(System.getProperty(LoggingSystemProperties.LOG_PATH)) @@ -563,11 +570,11 @@ public class LoggingApplicationListenerTests { @Deprecated public void systemPropertiesAreSetForLoggingConfigurationWithDeprecatedProperties() { TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.context, - "logging.file=target/log", "logging.path=path"); + "logging.file=" + this.logFile, "logging.path=path"); this.initializer.initialize(this.context.getEnvironment(), this.context.getClassLoader()); assertThat(System.getProperty(LoggingSystemProperties.LOG_FILE)) - .isEqualTo("target/log"); + .isEqualTo(this.logFile.getAbsolutePath()); assertThat(System.getProperty(LoggingSystemProperties.LOG_PATH)) .isEqualTo("path"); } @@ -597,11 +604,13 @@ public class LoggingApplicationListenerTests { @Test public void logFilePropertiesCanReferenceSystemProperties() { TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.context, - "logging.file.name=target/${PID}.log"); + "logging.file.name=" + this.temp.getRoot().getAbsolutePath() + + "${PID}.log"); this.initializer.initialize(this.context.getEnvironment(), this.context.getClassLoader()); assertThat(System.getProperty(LoggingSystemProperties.LOG_FILE)) - .isEqualTo("target/" + new ApplicationPid().toString() + ".log"); + .isEqualTo(this.temp.getRoot().getAbsolutePath() + + new ApplicationPid().toString() + ".log"); } @Test diff --git a/spring-boot-samples/spring-boot-sample-integration/src/main/java/sample/integration/SampleCommandLineRunner.java b/spring-boot-samples/spring-boot-sample-integration/src/main/java/sample/integration/SampleApplicationRunner.java similarity index 66% rename from spring-boot-samples/spring-boot-sample-integration/src/main/java/sample/integration/SampleCommandLineRunner.java rename to spring-boot-samples/spring-boot-sample-integration/src/main/java/sample/integration/SampleApplicationRunner.java index 1ec5db2d13..f497fead4c 100644 --- a/spring-boot-samples/spring-boot-sample-integration/src/main/java/sample/integration/SampleCommandLineRunner.java +++ b/spring-boot-samples/spring-boot-sample-integration/src/main/java/sample/integration/SampleApplicationRunner.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2016 the original author or authors. + * Copyright 2012-2018 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. @@ -16,21 +16,22 @@ package sample.integration; -import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; import org.springframework.stereotype.Component; @Component -public class SampleCommandLineRunner implements CommandLineRunner { +public class SampleApplicationRunner implements ApplicationRunner { private final SampleMessageGateway gateway; - public SampleCommandLineRunner(SampleMessageGateway gateway) { + public SampleApplicationRunner(SampleMessageGateway gateway) { this.gateway = gateway; } @Override - public void run(String... args) throws Exception { - for (String arg : args) { + public void run(ApplicationArguments args) throws Exception { + for (String arg : args.getNonOptionArgs()) { this.gateway.echo(arg); } } diff --git a/spring-boot-samples/spring-boot-sample-integration/src/main/java/sample/integration/SampleIntegrationApplication.java b/spring-boot-samples/spring-boot-sample-integration/src/main/java/sample/integration/SampleIntegrationApplication.java index 54e4327f51..c3804beb46 100644 --- a/spring-boot-samples/spring-boot-sample-integration/src/main/java/sample/integration/SampleIntegrationApplication.java +++ b/spring-boot-samples/spring-boot-sample-integration/src/main/java/sample/integration/SampleIntegrationApplication.java @@ -16,7 +16,6 @@ package sample.integration; -import java.io.File; import java.util.function.Consumer; import org.springframework.boot.SpringApplication; @@ -35,10 +34,16 @@ import org.springframework.integration.file.FileWritingMessageHandler; @EnableConfigurationProperties(ServiceProperties.class) public class SampleIntegrationApplication { + private final ServiceProperties serviceProperties; + + public SampleIntegrationApplication(ServiceProperties serviceProperties) { + this.serviceProperties = serviceProperties; + } + @Bean public FileReadingMessageSource fileReader() { FileReadingMessageSource reader = new FileReadingMessageSource(); - reader.setDirectory(new File("target/input")); + reader.setDirectory(this.serviceProperties.getInputDir()); return reader; } @@ -55,7 +60,7 @@ public class SampleIntegrationApplication { @Bean public FileWritingMessageHandler fileWriter() { FileWritingMessageHandler writer = new FileWritingMessageHandler( - new File("target/output")); + this.serviceProperties.getOutputDir()); writer.setExpectReply(false); return writer; } diff --git a/spring-boot-samples/spring-boot-sample-integration/src/main/java/sample/integration/ServiceProperties.java b/spring-boot-samples/spring-boot-sample-integration/src/main/java/sample/integration/ServiceProperties.java index 1b472cc44a..fbf701e449 100644 --- a/spring-boot-samples/spring-boot-sample-integration/src/main/java/sample/integration/ServiceProperties.java +++ b/spring-boot-samples/spring-boot-sample-integration/src/main/java/sample/integration/ServiceProperties.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2014 the original author or authors. + * Copyright 2012-2018 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. @@ -16,6 +16,8 @@ package sample.integration; +import java.io.File; + import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.jmx.export.annotation.ManagedAttribute; import org.springframework.jmx.export.annotation.ManagedResource; @@ -26,6 +28,10 @@ public class ServiceProperties { private String greeting = "Hello"; + private File inputDir; + + private File outputDir; + @ManagedAttribute public String getGreeting() { return this.greeting; @@ -35,4 +41,20 @@ public class ServiceProperties { this.greeting = greeting; } + public File getInputDir() { + return this.inputDir; + } + + public void setInputDir(File inputDir) { + this.inputDir = inputDir; + } + + public File getOutputDir() { + return this.outputDir; + } + + public void setOutputDir(File outputDir) { + this.outputDir = outputDir; + } + } diff --git a/spring-boot-samples/spring-boot-sample-integration/src/main/resources/application.properties b/spring-boot-samples/spring-boot-sample-integration/src/main/resources/application.properties index cac3e48600..e5641a4620 100644 --- a/spring-boot-samples/spring-boot-sample-integration/src/main/resources/application.properties +++ b/spring-boot-samples/spring-boot-sample-integration/src/main/resources/application.properties @@ -1,2 +1,4 @@ logging.level.org.springframework.integration.file=DEBUG service.greeting=Hello +service.input-dir=input +service.output-dir=output diff --git a/spring-boot-samples/spring-boot-sample-integration/src/test/java/sample/integration/consumer/SampleIntegrationApplicationTests.java b/spring-boot-samples/spring-boot-sample-integration/src/test/java/sample/integration/consumer/SampleIntegrationApplicationTests.java index cf4441730c..4eef61fe56 100644 --- a/spring-boot-samples/spring-boot-sample-integration/src/test/java/sample/integration/consumer/SampleIntegrationApplicationTests.java +++ b/spring-boot-samples/spring-boot-sample-integration/src/test/java/sample/integration/consumer/SampleIntegrationApplicationTests.java @@ -25,9 +25,11 @@ import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import org.junit.After; -import org.junit.Before; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TemporaryFolder; import sample.integration.SampleIntegrationApplication; +import sample.integration.ServiceProperties; import sample.integration.producer.ProducerApplication; import org.springframework.boot.SpringApplication; @@ -35,7 +37,6 @@ import org.springframework.context.ConfigurableApplicationContext; import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core.io.Resource; import org.springframework.core.io.support.ResourcePatternUtils; -import org.springframework.util.FileSystemUtils; import org.springframework.util.StreamUtils; import static org.assertj.core.api.Assertions.assertThat; @@ -48,20 +49,11 @@ import static org.assertj.core.api.Assertions.assertThat; */ public class SampleIntegrationApplicationTests { + @Rule + public final TemporaryFolder temp = new TemporaryFolder(); + private ConfigurableApplicationContext context; - @Before - public void deleteInputAndOutput() { - deleteIfExists(new File("target/input")); - deleteIfExists(new File("target/output")); - } - - private void deleteIfExists(File directory) { - if (directory.exists()) { - assertThat(FileSystemUtils.deleteRecursively(directory)).isTrue(); - } - } - @After public void stop() { if (this.context != null) { @@ -71,29 +63,37 @@ public class SampleIntegrationApplicationTests { @Test public void testVanillaExchange() throws Exception { - this.context = SpringApplication.run(SampleIntegrationApplication.class); - SpringApplication.run(ProducerApplication.class, "World"); - String output = getOutput(); + File inputDir = new File(this.temp.getRoot(), "input"); + File outputDir = new File(this.temp.getRoot(), "output"); + this.context = SpringApplication.run(SampleIntegrationApplication.class, + "--service.input-dir=" + inputDir, "--service.output-dir=" + outputDir); + SpringApplication.run(ProducerApplication.class, "World", + "--service.input-dir=" + inputDir, "--service.output-dir=" + outputDir); + String output = getOutput(outputDir); assertThat(output).contains("Hello World"); } @Test public void testMessageGateway() throws Exception { + File inputDir = new File(this.temp.getRoot(), "input"); + File outputDir = new File(this.temp.getRoot(), "output"); this.context = SpringApplication.run(SampleIntegrationApplication.class, - "testviamg"); - String output = getOutput(); + "testviamg", "--service.input-dir=" + inputDir, + "--service.output-dir=" + outputDir); + String output = getOutput( + this.context.getBean(ServiceProperties.class).getOutputDir()); assertThat(output).contains("testviamg"); } - private String getOutput() throws Exception { + private String getOutput(File outputDir) throws Exception { Future future = Executors.newSingleThreadExecutor() .submit(new Callable() { @Override public String call() throws Exception { - Resource[] resources = getResourcesWithContent(); + Resource[] resources = getResourcesWithContent(outputDir); while (resources.length == 0) { Thread.sleep(200); - resources = getResourcesWithContent(); + resources = getResourcesWithContent(outputDir); } StringBuilder builder = new StringBuilder(); for (Resource resource : resources) { @@ -108,10 +108,10 @@ public class SampleIntegrationApplicationTests { return future.get(30, TimeUnit.SECONDS); } - private Resource[] getResourcesWithContent() throws IOException { + private Resource[] getResourcesWithContent(File outputDir) throws IOException { Resource[] candidates = ResourcePatternUtils .getResourcePatternResolver(new DefaultResourceLoader()) - .getResources("file:target/output/**"); + .getResources("file:" + outputDir.getAbsolutePath() + "/**"); for (Resource candidate : candidates) { if ((candidate.getFilename() != null && candidate.getFilename().endsWith(".writing")) diff --git a/spring-boot-samples/spring-boot-sample-integration/src/test/java/sample/integration/producer/ProducerApplication.java b/spring-boot-samples/spring-boot-sample-integration/src/test/java/sample/integration/producer/ProducerApplication.java index e933cf3b88..6ab1c1d6b5 100644 --- a/spring-boot-samples/spring-boot-sample-integration/src/test/java/sample/integration/producer/ProducerApplication.java +++ b/spring-boot-samples/spring-boot-sample-integration/src/test/java/sample/integration/producer/ProducerApplication.java @@ -19,20 +19,32 @@ package sample.integration.producer; import java.io.File; import java.io.FileOutputStream; -import org.springframework.boot.CommandLineRunner; +import sample.integration.ServiceProperties; + +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; import org.springframework.boot.SpringApplication; +import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Configuration; @Configuration -public class ProducerApplication implements CommandLineRunner { +@EnableConfigurationProperties(ServiceProperties.class) +public class ProducerApplication implements ApplicationRunner { + + private final ServiceProperties serviceProperties; + + public ProducerApplication(ServiceProperties serviceProperties) { + this.serviceProperties = serviceProperties; + } @Override - public void run(String... args) throws Exception { - new File("target/input").mkdirs(); - if (args.length > 0) { + public void run(ApplicationArguments args) throws Exception { + this.serviceProperties.getInputDir().mkdirs(); + if (args.getNonOptionArgs().size() > 0) { FileOutputStream stream = new FileOutputStream( - "target/input/data" + System.currentTimeMillis() + ".txt"); - for (String arg : args) { + new File(this.serviceProperties.getInputDir(), + "data" + System.currentTimeMillis() + ".txt")); + for (String arg : args.getNonOptionArgs()) { stream.write(arg.getBytes()); } stream.flush(); diff --git a/spring-boot-samples/spring-boot-sample-parent-context/src/main/java/sample/parent/SampleParentContextApplication.java b/spring-boot-samples/spring-boot-sample-parent-context/src/main/java/sample/parent/SampleParentContextApplication.java index 2b0f879a49..43d38d4cf1 100644 --- a/spring-boot-samples/spring-boot-sample-parent-context/src/main/java/sample/parent/SampleParentContextApplication.java +++ b/spring-boot-samples/spring-boot-sample-parent-context/src/main/java/sample/parent/SampleParentContextApplication.java @@ -16,7 +16,6 @@ package sample.parent; -import java.io.File; import java.util.function.Consumer; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; @@ -33,7 +32,6 @@ import org.springframework.integration.file.FileReadingMessageSource; import org.springframework.integration.file.FileWritingMessageHandler; @SpringBootApplication -@EnableConfigurationProperties(ServiceProperties.class) public class SampleParentContextApplication { public static void main(String[] args) throws Exception { @@ -42,12 +40,19 @@ public class SampleParentContextApplication { } @EnableAutoConfiguration + @EnableConfigurationProperties(ServiceProperties.class) protected static class Parent { + private final ServiceProperties serviceProperties; + + public Parent(ServiceProperties serviceProperties) { + this.serviceProperties = serviceProperties; + } + @Bean public FileReadingMessageSource fileReader() { FileReadingMessageSource reader = new FileReadingMessageSource(); - reader.setDirectory(new File("target/input")); + reader.setDirectory(this.serviceProperties.getInputDir()); return reader; } @@ -64,7 +69,7 @@ public class SampleParentContextApplication { @Bean public FileWritingMessageHandler fileWriter() { FileWritingMessageHandler writer = new FileWritingMessageHandler( - new File("target/output")); + this.serviceProperties.getOutputDir()); writer.setExpectReply(false); return writer; } diff --git a/spring-boot-samples/spring-boot-sample-parent-context/src/main/java/sample/parent/ServiceProperties.java b/spring-boot-samples/spring-boot-sample-parent-context/src/main/java/sample/parent/ServiceProperties.java index b548158989..a044ae4fc8 100644 --- a/spring-boot-samples/spring-boot-sample-parent-context/src/main/java/sample/parent/ServiceProperties.java +++ b/spring-boot-samples/spring-boot-sample-parent-context/src/main/java/sample/parent/ServiceProperties.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2014 the original author or authors. + * Copyright 2012-2018 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. @@ -16,6 +16,8 @@ package sample.parent; +import java.io.File; + import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.jmx.export.annotation.ManagedAttribute; import org.springframework.jmx.export.annotation.ManagedResource; @@ -26,6 +28,10 @@ public class ServiceProperties { private String greeting = "Hello"; + private File inputDir; + + private File outputDir; + @ManagedAttribute public String getGreeting() { return this.greeting; @@ -35,4 +41,20 @@ public class ServiceProperties { this.greeting = greeting; } + public File getInputDir() { + return this.inputDir; + } + + public void setInputDir(File inputDir) { + this.inputDir = inputDir; + } + + public File getOutputDir() { + return this.outputDir; + } + + public void setOutputDir(File outputDir) { + this.outputDir = outputDir; + } + } diff --git a/spring-boot-samples/spring-boot-sample-parent-context/src/main/resources/application.properties b/spring-boot-samples/spring-boot-sample-parent-context/src/main/resources/application.properties index 503d925fb6..de0b14e6de 100644 --- a/spring-boot-samples/spring-boot-sample-parent-context/src/main/resources/application.properties +++ b/spring-boot-samples/spring-boot-sample-parent-context/src/main/resources/application.properties @@ -1 +1,3 @@ service.greeting=Hello +service.input-dir=input +service.output-dir=output diff --git a/spring-boot-samples/spring-boot-sample-parent-context/src/test/java/sample/parent/consumer/SampleIntegrationParentApplicationTests.java b/spring-boot-samples/spring-boot-sample-parent-context/src/test/java/sample/parent/consumer/SampleIntegrationParentApplicationTests.java index ba852c2835..71bc49b74d 100644 --- a/spring-boot-samples/spring-boot-sample-parent-context/src/test/java/sample/parent/consumer/SampleIntegrationParentApplicationTests.java +++ b/spring-boot-samples/spring-boot-sample-parent-context/src/test/java/sample/parent/consumer/SampleIntegrationParentApplicationTests.java @@ -16,11 +16,12 @@ package sample.parent.consumer; +import java.io.File; import java.io.IOException; -import org.junit.AfterClass; -import org.junit.BeforeClass; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TemporaryFolder; import sample.parent.SampleParentContextApplication; import sample.parent.producer.ProducerApplication; @@ -41,34 +42,41 @@ import static org.junit.Assert.fail; */ public class SampleIntegrationParentApplicationTests { - private static ConfigurableApplicationContext context; - - @BeforeClass - public static void start() { - context = SpringApplication.run(SampleParentContextApplication.class); - } - - @AfterClass - public static void stop() { - if (context != null) { - context.close(); - } - } + @Rule + public final TemporaryFolder temp = new TemporaryFolder(); @Test public void testVanillaExchange() throws Exception { - SpringApplication.run(ProducerApplication.class, "World"); - awaitOutputContaining("Hello World"); + File inputDir = new File(this.temp.getRoot(), "input"); + File outputDir = new File(this.temp.getRoot(), "output"); + ConfigurableApplicationContext app = SpringApplication.run( + SampleParentContextApplication.class, "--service.input-dir=" + inputDir, + "--service.output-dir=" + outputDir); + try { + ConfigurableApplicationContext producer = SpringApplication.run( + ProducerApplication.class, "--service.input-dir=" + inputDir, + "--service.output-dir=" + outputDir, "World"); + try { + awaitOutputContaining(outputDir, "Hello World"); + } + finally { + producer.close(); + } + } + finally { + app.close(); + } } - private void awaitOutputContaining(String requiredContents) throws Exception { + private void awaitOutputContaining(File outputDir, String requiredContents) + throws Exception { long endTime = System.currentTimeMillis() + 30000; String output = null; while (System.currentTimeMillis() < endTime) { - Resource[] resources = findResources(); + Resource[] resources = findResources(outputDir); if (resources.length == 0) { Thread.sleep(200); - resources = findResources(); + resources = findResources(outputDir); } else { output = readResources(resources); @@ -85,10 +93,10 @@ public class SampleIntegrationParentApplicationTests { + "'. Output was '" + output + "'"); } - private Resource[] findResources() throws IOException { + private Resource[] findResources(File outputDir) throws IOException { return ResourcePatternUtils .getResourcePatternResolver(new DefaultResourceLoader()) - .getResources("file:target/output/*.txt"); + .getResources("file:" + outputDir.getAbsolutePath() + "/*.txt"); } private String readResources(Resource[] resources) throws IOException { diff --git a/spring-boot-samples/spring-boot-sample-parent-context/src/test/java/sample/parent/producer/ProducerApplication.java b/spring-boot-samples/spring-boot-sample-parent-context/src/test/java/sample/parent/producer/ProducerApplication.java index 8b99f83688..e60ee90212 100644 --- a/spring-boot-samples/spring-boot-sample-parent-context/src/test/java/sample/parent/producer/ProducerApplication.java +++ b/spring-boot-samples/spring-boot-sample-parent-context/src/test/java/sample/parent/producer/ProducerApplication.java @@ -19,20 +19,32 @@ package sample.parent.producer; import java.io.File; import java.io.FileOutputStream; -import org.springframework.boot.CommandLineRunner; +import sample.parent.ServiceProperties; + +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; import org.springframework.boot.SpringApplication; +import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Configuration; @Configuration -public class ProducerApplication implements CommandLineRunner { +@EnableConfigurationProperties(ServiceProperties.class) +public class ProducerApplication implements ApplicationRunner { + + private final ServiceProperties serviceProperties; + + public ProducerApplication(ServiceProperties serviceProperties) { + this.serviceProperties = serviceProperties; + } @Override - public void run(String... args) throws Exception { - new File("target/input").mkdirs(); - if (args.length > 0) { + public void run(ApplicationArguments args) throws Exception { + this.serviceProperties.getInputDir().mkdirs(); + if (args.getNonOptionArgs().size() > 0) { FileOutputStream stream = new FileOutputStream( - "target/input/data" + System.currentTimeMillis() + ".txt"); - for (String arg : args) { + new File(this.serviceProperties.getInputDir(), + "data" + System.currentTimeMillis() + ".txt")); + for (String arg : args.getNonOptionArgs()) { stream.write(arg.getBytes()); } stream.flush(); diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/pom.xml b/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/pom.xml index 1653a8f930..ab0c5d2bd8 100644 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/pom.xml +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/pom.xml @@ -26,6 +26,11 @@ spring-boot-starter-test test + + org.springframework.boot + spring-boot-test-support + test + net.bytebuddy byte-buddy diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/com/example/DevToolsTestApplication.java b/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/com/example/DevToolsTestApplication.java index 51876ad3c8..63ba598d56 100644 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/com/example/DevToolsTestApplication.java +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/com/example/DevToolsTestApplication.java @@ -25,7 +25,7 @@ public class DevToolsTestApplication { public static void main(String[] args) { new SpringApplicationBuilder(DevToolsTestApplication.class) - .listeners(new WebServerPortFileWriter("target/server.port")).run(args); + .listeners(new WebServerPortFileWriter(args[0])).run(args); } } diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/AbstractApplicationLauncher.java b/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/AbstractApplicationLauncher.java new file mode 100644 index 0000000000..466dc7491e --- /dev/null +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/AbstractApplicationLauncher.java @@ -0,0 +1,57 @@ +/* + * Copyright 2012-2018 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 + * + * http://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.devtools.tests; + +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.springframework.util.FileSystemUtils; + +/** + * Base class for all {@link ApplicationLauncher} implementations. + * + * @author Andy Wilkinson + */ +abstract class AbstractApplicationLauncher implements ApplicationLauncher { + + private final Directories directories; + + AbstractApplicationLauncher(Directories directories) { + this.directories = directories; + } + + protected final void copyApplicationTo(File location) throws IOException { + FileSystemUtils.deleteRecursively(location); + location.mkdirs(); + FileSystemUtils.copyRecursively( + new File(this.directories.getTestClassesDirectory(), "com"), + new File(location, "com")); + } + + protected final List getDependencyJarPaths() { + return Stream.of(this.directories.getDependenciesDirectory().listFiles()) + .map(File::getAbsolutePath).collect(Collectors.toList()); + } + + protected final Directories getDirectories() { + return this.directories; + } + +} diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/ApplicationLauncher.java b/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/ApplicationLauncher.java index 65e9470682..065aa23a7a 100644 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/ApplicationLauncher.java +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/ApplicationLauncher.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2017 the original author or authors. + * Copyright 2012-2018 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. @@ -16,6 +16,8 @@ package org.springframework.boot.devtools.tests; +import java.io.File; + /** * Launches an application with DevTools. * @@ -23,6 +25,7 @@ package org.springframework.boot.devtools.tests; */ public interface ApplicationLauncher { - LaunchedApplication launchApplication(JvmLauncher javaLauncher) throws Exception; + LaunchedApplication launchApplication(JvmLauncher javaLauncher, File serverPortFile) + throws Exception; } diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/DevToolsIntegrationTests.java b/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/DevToolsIntegrationTests.java index 91cd63b5ef..edc7afee32 100644 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/DevToolsIntegrationTests.java +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/DevToolsIntegrationTests.java @@ -18,6 +18,8 @@ package org.springframework.boot.devtools.tests; import java.io.File; import java.io.FileReader; +import java.io.IOException; +import java.time.Duration; import java.util.ArrayList; import java.util.List; @@ -28,13 +30,16 @@ import net.bytebuddy.dynamic.DynamicType.Builder; import net.bytebuddy.implementation.FixedValue; import org.junit.After; import org.junit.Before; +import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TemporaryFolder; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.boot.testsupport.BuildOutput; import org.springframework.http.HttpStatus; import org.springframework.util.FileCopyUtils; import org.springframework.web.bind.annotation.RequestMapping; @@ -50,9 +55,15 @@ import static org.assertj.core.api.Assertions.assertThat; @RunWith(Parameterized.class) public class DevToolsIntegrationTests { + @ClassRule + public static final TemporaryFolder temp = new TemporaryFolder(); + + private static final BuildOutput buildOutput = new BuildOutput( + DevToolsIntegrationTests.class); + private LaunchedApplication launchedApplication; - private final File serverPortFile = new File("target/server.port"); + private final File serverPortFile; private final ApplicationLauncher applicationLauncher; @@ -61,14 +72,15 @@ public class DevToolsIntegrationTests { public DevToolsIntegrationTests(ApplicationLauncher applicationLauncher) { this.applicationLauncher = applicationLauncher; + this.serverPortFile = new File( + DevToolsIntegrationTests.buildOutput.getRootLocation(), "server.port"); } @Before public void launchApplication() throws Exception { this.serverPortFile.delete(); - System.out.println("Launching " + this.javaLauncher.getClass()); this.launchedApplication = this.applicationLauncher - .launchApplication(this.javaLauncher); + .launchApplication(this.javaLauncher, this.serverPortFile); } @After @@ -205,13 +217,15 @@ public class DevToolsIntegrationTests { } private int awaitServerPort() throws Exception { - long end = System.currentTimeMillis() + 40000; + Duration timeToWait = Duration.ofSeconds(40); + long end = System.currentTimeMillis() + timeToWait.toMillis(); + System.out.println("Reading server port from '" + this.serverPortFile + "'"); while (this.serverPortFile.length() == 0) { - 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", + "server.port file '" + this.serverPortFile + + "' was not written within " + timeToWait.toMillis() + + "ms. " + "Application output:%n%s%s", FileCopyUtils.copyToString(new FileReader( this.launchedApplication.getStandardOut())), FileCopyUtils.copyToString(new FileReader( @@ -234,10 +248,11 @@ public class DevToolsIntegrationTests { } @Parameters(name = "{0}") - public static Object[] parameters() { - return new Object[] { new Object[] { new LocalApplicationLauncher() }, - new Object[] { new ExplodedRemoteApplicationLauncher() }, - new Object[] { new JarFileRemoteApplicationLauncher() } }; + public static Object[] parameters() throws IOException { + Directories directories = new Directories(buildOutput, temp); + return new Object[] { new Object[] { new LocalApplicationLauncher(directories) }, + new Object[] { new ExplodedRemoteApplicationLauncher(directories) }, + new Object[] { new JarFileRemoteApplicationLauncher(directories) } }; } private static final class ControllerBuilder { diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/Directories.java b/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/Directories.java new file mode 100644 index 0000000000..3b9c8fb437 --- /dev/null +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/Directories.java @@ -0,0 +1,57 @@ +/* + * Copyright 2012-2018 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 + * + * http://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.devtools.tests; + +import java.io.File; + +import org.junit.rules.TemporaryFolder; + +import org.springframework.boot.testsupport.BuildOutput; + +/** + * Various directories used by the {@link ApplicationLauncher ApplicationLaunchers}. + * + * @author Andy Wilkinson + */ +class Directories { + + private final BuildOutput buildOutput; + + private final TemporaryFolder temp; + + Directories(BuildOutput buildOutput, TemporaryFolder temp) { + this.buildOutput = buildOutput; + this.temp = temp; + } + + File getTestClassesDirectory() { + return this.buildOutput.getTestClassesLocation(); + } + + File getRemoteAppDirectory() { + return new File(this.temp.getRoot(), "remote"); + } + + File getDependenciesDirectory() { + return new File(this.buildOutput.getRootLocation(), "dependencies"); + } + + File getAppDirectory() { + return new File(this.temp.getRoot(), "app"); + } + +} diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/ExplodedRemoteApplicationLauncher.java b/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/ExplodedRemoteApplicationLauncher.java index 1a3bfc5d08..d4279a975d 100644 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/ExplodedRemoteApplicationLauncher.java +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/ExplodedRemoteApplicationLauncher.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2017 the original author or authors. + * Copyright 2012-2018 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. @@ -20,7 +20,6 @@ import java.io.File; import java.util.ArrayList; import java.util.List; -import org.springframework.util.FileSystemUtils; import org.springframework.util.StringUtils; /** @@ -31,18 +30,17 @@ import org.springframework.util.StringUtils; */ public class ExplodedRemoteApplicationLauncher extends RemoteApplicationLauncher { + public ExplodedRemoteApplicationLauncher(Directories directories) { + super(directories); + } + @Override 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")); + File appDirectory = getDirectories().getAppDirectory(); + copyApplicationTo(appDirectory); List entries = new ArrayList<>(); - entries.add("target/app"); - for (File jar : new File("target/dependencies").listFiles()) { - entries.add(jar.getAbsolutePath()); - } + entries.add(appDirectory.getAbsolutePath()); + entries.addAll(getDependencyJarPaths()); return StringUtils.collectionToDelimitedString(entries, File.pathSeparator); } diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/JarFileRemoteApplicationLauncher.java b/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/JarFileRemoteApplicationLauncher.java index 539d181808..1c01cee6dc 100644 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/JarFileRemoteApplicationLauncher.java +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/JarFileRemoteApplicationLauncher.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2017 the original author or authors. + * Copyright 2012-2018 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. @@ -27,7 +27,6 @@ import java.util.jar.JarOutputStream; import java.util.jar.Manifest; import java.util.zip.ZipEntry; -import org.springframework.util.FileSystemUtils; import org.springframework.util.StreamUtils; import org.springframework.util.StringUtils; @@ -39,28 +38,24 @@ import org.springframework.util.StringUtils; */ public class JarFileRemoteApplicationLauncher extends RemoteApplicationLauncher { + public JarFileRemoteApplicationLauncher(Directories directories) { + super(directories); + } + @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() + "'"); - } - appDirectory.mkdirs(); + File appDirectory = getDirectories().getAppDirectory(); + copyApplicationTo(appDirectory); 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")); - addToJar(output, new File("target/app/"), new File("target/app/")); + File appJar = new File(appDirectory, "app.jar"); + JarOutputStream output = new JarOutputStream(new FileOutputStream(appJar), + manifest); + addToJar(output, appDirectory, appDirectory); output.close(); List entries = new ArrayList<>(); - entries.add("target/app/app.jar"); - for (File jar : new File("target/dependencies").listFiles()) { - entries.add(jar.getAbsolutePath()); - } + entries.add(appJar.getAbsolutePath()); + entries.addAll(getDependencyJarPaths()); String classpath = StringUtils.collectionToDelimitedString(entries, File.pathSeparator); return classpath; diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/JvmLauncher.java b/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/JvmLauncher.java index 35e00b7d2c..4de3df1b90 100644 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/JvmLauncher.java +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/JvmLauncher.java @@ -27,6 +27,7 @@ import org.junit.rules.TestRule; import org.junit.runner.Description; import org.junit.runners.model.Statement; +import org.springframework.boot.testsupport.BuildOutput; import org.springframework.util.StringUtils; /** @@ -39,12 +40,15 @@ class JvmLauncher implements TestRule { private static final Pattern NON_ALPHABET_PATTERN = Pattern.compile("[^A-Za-z]+"); + private final BuildOutput buildOutput = new BuildOutput(getClass()); + private File outputDirectory; @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(this.buildOutput.getRootLocation(), + "output/" + NON_ALPHABET_PATTERN.matcher(description.getMethodName()) + .replaceAll("")); this.outputDirectory.mkdirs(); return base; } diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/LocalApplicationLauncher.java b/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/LocalApplicationLauncher.java index 867a59fe63..cd0bccb37f 100644 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/LocalApplicationLauncher.java +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/LocalApplicationLauncher.java @@ -21,7 +21,6 @@ import java.util.ArrayList; import java.util.List; import org.springframework.boot.devtools.tests.JvmLauncher.LaunchedJvm; -import org.springframework.util.FileSystemUtils; import org.springframework.util.StringUtils; /** @@ -29,28 +28,29 @@ import org.springframework.util.StringUtils; * * @author Andy Wilkinson */ -public class LocalApplicationLauncher implements ApplicationLauncher { +public class LocalApplicationLauncher extends AbstractApplicationLauncher { + + LocalApplicationLauncher(Directories directories) { + super(directories); + } @Override - public LaunchedApplication launchApplication(JvmLauncher jvmLauncher) - throws Exception { + public LaunchedApplication launchApplication(JvmLauncher jvmLauncher, + File serverPortFile) 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); + "com.example.DevToolsTestApplication", serverPortFile.getAbsolutePath(), + "--server.port=0"); + return new LaunchedApplication(getDirectories().getAppDirectory(), + 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")); + File appDirectory = getDirectories().getAppDirectory(); + copyApplicationTo(appDirectory); List entries = new ArrayList<>(); - entries.add("target/app"); - for (File jar : new File("target/dependencies").listFiles()) { - entries.add(jar.getAbsolutePath()); - } + entries.add(appDirectory.getAbsolutePath()); + entries.addAll(getDependencyJarPaths()); return StringUtils.collectionToDelimitedString(entries, File.pathSeparator); } diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/RemoteApplicationLauncher.java b/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/RemoteApplicationLauncher.java index ac77e6c847..71c4c77a55 100644 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/RemoteApplicationLauncher.java +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/RemoteApplicationLauncher.java @@ -25,7 +25,6 @@ import java.util.function.BiFunction; import org.springframework.boot.devtools.RemoteSpringApplication; import org.springframework.boot.devtools.tests.JvmLauncher.LaunchedJvm; import org.springframework.util.FileCopyUtils; -import org.springframework.util.FileSystemUtils; import org.springframework.util.StringUtils; /** @@ -34,18 +33,23 @@ import org.springframework.util.StringUtils; * * @author Andy Wilkinson */ -abstract class RemoteApplicationLauncher implements ApplicationLauncher { +abstract class RemoteApplicationLauncher extends AbstractApplicationLauncher { + + RemoteApplicationLauncher(Directories directories) { + super(directories); + } @Override - public LaunchedApplication launchApplication(JvmLauncher javaLauncher) - throws Exception { + public LaunchedApplication launchApplication(JvmLauncher javaLauncher, + File serverPortFile) throws Exception { LaunchedJvm applicationJvm = javaLauncher.launch("app", createApplicationClassPath(), "com.example.DevToolsTestApplication", - "--server.port=0", "--spring.devtools.remote.secret=secret"); - int port = awaitServerPort(applicationJvm.getStandardOut()); + serverPortFile.getAbsolutePath(), "--server.port=0", + "--spring.devtools.remote.secret=secret"); + int port = awaitServerPort(applicationJvm.getStandardOut(), serverPortFile); BiFunction remoteRestarter = getRemoteRestarter( javaLauncher); - return new LaunchedApplication(new File("target/remote"), + return new LaunchedApplication(getDirectories().getRemoteAppDirectory(), applicationJvm.getStandardOut(), applicationJvm.getStandardError(), applicationJvm.getProcess(), remoteRestarter.apply(port, null), remoteRestarter); @@ -74,24 +78,18 @@ abstract class RemoteApplicationLauncher implements ApplicationLauncher { private String createRemoteSpringApplicationClassPath(File classesDirectory) throws Exception { + File remoteAppDirectory = getDirectories().getRemoteAppDirectory(); 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")); + copyApplicationTo(remoteAppDirectory); } List entries = new ArrayList<>(); - entries.add("target/remote"); - for (File jar : new File("target/dependencies").listFiles()) { - entries.add(jar.getAbsolutePath()); - } + entries.add(remoteAppDirectory.getAbsolutePath()); + entries.addAll(getDependencyJarPaths()); return StringUtils.collectionToDelimitedString(entries, File.pathSeparator); } - private int awaitServerPort(File standardOut) throws Exception { + private int awaitServerPort(File standardOut, File serverPortFile) throws Exception { long end = System.currentTimeMillis() + 30000; - File serverPortFile = new File("target/server.port"); while (serverPortFile.length() == 0) { if (System.currentTimeMillis() > end) { throw new IllegalStateException(String.format( diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/pom.xml b/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/pom.xml index 3cfac34508..4791a0d0f3 100644 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/pom.xml +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/pom.xml @@ -24,6 +24,11 @@ spring-boot-starter-test test + + org.springframework.boot + spring-boot-test-support + test + com.samskivert jmustache diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/com/example/ResourceHandlingApplication.java b/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/com/example/ResourceHandlingApplication.java index ec69ee146f..16207ecf67 100644 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/com/example/ResourceHandlingApplication.java +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/com/example/ResourceHandlingApplication.java @@ -41,7 +41,7 @@ public class ResourceHandlingApplication { public static void main(String[] args) { new SpringApplicationBuilder(ResourceHandlingApplication.class) .properties("server.port:0") - .listeners(new WebServerPortFileWriter("target/server.port")).run(args); + .listeners(new WebServerPortFileWriter(args[0])).run(args); } @Bean diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/AbstractApplicationLauncher.java b/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/AbstractApplicationLauncher.java index 2fc61a0e1f..868e4fa01b 100644 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/AbstractApplicationLauncher.java +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/AbstractApplicationLauncher.java @@ -26,6 +26,7 @@ import java.util.List; import org.junit.rules.ExternalResource; +import org.springframework.boot.testsupport.BuildOutput; import org.springframework.util.FileCopyUtils; import org.springframework.util.StreamUtils; import org.springframework.util.StringUtils; @@ -40,12 +41,16 @@ abstract class AbstractApplicationLauncher extends ExternalResource { private final ApplicationBuilder applicationBuilder; + private final BuildOutput buildOutput; + private Process process; private int httpPort; - protected AbstractApplicationLauncher(ApplicationBuilder applicationBuilder) { + protected AbstractApplicationLauncher(ApplicationBuilder applicationBuilder, + BuildOutput buildOutput) { this.applicationBuilder = applicationBuilder; + this.buildOutput = buildOutput; } @Override @@ -62,7 +67,7 @@ abstract class AbstractApplicationLauncher extends ExternalResource { return this.httpPort; } - protected abstract List getArguments(File archive); + protected abstract List getArguments(File archive, File serverPortFile); protected abstract File getWorkingDirectory(); @@ -70,14 +75,12 @@ abstract class AbstractApplicationLauncher extends ExternalResource { private Process startApplication() throws Exception { File workingDirectory = getWorkingDirectory(); - File serverPortFile = (workingDirectory != null) - ? new File(workingDirectory, "target/server.port") - : new File("target/server.port"); + File serverPortFile = new File(this.buildOutput.getRootLocation(), "server.port"); serverPortFile.delete(); File archive = this.applicationBuilder.buildApplication(); List arguments = new ArrayList<>(); arguments.add(System.getProperty("java.home") + "/bin/java"); - arguments.addAll(getArguments(archive)); + arguments.addAll(getArguments(archive, serverPortFile)); ProcessBuilder processBuilder = new ProcessBuilder( StringUtils.toStringArray(arguments)); if (workingDirectory != null) { diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/AbstractEmbeddedServletContainerIntegrationTests.java b/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/AbstractEmbeddedServletContainerIntegrationTests.java index 752cceb690..377d4f3e13 100644 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/AbstractEmbeddedServletContainerIntegrationTests.java +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/AbstractEmbeddedServletContainerIntegrationTests.java @@ -26,6 +26,7 @@ import org.junit.ClassRule; import org.junit.Rule; import org.junit.rules.TemporaryFolder; +import org.springframework.boot.testsupport.BuildOutput; import org.springframework.http.client.ClientHttpResponse; import org.springframework.util.StringUtils; import org.springframework.web.client.ResponseErrorHandler; @@ -48,6 +49,9 @@ public abstract class AbstractEmbeddedServletContainerIntegrationTests { }; + public static final BuildOutput buildOutput = new BuildOutput( + AbstractEmbeddedServletContainerIntegrationTests.class); + @Rule public final AbstractApplicationLauncher launcher; @@ -70,8 +74,9 @@ public abstract class AbstractEmbeddedServletContainerIntegrationTests { for (Class launcherClass : applicationLaunchers) { try { AbstractApplicationLauncher launcher = launcherClass - .getDeclaredConstructor(ApplicationBuilder.class) - .newInstance(applicationBuilder); + .getDeclaredConstructor(ApplicationBuilder.class, + BuildOutput.class) + .newInstance(applicationBuilder, buildOutput); String name = StringUtils.capitalize(container) + ": " + launcher.getDescription(packaging); parameters.add(new Object[] { name, launcher }); diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/BootRunApplicationLauncher.java b/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/BootRunApplicationLauncher.java index a99fea79ab..905a0f79ad 100644 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/BootRunApplicationLauncher.java +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/BootRunApplicationLauncher.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2017 the original author or authors. + * Copyright 2012-2018 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. @@ -27,6 +27,7 @@ import java.util.List; import java.util.jar.JarEntry; import java.util.jar.JarFile; +import org.springframework.boot.testsupport.BuildOutput; import org.springframework.util.FileCopyUtils; import org.springframework.util.FileSystemUtils; import org.springframework.util.StreamUtils; @@ -40,14 +41,16 @@ import org.springframework.util.StringUtils; */ class BootRunApplicationLauncher extends AbstractApplicationLauncher { - private final File exploded = new File("target/run"); + private final File exploded; - BootRunApplicationLauncher(ApplicationBuilder applicationBuilder) { - super(applicationBuilder); + BootRunApplicationLauncher(ApplicationBuilder applicationBuilder, + BuildOutput buildOutput) { + super(applicationBuilder, buildOutput); + this.exploded = new File(buildOutput.getRootLocation(), "run"); } @Override - protected List getArguments(File archive) { + protected List getArguments(File archive, File serverPortFile) { try { explodeArchive(archive); deleteLauncherClasses(); @@ -64,7 +67,8 @@ class BootRunApplicationLauncher extends AbstractApplicationLauncher { return Arrays.asList("-cp", StringUtils.collectionToDelimitedString(classpath, File.pathSeparator), - "com.example.ResourceHandlingApplication"); + "com.example.ResourceHandlingApplication", + serverPortFile.getAbsolutePath()); } catch (IOException ex) { throw new RuntimeException(ex); @@ -76,12 +80,12 @@ class BootRunApplicationLauncher extends AbstractApplicationLauncher { } private File populateTargetClasses(File archive) throws IOException { - File targetClasses = new File(this.exploded, "target/classes"); - targetClasses.mkdirs(); + File builtClasses = new File(this.exploded, "built/classes"); + builtClasses.mkdirs(); File source = new File(this.exploded, getClassesPath(archive)); - FileSystemUtils.copyRecursively(source, targetClasses); + FileSystemUtils.copyRecursively(source, builtClasses); FileSystemUtils.deleteRecursively(source); - return targetClasses; + return builtClasses; } private File populateDependencies(File archive) throws IOException { diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/ExplodedApplicationLauncher.java b/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/ExplodedApplicationLauncher.java index bb71be9487..11e9e9f47c 100644 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/ExplodedApplicationLauncher.java +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/ExplodedApplicationLauncher.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2017 the original author or authors. + * Copyright 2012-2018 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. @@ -22,9 +22,11 @@ import java.io.IOException; import java.util.Arrays; import java.util.Enumeration; import java.util.List; +import java.util.function.Supplier; import java.util.jar.JarEntry; import java.util.jar.JarFile; +import org.springframework.boot.testsupport.BuildOutput; import org.springframework.util.FileSystemUtils; import org.springframework.util.StreamUtils; @@ -36,15 +38,17 @@ import org.springframework.util.StreamUtils; */ class ExplodedApplicationLauncher extends AbstractApplicationLauncher { - private final File exploded = new File("target/exploded"); + private final Supplier exploded; - ExplodedApplicationLauncher(ApplicationBuilder applicationBuilder) { - super(applicationBuilder); + ExplodedApplicationLauncher(ApplicationBuilder applicationBuilder, + BuildOutput buildOutput) { + super(applicationBuilder, buildOutput); + this.exploded = () -> new File(buildOutput.getRootLocation(), "exploded"); } @Override protected File getWorkingDirectory() { - return this.exploded; + return this.exploded.get(); } @Override @@ -53,13 +57,14 @@ class ExplodedApplicationLauncher extends AbstractApplicationLauncher { } @Override - protected List getArguments(File archive) { + protected List getArguments(File archive, File serverPortFile) { String mainClass = (archive.getName().endsWith(".war") ? "org.springframework.boot.loader.WarLauncher" : "org.springframework.boot.loader.JarLauncher"); try { explodeArchive(archive); - return Arrays.asList("-cp", this.exploded.getAbsolutePath(), mainClass); + return Arrays.asList("-cp", this.exploded.get().getAbsolutePath(), mainClass, + serverPortFile.getAbsolutePath()); } catch (IOException ex) { throw new RuntimeException(ex); @@ -67,12 +72,12 @@ class ExplodedApplicationLauncher extends AbstractApplicationLauncher { } private void explodeArchive(File archive) throws IOException { - FileSystemUtils.deleteRecursively(this.exploded); + FileSystemUtils.deleteRecursively(this.exploded.get()); JarFile jarFile = new JarFile(archive); Enumeration entries = jarFile.entries(); while (entries.hasMoreElements()) { JarEntry jarEntry = entries.nextElement(); - File extracted = new File(this.exploded, jarEntry.getName()); + File extracted = new File(this.exploded.get(), jarEntry.getName()); if (jarEntry.isDirectory()) { extracted.mkdirs(); } diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/IdeApplicationLauncher.java b/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/IdeApplicationLauncher.java index c57206a991..12ab976f48 100644 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/IdeApplicationLauncher.java +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/IdeApplicationLauncher.java @@ -27,6 +27,7 @@ import java.util.List; import java.util.jar.JarEntry; import java.util.jar.JarFile; +import org.springframework.boot.testsupport.BuildOutput; import org.springframework.util.FileCopyUtils; import org.springframework.util.FileSystemUtils; import org.springframework.util.StreamUtils; @@ -40,10 +41,12 @@ import org.springframework.util.StringUtils; */ class IdeApplicationLauncher extends AbstractApplicationLauncher { - private final File exploded = new File("target/the+ide application"); + private final File exploded; - IdeApplicationLauncher(ApplicationBuilder applicationBuilder) { - super(applicationBuilder); + IdeApplicationLauncher(ApplicationBuilder applicationBuilder, + BuildOutput buildOutput) { + super(applicationBuilder, buildOutput); + this.exploded = new File(buildOutput.getRootLocation(), "the+ide application"); } @Override @@ -57,18 +60,18 @@ class IdeApplicationLauncher extends AbstractApplicationLauncher { } @Override - protected List getArguments(File archive) { + protected List getArguments(File archive, File serverPortFile) { try { explodeArchive(archive, this.exploded); deleteLauncherClasses(); - File targetClasses = populateTargetClasses(archive); + File builtClasses = populateBuiltClasses(archive); File dependencies = populateDependencies(archive); File resourcesProject = explodedResourcesProject(dependencies); if (archive.getName().endsWith(".war")) { populateSrcMainWebapp(); } List classpath = new ArrayList<>(); - classpath.add(targetClasses.getAbsolutePath()); + classpath.add(builtClasses.getAbsolutePath()); for (File dependency : dependencies.listFiles()) { classpath.add(dependency.getAbsolutePath()); } @@ -76,20 +79,21 @@ class IdeApplicationLauncher extends AbstractApplicationLauncher { return Arrays.asList("-cp", StringUtils.collectionToDelimitedString(classpath, File.pathSeparator), - "com.example.ResourceHandlingApplication"); + "com.example.ResourceHandlingApplication", + serverPortFile.getAbsolutePath()); } catch (IOException ex) { throw new RuntimeException(ex); } } - private File populateTargetClasses(File archive) throws IOException { - File targetClasses = new File(this.exploded, "target/classes"); - targetClasses.mkdirs(); + private File populateBuiltClasses(File archive) throws IOException { + File builtClasses = new File(this.exploded, "built/classes"); + builtClasses.mkdirs(); File source = new File(this.exploded, getClassesPath(archive)); - FileSystemUtils.copyRecursively(source, targetClasses); + FileSystemUtils.copyRecursively(source, builtClasses); FileSystemUtils.deleteRecursively(source); - return targetClasses; + return builtClasses; } private File populateDependencies(File archive) throws IOException { @@ -108,7 +112,7 @@ class IdeApplicationLauncher extends AbstractApplicationLauncher { private File explodedResourcesProject(File dependencies) throws IOException { File resourcesProject = new File(this.exploded, - "resources-project/target/classes"); + "resources-project/built/classes"); File resourcesJar = new File(dependencies, "resources-1.0.jar"); explodeArchive(resourcesJar, resourcesProject); resourcesJar.delete(); diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/PackagedApplicationLauncher.java b/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/PackagedApplicationLauncher.java index 3c176a1040..620e736cbd 100644 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/PackagedApplicationLauncher.java +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/PackagedApplicationLauncher.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2017 the original author or authors. + * Copyright 2012-2018 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. @@ -20,6 +20,8 @@ import java.io.File; import java.util.Arrays; import java.util.List; +import org.springframework.boot.testsupport.BuildOutput; + /** * {@link AbstractApplicationLauncher} that launches a packaged Spring Boot application * using {@code java -jar}. @@ -28,8 +30,9 @@ import java.util.List; */ class PackagedApplicationLauncher extends AbstractApplicationLauncher { - PackagedApplicationLauncher(ApplicationBuilder applicationBuilder) { - super(applicationBuilder); + PackagedApplicationLauncher(ApplicationBuilder applicationBuilder, + BuildOutput buildOutput) { + super(applicationBuilder, buildOutput); } @Override @@ -43,8 +46,9 @@ class PackagedApplicationLauncher extends AbstractApplicationLauncher { } @Override - protected List getArguments(File archive) { - return Arrays.asList("-jar", archive.getAbsolutePath()); + protected List getArguments(File archive, File serverPortFile) { + return Arrays.asList("-jar", archive.getAbsolutePath(), + serverPortFile.getAbsolutePath()); } }