From b5ae8b0af5fd57efd552a7f6b865b3ab2071e7f5 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Fri, 10 Jan 2020 20:35:18 +0000 Subject: [PATCH] Disable tests that use Docker when Docker is unavailable Closes gh-19616 --- .../DisabledIfDockerUnavailable.java | 52 +++++++++++++++++++ .../spring-boot-deployment-tests/build.gradle | 1 + .../sample/DeploymentIntegrationTests.java | 3 ++ .../build.gradle | 1 + .../SysVinitLaunchScriptIntegrationTests.java | 3 ++ 5 files changed, 60 insertions(+) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/testcontainers/DisabledIfDockerUnavailable.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/testcontainers/DisabledIfDockerUnavailable.java b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/testcontainers/DisabledIfDockerUnavailable.java new file mode 100644 index 00000000000..f0d5d676e33 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/testcontainers/DisabledIfDockerUnavailable.java @@ -0,0 +1,52 @@ +/* + * Copyright 2012-2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.testsupport.testcontainers; + +import org.junit.jupiter.api.extension.ConditionEvaluationResult; +import org.junit.jupiter.api.extension.ExecutionCondition; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.testcontainers.DockerClientFactory; + +/** + * An {@link ExecutionCondition} that disables execution if Docker is unavailable. + * + * @author Andy Wilkinson + */ +public class DisabledIfDockerUnavailable implements ExecutionCondition { + + @Override + public ConditionEvaluationResult evaluateExecutionCondition(ExtensionContext context) { + System.out.println("Checking Docker's availability"); + if (isDockerAvailable()) { + System.out.println("Docker available"); + return ConditionEvaluationResult.enabled("Docker is available"); + } + System.out.println("Docker unavailable"); + return ConditionEvaluationResult.disabled("Docker is not available"); + } + + private boolean isDockerAvailable() { + try { + DockerClientFactory.instance().client(); + return true; + } + catch (Throwable ex) { + return false; + } + } + +} diff --git a/spring-boot-tests/spring-boot-deployment-tests/build.gradle b/spring-boot-tests/spring-boot-deployment-tests/build.gradle index 942627d5faf..a59d1dc1ee3 100644 --- a/spring-boot-tests/spring-boot-deployment-tests/build.gradle +++ b/spring-boot-tests/spring-boot-deployment-tests/build.gradle @@ -13,6 +13,7 @@ dependencies { intTestImplementation enforcedPlatform(project(path: ":spring-boot-project:spring-boot-parent")) intTestImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') + intTestImplementation project(':spring-boot-project:spring-boot-tools:spring-boot-test-support') intTestImplementation 'org.apache.httpcomponents:httpasyncclient' intTestImplementation 'org.awaitility:awaitility' intTestImplementation 'org.testcontainers:testcontainers' diff --git a/spring-boot-tests/spring-boot-deployment-tests/src/intTest/java/sample/DeploymentIntegrationTests.java b/spring-boot-tests/spring-boot-deployment-tests/src/intTest/java/sample/DeploymentIntegrationTests.java index 3e892569f44..f4a8c324d20 100644 --- a/spring-boot-tests/spring-boot-deployment-tests/src/intTest/java/sample/DeploymentIntegrationTests.java +++ b/spring-boot-tests/spring-boot-deployment-tests/src/intTest/java/sample/DeploymentIntegrationTests.java @@ -26,12 +26,14 @@ 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.api.extension.ExtendWith; 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.testsupport.testcontainers.DisabledIfDockerUnavailable; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -42,6 +44,7 @@ import static org.assertj.core.api.Assertions.assertThat; /** * Deployment integration tests. */ +@ExtendWith(DisabledIfDockerUnavailable.class) class DeploymentIntegrationTests { @ParameterizedTest diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/build.gradle b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/build.gradle index 5d7f20909b8..6282342b27e 100644 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/build.gradle +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/build.gradle @@ -15,6 +15,7 @@ dependencies { 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-tools:spring-boot-test-support') intTestImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') intTestImplementation 'org.testcontainers:testcontainers' } diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/java/org/springframework/boot/launchscript/SysVinitLaunchScriptIntegrationTests.java b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/java/org/springframework/boot/launchscript/SysVinitLaunchScriptIntegrationTests.java index 2f1f4ea3d01..9e343c9d21d 100644 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/java/org/springframework/boot/launchscript/SysVinitLaunchScriptIntegrationTests.java +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/java/org/springframework/boot/launchscript/SysVinitLaunchScriptIntegrationTests.java @@ -24,6 +24,7 @@ import java.util.regex.Pattern; import org.assertj.core.api.Condition; import org.junit.jupiter.api.Assumptions; +import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; import org.testcontainers.containers.GenericContainer; @@ -32,6 +33,7 @@ import org.testcontainers.images.builder.ImageFromDockerfile; import org.testcontainers.utility.MountableFile; import org.springframework.boot.ansi.AnsiColor; +import org.springframework.boot.testsupport.testcontainers.DisabledIfDockerUnavailable; import static org.assertj.core.api.Assertions.assertThat; import static org.hamcrest.Matchers.containsString; @@ -42,6 +44,7 @@ import static org.hamcrest.Matchers.containsString; * @author Andy Wilkinson * @author Ali Shahbour */ +@ExtendWith(DisabledIfDockerUnavailable.class) class SysVinitLaunchScriptIntegrationTests { private static final char ESC = 27;