
org.testcontainers.junit.jupiter.TestcontainersExtension Maven / Gradle / Ivy
// Generated by delombok at Sat Oct 26 09:14:55 UTC 2019
package org.testcontainers.junit.jupiter;
import org.junit.jupiter.api.extension.*;
import org.junit.jupiter.api.extension.ExtensionContext.Namespace;
import org.junit.jupiter.api.extension.ExtensionContext.Store.CloseableResource;
import org.junit.platform.commons.support.AnnotationSupport;
import org.junit.platform.commons.util.AnnotationUtils;
import org.junit.platform.commons.util.Preconditions;
import org.junit.platform.commons.util.ReflectionUtils;
import org.testcontainers.DockerClientFactory;
import org.testcontainers.lifecycle.Startable;
import java.lang.reflect.Field;
import java.util.LinkedHashSet;
import java.util.Optional;
import java.util.Set;
import java.util.function.Predicate;
import java.util.stream.Stream;
class TestcontainersExtension implements BeforeEachCallback, BeforeAllCallback, ExecutionCondition, TestInstancePostProcessor {
private static final Namespace NAMESPACE = Namespace.create(TestcontainersExtension.class);
private static final String TEST_INSTANCE = "testInstance";
@Override
public void postProcessTestInstance(final Object testInstance, final ExtensionContext context) {
ExtensionContext.Store store = context.getStore(NAMESPACE);
store.put(TEST_INSTANCE, testInstance);
}
@Override
public void beforeAll(ExtensionContext context) {
Class> testClass = context.getTestClass().orElseThrow(() -> new ExtensionConfigurationException("TestcontainersExtension is only supported for classes."));
ExtensionContext.Store store = context.getStore(NAMESPACE);
findSharedContainers(testClass).forEach(adapter -> store.getOrComputeIfAbsent(adapter.getKey(), k -> adapter.start()));
}
@Override
public void beforeEach(final ExtensionContext context) {
collectParentTestInstances(context).parallelStream().flatMap(this::findRestartContainers).forEach(adapter -> context.getStore(NAMESPACE).getOrComputeIfAbsent(adapter.getKey(), k -> adapter.start()));
}
@Override
public ConditionEvaluationResult evaluateExecutionCondition(ExtensionContext context) {
return findTestcontainers(context).map(this::evaluate).orElseThrow(() -> new ExtensionConfigurationException("@Testcontainers not found"));
}
private Optional findTestcontainers(ExtensionContext context) {
Optional current = Optional.of(context);
while (current.isPresent()) {
Optional testcontainers = AnnotationUtils.findAnnotation(current.get().getRequiredTestClass(), Testcontainers.class);
if (testcontainers.isPresent()) {
return testcontainers;
}
current = current.get().getParent();
}
return Optional.empty();
}
private ConditionEvaluationResult evaluate(Testcontainers testcontainers) {
if (testcontainers.disabledWithoutDocker()) {
if (isDockerAvailable()) {
return ConditionEvaluationResult.enabled("Docker is available");
}
return ConditionEvaluationResult.disabled("disabledWithoutDocker is true and Docker is not available");
}
return ConditionEvaluationResult.enabled("disabledWithoutDocker is false");
}
boolean isDockerAvailable() {
try {
DockerClientFactory.instance().client();
return true;
} catch (Throwable ex) {
return false;
}
}
private Set
© 2015 - 2025 Weber Informatics LLC | Privacy Policy