Skip to content

Commit 4cf9867

Browse files
kabirKabir
andauthored
feat: add Docker/Podman test utilities for conditional test execution (a2aproject#740)
Add new test-utils-docker module with @RequiresDocker annotation for conditional execution of container-based tests. Features: - Detects both Docker and Podman availability - Fails tests when containers unavailable (clear error message) - Skips tests with -DskipDockerTests=true system property - Modules always compile regardless of container availability - No Testcontainers dependency (avoids classpath conflicts) Co-authored-by: Kabir <kabir@example.com>
1 parent 26cb3ad commit 4cf9867

15 files changed

Lines changed: 341 additions & 13 deletions

File tree

boms/extras/src/it/extras-usage-test/src/main/java/io/a2a/test/ExtrasBomVerifier.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,11 @@
1212
public class ExtrasBomVerifier extends DynamicBomVerifier {
1313

1414
private static final Set<String> EXTRAS_EXCLUSIONS = Set.of(
15-
"boms/", // BOM test modules themselves
16-
"examples/", // Example applications
17-
"tck/", // TCK test suite
18-
"tests/", // Integration tests
15+
"boms/", // BOM test modules themselves
16+
"examples/", // Example applications
17+
"tck/", // TCK test suite
18+
"tests/", // Integration tests
19+
"test-utils-docker/", // Test utilities for Docker-based tests
1920
"extras/queue-manager-replicated/tests-multi-instance/", // Test harness applications
2021
"extras/queue-manager-replicated/tests-single-instance/", // Test harness applications
2122
"extras/opentelemetry/integration-tests/" // Test harness applications

boms/reference/src/it/reference-usage-test/src/main/java/io/a2a/test/ReferenceBomVerifier.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,11 @@
1212
public class ReferenceBomVerifier extends DynamicBomVerifier {
1313

1414
private static final Set<String> REFERENCE_EXCLUSIONS = Set.of(
15-
"boms/", // BOM test modules themselves
16-
"examples/", // Example applications
17-
"tck/", // TCK test suite
18-
"tests/" // Integration tests
15+
"boms/", // BOM test modules themselves
16+
"examples/", // Example applications
17+
"tck/", // TCK test suite
18+
"tests/", // Integration tests
19+
"test-utils-docker/" // Test utilities for Docker-based tests
1920
// Note: reference/ is NOT in this list - we want to verify those classes load
2021
);
2122

boms/sdk/pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,12 @@
109109
</dependency>
110110

111111
<!-- Test utilities -->
112+
<dependency>
113+
<groupId>${project.groupId}</groupId>
114+
<artifactId>a2a-java-test-utils-docker</artifactId>
115+
<version>${project.version}</version>
116+
<scope>test</scope>
117+
</dependency>
112118
<dependency>
113119
<groupId>${project.groupId}</groupId>
114120
<artifactId>a2a-java-sdk-tests-server-common</artifactId>

boms/sdk/src/it/sdk-usage-test/src/main/java/io/a2a/test/SdkBomVerifier.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,11 @@
1212
public class SdkBomVerifier extends DynamicBomVerifier {
1313

1414
private static final Set<String> SDK_EXCLUSIONS = Set.of(
15-
"boms/", // BOM test modules themselves
16-
"examples/", // Example applications
17-
"tck/", // TCK test suite
18-
"tests/" // Integration tests
15+
"boms/", // BOM test modules themselves
16+
"examples/", // Example applications
17+
"tck/", // TCK test suite
18+
"tests/", // Integration tests
19+
"test-utils-docker/" // Test utilities for Docker-based tests
1920
);
2021

2122
private static final Set<String> SDK_FORBIDDEN = Set.of(

extras/queue-manager-replicated/tests-multi-instance/tests/pom.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,14 @@
7474
<artifactId>logback-classic</artifactId>
7575
<scope>test</scope>
7676
</dependency>
77+
78+
<!-- Docker test utilities -->
79+
<dependency>
80+
<groupId>io.github.a2asdk</groupId>
81+
<artifactId>a2a-java-test-utils-docker</artifactId>
82+
<scope>test</scope>
83+
</dependency>
84+
<!-- Note: testcontainers dependency already present above -->
7785
</dependencies>
7886

7987
<build>

extras/queue-manager-replicated/tests-multi-instance/tests/src/test/java/io/a2a/extras/queuemanager/replicated/tests/multiinstance/MultiInstanceReplicationTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import io.a2a.spec.TaskQueryParams;
3232
import io.a2a.spec.TaskState;
3333
import io.a2a.spec.TransportProtocol;
34+
import io.a2a.testutils.docker.RequiresDocker;
3435
import org.junit.jupiter.api.AfterAll;
3536
import org.junit.jupiter.api.AfterEach;
3637
import org.junit.jupiter.api.BeforeAll;
@@ -47,14 +48,15 @@
4748
/**
4849
* Multi-instance replication test that validates event queue replication
4950
* between two running Quarkus instances using Testcontainers.
50-
*
51+
*
5152
* Test Architecture:
5253
* - Shared KafkaContainer for event replication
5354
* - Shared PostgreSQLContainer for task persistence
5455
* - Two Quarkus application containers (app1 on 8081, app2 on 8082)
5556
* - A2A Client instances to interact with both applications
5657
*/
5758
@Testcontainers
59+
@RequiresDocker
5860
public class MultiInstanceReplicationTest {
5961

6062
private static final String KAFKA_IMAGE = "confluentinc/cp-kafka:7.6.1";

extras/queue-manager-replicated/tests-single-instance/pom.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,13 @@
8484
<scope>test</scope>
8585
</dependency>
8686

87+
<!-- Docker test utilities -->
88+
<dependency>
89+
<groupId>io.github.a2asdk</groupId>
90+
<artifactId>a2a-java-test-utils-docker</artifactId>
91+
<scope>test</scope>
92+
</dependency>
93+
8794
</dependencies>
8895

8996
<profiles>

extras/queue-manager-replicated/tests-single-instance/src/test/java/io/a2a/extras/queuemanager/replicated/tests/KafkaReplicationIntegrationTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import io.a2a.spec.TaskStatus;
4343
import io.a2a.spec.TaskStatusUpdateEvent;
4444
import io.a2a.spec.TextPart;
45+
import io.a2a.testutils.docker.RequiresDocker;
4546
import io.quarkus.test.junit.QuarkusTest;
4647
import org.eclipse.microprofile.reactive.messaging.Channel;
4748
import org.eclipse.microprofile.reactive.messaging.Emitter;
@@ -56,6 +57,7 @@
5657
* Tests the full A2A message flow with Kafka replication verification.
5758
*/
5859
@QuarkusTest
60+
@RequiresDocker
5961
public class KafkaReplicationIntegrationTest {
6062

6163
private static final Logger LOGGER = LoggerFactory.getLogger(KafkaReplicationIntegrationTest.class);

extras/queue-manager-replicated/tests-single-instance/src/test/java/io/a2a/extras/queuemanager/replicated/tests/ReplicatedQueueManagerTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import jakarta.inject.Inject;
66

77
import io.a2a.extras.queuemanager.replicated.core.ReplicatedQueueManager;
8+
import io.a2a.testutils.docker.RequiresDocker;
89
import io.a2a.server.events.QueueManager;
910
import io.quarkus.test.junit.QuarkusTest;
1011
import org.junit.jupiter.api.Test;
@@ -14,6 +15,7 @@
1415
* For full integration testing with Kafka replication, see KafkaReplicationIntegrationTest.
1516
*/
1617
@QuarkusTest
18+
@RequiresDocker
1719
public class ReplicatedQueueManagerTest {
1820

1921
@Inject

pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,11 @@
220220
<artifactId>a2a-java-sdk-opentelemetry-client-propagation</artifactId>
221221
<version>${project.version}</version>
222222
</dependency>
223+
<dependency>
224+
<groupId>io.github.a2asdk</groupId>
225+
<artifactId>a2a-java-test-utils-docker</artifactId>
226+
<version>${project.version}</version>
227+
</dependency>
223228
<dependency>
224229
<groupId>io.grpc</groupId>
225230
<artifactId>grpc-bom</artifactId>
@@ -566,6 +571,7 @@
566571
<module>spec</module>
567572
<module>spec-grpc</module>
568573
<module>tck</module>
574+
<module>test-utils-docker</module>
569575
<module>tests/server-common</module>
570576
<module>transport/jsonrpc</module>
571577
<module>transport/grpc</module>

0 commit comments

Comments
 (0)