diff --git a/modules/junit-jupiter/src/main/java/org/testcontainers/junit/jupiter/TestcontainersExtension.java b/modules/junit-jupiter/src/main/java/org/testcontainers/junit/jupiter/TestcontainersExtension.java index 89adba6033f..7522811a800 100644 --- a/modules/junit-jupiter/src/main/java/org/testcontainers/junit/jupiter/TestcontainersExtension.java +++ b/modules/junit-jupiter/src/main/java/org/testcontainers/junit/jupiter/TestcontainersExtension.java @@ -41,6 +41,10 @@ public class TestcontainersExtension private static final String LOCAL_LIFECYCLE_AWARE_CONTAINERS = "localLifecycleAwareContainers"; + private static final String TEST_CLASS_LABEL = "testcontainers/test-class"; + + private static final String TEST_FIELD_LABEL = "testcontainers/test-field"; + private final DockerAvailableDetector dockerDetector = new DockerAvailableDetector(); @Override @@ -267,12 +271,24 @@ private static class StoreAdapter implements CloseableResource, AutoCloseable { private Startable container; + private Class declaringClass; + + private String fieldName; + private StoreAdapter(Class declaringClass, String fieldName, Startable container) { + this.declaringClass = declaringClass; + this.fieldName = fieldName; this.key = declaringClass.getName() + "." + fieldName; this.container = container; } private StoreAdapter start() { + if (container instanceof org.testcontainers.containers.Container) { + ((org.testcontainers.containers.Container) container) + .withLabel(TEST_CLASS_LABEL, declaringClass.getName()); + ((org.testcontainers.containers.Container) container) + .withLabel(TEST_FIELD_LABEL, fieldName); + } container.start(); return this; } diff --git a/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/ContainerLabelingTest.java b/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/ContainerLabelingTest.java new file mode 100644 index 00000000000..a8ab05875d9 --- /dev/null +++ b/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/ContainerLabelingTest.java @@ -0,0 +1,34 @@ +package org.testcontainers.junit.jupiter; + +import org.junit.jupiter.api.Test; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.wait.strategy.HostPortWaitStrategy; +import org.testcontainers.utility.DockerImageName; + +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; + +class ContainerLabelingTest { + + private static final DockerImageName IMAGE = DockerImageName.parse("nginx:1.27-alpine"); + + @Testcontainers + static class LabeledContainerTest { + + @Container + @SuppressWarnings("unused") + static GenericContainer container = new GenericContainer<>(IMAGE) + .withExposedPorts(80) + .waitingFor(new HostPortWaitStrategy()); + + @Test + void shouldHaveTestClassLabel() { + Map labels = container.getContainerInfo().getConfig().getLabels(); + assertThat(labels) + .containsEntry("testcontainers/test-class", + ContainerLabelingTest.class.getName() + "$LabeledContainerTest") + .containsEntry("testcontainers/test-field", "container"); + } + } +}