From b566b73be695cf8315e2f81ecb712755d49ee88c Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 10 Sep 2025 11:58:43 +0200 Subject: [PATCH] Add nullability annotations to tests in core/spring-boot-docker-compose See gh-47263 --- core/spring-boot-docker-compose/build.gradle | 8 ++++++++ .../DefaultDockerComposeIntegrationTests.java | 3 ++- .../compose/core/DockerCliIntegrationTests.java | 1 + .../compose/core/DefaultRunningServiceTests.java | 3 ++- .../compose/core/DockerComposeFileTests.java | 4 ++++ .../compose/core/DockerComposeOriginTests.java | 1 + .../docker/compose/core/DockerHostTests.java | 3 ++- .../boot/docker/compose/core/ImageNameTests.java | 1 + .../DockerComposeLifecycleManagerTests.java | 16 +++++++++++----- .../lifecycle/DockerComposeListenerTests.java | 5 +++-- .../lifecycle/ServiceReadinessChecksTests.java | 8 +++++--- .../connection/ConnectionNamePredicateTests.java | 3 ++- 12 files changed, 42 insertions(+), 14 deletions(-) diff --git a/core/spring-boot-docker-compose/build.gradle b/core/spring-boot-docker-compose/build.gradle index beba50a452d..1dd48e1313c 100644 --- a/core/spring-boot-docker-compose/build.gradle +++ b/core/spring-boot-docker-compose/build.gradle @@ -38,3 +38,11 @@ dependencies { testFixturesImplementation(project(":test-support:spring-boot-docker-test-support")) } + +tasks.named("compileTestJava") { + options.nullability.checking = "tests" +} + +tasks.named("compileDockerTestJava") { + options.nullability.checking = "tests" +} diff --git a/core/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/core/DefaultDockerComposeIntegrationTests.java b/core/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/core/DefaultDockerComposeIntegrationTests.java index 6024f5e709e..1cd1f6de5d1 100644 --- a/core/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/core/DefaultDockerComposeIntegrationTests.java +++ b/core/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/core/DefaultDockerComposeIntegrationTests.java @@ -27,6 +27,7 @@ import java.util.List; import java.util.Set; import org.assertj.core.api.Assertions; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; @@ -88,7 +89,7 @@ class DefaultDockerComposeIntegrationTests { } } - private RunningService findService(List runningServices, String serviceName) { + private @Nullable RunningService findService(List runningServices, String serviceName) { for (RunningService runningService : runningServices) { if (runningService.name().contains(serviceName)) { return runningService; diff --git a/core/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/core/DockerCliIntegrationTests.java b/core/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/core/DockerCliIntegrationTests.java index 3e1e4a5552f..625c88f6544 100644 --- a/core/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/core/DockerCliIntegrationTests.java +++ b/core/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/core/DockerCliIntegrationTests.java @@ -59,6 +59,7 @@ import static org.assertj.core.api.Assertions.assertThat; class DockerCliIntegrationTests { @TempDir + @SuppressWarnings("NullAway.Init") private static Path tempDir; @Test diff --git a/core/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/core/DefaultRunningServiceTests.java b/core/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/core/DefaultRunningServiceTests.java index 1d5e5f00f60..60e78e30915 100644 --- a/core/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/core/DefaultRunningServiceTests.java +++ b/core/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/core/DefaultRunningServiceTests.java @@ -47,6 +47,7 @@ import static org.assertj.core.api.Assertions.entry; class DefaultRunningServiceTests { @TempDir + @SuppressWarnings("NullAway.Init") File temp; private DefaultRunningService runningService; @@ -126,7 +127,7 @@ class DefaultRunningServiceTests { Map exposedPorts = Map.of("8080/tcp", new ExposedPort()); List env = List.of("a=b"); Config config = new Config(image, labels, exposedPorts, env); - Map> ports = Map.of("8080/tcp", List.of(new HostPort(null, "9090"))); + Map> ports = Map.of("8080/tcp", List.of(new HostPort("127.0.0.1", "9090"))); NetworkSettings networkSettings = new NetworkSettings(ports); HostConfig hostConfig = new HostConfig("bridge"); DockerCliInspectResponse inspectResponse = new DockerCliInspectResponse(id, config, networkSettings, diff --git a/core/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/core/DockerComposeFileTests.java b/core/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/core/DockerComposeFileTests.java index fe7b312e5a6..adbb1061fc8 100644 --- a/core/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/core/DockerComposeFileTests.java +++ b/core/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/core/DockerComposeFileTests.java @@ -39,6 +39,7 @@ import static org.assertj.core.api.Assertions.assertThatIllegalStateException; class DockerComposeFileTests { @TempDir + @SuppressWarnings("NullAway.Init") File temp; @Test @@ -74,6 +75,7 @@ class DockerComposeFileTests { File file = new File(this.temp, "docker-compose.yml").getCanonicalFile(); FileCopyUtils.copy(new byte[0], file); DockerComposeFile composeFile = DockerComposeFile.find(file.getParentFile()); + assertThat(composeFile).isNotNull(); assertThat(composeFile.getFiles()).containsExactly(file); } @@ -84,6 +86,7 @@ class DockerComposeFileTests { File f2 = new File(this.temp, "compose.yml").getCanonicalFile(); FileCopyUtils.copy(new byte[0], f2); DockerComposeFile composeFile = DockerComposeFile.find(f1.getParentFile()); + assertThat(composeFile).isNotNull(); assertThat(composeFile.getFiles()).containsExactly(f2); } @@ -127,6 +130,7 @@ class DockerComposeFileTests { } @Test + @SuppressWarnings("NullAway") // Test null check void ofWhenFileIsNullThrowsException() { assertThatIllegalArgumentException().isThrownBy(() -> DockerComposeFile.of((File) null)) .withMessage("'file' must not be null"); diff --git a/core/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/core/DockerComposeOriginTests.java b/core/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/core/DockerComposeOriginTests.java index b3e4c6dab7e..ee921086d9f 100644 --- a/core/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/core/DockerComposeOriginTests.java +++ b/core/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/core/DockerComposeOriginTests.java @@ -37,6 +37,7 @@ import static org.assertj.core.api.Assertions.assertThat; class DockerComposeOriginTests { @TempDir + @SuppressWarnings("NullAway.Init") File temp; @Test diff --git a/core/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/core/DockerHostTests.java b/core/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/core/DockerHostTests.java index 4f99d783edc..ce8bf976628 100644 --- a/core/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/core/DockerHostTests.java +++ b/core/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/core/DockerHostTests.java @@ -23,6 +23,7 @@ import java.util.Map; import java.util.function.Function; import java.util.function.Supplier; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -50,7 +51,7 @@ class DockerHostTests { private static final String TCP_HOST = "tcp://192.168.1.1"; - private static final Function NO_SYSTEM_ENV = (key) -> null; + private static final Function NO_SYSTEM_ENV = (key) -> null; private static final Supplier> NO_CONTEXT = Collections::emptyList; diff --git a/core/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/core/ImageNameTests.java b/core/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/core/ImageNameTests.java index 5ffd3b6a24a..b1282cf4203 100644 --- a/core/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/core/ImageNameTests.java +++ b/core/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/core/ImageNameTests.java @@ -116,6 +116,7 @@ class ImageNameTests { } @Test + @SuppressWarnings("NullAway") // Test null check void ofWhenNameIsNullThrowsException() { assertThatIllegalArgumentException().isThrownBy(() -> ImageName.of(null)) .withMessage("'value' must not be empty"); diff --git a/core/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/lifecycle/DockerComposeLifecycleManagerTests.java b/core/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/lifecycle/DockerComposeLifecycleManagerTests.java index 6207a664498..b6a978e1de7 100644 --- a/core/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/lifecycle/DockerComposeLifecycleManagerTests.java +++ b/core/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/lifecycle/DockerComposeLifecycleManagerTests.java @@ -27,6 +27,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -68,15 +69,16 @@ import static org.mockito.Mockito.never; class DockerComposeLifecycleManagerTests { @TempDir + @SuppressWarnings("NullAway.Init") File temp; private DockerComposeFile dockerComposeFile; private DockerCompose dockerCompose; - private Set activeProfiles; + private @Nullable Set activeProfiles; - private List arguments; + private @Nullable List arguments; private GenericApplicationContext applicationContext; @@ -84,7 +86,7 @@ class DockerComposeLifecycleManagerTests { private ServiceReadinessChecks serviceReadinessChecks; - private List runningServices; + private @Nullable List runningServices; private DockerComposeProperties properties; @@ -316,6 +318,7 @@ class DockerComposeLifecycleManagerTests { setUpRunningServices(); this.lifecycleManager.start(); this.shutdownHandlers.run(); + assertThat(this.runningServices).isNotNull(); then(this.serviceReadinessChecks).should().waitUntilReady(this.runningServices); } @@ -327,6 +330,7 @@ class DockerComposeLifecycleManagerTests { setUpRunningServices(); this.lifecycleManager.start(); this.shutdownHandlers.run(); + assertThat(this.runningServices).isNotNull(); then(this.serviceReadinessChecks).should(never()).waitUntilReady(this.runningServices); } @@ -339,6 +343,7 @@ class DockerComposeLifecycleManagerTests { setUpRunningServices(); this.lifecycleManager.start(); this.shutdownHandlers.run(); + assertThat(this.runningServices).isNotNull(); then(this.serviceReadinessChecks).should(never()).waitUntilReady(this.runningServices); } @@ -350,6 +355,7 @@ class DockerComposeLifecycleManagerTests { setUpRunningServices(false); this.lifecycleManager.start(); this.shutdownHandlers.run(); + assertThat(this.runningServices).isNotNull(); then(this.serviceReadinessChecks).should().waitUntilReady(this.runningServices); } @@ -498,14 +504,14 @@ class DockerComposeLifecycleManagerTests { */ static class EventCapturingListener implements ApplicationListener { - private DockerComposeServicesReadyEvent event; + private @Nullable DockerComposeServicesReadyEvent event; @Override public void onApplicationEvent(DockerComposeServicesReadyEvent event) { this.event = event; } - DockerComposeServicesReadyEvent getEvent() { + @Nullable DockerComposeServicesReadyEvent getEvent() { return this.event; } diff --git a/core/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/lifecycle/DockerComposeListenerTests.java b/core/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/lifecycle/DockerComposeListenerTests.java index d5eb233fe44..af9f3099127 100644 --- a/core/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/lifecycle/DockerComposeListenerTests.java +++ b/core/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/lifecycle/DockerComposeListenerTests.java @@ -18,6 +18,7 @@ package org.springframework.boot.docker.compose.lifecycle; import java.util.Set; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import org.springframework.boot.SpringApplication; @@ -60,7 +61,7 @@ class DockerComposeListenerTests { private final ConfigurableApplicationContext context; - private DockerComposeLifecycleManager manager; + private @Nullable DockerComposeLifecycleManager manager; TestDockerComposeListener(SpringApplicationShutdownHandlers shutdownHandlers, ConfigurableApplicationContext context) { @@ -79,7 +80,7 @@ class DockerComposeListenerTests { return this.manager; } - DockerComposeLifecycleManager getManager() { + @Nullable DockerComposeLifecycleManager getManager() { return this.manager; } diff --git a/core/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/lifecycle/ServiceReadinessChecksTests.java b/core/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/lifecycle/ServiceReadinessChecksTests.java index 221ad056a4b..ead3da10768 100644 --- a/core/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/lifecycle/ServiceReadinessChecksTests.java +++ b/core/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/lifecycle/ServiceReadinessChecksTests.java @@ -23,10 +23,12 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.boot.docker.compose.core.RunningService; +import org.springframework.boot.docker.compose.lifecycle.DockerComposeProperties.Readiness.Tcp; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; @@ -103,7 +105,7 @@ class ServiceReadinessChecksTests { */ static class MockServiceReadinessCheck extends TcpConnectServiceReadinessCheck { - private final Integer failUntil; + private final @Nullable Integer failUntil; private final List checked = new ArrayList<>(); @@ -111,8 +113,8 @@ class ServiceReadinessChecksTests { this(null); } - MockServiceReadinessCheck(Integer failUntil) { - super(null); + MockServiceReadinessCheck(@Nullable Integer failUntil) { + super(new Tcp()); this.failUntil = failUntil; } diff --git a/core/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/service/connection/ConnectionNamePredicateTests.java b/core/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/service/connection/ConnectionNamePredicateTests.java index aef265dde80..a506e48f795 100644 --- a/core/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/service/connection/ConnectionNamePredicateTests.java +++ b/core/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/service/connection/ConnectionNamePredicateTests.java @@ -19,6 +19,7 @@ package org.springframework.boot.docker.compose.service.connection; import java.util.Map; import java.util.function.Predicate; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import org.springframework.boot.docker.compose.core.ImageReference; @@ -96,7 +97,7 @@ class ConnectionNamePredicateTests { return sourceOf(connectionName, null); } - private DockerComposeConnectionSource sourceOf(String connectionName, String label) { + private DockerComposeConnectionSource sourceOf(String connectionName, @Nullable String label) { DockerComposeConnectionSource source = mock(DockerComposeConnectionSource.class); RunningService runningService = mock(RunningService.class); given(source.getRunningService()).willReturn(runningService);