Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 0 additions & 30 deletions src/main/java/io/vertx/junit5/ReportHandlerFailures.java

This file was deleted.

146 changes: 102 additions & 44 deletions src/main/java/io/vertx/junit5/VertxExtension.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,9 @@
import io.vertx.core.Vertx;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.extension.DynamicTestInvocationContext;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.api.extension.*;
import org.junit.jupiter.api.extension.ExtensionContext.Namespace;
import org.junit.jupiter.api.extension.ExtensionContext.Store;
import org.junit.jupiter.api.extension.InvocationInterceptor;
import org.junit.jupiter.api.extension.ParameterContext;
import org.junit.jupiter.api.extension.ParameterResolutionException;
import org.junit.jupiter.api.extension.ParameterResolver;
import org.junit.jupiter.api.extension.ReflectiveInvocationContext;

import java.lang.reflect.Method;
import java.time.Duration;
Expand All @@ -46,7 +40,7 @@
*
* @author <a href="https://julien.ponge.org/">Julien Ponge</a>
*/
public final class VertxExtension implements ParameterResolver, InvocationInterceptor {
public final class VertxExtension implements ParameterResolver, InvocationInterceptor, BeforeAllCallback {

/**
* Default timeout.
Expand All @@ -67,6 +61,8 @@ public final class VertxExtension implements ParameterResolver, InvocationInterc

private static final String TEST_CONTEXT_KEY = "VertxTestContext";

private static final String TEST_CONFIG = "TestConfig";

private static class VertxTestContextEntry {
private final VertxTestContext context;
private final Checkpoint checkpoint;
Expand All @@ -91,6 +87,39 @@ public VertxExtension() {
}
}

static boolean instrumentVertx(ExtensionContext context) {
Store store = context.getStore(Namespace.GLOBAL);
TestConfig config = (TestConfig)store.get(TEST_CONFIG);
if (config != null) {
return config.instrumentVertx;
} else {
return false;
}
}

/**
* Hold context data for the test
*/
private static class TestConfig {
private List<VertxTestContextEntry> testContexts;
private boolean instrumentVertx;
}

@Override
public void beforeAll(ExtensionContext context) throws Exception {
Optional<Class<?>> maybeClass = context.getTestClass();
if (maybeClass.isPresent()) {
Class<?> clazz = maybeClass.get();
VertxTest vertxTest = clazz.getAnnotation(VertxTest.class);
if (vertxTest != null) {
TestConfig config = new TestConfig();
config.instrumentVertx = vertxTest.instrumentVertx();
Store store = context.getStore(Namespace.GLOBAL);
store.put(TEST_CONFIG, config);
}
}
}

@Override
public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
return parameterProviders.containsKey(parameterType(parameterContext));
Expand Down Expand Up @@ -130,17 +159,31 @@ private static Object unpack(Object object) {
return object;
}

private void initParameters(ExtensionContext extensionContext, ReflectiveInvocationContext<?> invocation) {
List<Object> args = invocation.getArguments();
for (Object arg : args) {
for (Map.Entry<Class<?>, VertxExtensionParameterProvider<?>> entry : parameterProviders.entrySet()) {
Class<?> clazz = entry.getKey();
if (clazz != VertxTestContext.class && clazz.isInstance(arg)) {
VertxExtensionParameterProvider<Object> value = (VertxExtensionParameterProvider<Object>)entry.getValue();
value.init(arg, extensionContext);
private void setupVertxInstances(ExtensionContext extensionContext) {
Store store = extensionContext.getStore(Namespace.GLOBAL);
ScopedObject<Vertx> scopedVertx = (ScopedObject<Vertx>)store.get(VERTX_INSTANCE_KEY);
ContextList entries = (ContextList)store.get(TEST_CONTEXT_KEY);
if (instrumentVertx(extensionContext) && scopedVertx != null && entries != null) {
List<VertxTestContext> testContexts = entries
.stream()
.map(entry -> entry.context)
.collect(Collectors.toList());
Vertx vertx = scopedVertx.get();
vertx.exceptionHandler(failure -> {
for (VertxTestContext context : testContexts) {
context.failNow(failure);
break;
}
}
});
}
}

private void cleanup(ExtensionContext extensionContext) {
Store store = extensionContext.getStore(Namespace.GLOBAL);
ScopedObject<Vertx> scopedVertx = (ScopedObject<Vertx>)store.get(VERTX_INSTANCE_KEY);
if (instrumentVertx(extensionContext) && scopedVertx != null) {
Vertx vertx = scopedVertx.get();
vertx.exceptionHandler(null);
}
}

Expand All @@ -157,48 +200,59 @@ private static Store store(ExtensionContext extensionContext) {
return extensionContext.getStore(Namespace.GLOBAL);
}

static <T> List<VertxTestContext> testContextsOf(ExtensionContext extensionContext) {
Store store = store(extensionContext);
ContextList contexts = (ContextList) store.getOrComputeIfAbsent(TEST_CONTEXT_KEY, key -> new ContextList());
return contexts
.stream()
.map(e -> e.context)
.collect(Collectors.toList());
}

@Override
public void interceptBeforeAllMethod(Invocation<Void> invocation, ReflectiveInvocationContext<Method> invocationContext, ExtensionContext extensionContext) throws Throwable {
initParameters(extensionContext, invocationContext);
invocation.proceed();
joinActiveTestContexts(extensionContext);
setupVertxInstances(extensionContext);
try {
invocation.proceed();
joinActiveTestContexts(extensionContext);
} finally {
cleanup(extensionContext);
}
}

@Override
public void interceptAfterAllMethod(Invocation<Void> invocation, ReflectiveInvocationContext<Method> invocationContext, ExtensionContext extensionContext) throws Throwable {
initParameters(extensionContext, invocationContext);
invocation.proceed();
joinActiveTestContexts(extensionContext);
setupVertxInstances(extensionContext);
try {
invocation.proceed();
joinActiveTestContexts(extensionContext);
} finally {
cleanup(extensionContext);
}
}

@Override
public void interceptTestMethod(Invocation<Void> invocation, ReflectiveInvocationContext<Method> invocationContext, ExtensionContext extensionContext) throws Throwable {
initParameters(extensionContext, invocationContext);
invocation.proceed();
joinActiveTestContexts(extensionContext);
setupVertxInstances(extensionContext);
try {
invocation.proceed();
joinActiveTestContexts(extensionContext);
} finally {
cleanup(extensionContext);
}
}

@Override
public void interceptBeforeEachMethod(Invocation<Void> invocation, ReflectiveInvocationContext<Method> invocationContext, ExtensionContext extensionContext) throws Throwable {
initParameters(extensionContext, invocationContext);
invocation.proceed();
joinActiveTestContexts(extensionContext);
setupVertxInstances(extensionContext);
try {
invocation.proceed();
joinActiveTestContexts(extensionContext);
} finally {
cleanup(extensionContext);
}
}

@Override
public void interceptTestTemplateMethod(Invocation<Void> invocation, ReflectiveInvocationContext<Method> invocationContext, ExtensionContext extensionContext) throws Throwable {
initParameters(extensionContext, invocationContext);
invocation.proceed();
joinActiveTestContexts(extensionContext);
setupVertxInstances(extensionContext);
try {
invocation.proceed();
joinActiveTestContexts(extensionContext);
} finally {
cleanup(extensionContext);
}
}

@Override
Expand All @@ -209,9 +263,13 @@ public void interceptDynamicTest(Invocation<Void> invocation, DynamicTestInvocat

@Override
public void interceptAfterEachMethod(Invocation<Void> invocation, ReflectiveInvocationContext<Method> invocationContext, ExtensionContext extensionContext) throws Throwable {
initParameters(extensionContext, invocationContext);
invocation.proceed();
joinActiveTestContexts(invocationContext, extensionContext);
setupVertxInstances(extensionContext);
try {
invocation.proceed();
joinActiveTestContexts(invocationContext, extensionContext);
} finally {
cleanup(extensionContext);
}
}

private void joinActiveTestContexts(ExtensionContext extensionContext) throws Exception {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,6 @@ public interface VertxExtensionParameterProvider<T> {
*/
T newInstance(ExtensionContext extensionContext, ParameterContext parameterContext);

void init(T init, ExtensionContext extensionContext);

/**
* A consumer to close the resource.
*
Expand Down
14 changes: 0 additions & 14 deletions src/main/java/io/vertx/junit5/VertxParameterProvider.java
Original file line number Diff line number Diff line change
Expand Up @@ -146,20 +146,6 @@ public ParameterClosingConsumer<Vertx> parameterClosingConsumer() {
};
}

@Override
public void init(Vertx init, ExtensionContext extensionContext) {
ReportHandlerFailures annotation = extensionContext.getRequiredTestClass().getAnnotation(ReportHandlerFailures.class);
if (annotation != null) {
List<VertxTestContext> testContexts = new ArrayList<>(testContextsOf(extensionContext));
init.exceptionHandler(failure -> {
for (VertxTestContext testContext : testContexts) {
testContext.failNow(failure);
break;
}
});
}
}

public static JsonObject getVertxOptions() {
String optionFileName = System.getenv(VERTX_PARAMETER_FILENAME_ENV_VAR);
if (optionFileName == null) {
Expand Down
15 changes: 15 additions & 0 deletions src/main/java/io/vertx/junit5/VertxTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package io.vertx.junit5;

import org.junit.jupiter.api.extension.ExtendWith;

import java.lang.annotation.*;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@ExtendWith(VertxExtension.class)
@Inherited
public @interface VertxTest {

boolean instrumentVertx() default true;

}
Original file line number Diff line number Diff line change
Expand Up @@ -45,12 +45,7 @@ public VertxTestContext newInstance(ExtensionContext extensionContext, Parameter
doNotCallMe();
return null;
}

@Override
public void init(VertxTestContext init, ExtensionContext extensionContext) {
doNotCallMe();
}


@Override
public ParameterClosingConsumer<VertxTestContext> parameterClosingConsumer() {
doNotCallMe();
Expand Down
Loading
Loading