diff --git a/junit-jupiter-api/src/main/java/org/junit/jupiter/api/extension/AfterDiscoveryCallback.java b/junit-jupiter-api/src/main/java/org/junit/jupiter/api/extension/AfterDiscoveryCallback.java new file mode 100644 index 000000000000..3a7222724fbd --- /dev/null +++ b/junit-jupiter-api/src/main/java/org/junit/jupiter/api/extension/AfterDiscoveryCallback.java @@ -0,0 +1,25 @@ +/* + * Copyright 2015-2016 the original author or authors. + * + * All rights reserved. This program and the accompanying materials are + * made available under the terms of the Eclipse Public License v1.0 which + * accompanies this distribution and is available at + * + * http://www.eclipse.org/legal/epl-v10.html + */ + +package org.junit.jupiter.api.extension; + +import org.junit.platform.commons.meta.API; + +/** + * @author swm16 + * + */ +@FunctionalInterface +@API(API.Usage.Experimental) +public interface AfterDiscoveryCallback extends Extension { + + void afterDiscovery(Object testDescriptor) throws Exception; + +} diff --git a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/AfterDiscoveryCallbackInvoker.java b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/AfterDiscoveryCallbackInvoker.java new file mode 100644 index 000000000000..a5ca0a4b5653 --- /dev/null +++ b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/AfterDiscoveryCallbackInvoker.java @@ -0,0 +1,51 @@ +/* + * Copyright 2015-2016 the original author or authors. + * + * All rights reserved. This program and the accompanying materials are + * made available under the terms of the Eclipse Public License v1.0 which + * accompanies this distribution and is available at + * + * http://www.eclipse.org/legal/epl-v10.html + */ + +package org.junit.jupiter.engine; + +import java.util.Arrays; +import java.util.List; + +import org.junit.jupiter.api.extension.AfterDiscoveryCallback; +import org.junit.jupiter.api.extension.Extension; +import org.junit.jupiter.api.function.Executable; +import org.junit.jupiter.engine.extension.ExtensionRegistry; +import org.junit.platform.commons.util.ExceptionUtils; +import org.junit.platform.engine.TestDescriptor; + +public class AfterDiscoveryCallbackInvoker { + + static final Class AFTER_DISCOVERY_CALLBACK_TYPE = AfterDiscoveryCallback.class; + static final List> EXTENSION_TYPES = Arrays.asList(AFTER_DISCOVERY_CALLBACK_TYPE); + + void invokeAfterDiscoveryCallbacks(TestDescriptor engineDescriptor) { + TestDescriptor.Visitor visitor = (testDescriptor) -> { + ExtensionRegistry registry = getExtensionRegistry(testDescriptor); + registry.stream(AfterDiscoveryCallback.class).forEach( + (extension) -> executeAndMaskThrowable(() -> extension.afterDiscovery((testDescriptor)))); + }; + engineDescriptor.accept(visitor); + } + + protected void executeAndMaskThrowable(Executable executable) { + try { + executable.execute(); + } + catch (Throwable throwable) { + ExceptionUtils.throwAsUncheckedException(throwable); + } + } + + ExtensionRegistry getExtensionRegistry(TestDescriptor testDescriptor) { + ExtensionRegistry defaultRegistry = ExtensionRegistry.createRegistryWithDefaultExtensions(); + return defaultRegistry; + } + +} diff --git a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/JupiterTestEngine.java b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/JupiterTestEngine.java index a2e3c414a4ce..93d9ebfe64e1 100644 --- a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/JupiterTestEngine.java +++ b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/JupiterTestEngine.java @@ -49,6 +49,7 @@ private void resolveDiscoveryRequest(EngineDiscoveryRequest discoveryRequest, DiscoverySelectorResolver resolver = new DiscoverySelectorResolver(); resolver.resolveSelectors(discoveryRequest, engineDescriptor); applyDiscoveryFilters(discoveryRequest, engineDescriptor); + invokeAfterDiscoveryCallbacks(engineDescriptor); } private void applyDiscoveryFilters(EngineDiscoveryRequest discoveryRequest, @@ -56,6 +57,10 @@ private void applyDiscoveryFilters(EngineDiscoveryRequest discoveryRequest, new DiscoveryFilterApplier().applyAllFilters(discoveryRequest, engineDescriptor); } + private void invokeAfterDiscoveryCallbacks(JupiterEngineDescriptor engineDescriptor) { + new AfterDiscoveryCallbackInvoker().invokeAfterDiscoveryCallbacks(engineDescriptor); + } + @Override protected JupiterEngineExecutionContext createExecutionContext(ExecutionRequest request) { return new JupiterEngineExecutionContext(request.getEngineExecutionListener(), diff --git a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/DiscoveryReportExtension.java b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/DiscoveryReportExtension.java new file mode 100644 index 000000000000..2fc8cf4d6a0f --- /dev/null +++ b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/DiscoveryReportExtension.java @@ -0,0 +1,38 @@ +/* + * Copyright 2015-2016 the original author or authors. + * + * All rights reserved. This program and the accompanying materials are + * made available under the terms of the Eclipse Public License v1.0 which + * accompanies this distribution and is available at + * + * http://www.eclipse.org/legal/epl-v10.html + */ + +package org.junit.jupiter.engine.extension; + +import org.junit.jupiter.api.extension.AfterDiscoveryCallback; +import org.junit.platform.engine.TestDescriptor; + +/** + * @author swm16 + * + */ +public class DiscoveryReportExtension implements AfterDiscoveryCallback { + + /* (non-Javadoc) + * @see org.junit.jupiter.api.extension.AfterDiscoveryCallback#afterDiscovery(java.lang.Object) + */ + @Override + public void afterDiscovery(Object object) { + if (object instanceof TestDescriptor) { + TestDescriptor testDescriptor = (TestDescriptor) object; + System.out.println("DiscoveryReportExtension.afterDiscovery(): UniqueId - " + testDescriptor.getUniqueId()); + System.out.println( + "DiscoveryReportExtension.afterDiscovery(): DisplayName - " + testDescriptor.getDisplayName()); + } + else { + System.out.println("afterDiscovery(): ERROR - That wasn't a TestDescriptor"); + } + } + +} diff --git a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/ExtensionRegistry.java b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/ExtensionRegistry.java index cdd7c96ef01d..8af6c9f9055b 100644 --- a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/ExtensionRegistry.java +++ b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/ExtensionRegistry.java @@ -46,7 +46,8 @@ public class ExtensionRegistry { private static final Logger LOG = Logger.getLogger(ExtensionRegistry.class.getName()); private static final List DEFAULT_EXTENSIONS = Collections.unmodifiableList( - Arrays.asList(new DisabledCondition(), new TestInfoParameterResolver(), new TestReporterParameterResolver())); + Arrays.asList(new DisabledCondition(), new TestInfoParameterResolver(), new TestReporterParameterResolver(), + new DiscoveryReportExtension())); /** * Factory for creating and populating a new root registry with the default diff --git a/junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/extension/ExtensionRegistryTests.java b/junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/extension/ExtensionRegistryTests.java index c5e45e2e9006..da927eff1f53 100644 --- a/junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/extension/ExtensionRegistryTests.java +++ b/junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/extension/ExtensionRegistryTests.java @@ -39,7 +39,7 @@ public class ExtensionRegistryTests { void newRegistryWithoutParentHasDefaultExtensions() { List extensions = registry.getExtensions(Extension.class); - assertEquals(3, extensions.size()); + assertEquals(4, extensions.size()); assertExtensionRegistered(registry, DisabledCondition.class); assertExtensionRegistered(registry, TestInfoParameterResolver.class); assertExtensionRegistered(registry, TestReporterParameterResolver.class);