Port the build to Gradle
Closes gh-19609 Closes gh-19608
This commit is contained in:
@@ -1,59 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-parent</artifactId>
|
||||
<version>${revision}</version>
|
||||
<relativePath>../spring-boot-project/spring-boot-parent</relativePath>
|
||||
</parent>
|
||||
<artifactId>spring-boot-tests</artifactId>
|
||||
<packaging>pom</packaging>
|
||||
<name>Spring Boot Tests</name>
|
||||
<description>Spring Boot Test</description>
|
||||
<properties>
|
||||
<main.basedir>${basedir}/..</main.basedir>
|
||||
</properties>
|
||||
<modules>
|
||||
<!-- Deployment tests are slow so don't include by default -->
|
||||
<module>spring-boot-smoke-tests-invoker</module>
|
||||
<module>spring-boot-integration-tests</module>
|
||||
</modules>
|
||||
<profiles>
|
||||
<!-- M2E profile to allow easy import into Eclipse -->
|
||||
<profile>
|
||||
<id>m2e</id>
|
||||
<activation>
|
||||
<property>
|
||||
<name>m2e.version</name>
|
||||
</property>
|
||||
</activation>
|
||||
<modules>
|
||||
<module>spring-boot-smoke-tests</module>
|
||||
<module>spring-boot-smoke-tests-invoker</module>
|
||||
<module>spring-boot-integration-tests</module>
|
||||
<module>spring-boot-deployment-tests</module>
|
||||
</modules>
|
||||
</profile>
|
||||
</profiles>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-install-plugin</artifactId>
|
||||
<configuration>
|
||||
<skip>true</skip>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-javadoc-plugin</artifactId>
|
||||
<configuration>
|
||||
<skip>true</skip>
|
||||
</configuration>
|
||||
<inherited>true</inherited>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
||||
28
spring-boot-tests/spring-boot-deployment-tests/build.gradle
Normal file
28
spring-boot-tests/spring-boot-deployment-tests/build.gradle
Normal file
@@ -0,0 +1,28 @@
|
||||
plugins {
|
||||
id 'war'
|
||||
id 'org.springframework.boot.conventions'
|
||||
id 'org.springframework.boot.integration-test'
|
||||
}
|
||||
|
||||
description = "Spring Boot Deployment Tests"
|
||||
|
||||
dependencies {
|
||||
implementation(project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web')) {
|
||||
exclude group: 'org.hibernate.validator'
|
||||
}
|
||||
|
||||
intTestImplementation enforcedPlatform(project(path: ":spring-boot-project:spring-boot-parent"))
|
||||
intTestImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test')
|
||||
intTestImplementation 'org.apache.httpcomponents:httpasyncclient'
|
||||
intTestImplementation 'org.awaitility:awaitility'
|
||||
intTestImplementation 'org.testcontainers:testcontainers'
|
||||
intTestImplementation 'org.springframework:spring-web'
|
||||
|
||||
providedRuntime project(':spring-boot-project:spring-boot-starters:spring-boot-starter-tomcat')
|
||||
|
||||
runtimeOnly project(':spring-boot-project:spring-boot-starters:spring-boot-starter-actuator')
|
||||
}
|
||||
|
||||
intTest {
|
||||
dependsOn war
|
||||
}
|
||||
@@ -1,85 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-tests</artifactId>
|
||||
<version>${revision}</version>
|
||||
</parent>
|
||||
<artifactId>spring-boot-deployment-tests</artifactId>
|
||||
<packaging>pom</packaging>
|
||||
<name>Spring Boot Deployment Tests</name>
|
||||
<description>Spring Boot Deployment Tests</description>
|
||||
<properties>
|
||||
<main.basedir>${basedir}/../..</main.basedir>
|
||||
<java.version>1.8</java.version>
|
||||
<cargo.timeout>1200000</cargo.timeout>
|
||||
<cargo.container.download-dir>${settings.localRepository}/.cache/cargo/installs</cargo.container.download-dir>
|
||||
</properties>
|
||||
<modules>
|
||||
<module>spring-boot-deployment-test-glassfish</module>
|
||||
<module>spring-boot-deployment-test-tomee</module>
|
||||
<module>spring-boot-deployment-test-tomcat</module>
|
||||
<module>spring-boot-deployment-test-wildfly</module>
|
||||
<module>spring-boot-deployment-test-wlp</module>
|
||||
</modules>
|
||||
<build>
|
||||
<pluginManagement>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.cargo</groupId>
|
||||
<artifactId>cargo-maven2-plugin</artifactId>
|
||||
<configuration>
|
||||
<container>
|
||||
<containerId>${cargo.container.id}</containerId>
|
||||
<timeout>${cargo.timeout}</timeout>
|
||||
<zipUrlInstaller>
|
||||
<url>${cargo.container.url}</url>
|
||||
<downloadDir>${cargo.container.download-dir}</downloadDir>
|
||||
</zipUrlInstaller>
|
||||
<systemProperties>
|
||||
<java.net.preferIPv4Stack>true</java.net.preferIPv4Stack>
|
||||
<java.net.preferIPv4Addresses>true</java.net.preferIPv4Addresses>
|
||||
</systemProperties>
|
||||
</container>
|
||||
<deployables>
|
||||
<deployable>
|
||||
<properties>
|
||||
<context>/bootapp</context>
|
||||
</properties>
|
||||
<pingURL>http://localhost:${appserver.port}/bootapp</pingURL>
|
||||
<pingTimeout>60000</pingTimeout>
|
||||
</deployable>
|
||||
</deployables>
|
||||
</configuration>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>start-cargo</id>
|
||||
<phase>pre-integration-test</phase>
|
||||
<goals>
|
||||
<goal>start</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
<execution>
|
||||
<id>stop-cargo</id>
|
||||
<phase>post-integration-test</phase>
|
||||
<goals>
|
||||
<goal>stop</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</pluginManagement>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-install-plugin</artifactId>
|
||||
<configuration>
|
||||
<skip>true</skip>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
||||
@@ -1,117 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-deployment-tests</artifactId>
|
||||
<version>${revision}</version>
|
||||
</parent>
|
||||
<artifactId>spring-boot-deployment-test-glassfish</artifactId>
|
||||
<packaging>war</packaging>
|
||||
<name>Spring Boot Glassfish Deployment Test</name>
|
||||
<description>Spring Boot Glassfish Deployment Test</description>
|
||||
<properties>
|
||||
<main.basedir>${basedir}/../../..</main.basedir>
|
||||
<glassfish.version>4.1.1</glassfish.version>
|
||||
<cargo.container.id>glassfish4x</cargo.container.id>
|
||||
<cargo.container.url>https://download.oracle.com/glassfish/${glassfish.version}/release/glassfish-${glassfish.version}.zip</cargo.container.url>
|
||||
</properties>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-tomcat</artifactId>
|
||||
</exclusion>
|
||||
<exclusion>
|
||||
<groupId>org.hibernate.validator</groupId>
|
||||
<artifactId>hibernate-validator</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-actuator</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>jakarta.servlet</groupId>
|
||||
<artifactId>jakarta.servlet-api</artifactId>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<profiles>
|
||||
<profile>
|
||||
<id>jdk8</id>
|
||||
<activation>
|
||||
<jdk>1.8</jdk>
|
||||
</activation>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>build-helper-maven-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>reserve-network-port</id>
|
||||
<goals>
|
||||
<goal>reserve-network-port</goal>
|
||||
</goals>
|
||||
<phase>process-resources</phase>
|
||||
<configuration>
|
||||
<portNames>
|
||||
<portName>appserver.port</portName>
|
||||
<portName>appserver.admin.port</portName>
|
||||
<portName>appserver.jms.port</portName>
|
||||
<portName>appserver.iiop.port</portName>
|
||||
<portName>appserver.https.port</portName>
|
||||
<portName>appserver.iiops.port</portName>
|
||||
<portName>appserver.iiopmutualauth.port</portName>
|
||||
<portName>appserver.jmx.port</portName>
|
||||
<portName>appserver.osgishell.port</portName>
|
||||
<portName>appserver.debugger.port</portName>
|
||||
</portNames>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.cargo</groupId>
|
||||
<artifactId>cargo-maven2-plugin</artifactId>
|
||||
<configuration>
|
||||
<configuration>
|
||||
<properties>
|
||||
<cargo.servlet.port>${appserver.port}</cargo.servlet.port>
|
||||
<cargo.glassfish.admin.port>${appserver.admin.port}</cargo.glassfish.admin.port>
|
||||
<cargo.glassfish.domain.jmxPort>${appserver.jmx.port}</cargo.glassfish.domain.jmxPort>
|
||||
<cargo.glassfish.http.ssl.port>${appserver.https.port}</cargo.glassfish.http.ssl.port>
|
||||
<cargo.glassfish.java.debugger.port>${appserver.debugger.port}</cargo.glassfish.java.debugger.port>
|
||||
<cargo.glassfish.jms.port>${appserver.jms.port}</cargo.glassfish.jms.port>
|
||||
<cargo.glassfish.orb.listener.port>${appserver.iiop.port}</cargo.glassfish.orb.listener.port>
|
||||
<cargo.glassfish.orb.mutualauth.port>${appserver.iiopmutualauth.port}</cargo.glassfish.orb.mutualauth.port>
|
||||
<cargo.glassfish.orb.ssl.port>${appserver.iiops.port}</cargo.glassfish.orb.ssl.port>
|
||||
<cargo.glassfish.osgi.shell.telnet.port>${appserver.osgishell.port}</cargo.glassfish.osgi.shell.telnet.port>
|
||||
</properties>
|
||||
</configuration>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-failsafe-plugin</artifactId>
|
||||
<configuration>
|
||||
<systemPropertyVariables>
|
||||
<port>${appserver.port}</port>
|
||||
</systemPropertyVariables>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
</profiles>
|
||||
</project>
|
||||
@@ -1,25 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2019 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package sample;
|
||||
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
|
||||
|
||||
@SpringBootApplication
|
||||
public class SampleGlassfishDeployApplication extends SpringBootServletInitializer {
|
||||
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<glassfish-web-app error-url="">
|
||||
<class-loader delegate="false"/>
|
||||
</glassfish-web-app>
|
||||
@@ -1,52 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2019 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package sample;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.boot.test.web.client.TestRestTemplate;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
/**
|
||||
* Integration Tests for {@link SampleGlassfishDeployApplication}.
|
||||
*/
|
||||
public class SampleGlassfishDeployApplicationIT {
|
||||
|
||||
private int port = Integer.valueOf(System.getProperty("port"));
|
||||
|
||||
@Test
|
||||
void testHome() throws Exception {
|
||||
String url = "http://localhost:" + this.port + "/bootapp/";
|
||||
System.out.println(url);
|
||||
ResponseEntity<String> entity = new TestRestTemplate().getForEntity(url, String.class);
|
||||
assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK);
|
||||
assertThat(entity.getBody()).isEqualTo("Hello World");
|
||||
}
|
||||
|
||||
@Test
|
||||
void testHealth() throws Exception {
|
||||
String url = "http://localhost:" + this.port + "/bootapp/actuator/health";
|
||||
System.out.println(url);
|
||||
ResponseEntity<String> entity = new TestRestTemplate().getForEntity(url, String.class);
|
||||
assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK);
|
||||
assertThat(entity.getBody()).isEqualTo("{\"status\":\"UP\"}");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,90 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-deployment-tests</artifactId>
|
||||
<version>${revision}</version>
|
||||
</parent>
|
||||
<artifactId>spring-boot-deployment-test-tomcat</artifactId>
|
||||
<packaging>war</packaging>
|
||||
<name>Spring Boot Tomcat Deployment Test</name>
|
||||
<description>Spring Boot Tomcat Deployment Test</description>
|
||||
<properties>
|
||||
<main.basedir>${basedir}/../../..</main.basedir>
|
||||
<cargo.container.id>tomcat9x</cargo.container.id>
|
||||
<cargo.container.url>
|
||||
https://repo.maven.apache.org/maven2/org/apache/tomcat/tomcat/${tomcat.version}/tomcat-${tomcat.version}.zip
|
||||
</cargo.container.url>
|
||||
</properties>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-tomcat</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-actuator</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>jakarta.servlet</groupId>
|
||||
<artifactId>jakarta.servlet-api</artifactId>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>build-helper-maven-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>reserve-network-port</id>
|
||||
<goals>
|
||||
<goal>reserve-network-port</goal>
|
||||
</goals>
|
||||
<phase>process-resources</phase>
|
||||
<configuration>
|
||||
<portNames>
|
||||
<portName>appserver.port</portName>
|
||||
<portName>appserver.ajp.port</portName>
|
||||
</portNames>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.cargo</groupId>
|
||||
<artifactId>cargo-maven2-plugin</artifactId>
|
||||
<configuration>
|
||||
<configuration>
|
||||
<properties>
|
||||
<cargo.servlet.port>${appserver.port}</cargo.servlet.port>
|
||||
<cargo.tomcat.ajp.port>${appserver.ajp.port}</cargo.tomcat.ajp.port>
|
||||
</properties>
|
||||
</configuration>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-failsafe-plugin</artifactId>
|
||||
<configuration>
|
||||
<systemPropertyVariables>
|
||||
<port>${appserver.port}</port>
|
||||
</systemPropertyVariables>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
||||
@@ -1,44 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2019 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package sample;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
@RestController
|
||||
public class SampleController {
|
||||
|
||||
@RequestMapping("/")
|
||||
public String hello() {
|
||||
return "Hello World";
|
||||
}
|
||||
|
||||
@RequestMapping("/send-error")
|
||||
public void sendError(HttpServletResponse response) throws IOException {
|
||||
response.sendError(500);
|
||||
}
|
||||
|
||||
@RequestMapping("/exception")
|
||||
public void exception() {
|
||||
throw new RuntimeException();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2019 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package sample;
|
||||
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
|
||||
|
||||
@SpringBootApplication
|
||||
public class SampleTomcatDeployApplication extends SpringBootServletInitializer {
|
||||
|
||||
}
|
||||
@@ -1,98 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2019 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package sample;
|
||||
|
||||
import java.net.URI;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.boot.test.web.client.TestRestTemplate;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.http.RequestEntity;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
/**
|
||||
* Integration Tests for {@link SampleTomcatDeployApplication}.
|
||||
*/
|
||||
public class SampleTomcatDeployApplicationIT {
|
||||
|
||||
private final TestRestTemplate rest = new TestRestTemplate();
|
||||
|
||||
private int port = Integer.valueOf(System.getProperty("port"));
|
||||
|
||||
@Test
|
||||
void testHome() throws Exception {
|
||||
String url = "http://localhost:" + this.port + "/bootapp/";
|
||||
ResponseEntity<String> entity = this.rest.getForEntity(url, String.class);
|
||||
assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK);
|
||||
assertThat(entity.getBody()).isEqualTo("Hello World");
|
||||
}
|
||||
|
||||
@Test
|
||||
void testHealth() throws Exception {
|
||||
String url = "http://localhost:" + this.port + "/bootapp/actuator/health";
|
||||
System.out.println(url);
|
||||
ResponseEntity<String> entity = new TestRestTemplate().getForEntity(url, String.class);
|
||||
assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK);
|
||||
assertThat(entity.getBody()).isEqualTo("{\"status\":\"UP\"}");
|
||||
}
|
||||
|
||||
@Test
|
||||
void errorFromExceptionForRequestAcceptingAnythingProducesAJsonResponse() throws Exception {
|
||||
assertThatPathProducesExpectedResponse("/bootapp/exception", MediaType.ALL, MediaType.APPLICATION_JSON);
|
||||
}
|
||||
|
||||
@Test
|
||||
void errorFromExceptionForRequestAcceptingJsonProducesAJsonResponse() throws Exception {
|
||||
assertThatPathProducesExpectedResponse("/bootapp/exception", MediaType.APPLICATION_JSON,
|
||||
MediaType.APPLICATION_JSON);
|
||||
}
|
||||
|
||||
@Test
|
||||
void errorFromExceptionForRequestAcceptingHtmlProducesAnHtmlResponse() throws Exception {
|
||||
assertThatPathProducesExpectedResponse("/bootapp/exception", MediaType.TEXT_HTML, MediaType.TEXT_HTML);
|
||||
}
|
||||
|
||||
@Test
|
||||
void sendErrorForRequestAcceptingAnythingProducesAJsonResponse() throws Exception {
|
||||
assertThatPathProducesExpectedResponse("/bootapp/send-error", MediaType.ALL, MediaType.APPLICATION_JSON);
|
||||
}
|
||||
|
||||
@Test
|
||||
void sendErrorForRequestAcceptingJsonProducesAJsonResponse() throws Exception {
|
||||
assertThatPathProducesExpectedResponse("/bootapp/send-error", MediaType.APPLICATION_JSON,
|
||||
MediaType.APPLICATION_JSON);
|
||||
}
|
||||
|
||||
@Test
|
||||
void sendErrorForRequestAcceptingHtmlProducesAnHtmlResponse() throws Exception {
|
||||
assertThatPathProducesExpectedResponse("/bootapp/send-error", MediaType.TEXT_HTML, MediaType.TEXT_HTML);
|
||||
}
|
||||
|
||||
private void assertThatPathProducesExpectedResponse(String path, MediaType accept, MediaType contentType) {
|
||||
RequestEntity<Void> request = RequestEntity.get(URI.create("http://localhost:" + this.port + path))
|
||||
.accept(accept).build();
|
||||
ResponseEntity<String> response = this.rest.exchange(request, String.class);
|
||||
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR);
|
||||
assertThat(contentType.isCompatibleWith(response.getHeaders().getContentType()))
|
||||
.as("%s is compatible with %s", contentType, response.getHeaders().getContentType()).isTrue();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,103 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-deployment-tests</artifactId>
|
||||
<version>${revision}</version>
|
||||
</parent>
|
||||
<artifactId>spring-boot-deployment-test-tomee</artifactId>
|
||||
<packaging>war</packaging>
|
||||
<name>Spring Boot TomEE Deployment Test</name>
|
||||
<description>Spring Boot TomEE Deployment Test</description>
|
||||
<properties>
|
||||
<main.basedir>${basedir}/../../..</main.basedir>
|
||||
<tomee.version>8.0.0</tomee.version>
|
||||
<cargo.container.id>tomee1x</cargo.container.id>
|
||||
<cargo.container.url>
|
||||
https://archive.apache.org/dist/tomee/tomee-${tomee.version}/apache-tomee-${tomee.version}-webprofile.zip
|
||||
</cargo.container.url>
|
||||
</properties>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-tomcat</artifactId>
|
||||
</exclusion>
|
||||
<exclusion>
|
||||
<groupId>org.hibernate.validator</groupId>
|
||||
<artifactId>hibernate-validator</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-actuator</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>jakarta.servlet</groupId>
|
||||
<artifactId>jakarta.servlet-api</artifactId>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<profiles>
|
||||
<profile>
|
||||
<id>jdk8</id>
|
||||
<activation>
|
||||
<jdk>1.8</jdk>
|
||||
</activation>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>build-helper-maven-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>reserve-network-port</id>
|
||||
<goals>
|
||||
<goal>reserve-network-port</goal>
|
||||
</goals>
|
||||
<phase>process-resources</phase>
|
||||
<configuration>
|
||||
<portNames>
|
||||
<portName>appserver.port</portName>
|
||||
<portName>appserver.ajp.port</portName>
|
||||
</portNames>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.cargo</groupId>
|
||||
<artifactId>cargo-maven2-plugin</artifactId>
|
||||
<configuration>
|
||||
<configuration>
|
||||
<properties>
|
||||
<cargo.servlet.port>${appserver.port}</cargo.servlet.port>
|
||||
<cargo.tomcat.ajp.port>${appserver.ajp.port}</cargo.tomcat.ajp.port>
|
||||
</properties>
|
||||
</configuration>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-failsafe-plugin</artifactId>
|
||||
<configuration>
|
||||
<systemPropertyVariables>
|
||||
<port>${appserver.port}</port>
|
||||
</systemPropertyVariables>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
</profiles>
|
||||
</project>
|
||||
@@ -1,30 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2019 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package sample;
|
||||
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
@RestController
|
||||
public class SampleController {
|
||||
|
||||
@GetMapping("/")
|
||||
public String hello() {
|
||||
return "Hello World";
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2019 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package sample;
|
||||
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.boot.builder.SpringApplicationBuilder;
|
||||
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
|
||||
|
||||
@SpringBootApplication
|
||||
public class SampleTomEEDeployApplication extends SpringBootServletInitializer {
|
||||
|
||||
@Override
|
||||
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
|
||||
return application.sources(SampleTomEEDeployApplication.class);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,51 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2019 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package sample;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.boot.test.web.client.TestRestTemplate;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
/**
|
||||
* Integration Tests for {@link SampleTomEEDeployApplication}.
|
||||
*/
|
||||
public class SampleTomEEDeployApplicationIT {
|
||||
|
||||
private int port = Integer.valueOf(System.getProperty("port"));
|
||||
|
||||
@Test
|
||||
void testHome() throws Exception {
|
||||
String url = "http://localhost:" + this.port + "/bootapp/";
|
||||
ResponseEntity<String> entity = new TestRestTemplate().getForEntity(url, String.class);
|
||||
assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK);
|
||||
assertThat(entity.getBody()).isEqualTo("Hello World");
|
||||
}
|
||||
|
||||
@Test
|
||||
void testHealth() throws Exception {
|
||||
String url = "http://localhost:" + this.port + "/bootapp/actuator/health";
|
||||
System.out.println(url);
|
||||
ResponseEntity<String> entity = new TestRestTemplate().getForEntity(url, String.class);
|
||||
assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK);
|
||||
assertThat(entity.getBody()).isEqualTo("{\"status\":\"UP\"}");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,95 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-deployment-tests</artifactId>
|
||||
<version>${revision}</version>
|
||||
</parent>
|
||||
<artifactId>spring-boot-deployment-test-wildfly</artifactId>
|
||||
<packaging>war</packaging>
|
||||
<name>Spring Boot WildFly Deployment Test</name>
|
||||
<description>Spring Boot WildFly Deployment Test</description>
|
||||
<properties>
|
||||
<main.basedir>${basedir}/../../..</main.basedir>
|
||||
<wildfly.version>12.0.0.Final</wildfly.version>
|
||||
<cargo.container.id>wildfly12x</cargo.container.id>
|
||||
<cargo.container.url>https://download.jboss.org/wildfly/${wildfly.version}/wildfly-${wildfly.version}.zip
|
||||
</cargo.container.url>
|
||||
</properties>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-tomcat</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-actuator</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>jakarta.servlet</groupId>
|
||||
<artifactId>jakarta.servlet-api</artifactId>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>build-helper-maven-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>reserve-network-port</id>
|
||||
<goals>
|
||||
<goal>reserve-network-port</goal>
|
||||
</goals>
|
||||
<phase>process-resources</phase>
|
||||
<configuration>
|
||||
<portNames>
|
||||
<portName>appserver.port</portName>
|
||||
<portName>appserver.ajp.port</portName>
|
||||
<portName>appserver.transaction.port</portName>
|
||||
</portNames>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.cargo</groupId>
|
||||
<artifactId>cargo-maven2-plugin</artifactId>
|
||||
<configuration>
|
||||
<configuration>
|
||||
<properties>
|
||||
<cargo.servlet.port>${appserver.port}</cargo.servlet.port>
|
||||
<cargo.jboss.ajp.port>${appserver.ajp.port}</cargo.jboss.ajp.port>
|
||||
<cargo.jboss.transaction.statusManager.port>
|
||||
${appserver.transaction.port}
|
||||
</cargo.jboss.transaction.statusManager.port>
|
||||
<cargo.jboss.configuration>standalone-full</cargo.jboss.configuration>
|
||||
</properties>
|
||||
</configuration>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-failsafe-plugin</artifactId>
|
||||
<configuration>
|
||||
<systemPropertyVariables>
|
||||
<port>${appserver.port}</port>
|
||||
</systemPropertyVariables>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
||||
@@ -1,30 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2019 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package sample;
|
||||
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
@RestController
|
||||
public class SampleController {
|
||||
|
||||
@GetMapping("/")
|
||||
public String hello() {
|
||||
return "Hello World";
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2019 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package sample;
|
||||
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
|
||||
|
||||
@SpringBootApplication
|
||||
public class SampleWildFlyDeployApplication extends SpringBootServletInitializer {
|
||||
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.1">
|
||||
<deployment>
|
||||
<exclusions>
|
||||
<module name="com.fasterxml.jackson.core.jackson-annotations" />
|
||||
<module name="com.fasterxml.jackson.core.jackson-core" />
|
||||
<module name="com.fasterxml.jackson.core.jackson-databind" />
|
||||
<module name="com.fasterxml.jackson.datatype.jackson-datatype-jdk8"/>
|
||||
<module name="com.fasterxml.jackson.datatype.jackson-datatype-jsr310"/>
|
||||
<module name="com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider" />
|
||||
<module name="org.jboss.resteasy.resteasy-jackson2-provider" />
|
||||
<module name="org.slf4j" />
|
||||
</exclusions>
|
||||
</deployment>
|
||||
</jboss-deployment-structure>
|
||||
@@ -1,51 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2019 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package sample;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.boot.test.web.client.TestRestTemplate;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
/**
|
||||
* Integration Tests for {@link SampleWildFlyDeployApplication}.
|
||||
*/
|
||||
public class SampleWildFlyDeployApplicationIT {
|
||||
|
||||
private int port = Integer.valueOf(System.getProperty("port"));
|
||||
|
||||
@Test
|
||||
void testHome() throws Exception {
|
||||
String url = "http://localhost:" + this.port + "/bootapp/";
|
||||
ResponseEntity<String> entity = new TestRestTemplate().getForEntity(url, String.class);
|
||||
assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK);
|
||||
assertThat(entity.getBody()).isEqualTo("Hello World");
|
||||
}
|
||||
|
||||
@Test
|
||||
void testHealth() throws Exception {
|
||||
String url = "http://localhost:" + this.port + "/bootapp/actuator/health";
|
||||
System.out.println(url);
|
||||
ResponseEntity<String> entity = new TestRestTemplate().getForEntity(url, String.class);
|
||||
assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK);
|
||||
assertThat(entity.getBody()).isEqualTo("{\"status\":\"UP\"}");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,95 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-deployment-tests</artifactId>
|
||||
<version>${revision}</version>
|
||||
</parent>
|
||||
<artifactId>spring-boot-deployment-test-wlp</artifactId>
|
||||
<packaging>war</packaging>
|
||||
<name>Spring Boot WebSphere Liberty Profile Deployment Test</name>
|
||||
<description>Spring Boot WebSphere Liberty Profile Deployment Test</description>
|
||||
<properties>
|
||||
<main.basedir>${basedir}/../../..</main.basedir>
|
||||
<wlp.version>18.0.0.1</wlp.version>
|
||||
<cargo.container.id>liberty</cargo.container.id>
|
||||
<cargo.container.url>https://repo.maven.apache.org/maven2/com/ibm/websphere/appserver/runtime/wlp-webProfile7/${wlp.version}/wlp-webProfile7-${wlp.version}.zip</cargo.container.url>
|
||||
</properties>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-tomcat</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-actuator</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>jakarta.servlet</groupId>
|
||||
<artifactId>jakarta.servlet-api</artifactId>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<profiles>
|
||||
<profile>
|
||||
<id>jdk8</id>
|
||||
<activation>
|
||||
<jdk>1.8</jdk>
|
||||
</activation>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>build-helper-maven-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>reserve-network-port</id>
|
||||
<goals>
|
||||
<goal>reserve-network-port</goal>
|
||||
</goals>
|
||||
<phase>process-resources</phase>
|
||||
<configuration>
|
||||
<portNames>
|
||||
<portName>appserver.port</portName>
|
||||
</portNames>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.cargo</groupId>
|
||||
<artifactId>cargo-maven2-plugin</artifactId>
|
||||
<configuration>
|
||||
<configuration>
|
||||
<properties>
|
||||
<cargo.servlet.port>${appserver.port}</cargo.servlet.port>
|
||||
</properties>
|
||||
</configuration>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-failsafe-plugin</artifactId>
|
||||
<configuration>
|
||||
<systemPropertyVariables>
|
||||
<port>${appserver.port}</port>
|
||||
</systemPropertyVariables>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
</profiles>
|
||||
</project>
|
||||
@@ -1,30 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2019 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package sample;
|
||||
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
@RestController
|
||||
public class SampleController {
|
||||
|
||||
@GetMapping("/")
|
||||
public String hello() {
|
||||
return "Hello World";
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,51 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2019 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package sample;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.boot.test.web.client.TestRestTemplate;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
/**
|
||||
* Integration Tests for {@link SampleWlpDeployApplication}.
|
||||
*/
|
||||
public class SampleWlpDeployApplicationIT {
|
||||
|
||||
private int port = Integer.valueOf(System.getProperty("port"));
|
||||
|
||||
@Test
|
||||
void testHome() throws Exception {
|
||||
String url = "http://localhost:" + this.port + "/bootapp/";
|
||||
ResponseEntity<String> entity = new TestRestTemplate().getForEntity(url, String.class);
|
||||
assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK);
|
||||
assertThat(entity.getBody()).isEqualTo("Hello World");
|
||||
}
|
||||
|
||||
@Test
|
||||
void testHealth() throws Exception {
|
||||
String url = "http://localhost:" + this.port + "/bootapp/actuator/health";
|
||||
System.out.println(url);
|
||||
ResponseEntity<String> entity = new TestRestTemplate().getForEntity(url, String.class);
|
||||
assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK);
|
||||
assertThat(entity.getBody()).isEqualTo("{\"status\":\"UP\"}");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,139 @@
|
||||
/*
|
||||
* Copyright 2012-2019 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package sample;
|
||||
|
||||
import java.io.File;
|
||||
import java.time.Duration;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import org.apache.http.impl.client.HttpClients;
|
||||
import org.apache.http.impl.client.StandardHttpRequestRetryHandler;
|
||||
import org.awaitility.Awaitility;
|
||||
import org.awaitility.core.ConditionTimeoutException;
|
||||
import org.junit.jupiter.params.ParameterizedTest;
|
||||
import org.junit.jupiter.params.provider.MethodSource;
|
||||
import org.testcontainers.containers.GenericContainer;
|
||||
import org.testcontainers.images.builder.ImageFromDockerfile;
|
||||
|
||||
import org.springframework.boot.test.web.client.TestRestTemplate;
|
||||
import org.springframework.boot.web.client.RestTemplateBuilder;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
/**
|
||||
* Deployment integration tests.
|
||||
*/
|
||||
class DeploymentIntegrationTests {
|
||||
|
||||
@ParameterizedTest
|
||||
@MethodSource("deployedApplications")
|
||||
void home(DeployedApplication app) throws Exception {
|
||||
app.test((rest) -> {
|
||||
ResponseEntity<String> response = rest.getForEntity("/", String.class);
|
||||
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
|
||||
assertThat(response.getBody()).isEqualTo("Hello World");
|
||||
});
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@MethodSource("deployedApplications")
|
||||
void health(DeployedApplication application) throws Exception {
|
||||
application.test((rest) -> {
|
||||
ResponseEntity<String> response = rest.getForEntity("/actuator/health", String.class);
|
||||
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
|
||||
assertThat(response.getBody()).isEqualTo("{\"status\":\"UP\"}");
|
||||
});
|
||||
}
|
||||
|
||||
static List<DeployedApplication> deployedApplications() {
|
||||
return Arrays.asList(new DeployedApplication("open-liberty:19.0.0.9-webProfile8", "/config/dropins", 9080),
|
||||
new DeployedApplication("tomcat:9.0.29-jdk8-openjdk", "/usr/local/tomcat/webapps", 8080),
|
||||
new DeployedApplication("tomee:11-jre-8.0.0-M3-webprofile", "/usr/local/tomee/webapps", 8080),
|
||||
new DeployedApplication("jboss/wildfly:18.0.1.Final", "/opt/jboss/wildfly/standalone/deployments/",
|
||||
8080));
|
||||
}
|
||||
|
||||
public static final class DeployedApplication {
|
||||
|
||||
private final String baseImage;
|
||||
|
||||
private final String deploymentLocation;
|
||||
|
||||
private final int port;
|
||||
|
||||
private DeployedApplication(String baseImage, String deploymentLocation, int port) {
|
||||
this.baseImage = baseImage;
|
||||
this.deploymentLocation = deploymentLocation;
|
||||
this.port = port;
|
||||
}
|
||||
|
||||
private void test(Consumer<TestRestTemplate> consumer) {
|
||||
try (WarDeploymentContainer container = new WarDeploymentContainer(this.baseImage, this.deploymentLocation,
|
||||
this.port)) {
|
||||
container.start();
|
||||
TestRestTemplate rest = new TestRestTemplate(new RestTemplateBuilder()
|
||||
.rootUri("http://" + container.getContainerIpAddress() + ":"
|
||||
+ container.getMappedPort(this.port) + "/spring-boot")
|
||||
.requestFactory(() -> new HttpComponentsClientHttpRequestFactory(HttpClients.custom()
|
||||
.setRetryHandler(new StandardHttpRequestRetryHandler(10, false)).build())));
|
||||
try {
|
||||
Awaitility.await().atMost(Duration.ofMinutes(10)).until(() -> {
|
||||
try {
|
||||
consumer.accept(rest);
|
||||
return true;
|
||||
}
|
||||
catch (Throwable ex) {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
}
|
||||
catch (ConditionTimeoutException ex) {
|
||||
System.out.println(container.getLogs());
|
||||
throw ex;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return this.baseImage;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static final class WarDeploymentContainer extends GenericContainer<WarDeploymentContainer> {
|
||||
|
||||
private WarDeploymentContainer(String baseImage, String deploymentLocation, int port) {
|
||||
super(new ImageFromDockerfile().withFileFromFile("spring-boot.war", findWarToDeploy())
|
||||
.withDockerfileFromBuilder((builder) -> builder.from(baseImage)
|
||||
.add("spring-boot.war", deploymentLocation + "/spring-boot.war").build()));
|
||||
withExposedPorts(port).withStartupTimeout(Duration.ofMinutes(10));
|
||||
}
|
||||
|
||||
private static File findWarToDeploy() {
|
||||
File[] candidates = new File("build/libs").listFiles();
|
||||
assertThat(candidates).hasSize(1);
|
||||
return candidates[0];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -20,6 +20,6 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
|
||||
|
||||
@SpringBootApplication
|
||||
public class SampleWlpDeployApplication extends SpringBootServletInitializer {
|
||||
public class DeploymentTestApplication extends SpringBootServletInitializer {
|
||||
|
||||
}
|
||||
@@ -1,35 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-tests</artifactId>
|
||||
<version>${revision}</version>
|
||||
</parent>
|
||||
<artifactId>spring-boot-integration-tests</artifactId>
|
||||
<packaging>pom</packaging>
|
||||
<name>Spring Boot Integration Tests</name>
|
||||
<description>Spring Boot Integration Tests</description>
|
||||
<properties>
|
||||
<main.basedir>${basedir}/../..</main.basedir>
|
||||
<java.version>1.8</java.version>
|
||||
</properties>
|
||||
<modules>
|
||||
<module>spring-boot-configuration-processor-tests</module>
|
||||
<module>spring-boot-devtools-tests</module>
|
||||
<module>spring-boot-server-tests</module>
|
||||
<module>spring-boot-launch-script-tests</module>
|
||||
</modules>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-install-plugin</artifactId>
|
||||
<configuration>
|
||||
<skip>true</skip>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
||||
@@ -0,0 +1,17 @@
|
||||
plugins {
|
||||
id 'java'
|
||||
id 'org.springframework.boot.conventions'
|
||||
}
|
||||
|
||||
description = "Spring Boot Configuration Processor Tests"
|
||||
|
||||
dependencies {
|
||||
annotationProcessor project(':spring-boot-project:spring-boot-tools:spring-boot-configuration-processor')
|
||||
|
||||
implementation enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies'))
|
||||
implementation project(':spring-boot-project:spring-boot')
|
||||
implementation 'jakarta.validation:jakarta.validation-api'
|
||||
|
||||
testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test')
|
||||
testImplementation project(':spring-boot-project:spring-boot-tools:spring-boot-configuration-metadata')
|
||||
}
|
||||
@@ -1,40 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-integration-tests</artifactId>
|
||||
<version>${revision}</version>
|
||||
</parent>
|
||||
<artifactId>spring-boot-configuration-processor-tests</artifactId>
|
||||
<name>Spring Boot Configuration Processor Tests</name>
|
||||
<description>${project.name}</description>
|
||||
<properties>
|
||||
<main.basedir>${basedir}/../../..</main.basedir>
|
||||
</properties>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-configuration-metadata</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>jakarta.validation</groupId>
|
||||
<artifactId>jakarta.validation-api</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-configuration-processor</artifactId>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
@@ -1,67 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-integration-tests</artifactId>
|
||||
<version>${revision}</version>
|
||||
</parent>
|
||||
<artifactId>spring-boot-devtools-tests</artifactId>
|
||||
<name>Spring Boot DevTools Tests</name>
|
||||
<description>${project.name}</description>
|
||||
<properties>
|
||||
<main.basedir>${basedir}/../../..</main.basedir>
|
||||
</properties>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-devtools</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.bytebuddy</groupId>
|
||||
<artifactId>byte-buddy</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-test-support</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.awaitility</groupId>
|
||||
<artifactId>awaitility</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-dependency-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>copy-dependencies</id>
|
||||
<phase>process-test-resources</phase>
|
||||
<goals>
|
||||
<goal>copy-dependencies</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<includeScope>runtime</includeScope>
|
||||
<outputDirectory>${project.build.directory}/dependencies</outputDirectory>
|
||||
<overWriteSnapshots>true</overWriteSnapshots>
|
||||
<overWriteIfNewer>true</overWriteIfNewer>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
||||
@@ -1,30 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2019 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.example;
|
||||
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
@RestController
|
||||
public class ControllerOne {
|
||||
|
||||
@RequestMapping("/one")
|
||||
public String one() {
|
||||
return "one";
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2019 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.example;
|
||||
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.boot.builder.SpringApplicationBuilder;
|
||||
import org.springframework.boot.web.context.WebServerPortFileWriter;
|
||||
|
||||
@SpringBootApplication
|
||||
public class DevToolsTestApplication {
|
||||
|
||||
public static void main(String[] args) {
|
||||
new SpringApplicationBuilder(DevToolsTestApplication.class).listeners(new WebServerPortFileWriter(args[0]))
|
||||
.run(args);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,56 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2019 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.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<String> getDependencyJarPaths() {
|
||||
return Stream.of(this.directories.getDependenciesDirectory().listFiles()).map(File::getAbsolutePath)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
protected final Directories getDirectories() {
|
||||
return this.directories;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,114 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2019 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.devtools.tests;
|
||||
|
||||
import java.io.File;
|
||||
import java.time.Duration;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import net.bytebuddy.ByteBuddy;
|
||||
import net.bytebuddy.description.annotation.AnnotationDescription;
|
||||
import net.bytebuddy.description.modifier.Visibility;
|
||||
import net.bytebuddy.dynamic.DynamicType;
|
||||
import net.bytebuddy.implementation.FixedValue;
|
||||
import org.awaitility.Awaitility;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.extension.RegisterExtension;
|
||||
import org.junit.jupiter.api.io.TempDir;
|
||||
|
||||
import org.springframework.boot.testsupport.BuildOutput;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
/**
|
||||
* Base class for DevTools integration tests.
|
||||
*
|
||||
* @author Andy Wilkinson
|
||||
*/
|
||||
abstract class AbstractDevToolsIntegrationTests {
|
||||
|
||||
protected static final BuildOutput buildOutput = new BuildOutput(AbstractDevToolsIntegrationTests.class);
|
||||
|
||||
protected final File serverPortFile = new File(buildOutput.getRootLocation(), "server.port");
|
||||
|
||||
@RegisterExtension
|
||||
protected final JvmLauncher javaLauncher = new JvmLauncher();
|
||||
|
||||
@TempDir
|
||||
protected static File temp;
|
||||
|
||||
protected LaunchedApplication launchedApplication;
|
||||
|
||||
protected void launchApplication(ApplicationLauncher applicationLauncher, String... args) throws Exception {
|
||||
this.serverPortFile.delete();
|
||||
this.launchedApplication = applicationLauncher.launchApplication(this.javaLauncher, this.serverPortFile, args);
|
||||
}
|
||||
|
||||
@AfterEach
|
||||
void stopApplication() throws InterruptedException {
|
||||
this.launchedApplication.stop();
|
||||
}
|
||||
|
||||
protected int awaitServerPort() throws Exception {
|
||||
int port = Awaitility.waitAtMost(Duration.ofSeconds(30))
|
||||
.until(() -> new ApplicationState(this.serverPortFile, this.launchedApplication),
|
||||
ApplicationState::hasServerPort)
|
||||
.getServerPort();
|
||||
this.serverPortFile.delete();
|
||||
System.out.println("Got port " + port);
|
||||
this.launchedApplication.restartRemote(port);
|
||||
Thread.sleep(1000);
|
||||
return port;
|
||||
}
|
||||
|
||||
protected ControllerBuilder controller(String name) {
|
||||
return new ControllerBuilder(name, this.launchedApplication.getClassesDirectory());
|
||||
}
|
||||
|
||||
protected static final class ControllerBuilder {
|
||||
|
||||
private final List<String> mappings = new ArrayList<>();
|
||||
|
||||
private final String name;
|
||||
|
||||
private final File classesDirectory;
|
||||
|
||||
protected ControllerBuilder(String name, File classesDirectory) {
|
||||
this.name = name;
|
||||
this.classesDirectory = classesDirectory;
|
||||
}
|
||||
|
||||
protected ControllerBuilder withRequestMapping(String mapping) {
|
||||
this.mappings.add(mapping);
|
||||
return this;
|
||||
}
|
||||
|
||||
protected void build() throws Exception {
|
||||
DynamicType.Builder<Object> builder = new ByteBuddy().subclass(Object.class).name(this.name)
|
||||
.annotateType(AnnotationDescription.Builder.ofType(RestController.class).build());
|
||||
for (String mapping : this.mappings) {
|
||||
builder = builder.defineMethod(mapping, String.class, Visibility.PUBLIC)
|
||||
.intercept(FixedValue.value(mapping)).annotateMethod(AnnotationDescription.Builder
|
||||
.ofType(RequestMapping.class).defineArray("value", mapping).build());
|
||||
}
|
||||
builder.make().saveIn(this.classesDirectory);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,34 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2019 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.devtools.tests;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
/**
|
||||
* Launches an application with DevTools.
|
||||
*
|
||||
* @author Andy Wilkinson
|
||||
* @author Madhura Bhave
|
||||
*/
|
||||
public interface ApplicationLauncher {
|
||||
|
||||
LaunchedApplication launchApplication(JvmLauncher javaLauncher, File serverPortFile) throws Exception;
|
||||
|
||||
LaunchedApplication launchApplication(JvmLauncher jvmLauncher, File serverPortFile, String... additionalArgs)
|
||||
throws Exception;
|
||||
|
||||
}
|
||||
@@ -1,63 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2019 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.devtools.tests;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
import org.springframework.boot.devtools.tests.JvmLauncher.LaunchedJvm;
|
||||
|
||||
/**
|
||||
* State of an application.
|
||||
*
|
||||
* @author Andy Wilkinson
|
||||
*/
|
||||
final class ApplicationState {
|
||||
|
||||
private final Integer serverPort;
|
||||
|
||||
private final FileContents out;
|
||||
|
||||
private final FileContents err;
|
||||
|
||||
ApplicationState(File serverPortFile, LaunchedJvm jvm) {
|
||||
this(serverPortFile, jvm.getStandardOut(), jvm.getStandardError());
|
||||
}
|
||||
|
||||
ApplicationState(File serverPortFile, LaunchedApplication application) {
|
||||
this(serverPortFile, application.getStandardOut(), application.getStandardError());
|
||||
}
|
||||
|
||||
private ApplicationState(File serverPortFile, File out, File err) {
|
||||
this.serverPort = new FileContents(serverPortFile).get(Integer::parseInt);
|
||||
this.out = new FileContents(out);
|
||||
this.err = new FileContents(err);
|
||||
}
|
||||
|
||||
boolean hasServerPort() {
|
||||
return this.serverPort != null;
|
||||
}
|
||||
|
||||
int getServerPort() {
|
||||
return this.serverPort;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return String.format("Application output:%n%s%n%s", this.out, this.err);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,162 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2019 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.devtools.tests;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
|
||||
import org.junit.jupiter.params.ParameterizedTest;
|
||||
import org.junit.jupiter.params.provider.MethodSource;
|
||||
|
||||
import org.springframework.boot.test.web.client.TestRestTemplate;
|
||||
import org.springframework.http.HttpStatus;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
/**
|
||||
* Integration tests for DevTools.
|
||||
*
|
||||
* @author Andy Wilkinson
|
||||
*/
|
||||
class DevToolsIntegrationTests extends AbstractDevToolsIntegrationTests {
|
||||
|
||||
@ParameterizedTest(name = "{0}")
|
||||
@MethodSource("parameters")
|
||||
void addARequestMappingToAnExistingController(ApplicationLauncher applicationLauncher) throws Exception {
|
||||
launchApplication(applicationLauncher);
|
||||
TestRestTemplate template = new TestRestTemplate();
|
||||
String urlBase = "http://localhost:" + awaitServerPort();
|
||||
assertThat(template.getForObject(urlBase + "/one", String.class)).isEqualTo("one");
|
||||
assertThat(template.getForEntity(urlBase + "/two", String.class).getStatusCode())
|
||||
.isEqualTo(HttpStatus.NOT_FOUND);
|
||||
controller("com.example.ControllerOne").withRequestMapping("one").withRequestMapping("two").build();
|
||||
urlBase = "http://localhost:" + awaitServerPort();
|
||||
assertThat(template.getForObject(urlBase + "/one", String.class)).isEqualTo("one");
|
||||
assertThat(template.getForObject(urlBase + "/two", String.class)).isEqualTo("two");
|
||||
}
|
||||
|
||||
@ParameterizedTest(name = "{0}")
|
||||
@MethodSource("parameters")
|
||||
void removeARequestMappingFromAnExistingController(ApplicationLauncher applicationLauncher) throws Exception {
|
||||
launchApplication(applicationLauncher);
|
||||
TestRestTemplate template = new TestRestTemplate();
|
||||
String urlBase = "http://localhost:" + awaitServerPort();
|
||||
assertThat(template.getForObject(urlBase + "/one", String.class)).isEqualTo("one");
|
||||
controller("com.example.ControllerOne").build();
|
||||
urlBase = "http://localhost:" + awaitServerPort();
|
||||
assertThat(template.getForEntity(urlBase + "/one", String.class).getStatusCode())
|
||||
.isEqualTo(HttpStatus.NOT_FOUND);
|
||||
}
|
||||
|
||||
@ParameterizedTest(name = "{0}")
|
||||
@MethodSource("parameters")
|
||||
void createAController(ApplicationLauncher applicationLauncher) throws Exception {
|
||||
launchApplication(applicationLauncher);
|
||||
TestRestTemplate template = new TestRestTemplate();
|
||||
String urlBase = "http://localhost:" + awaitServerPort();
|
||||
assertThat(template.getForObject(urlBase + "/one", String.class)).isEqualTo("one");
|
||||
assertThat(template.getForEntity(urlBase + "/two", String.class).getStatusCode())
|
||||
.isEqualTo(HttpStatus.NOT_FOUND);
|
||||
controller("com.example.ControllerTwo").withRequestMapping("two").build();
|
||||
urlBase = "http://localhost:" + awaitServerPort();
|
||||
assertThat(template.getForObject(urlBase + "/one", String.class)).isEqualTo("one");
|
||||
assertThat(template.getForObject(urlBase + "/two", String.class)).isEqualTo("two");
|
||||
|
||||
}
|
||||
|
||||
@ParameterizedTest(name = "{0}")
|
||||
@MethodSource("parameters")
|
||||
void createAControllerAndThenAddARequestMapping(ApplicationLauncher applicationLauncher) throws Exception {
|
||||
launchApplication(applicationLauncher);
|
||||
TestRestTemplate template = new TestRestTemplate();
|
||||
String urlBase = "http://localhost:" + awaitServerPort();
|
||||
assertThat(template.getForObject(urlBase + "/one", String.class)).isEqualTo("one");
|
||||
assertThat(template.getForEntity(urlBase + "/two", String.class).getStatusCode())
|
||||
.isEqualTo(HttpStatus.NOT_FOUND);
|
||||
controller("com.example.ControllerTwo").withRequestMapping("two").build();
|
||||
urlBase = "http://localhost:" + awaitServerPort();
|
||||
assertThat(template.getForObject(urlBase + "/one", String.class)).isEqualTo("one");
|
||||
assertThat(template.getForObject(urlBase + "/two", String.class)).isEqualTo("two");
|
||||
controller("com.example.ControllerTwo").withRequestMapping("two").withRequestMapping("three").build();
|
||||
urlBase = "http://localhost:" + awaitServerPort();
|
||||
assertThat(template.getForObject(urlBase + "/three", String.class)).isEqualTo("three");
|
||||
}
|
||||
|
||||
@ParameterizedTest(name = "{0}")
|
||||
@MethodSource("parameters")
|
||||
void createAControllerAndThenAddARequestMappingToAnExistingController(ApplicationLauncher applicationLauncher)
|
||||
throws Exception {
|
||||
launchApplication(applicationLauncher);
|
||||
TestRestTemplate template = new TestRestTemplate();
|
||||
String urlBase = "http://localhost:" + awaitServerPort();
|
||||
assertThat(template.getForObject(urlBase + "/one", String.class)).isEqualTo("one");
|
||||
assertThat(template.getForEntity(urlBase + "/two", String.class).getStatusCode())
|
||||
.isEqualTo(HttpStatus.NOT_FOUND);
|
||||
controller("com.example.ControllerTwo").withRequestMapping("two").build();
|
||||
urlBase = "http://localhost:" + awaitServerPort();
|
||||
assertThat(template.getForObject(urlBase + "/one", String.class)).isEqualTo("one");
|
||||
assertThat(template.getForObject(urlBase + "/two", String.class)).isEqualTo("two");
|
||||
controller("com.example.ControllerOne").withRequestMapping("one").withRequestMapping("three").build();
|
||||
urlBase = "http://localhost:" + awaitServerPort();
|
||||
assertThat(template.getForObject(urlBase + "/one", String.class)).isEqualTo("one");
|
||||
assertThat(template.getForObject(urlBase + "/two", String.class)).isEqualTo("two");
|
||||
assertThat(template.getForObject(urlBase + "/three", String.class)).isEqualTo("three");
|
||||
}
|
||||
|
||||
@ParameterizedTest(name = "{0}")
|
||||
@MethodSource("parameters")
|
||||
void deleteAController(ApplicationLauncher applicationLauncher) throws Exception {
|
||||
launchApplication(applicationLauncher);
|
||||
TestRestTemplate template = new TestRestTemplate();
|
||||
String urlBase = "http://localhost:" + awaitServerPort();
|
||||
assertThat(template.getForObject(urlBase + "/one", String.class)).isEqualTo("one");
|
||||
assertThat(new File(this.launchedApplication.getClassesDirectory(), "com/example/ControllerOne.class").delete())
|
||||
.isTrue();
|
||||
urlBase = "http://localhost:" + awaitServerPort();
|
||||
assertThat(template.getForEntity(urlBase + "/one", String.class).getStatusCode())
|
||||
.isEqualTo(HttpStatus.NOT_FOUND);
|
||||
|
||||
}
|
||||
|
||||
@ParameterizedTest(name = "{0}")
|
||||
@MethodSource("parameters")
|
||||
void createAControllerAndThenDeleteIt(ApplicationLauncher applicationLauncher) throws Exception {
|
||||
launchApplication(applicationLauncher);
|
||||
TestRestTemplate template = new TestRestTemplate();
|
||||
String urlBase = "http://localhost:" + awaitServerPort();
|
||||
assertThat(template.getForObject(urlBase + "/one", String.class)).isEqualTo("one");
|
||||
assertThat(template.getForEntity(urlBase + "/two", String.class).getStatusCode())
|
||||
.isEqualTo(HttpStatus.NOT_FOUND);
|
||||
controller("com.example.ControllerTwo").withRequestMapping("two").build();
|
||||
urlBase = "http://localhost:" + awaitServerPort();
|
||||
assertThat(template.getForObject(urlBase + "/one", String.class)).isEqualTo("one");
|
||||
assertThat(template.getForObject(urlBase + "/two", String.class)).isEqualTo("two");
|
||||
assertThat(new File(this.launchedApplication.getClassesDirectory(), "com/example/ControllerTwo.class").delete())
|
||||
.isTrue();
|
||||
urlBase = "http://localhost:" + awaitServerPort();
|
||||
assertThat(template.getForEntity(urlBase + "/two", String.class).getStatusCode())
|
||||
.isEqualTo(HttpStatus.NOT_FOUND);
|
||||
}
|
||||
|
||||
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) } };
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,60 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2019 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.devtools.tests;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import org.junit.jupiter.params.ParameterizedTest;
|
||||
import org.junit.jupiter.params.provider.MethodSource;
|
||||
|
||||
import org.springframework.boot.test.web.client.TestRestTemplate;
|
||||
import org.springframework.http.HttpStatus;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
/**
|
||||
* Integration tests for DevTools with lazy initialization enabled.
|
||||
*
|
||||
* @author Madhura Bhave
|
||||
*/
|
||||
class DevToolsWithLazyInitializationIntegrationTests extends AbstractDevToolsIntegrationTests {
|
||||
|
||||
@ParameterizedTest(name = "{0}")
|
||||
@MethodSource("parameters")
|
||||
void addARequestMappingToAnExistingControllerWhenLazyInit(ApplicationLauncher applicationLauncher)
|
||||
throws Exception {
|
||||
launchApplication(applicationLauncher, "--spring.main.lazy-initialization=true");
|
||||
TestRestTemplate template = new TestRestTemplate();
|
||||
String urlBase = "http://localhost:" + awaitServerPort();
|
||||
assertThat(template.getForObject(urlBase + "/one", String.class)).isEqualTo("one");
|
||||
assertThat(template.getForEntity(urlBase + "/two", String.class).getStatusCode())
|
||||
.isEqualTo(HttpStatus.NOT_FOUND);
|
||||
controller("com.example.ControllerOne").withRequestMapping("one").withRequestMapping("two").build();
|
||||
urlBase = "http://localhost:" + awaitServerPort();
|
||||
assertThat(template.getForObject(urlBase + "/one", String.class)).isEqualTo("one");
|
||||
assertThat(template.getForObject(urlBase + "/two", String.class)).isEqualTo("two");
|
||||
}
|
||||
|
||||
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) } };
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2019 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.devtools.tests;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
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 File temp;
|
||||
|
||||
Directories(BuildOutput buildOutput, File temp) {
|
||||
this.buildOutput = buildOutput;
|
||||
this.temp = temp;
|
||||
}
|
||||
|
||||
File getTestClassesDirectory() {
|
||||
return this.buildOutput.getTestClassesLocation();
|
||||
}
|
||||
|
||||
File getRemoteAppDirectory() {
|
||||
return new File(this.temp, "remote");
|
||||
}
|
||||
|
||||
File getDependenciesDirectory() {
|
||||
return new File(this.buildOutput.getRootLocation(), "dependencies");
|
||||
}
|
||||
|
||||
File getAppDirectory() {
|
||||
return new File(this.temp, "app");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,52 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2019 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.devtools.tests;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
/**
|
||||
* {@link ApplicationLauncher} that launches a remote application with its classes
|
||||
* available directly on the file system.
|
||||
*
|
||||
* @author Andy Wilkinson
|
||||
*/
|
||||
public class ExplodedRemoteApplicationLauncher extends RemoteApplicationLauncher {
|
||||
|
||||
public ExplodedRemoteApplicationLauncher(Directories directories) {
|
||||
super(directories);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String createApplicationClassPath() throws Exception {
|
||||
File appDirectory = getDirectories().getAppDirectory();
|
||||
copyApplicationTo(appDirectory);
|
||||
List<String> entries = new ArrayList<>();
|
||||
entries.add(appDirectory.getAbsolutePath());
|
||||
entries.addAll(getDependencyJarPaths());
|
||||
return StringUtils.collectionToDelimitedString(entries, File.pathSeparator);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "exploded remote";
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,60 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2019 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.devtools.tests;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileReader;
|
||||
import java.io.IOException;
|
||||
import java.util.function.Function;
|
||||
|
||||
import org.springframework.util.FileCopyUtils;
|
||||
|
||||
/**
|
||||
* Provides access to the contents of a file.
|
||||
*
|
||||
* @author Andy Wilkinson
|
||||
*/
|
||||
class FileContents {
|
||||
|
||||
private final File file;
|
||||
|
||||
FileContents(File file) {
|
||||
this.file = file;
|
||||
}
|
||||
|
||||
String get() {
|
||||
return get(Function.identity());
|
||||
}
|
||||
|
||||
<T> T get(Function<String, T> transformer) {
|
||||
if ((!this.file.exists()) || this.file.length() == 0) {
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
return transformer.apply(FileCopyUtils.copyToString(new FileReader(this.file)));
|
||||
}
|
||||
catch (IOException ex) {
|
||||
throw new RuntimeException(ex);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return get();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,84 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2019 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.devtools.tests;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.jar.Attributes;
|
||||
import java.util.jar.JarOutputStream;
|
||||
import java.util.jar.Manifest;
|
||||
import java.util.zip.ZipEntry;
|
||||
|
||||
import org.springframework.util.StreamUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
/**
|
||||
* {@link ApplicationLauncher} that launches a remote application with its classes in a
|
||||
* jar file.
|
||||
*
|
||||
* @author Andy Wilkinson
|
||||
*/
|
||||
public class JarFileRemoteApplicationLauncher extends RemoteApplicationLauncher {
|
||||
|
||||
public JarFileRemoteApplicationLauncher(Directories directories) {
|
||||
super(directories);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String createApplicationClassPath() throws Exception {
|
||||
File appDirectory = getDirectories().getAppDirectory();
|
||||
copyApplicationTo(appDirectory);
|
||||
Manifest manifest = new Manifest();
|
||||
manifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0");
|
||||
File appJar = new File(appDirectory, "app.jar");
|
||||
JarOutputStream output = new JarOutputStream(new FileOutputStream(appJar), manifest);
|
||||
addToJar(output, appDirectory, appDirectory);
|
||||
output.close();
|
||||
List<String> entries = new ArrayList<>();
|
||||
entries.add(appJar.getAbsolutePath());
|
||||
entries.addAll(getDependencyJarPaths());
|
||||
String classpath = StringUtils.collectionToDelimitedString(entries, File.pathSeparator);
|
||||
return classpath;
|
||||
}
|
||||
|
||||
private void addToJar(JarOutputStream output, File root, File current) throws IOException {
|
||||
for (File file : current.listFiles()) {
|
||||
if (file.isDirectory()) {
|
||||
addToJar(output, root, file);
|
||||
}
|
||||
output.putNextEntry(new ZipEntry(
|
||||
file.getAbsolutePath().substring(root.getAbsolutePath().length() + 1).replace("\\", "/")
|
||||
+ (file.isDirectory() ? "/" : "")));
|
||||
if (file.isFile()) {
|
||||
try (FileInputStream input = new FileInputStream(file)) {
|
||||
StreamUtils.copy(input, output);
|
||||
}
|
||||
}
|
||||
output.closeEntry();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "jar file remote";
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,93 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2019 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.devtools.tests;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import org.junit.jupiter.api.extension.BeforeTestExecutionCallback;
|
||||
import org.junit.jupiter.api.extension.Extension;
|
||||
import org.junit.jupiter.api.extension.ExtensionContext;
|
||||
|
||||
import org.springframework.boot.testsupport.BuildOutput;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
/**
|
||||
* {@link Extension} that launches a JVM and redirects its output to a test
|
||||
* method-specific location.
|
||||
*
|
||||
* @author Andy Wilkinson
|
||||
*/
|
||||
class JvmLauncher implements BeforeTestExecutionCallback {
|
||||
|
||||
private static final Pattern NON_ALPHABET_PATTERN = Pattern.compile("[^A-Za-z]+");
|
||||
|
||||
private final BuildOutput buildOutput = new BuildOutput(getClass());
|
||||
|
||||
private File outputDirectory;
|
||||
|
||||
@Override
|
||||
public void beforeTestExecution(ExtensionContext context) throws Exception {
|
||||
this.outputDirectory = new File(this.buildOutput.getRootLocation(),
|
||||
"output/" + NON_ALPHABET_PATTERN.matcher(context.getRequiredTestMethod().getName()).replaceAll(""));
|
||||
this.outputDirectory.mkdirs();
|
||||
}
|
||||
|
||||
LaunchedJvm launch(String name, String classpath, String... args) throws IOException {
|
||||
List<String> command = new ArrayList<>(
|
||||
Arrays.asList(System.getProperty("java.home") + "/bin/java", "-cp", classpath));
|
||||
command.addAll(Arrays.asList(args));
|
||||
File standardOut = new File(this.outputDirectory, name + ".out");
|
||||
File standardError = new File(this.outputDirectory, name + ".err");
|
||||
Process process = new ProcessBuilder(StringUtils.toStringArray(command)).redirectError(standardError)
|
||||
.redirectOutput(standardOut).start();
|
||||
return new LaunchedJvm(process, standardOut, standardError);
|
||||
}
|
||||
|
||||
static class LaunchedJvm {
|
||||
|
||||
private final Process process;
|
||||
|
||||
private final File standardOut;
|
||||
|
||||
private final File standardError;
|
||||
|
||||
LaunchedJvm(Process process, File standardOut, File standardError) {
|
||||
this.process = process;
|
||||
this.standardOut = standardOut;
|
||||
this.standardError = standardError;
|
||||
}
|
||||
|
||||
Process getProcess() {
|
||||
return this.process;
|
||||
}
|
||||
|
||||
File getStandardOut() {
|
||||
return this.standardOut;
|
||||
}
|
||||
|
||||
File getStandardError() {
|
||||
return this.standardError;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,82 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2019 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.devtools.tests;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.function.BiFunction;
|
||||
|
||||
/**
|
||||
* An application launched by {@link ApplicationLauncher}.
|
||||
*
|
||||
* @author Andy Wilkinson
|
||||
*/
|
||||
class LaunchedApplication {
|
||||
|
||||
private final File classesDirectory;
|
||||
|
||||
private final File standardOut;
|
||||
|
||||
private final File standardError;
|
||||
|
||||
private final Process localProcess;
|
||||
|
||||
private Process remoteProcess;
|
||||
|
||||
private final BiFunction<Integer, File, Process> remoteProcessRestarter;
|
||||
|
||||
LaunchedApplication(File classesDirectory, File standardOut, File standardError, Process localProcess,
|
||||
Process remoteProcess, BiFunction<Integer, File, Process> remoteProcessRestarter) {
|
||||
this.classesDirectory = classesDirectory;
|
||||
this.standardOut = standardOut;
|
||||
this.standardError = standardError;
|
||||
this.localProcess = localProcess;
|
||||
this.remoteProcess = remoteProcess;
|
||||
this.remoteProcessRestarter = remoteProcessRestarter;
|
||||
}
|
||||
|
||||
void restartRemote(int port) throws InterruptedException {
|
||||
if (this.remoteProcessRestarter != null) {
|
||||
stop(this.remoteProcess);
|
||||
this.remoteProcess = this.remoteProcessRestarter.apply(port, this.classesDirectory);
|
||||
}
|
||||
}
|
||||
|
||||
void stop() throws InterruptedException {
|
||||
stop(this.localProcess);
|
||||
stop(this.remoteProcess);
|
||||
}
|
||||
|
||||
private void stop(Process process) throws InterruptedException {
|
||||
if (process != null) {
|
||||
process.destroy();
|
||||
process.waitFor();
|
||||
}
|
||||
}
|
||||
|
||||
File getStandardOut() {
|
||||
return this.standardOut;
|
||||
}
|
||||
|
||||
File getStandardError() {
|
||||
return this.standardError;
|
||||
}
|
||||
|
||||
File getClassesDirectory() {
|
||||
return this.classesDirectory;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,71 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2019 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.devtools.tests;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import org.springframework.boot.devtools.tests.JvmLauncher.LaunchedJvm;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
/**
|
||||
* {@link ApplicationLauncher} that launches a local application with DevTools enabled.
|
||||
*
|
||||
* @author Andy Wilkinson
|
||||
*/
|
||||
public class LocalApplicationLauncher extends AbstractApplicationLauncher {
|
||||
|
||||
LocalApplicationLauncher(Directories directories) {
|
||||
super(directories);
|
||||
}
|
||||
|
||||
@Override
|
||||
public LaunchedApplication launchApplication(JvmLauncher jvmLauncher, File serverPortFile) throws Exception {
|
||||
LaunchedJvm jvm = jvmLauncher.launch("local", createApplicationClassPath(),
|
||||
"com.example.DevToolsTestApplication", serverPortFile.getAbsolutePath(), "--server.port=0");
|
||||
return new LaunchedApplication(getDirectories().getAppDirectory(), jvm.getStandardOut(), jvm.getStandardError(),
|
||||
jvm.getProcess(), null, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public LaunchedApplication launchApplication(JvmLauncher jvmLauncher, File serverPortFile, String... additionalArgs)
|
||||
throws Exception {
|
||||
List<String> args = new ArrayList<>(Arrays.asList("com.example.DevToolsTestApplication",
|
||||
serverPortFile.getAbsolutePath(), "--server.port=0"));
|
||||
args.addAll(Arrays.asList(additionalArgs));
|
||||
LaunchedJvm jvm = jvmLauncher.launch("local", createApplicationClassPath(), args.toArray(new String[] {}));
|
||||
return new LaunchedApplication(getDirectories().getAppDirectory(), jvm.getStandardOut(), jvm.getStandardError(),
|
||||
jvm.getProcess(), null, null);
|
||||
}
|
||||
|
||||
protected String createApplicationClassPath() throws Exception {
|
||||
File appDirectory = getDirectories().getAppDirectory();
|
||||
copyApplicationTo(appDirectory);
|
||||
List<String> entries = new ArrayList<>();
|
||||
entries.add(appDirectory.getAbsolutePath());
|
||||
entries.addAll(getDependencyJarPaths());
|
||||
return StringUtils.collectionToDelimitedString(entries, File.pathSeparator);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "local";
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,114 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2019 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.devtools.tests;
|
||||
|
||||
import java.io.File;
|
||||
import java.time.Duration;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.function.BiFunction;
|
||||
|
||||
import org.awaitility.Awaitility;
|
||||
|
||||
import org.springframework.boot.devtools.RemoteSpringApplication;
|
||||
import org.springframework.boot.devtools.tests.JvmLauncher.LaunchedJvm;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import static org.hamcrest.Matchers.containsString;
|
||||
|
||||
/**
|
||||
* Base class for {@link ApplicationLauncher} implementations that use
|
||||
* {@link RemoteSpringApplication}.
|
||||
*
|
||||
* @author Andy Wilkinson
|
||||
*/
|
||||
abstract class RemoteApplicationLauncher extends AbstractApplicationLauncher {
|
||||
|
||||
RemoteApplicationLauncher(Directories directories) {
|
||||
super(directories);
|
||||
}
|
||||
|
||||
@Override
|
||||
public LaunchedApplication launchApplication(JvmLauncher javaLauncher, File serverPortFile) throws Exception {
|
||||
LaunchedJvm applicationJvm = javaLauncher.launch("app", createApplicationClassPath(),
|
||||
"com.example.DevToolsTestApplication", serverPortFile.getAbsolutePath(), "--server.port=0",
|
||||
"--spring.devtools.remote.secret=secret");
|
||||
int port = awaitServerPort(applicationJvm, serverPortFile);
|
||||
BiFunction<Integer, File, Process> remoteRestarter = getRemoteRestarter(javaLauncher);
|
||||
return new LaunchedApplication(getDirectories().getRemoteAppDirectory(), applicationJvm.getStandardOut(),
|
||||
applicationJvm.getStandardError(), applicationJvm.getProcess(), remoteRestarter.apply(port, null),
|
||||
remoteRestarter);
|
||||
}
|
||||
|
||||
@Override
|
||||
public LaunchedApplication launchApplication(JvmLauncher javaLauncher, File serverPortFile,
|
||||
String... additionalArgs) throws Exception {
|
||||
List<String> args = new ArrayList<>(Arrays.asList("com.example.DevToolsTestApplication",
|
||||
serverPortFile.getAbsolutePath(), "--server.port=0", "--spring.devtools.remote.secret=secret"));
|
||||
args.addAll(Arrays.asList(additionalArgs));
|
||||
LaunchedJvm applicationJvm = javaLauncher.launch("app", createApplicationClassPath(),
|
||||
args.toArray(new String[] {}));
|
||||
int port = awaitServerPort(applicationJvm, serverPortFile);
|
||||
BiFunction<Integer, File, Process> remoteRestarter = getRemoteRestarter(javaLauncher);
|
||||
return new LaunchedApplication(getDirectories().getRemoteAppDirectory(), applicationJvm.getStandardOut(),
|
||||
applicationJvm.getStandardError(), applicationJvm.getProcess(), remoteRestarter.apply(port, null),
|
||||
remoteRestarter);
|
||||
}
|
||||
|
||||
private BiFunction<Integer, File, Process> getRemoteRestarter(JvmLauncher javaLauncher) {
|
||||
return (port, classesDirectory) -> {
|
||||
try {
|
||||
LaunchedJvm remoteSpringApplicationJvm = javaLauncher.launch("remote-spring-application",
|
||||
createRemoteSpringApplicationClassPath(classesDirectory),
|
||||
RemoteSpringApplication.class.getName(), "--spring.devtools.remote.secret=secret",
|
||||
"http://localhost:" + port);
|
||||
awaitRemoteSpringApplication(remoteSpringApplicationJvm.getStandardOut());
|
||||
return remoteSpringApplicationJvm.getProcess();
|
||||
}
|
||||
catch (Exception ex) {
|
||||
throw new IllegalStateException(ex);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
protected abstract String createApplicationClassPath() throws Exception;
|
||||
|
||||
private String createRemoteSpringApplicationClassPath(File classesDirectory) throws Exception {
|
||||
File remoteAppDirectory = getDirectories().getRemoteAppDirectory();
|
||||
if (classesDirectory == null) {
|
||||
copyApplicationTo(remoteAppDirectory);
|
||||
}
|
||||
List<String> entries = new ArrayList<>();
|
||||
entries.add(remoteAppDirectory.getAbsolutePath());
|
||||
entries.addAll(getDependencyJarPaths());
|
||||
return StringUtils.collectionToDelimitedString(entries, File.pathSeparator);
|
||||
}
|
||||
|
||||
private int awaitServerPort(LaunchedJvm jvm, File serverPortFile) throws Exception {
|
||||
return Awaitility.waitAtMost(Duration.ofSeconds(30))
|
||||
.until(() -> new ApplicationState(serverPortFile, jvm), ApplicationState::hasServerPort)
|
||||
.getServerPort();
|
||||
}
|
||||
|
||||
private void awaitRemoteSpringApplication(File standardOut) throws Exception {
|
||||
FileContents contents = new FileContents(standardOut);
|
||||
Awaitility.waitAtMost(Duration.ofSeconds(30)).until(contents::get,
|
||||
containsString("Started RemoteSpringApplication"));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
plugins {
|
||||
id 'java'
|
||||
id 'org.springframework.boot'
|
||||
}
|
||||
|
||||
apply plugin: 'io.spring.dependency-management'
|
||||
|
||||
repositories {
|
||||
maven { url "file:$rootDir/../int-test-maven-repository"}
|
||||
mavenCentral()
|
||||
maven { url 'https://repo.spring.io/snapshot' }
|
||||
maven { url 'https://repo.spring.io/milestone' }
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation 'org.springframework.boot:spring-boot-starter-web'
|
||||
}
|
||||
|
||||
bootJar {
|
||||
launchScript()
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
pluginManagement {
|
||||
repositories {
|
||||
maven { url "file:$rootDir/../int-test-maven-repository"}
|
||||
mavenCentral()
|
||||
maven { url 'https://repo.spring.io/snapshot' }
|
||||
maven { url 'https://repo.spring.io/milestone' }
|
||||
}
|
||||
resolutionStrategy {
|
||||
eachPlugin {
|
||||
if (requested.id.id == 'org.springframework.boot') {
|
||||
useModule "org.springframework.boot:spring-boot-gradle-plugin:${requested.version}"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
plugins {
|
||||
id 'java'
|
||||
id 'org.springframework.boot.conventions'
|
||||
id 'org.springframework.boot.integration-test'
|
||||
}
|
||||
|
||||
description = "Spring Boot Launch Script Integration Tests"
|
||||
|
||||
configurations {
|
||||
app
|
||||
}
|
||||
|
||||
dependencies {
|
||||
app project(path: ':spring-boot-project:spring-boot-tools:spring-boot-gradle-plugin', configuration: 'mavenRepository')
|
||||
app project(path: ':spring-boot-project:spring-boot-starters:spring-boot-starter-web', configuration: 'mavenRepository')
|
||||
|
||||
intTestImplementation enforcedPlatform(project(':spring-boot-project:spring-boot-parent'))
|
||||
intTestImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test')
|
||||
intTestImplementation 'org.testcontainers:testcontainers'
|
||||
}
|
||||
|
||||
task syncMavenRepository(type: Sync) {
|
||||
from configurations.app
|
||||
into "$buildDir/int-test-maven-repository"
|
||||
}
|
||||
|
||||
task syncAppSource(type: Sync) {
|
||||
from 'app'
|
||||
into "$buildDir/app"
|
||||
filter { line ->
|
||||
line.replace("id 'org.springframework.boot'", "id 'org.springframework.boot' version '${project.version}'")
|
||||
}
|
||||
}
|
||||
|
||||
task buildApp(type: GradleBuild) {
|
||||
dependsOn syncAppSource, syncMavenRepository
|
||||
dir = "$buildDir/app"
|
||||
startParameter.buildCacheEnabled = false
|
||||
tasks = ['build']
|
||||
}
|
||||
|
||||
intTest {
|
||||
dependsOn buildApp
|
||||
enabled = !JavaVersion.current().java9Compatible
|
||||
}
|
||||
@@ -1,110 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-integration-tests</artifactId>
|
||||
<version>${revision}</version>
|
||||
</parent>
|
||||
<artifactId>spring-boot-launch-script-tests</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
<name>Spring Boot Launch Script Integration Tests</name>
|
||||
<description>Spring Boot Launch Script Integration Tests</description>
|
||||
<properties>
|
||||
<main.basedir>${basedir}/../../..</main.basedir>
|
||||
<jersey.version>2.27</jersey.version>
|
||||
</properties>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-tomcat</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-undertow</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>jcl-over-slf4j</artifactId>
|
||||
</exclusion>
|
||||
<exclusion>
|
||||
<groupId>javax.ws.rs</groupId>
|
||||
<artifactId>javax.ws.rs-api</artifactId>
|
||||
</exclusion>
|
||||
<exclusion>
|
||||
<groupId>javax.annotation</groupId>
|
||||
<artifactId>javax.annotation-api</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>jakarta.ws.rs</groupId>
|
||||
<artifactId>jakarta.ws.rs-api</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.testcontainers</groupId>
|
||||
<artifactId>testcontainers</artifactId>
|
||||
<scope>test</scope>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>javax.annotation</groupId>
|
||||
<artifactId>javax.annotation-api</artifactId>
|
||||
</exclusion>
|
||||
<exclusion>
|
||||
<groupId>javax.xml.bind</groupId>
|
||||
<artifactId>jaxb-api</artifactId>
|
||||
</exclusion>
|
||||
<exclusion>
|
||||
<groupId>org.hamcrest</groupId>
|
||||
<artifactId>hamcrest-core</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<profiles>
|
||||
<profile>
|
||||
<id>docker</id>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
<configuration>
|
||||
<executable>true</executable>
|
||||
</configuration>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>repackage</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-failsafe-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>integration-test</goal>
|
||||
<goal>verify</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
</profiles>
|
||||
</project>
|
||||
@@ -42,7 +42,7 @@ import static org.hamcrest.Matchers.containsString;
|
||||
* @author Andy Wilkinson
|
||||
* @author Ali Shahbour
|
||||
*/
|
||||
class SysVinitLaunchScriptIT {
|
||||
class SysVinitLaunchScriptIntegrationTests {
|
||||
|
||||
private static final char ESC = 27;
|
||||
|
||||
@@ -279,7 +279,7 @@ class SysVinitLaunchScriptIT {
|
||||
|
||||
static List<Object[]> parameters() {
|
||||
List<Object[]> parameters = new ArrayList<>();
|
||||
for (File os : new File("src/test/resources/conf").listFiles()) {
|
||||
for (File os : new File("src/intTest/resources/conf").listFiles()) {
|
||||
for (File version : os.listFiles()) {
|
||||
parameters.add(new Object[] { os.getName(), version.getName() });
|
||||
}
|
||||
@@ -333,25 +333,22 @@ class SysVinitLaunchScriptIT {
|
||||
private LaunchScriptTestContainer(String os, String version, String testScript) {
|
||||
super(new ImageFromDockerfile("spring-boot-launch-script/" + os.toLowerCase() + "-" + version)
|
||||
.withFileFromFile("Dockerfile",
|
||||
new File("src/test/resources/conf/" + os + "/" + version + "/Dockerfile"))
|
||||
.withFileFromFile("spring-boot-launch-script-tests.jar", findApplication())
|
||||
.withFileFromFile("test-functions.sh", new File("src/test/resources/scripts/test-functions.sh")));
|
||||
withCopyFileToContainer(MountableFile.forHostPath("src/test/resources/scripts/" + testScript),
|
||||
new File("src/intTest/resources/conf/" + os + "/" + version + "/Dockerfile"))
|
||||
.withFileFromFile("app.jar", findApplication()).withFileFromFile("test-functions.sh",
|
||||
new File("src/intTest/resources/scripts/test-functions.sh")));
|
||||
withCopyFileToContainer(MountableFile.forHostPath("src/intTest/resources/scripts/" + testScript),
|
||||
"/" + testScript);
|
||||
withCommand("/bin/bash", "-c", "chmod +x " + testScript + " && ./" + testScript);
|
||||
withStartupTimeout(Duration.ofMinutes(10));
|
||||
}
|
||||
|
||||
private static File findApplication() {
|
||||
File targetDir = new File("target");
|
||||
for (File file : targetDir.listFiles()) {
|
||||
if (file.getName().startsWith("spring-boot-launch-script-tests") && file.getName().endsWith(".jar")
|
||||
&& !file.getName().endsWith("-sources.jar")) {
|
||||
return file;
|
||||
}
|
||||
File appJar = new File("build/app/build/libs/app.jar");
|
||||
if (appJar.isFile()) {
|
||||
return appJar;
|
||||
}
|
||||
throw new IllegalStateException(
|
||||
"Could not find test application in target directory. Have you built it (mvn package)?");
|
||||
"Could not find test application in build/app/build/libs directory. Have you built it?");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -7,5 +7,5 @@ RUN yum install -y wget && \
|
||||
https://cdn.azul.com/zulu/bin/zulu8.21.0.1-jdk8.0.131-linux.x86_64.rpm && \
|
||||
yum --nogpg localinstall -y jdk.rpm && \
|
||||
rm -f jdk.rpm
|
||||
ADD spring-boot-launch-script-tests.jar /spring-boot-launch-script-tests.jar
|
||||
ADD app.jar /app.jar
|
||||
ADD test-functions.sh /test-functions.sh
|
||||
@@ -6,5 +6,5 @@ RUN apt-get update && \
|
||||
curl -L https://github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk8u202-b08/OpenJDK8U-jdk_x64_linux_hotspot_8u202b08.tar.gz | tar zx --strip-components=1
|
||||
ENV JAVA_HOME /opt/openjdk
|
||||
ENV PATH $JAVA_HOME/bin:$PATH
|
||||
ADD spring-boot-launch-script-tests.jar /spring-boot-launch-script-tests.jar
|
||||
ADD app.jar /app.jar
|
||||
ADD test-functions.sh /test-functions.sh
|
||||
@@ -6,5 +6,5 @@ RUN apt-get update && \
|
||||
curl -L https://github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk8u202-b08/OpenJDK8U-jdk_x64_linux_hotspot_8u202b08.tar.gz | tar zx --strip-components=1
|
||||
ENV JAVA_HOME /opt/openjdk
|
||||
ENV PATH $JAVA_HOME/bin:$PATH
|
||||
ADD spring-boot-launch-script-tests.jar /spring-boot-launch-script-tests.jar
|
||||
ADD app.jar /app.jar
|
||||
ADD test-functions.sh /test-functions.sh
|
||||
@@ -1,15 +1,15 @@
|
||||
install_service() {
|
||||
mkdir /test-service
|
||||
mv /spring-boot-launch-script-tests.jar /test-service/spring-boot-app.jar
|
||||
mv /app.jar /test-service/spring-boot-app.jar
|
||||
chmod +x /test-service/spring-boot-app.jar
|
||||
ln -s /test-service/spring-boot-app.jar /etc/init.d/spring-boot-app
|
||||
}
|
||||
|
||||
install_double_link_service() {
|
||||
mkdir /test-service
|
||||
mv /spring-boot-launch-script-tests.jar /test-service/
|
||||
chmod +x /test-service/spring-boot-launch-script-tests.jar
|
||||
ln -s /test-service/spring-boot-launch-script-tests.jar /test-service/spring-boot-app.jar
|
||||
mv /app.jar /test-service/
|
||||
chmod +x /test-service/app.jar
|
||||
ln -s /test-service/app.jar /test-service/spring-boot-app.jar
|
||||
ln -s /test-service/spring-boot-app.jar /etc/init.d/spring-boot-app
|
||||
}
|
||||
|
||||
@@ -41,7 +41,7 @@ await_app() {
|
||||
url=$1
|
||||
fi
|
||||
end=$(date +%s)
|
||||
let "end+=30"
|
||||
let "end+=600"
|
||||
until curl -s $url > /dev/null
|
||||
do
|
||||
now=$(date +%s)
|
||||
@@ -0,0 +1,51 @@
|
||||
plugins {
|
||||
id 'java'
|
||||
id 'org.springframework.boot.conventions'
|
||||
}
|
||||
|
||||
description = "Spring Boot Server Tests"
|
||||
|
||||
configurations {
|
||||
testRepository
|
||||
}
|
||||
|
||||
dependencies {
|
||||
testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test')
|
||||
testImplementation project(':spring-boot-project:spring-boot-tools:spring-boot-test-support')
|
||||
|
||||
testImplementation 'com.samskivert:jmustache'
|
||||
testImplementation 'jakarta.servlet:jakarta.servlet-api'
|
||||
testImplementation 'org.apache.httpcomponents:httpasyncclient'
|
||||
testImplementation 'org.apache.maven.shared:maven-invoker:3.0.0'
|
||||
testImplementation 'org.awaitility:awaitility'
|
||||
testImplementation('org.eclipse.jetty:jetty-webapp') {
|
||||
exclude group: 'javax.servlet', module: 'javax-servlet-api'
|
||||
}
|
||||
testImplementation 'org.springframework:spring-web'
|
||||
|
||||
testRepository project(path: ':spring-boot-project:spring-boot-dependencies', configuration: 'mavenRepository')
|
||||
testRepository project(path: ':spring-boot-project:spring-boot-tools:spring-boot-maven-plugin', configuration: 'mavenRepository')
|
||||
testRepository project(path: ':spring-boot-project:spring-boot-starters:spring-boot-starter', configuration: 'mavenRepository')
|
||||
testRepository project(path: ':spring-boot-project:spring-boot-starters:spring-boot-starter-jetty', configuration: 'mavenRepository')
|
||||
testRepository project(path: ':spring-boot-project:spring-boot-starters:spring-boot-starter-parent', configuration: 'mavenRepository')
|
||||
testRepository project(path: ':spring-boot-project:spring-boot-starters:spring-boot-starter-tomcat', configuration: 'mavenRepository')
|
||||
testRepository project(path: ':spring-boot-project:spring-boot-starters:spring-boot-starter-undertow', configuration: 'mavenRepository')
|
||||
|
||||
testRuntimeOnly project(':spring-boot-project:spring-boot-starters:spring-boot-starter-logging')
|
||||
}
|
||||
|
||||
task prepareMavenBinaries(type: org.springframework.boot.build.mavenplugin.PrepareMavenBinaries) {
|
||||
outputDir = file("$buildDir/maven-binaries")
|
||||
versions '3.6.2'
|
||||
}
|
||||
|
||||
task syncTestRepository(type: Sync) {
|
||||
destinationDir = file("${buildDir}/test-repository")
|
||||
from {
|
||||
configurations.testRepository
|
||||
}
|
||||
}
|
||||
|
||||
test {
|
||||
dependsOn prepareMavenBinaries, syncTestRepository
|
||||
}
|
||||
@@ -1,84 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-integration-tests</artifactId>
|
||||
<version>${revision}</version>
|
||||
</parent>
|
||||
<artifactId>spring-boot-server-tests</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
<name>Spring Boot Server Tests</name>
|
||||
<properties>
|
||||
<main.basedir>${basedir}/../../..</main.basedir>
|
||||
</properties>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-logging</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-test-support</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.samskivert</groupId>
|
||||
<artifactId>jmustache</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>jakarta.servlet</groupId>
|
||||
<artifactId>jakarta.servlet-api</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.maven.shared</groupId>
|
||||
<artifactId>maven-invoker</artifactId>
|
||||
<version>3.0.0</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.awaitility</groupId>
|
||||
<artifactId>awaitility</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<artifactId>jetty-webapp</artifactId>
|
||||
<scope>test</scope>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>javax.servlet</groupId>
|
||||
<artifactId>javax.servlet-api</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-web</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<configuration>
|
||||
<systemPropertyVariables>
|
||||
<maven.home>${maven.home}</maven.home>
|
||||
<repository>${repository}</repository>
|
||||
</systemPropertyVariables>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
||||
@@ -95,7 +95,7 @@ abstract class AbstractApplicationLauncher implements BeforeEachCallback, AfterE
|
||||
}
|
||||
|
||||
private int awaitServerPort(Process process, File serverPortFile) throws Exception {
|
||||
Awaitility.waitAtMost(Duration.ofSeconds(30)).until(serverPortFile::length, (length) -> {
|
||||
Awaitility.waitAtMost(Duration.ofSeconds(180)).until(serverPortFile::length, (length) -> {
|
||||
if (!process.isAlive()) {
|
||||
throw new IllegalStateException("Application failed to start");
|
||||
}
|
||||
|
||||
@@ -36,13 +36,11 @@ import org.apache.maven.shared.invoker.InvocationResult;
|
||||
import org.apache.maven.shared.invoker.MavenInvocationException;
|
||||
|
||||
import org.springframework.util.FileCopyUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
/**
|
||||
* Builds a Spring Boot application using Maven. To use this class, the {@code maven.home}
|
||||
* system property must be set.
|
||||
* Builds a Spring Boot application using Maven.
|
||||
*
|
||||
* @author Andy Wilkinson
|
||||
*/
|
||||
@@ -121,12 +119,9 @@ class ApplicationBuilder {
|
||||
}
|
||||
|
||||
private File writeSettingsXml(File appFolder) throws IOException {
|
||||
String repository = System.getProperty("repository");
|
||||
if (!StringUtils.hasText(repository)) {
|
||||
return null;
|
||||
}
|
||||
Map<String, Object> context = new HashMap<>();
|
||||
context.put("repository", repository);
|
||||
context.put("repository", new File("build/test-repository").toURI().toURL());
|
||||
context.put("localRepository", new File("build/local-m2-repository").getAbsolutePath());
|
||||
File settingsXml = new File(appFolder, "settings.xml");
|
||||
try (FileWriter out = new FileWriter(settingsXml);
|
||||
FileReader templateReader = new FileReader("src/test/resources/settings-template.xml")) {
|
||||
@@ -160,7 +155,9 @@ class ApplicationBuilder {
|
||||
if (settingsXml != null) {
|
||||
invocation.setUserSettingsFile(settingsXml);
|
||||
}
|
||||
InvocationResult execute = new DefaultInvoker().execute(invocation);
|
||||
DefaultInvoker invoker = new DefaultInvoker();
|
||||
invoker.setMavenHome(new File("build/maven-binaries/apache-maven-3.6.2"));
|
||||
InvocationResult execute = invoker.execute(invocation);
|
||||
assertThat(execute.getExitCode()).isEqualTo(0);
|
||||
}
|
||||
|
||||
|
||||
@@ -27,6 +27,8 @@ import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import org.apache.http.impl.client.HttpClients;
|
||||
import org.apache.http.impl.client.StandardHttpRequestRetryHandler;
|
||||
import org.junit.jupiter.api.extension.AfterAllCallback;
|
||||
import org.junit.jupiter.api.extension.Extension;
|
||||
import org.junit.jupiter.api.extension.ExtensionContext;
|
||||
@@ -39,6 +41,7 @@ import org.junit.platform.commons.util.ReflectionUtils;
|
||||
|
||||
import org.springframework.boot.testsupport.BuildOutput;
|
||||
import org.springframework.http.client.ClientHttpResponse;
|
||||
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
|
||||
import org.springframework.util.FileSystemUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
import org.springframework.web.client.ResponseErrorHandler;
|
||||
@@ -154,7 +157,8 @@ class EmbeddedServerContainerInvocationContextProvider
|
||||
@Override
|
||||
public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext)
|
||||
throws ParameterResolutionException {
|
||||
RestTemplate rest = new RestTemplate();
|
||||
RestTemplate rest = new RestTemplate(new HttpComponentsClientHttpRequestFactory(
|
||||
HttpClients.custom().setRetryHandler(new StandardHttpRequestRetryHandler(10, false)).build()));
|
||||
rest.setErrorHandler(new ResponseErrorHandler() {
|
||||
|
||||
@Override
|
||||
|
||||
@@ -80,6 +80,7 @@ class ExplodedApplicationLauncher extends AbstractApplicationLauncher {
|
||||
extracted.mkdirs();
|
||||
}
|
||||
else {
|
||||
extracted.getParentFile().mkdirs();
|
||||
FileOutputStream extractedOutputStream = new FileOutputStream(extracted);
|
||||
StreamUtils.copy(jarFile.getInputStream(jarEntry), extractedOutputStream);
|
||||
extractedOutputStream.close();
|
||||
|
||||
@@ -16,43 +16,28 @@
|
||||
|
||||
package org.springframework.boot.context.embedded;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileReader;
|
||||
|
||||
import javax.xml.xpath.XPath;
|
||||
import javax.xml.xpath.XPathFactory;
|
||||
|
||||
import org.xml.sax.InputSource;
|
||||
|
||||
import org.springframework.util.StringUtils;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.Properties;
|
||||
|
||||
/**
|
||||
* Provides access to dependency versions by querying the project's pom.
|
||||
* Provides access to the current Boot version by referring to {@code gradle.properties}.
|
||||
*
|
||||
* @author Andy Wilkinson
|
||||
*/
|
||||
final class Versions {
|
||||
|
||||
private static final String PROPERTIES = "/*[local-name()='project']/*[local-name()='properties']";
|
||||
|
||||
private Versions() {
|
||||
}
|
||||
|
||||
static String getBootVersion() {
|
||||
String baseDir = StringUtils.cleanPath(new File(".").getAbsolutePath());
|
||||
String mainBaseDir = evaluateExpression("pom.xml", PROPERTIES + "/*[local-name()='main.basedir']/text()");
|
||||
mainBaseDir = mainBaseDir.replace("${basedir}", baseDir);
|
||||
return evaluateExpression(mainBaseDir + "/pom.xml", PROPERTIES + "/*[local-name()='revision']/text()");
|
||||
}
|
||||
|
||||
private static String evaluateExpression(String file, String expression) {
|
||||
try {
|
||||
InputSource source = new InputSource(new FileReader(file));
|
||||
XPath xpath = XPathFactory.newInstance().newXPath();
|
||||
return xpath.compile(expression).evaluate(source);
|
||||
Properties gradleProperties = new Properties();
|
||||
try (FileInputStream input = new FileInputStream("../../../gradle.properties")) {
|
||||
gradleProperties.load(input);
|
||||
return gradleProperties.getProperty("version");
|
||||
}
|
||||
catch (Exception ex) {
|
||||
throw new IllegalStateException("Failed to evaluate expression", ex);
|
||||
catch (IOException ex) {
|
||||
throw new RuntimeException(ex);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">
|
||||
<localRepository>{{localRepository}}</localRepository>
|
||||
<profiles>
|
||||
<profile>
|
||||
<id>repository</id>
|
||||
|
||||
@@ -1,81 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-parent</artifactId>
|
||||
<version>${revision}</version>
|
||||
<relativePath>../../spring-boot-project/spring-boot-parent</relativePath>
|
||||
</parent>
|
||||
<artifactId>spring-boot-smoke-tests-invoker</artifactId>
|
||||
<packaging>pom</packaging>
|
||||
<name>Spring Boot Smoke Tests Invoker</name>
|
||||
<description>Spring Boot Smoke Tests Invoker</description>
|
||||
<properties>
|
||||
<main.basedir>${basedir}/../..</main.basedir>
|
||||
</properties>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<!-- We use invoker so that the spring-boot-maven-plugin can be used -->
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-invoker-plugin</artifactId>
|
||||
<inherited>false</inherited>
|
||||
<configuration>
|
||||
<projectsDirectory>${main.basedir}/spring-boot-tests/spring-boot-smoke-tests</projectsDirectory>
|
||||
<skipInvocation>${skipTests}</skipInvocation>
|
||||
<streamLogs>true</streamLogs>
|
||||
<pomIncludes>
|
||||
<pomInclude>pom.xml</pomInclude>
|
||||
</pomIncludes>
|
||||
</configuration>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>integration-test</id>
|
||||
<phase>install</phase>
|
||||
<goals>
|
||||
<goal>run</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-antrun-plugin</artifactId>
|
||||
<inherited>false</inherited>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>clean-smoke-tests</id>
|
||||
<phase>clean</phase>
|
||||
<goals>
|
||||
<goal>run</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<target>
|
||||
<delete includeemptydirs="true">
|
||||
<fileset dir="${main.basedir}/spring-boot-tests/spring-boot-smoke-tests"
|
||||
includes="**/target/" />
|
||||
</delete>
|
||||
</target>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-clean-plugin</artifactId>
|
||||
<inherited>false</inherited>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>clean-smoke-tests</id>
|
||||
<phase>clean</phase>
|
||||
<goals>
|
||||
<goal>clean</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
||||
@@ -1,206 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-parent</artifactId>
|
||||
<version>${revision}</version>
|
||||
<relativePath>../../spring-boot-project/spring-boot-starters/spring-boot-starter-parent</relativePath>
|
||||
</parent>
|
||||
<artifactId>spring-boot-smoke-tests</artifactId>
|
||||
<packaging>pom</packaging>
|
||||
<name>Spring Boot Smoke Tests</name>
|
||||
<description>Spring Boot Smoke Tests</description>
|
||||
<properties>
|
||||
<main.basedir>${basedir}/../..</main.basedir>
|
||||
<java.version>1.8</java.version>
|
||||
<disable.checks>false</disable.checks>
|
||||
</properties>
|
||||
<modules>
|
||||
<module>spring-boot-smoke-test-ant</module>
|
||||
<module>spring-boot-smoke-test-activemq</module>
|
||||
<module>spring-boot-smoke-test-actuator</module>
|
||||
<module>spring-boot-smoke-test-actuator-log4j2</module>
|
||||
<module>spring-boot-smoke-test-actuator-noweb</module>
|
||||
<module>spring-boot-smoke-test-actuator-ui</module>
|
||||
<module>spring-boot-smoke-test-actuator-custom-security</module>
|
||||
<module>spring-boot-smoke-test-amqp</module>
|
||||
<module>spring-boot-smoke-test-animated-banner</module>
|
||||
<module>spring-boot-smoke-test-aop</module>
|
||||
<module>spring-boot-smoke-test-atmosphere</module>
|
||||
<module>spring-boot-smoke-test-batch</module>
|
||||
<module>spring-boot-smoke-test-cache</module>
|
||||
<module>spring-boot-smoke-test-custom-layout</module>
|
||||
<module>spring-boot-smoke-test-data-cassandra</module>
|
||||
<module>spring-boot-smoke-test-data-couchbase</module>
|
||||
<module>spring-boot-smoke-test-data-elasticsearch</module>
|
||||
<module>spring-boot-smoke-test-data-jdbc</module>
|
||||
<module>spring-boot-smoke-test-data-jpa</module>
|
||||
<module>spring-boot-smoke-test-data-ldap</module>
|
||||
<module>spring-boot-smoke-test-data-mongodb</module>
|
||||
<module>spring-boot-smoke-test-data-neo4j</module>
|
||||
<module>spring-boot-smoke-test-data-redis</module>
|
||||
<module>spring-boot-smoke-test-data-rest</module>
|
||||
<module>spring-boot-smoke-test-data-solr</module>
|
||||
<module>spring-boot-smoke-test-devtools</module>
|
||||
<module>spring-boot-smoke-test-flyway</module>
|
||||
<module>spring-boot-smoke-test-hateoas</module>
|
||||
<module>spring-boot-smoke-test-hibernate52</module>
|
||||
<module>spring-boot-smoke-test-integration</module>
|
||||
<module>spring-boot-smoke-test-jersey</module>
|
||||
<module>spring-boot-smoke-test-jetty</module>
|
||||
<module>spring-boot-smoke-test-jetty-jsp</module>
|
||||
<module>spring-boot-smoke-test-jetty-ssl</module>
|
||||
<module>spring-boot-smoke-test-jooq</module>
|
||||
<module>spring-boot-smoke-test-jpa</module>
|
||||
<module>spring-boot-smoke-test-jta-atomikos</module>
|
||||
<module>spring-boot-smoke-test-jta-bitronix</module>
|
||||
<module>spring-boot-smoke-test-jta-jndi</module>
|
||||
<module>spring-boot-smoke-test-junit-jupiter</module>
|
||||
<module>spring-boot-smoke-test-junit-vintage</module>
|
||||
<module>spring-boot-smoke-test-kafka</module>
|
||||
<module>spring-boot-smoke-test-liquibase</module>
|
||||
<module>spring-boot-smoke-test-logback</module>
|
||||
<module>spring-boot-smoke-test-oauth2-client</module>
|
||||
<module>spring-boot-smoke-test-oauth2-resource-server</module>
|
||||
<module>spring-boot-smoke-test-parent-context</module>
|
||||
<module>spring-boot-smoke-test-profile</module>
|
||||
<module>spring-boot-smoke-test-property-validation</module>
|
||||
<module>spring-boot-smoke-test-quartz</module>
|
||||
<module>spring-boot-smoke-test-reactive-oauth2-client</module>
|
||||
<module>spring-boot-smoke-test-reactive-oauth2-resource-server</module>
|
||||
<module>spring-boot-smoke-test-rsocket</module>
|
||||
<module>spring-boot-smoke-test-saml2-service-provider</module>
|
||||
<module>spring-boot-smoke-test-secure</module>
|
||||
<module>spring-boot-smoke-test-secure-jersey</module>
|
||||
<module>spring-boot-smoke-test-secure-webflux</module>
|
||||
<module>spring-boot-smoke-test-servlet</module>
|
||||
<module>spring-boot-smoke-test-session</module>
|
||||
<module>spring-boot-smoke-test-session-webflux</module>
|
||||
<module>spring-boot-smoke-test-simple</module>
|
||||
<module>spring-boot-smoke-test-test</module>
|
||||
<module>spring-boot-smoke-test-test-nomockito</module>
|
||||
<module>spring-boot-smoke-test-testng</module>
|
||||
<module>spring-boot-smoke-test-tomcat</module>
|
||||
<module>spring-boot-smoke-test-tomcat-jsp</module>
|
||||
<module>spring-boot-smoke-test-tomcat-ssl</module>
|
||||
<module>spring-boot-smoke-test-tomcat-multi-connectors</module>
|
||||
<module>spring-boot-smoke-test-traditional</module>
|
||||
<module>spring-boot-smoke-test-undertow</module>
|
||||
<module>spring-boot-smoke-test-undertow-ssl</module>
|
||||
<module>spring-boot-smoke-test-war</module>
|
||||
<module>spring-boot-smoke-test-web-freemarker</module>
|
||||
<module>spring-boot-smoke-test-web-groovy-templates</module>
|
||||
<module>spring-boot-smoke-test-web-jsp</module>
|
||||
<module>spring-boot-smoke-test-web-method-security</module>
|
||||
<module>spring-boot-smoke-test-web-mustache</module>
|
||||
<module>spring-boot-smoke-test-web-secure</module>
|
||||
<module>spring-boot-smoke-test-web-secure-custom</module>
|
||||
<module>spring-boot-smoke-test-web-secure-jdbc</module>
|
||||
<module>spring-boot-smoke-test-web-static</module>
|
||||
<module>spring-boot-smoke-test-web-ui</module>
|
||||
<module>spring-boot-smoke-test-webflux</module>
|
||||
<module>spring-boot-smoke-test-webflux-coroutines</module>
|
||||
<module>spring-boot-smoke-test-websocket-jetty</module>
|
||||
<module>spring-boot-smoke-test-websocket-tomcat</module>
|
||||
<module>spring-boot-smoke-test-websocket-undertow</module>
|
||||
<module>spring-boot-smoke-test-webservices</module>
|
||||
<module>spring-boot-smoke-test-xml</module>
|
||||
</modules>
|
||||
<!-- No dependencies - otherwise the smoke tests won't work if you change the
|
||||
parent -->
|
||||
<build>
|
||||
<pluginManagement>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>flatten-maven-plugin</artifactId>
|
||||
<inherited>true</inherited>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>flatten</id>
|
||||
<phase>process-resources</phase>
|
||||
<goals>
|
||||
<goal>flatten</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<updatePomFile>true</updatePomFile>
|
||||
<flattenMode>oss</flattenMode>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</pluginManagement>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<configuration>
|
||||
<includes>
|
||||
<include>**/*Tests.java</include>
|
||||
</includes>
|
||||
<excludes>
|
||||
<exclude>**/Abstract*.java</exclude>
|
||||
</excludes>
|
||||
<systemPropertyVariables>
|
||||
<java.security.egd>file:/dev/./urandom</java.security.egd>
|
||||
<java.awt.headless>true</java.awt.headless>
|
||||
</systemPropertyVariables>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-enforcer-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>enforce-rules</id>
|
||||
<goals>
|
||||
<goal>enforce</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<rules>
|
||||
<bannedDependencies>
|
||||
<excludes>
|
||||
<exclude>commons-logging:*:*</exclude>
|
||||
</excludes>
|
||||
<searchTransitive>true</searchTransitive>
|
||||
</bannedDependencies>
|
||||
</rules>
|
||||
<fail>true</fail>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-install-plugin</artifactId>
|
||||
<configuration>
|
||||
<skip>true</skip>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-javadoc-plugin</artifactId>
|
||||
<configuration>
|
||||
<skip>true</skip>
|
||||
</configuration>
|
||||
<inherited>true</inherited>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
<profiles>
|
||||
<profile>
|
||||
<id>fast</id>
|
||||
<activation>
|
||||
<property>
|
||||
<name>fast</name>
|
||||
</property>
|
||||
</activation>
|
||||
<properties>
|
||||
<disable.checks>true</disable.checks>
|
||||
</properties>
|
||||
</profile>
|
||||
</profiles>
|
||||
</project>
|
||||
@@ -0,0 +1,11 @@
|
||||
plugins {
|
||||
id 'java'
|
||||
id 'org.springframework.boot.conventions'
|
||||
}
|
||||
|
||||
description = 'Spring Boot Actuator ActiveMQ smoke test'
|
||||
|
||||
dependencies {
|
||||
implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-activemq')
|
||||
testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test')
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user