Move provider classes to maven surefire package
Project: http://git-wip-us.apache.org/repos/asf/maven-surefire/repo Commit: http://git-wip-us.apache.org/repos/asf/maven-surefire/commit/c197b926 Tree: http://git-wip-us.apache.org/repos/asf/maven-surefire/tree/c197b926 Diff: http://git-wip-us.apache.org/repos/asf/maven-surefire/diff/c197b926 Branch: refs/heads/3.0-rc1 Commit: c197b926a5f02ab2a3842d4a8a736315c3c8eb33 Parents: 30ee7b9 Author: Benedikt Ritter <brit...@apache.org> Authored: Mon Feb 6 19:14:53 2017 +0100 Committer: Benedikt Ritter <brit...@apache.org> Committed: Mon Feb 6 19:14:53 2017 +0100 ---------------------------------------------------------------------- .../surefire/junit5/JUnitPlatformProvider.java | 202 ++++++++++++ .../surefire/junit5/RunListenerAdapter.java | 148 +++++++++ .../surefire/junit5/TestPlanScannerFilter.java | 64 ++++ .../provider/JUnitPlatformProvider.java | 202 ------------ .../surefire/provider/RunListenerAdapter.java | 148 --------- .../provider/TestPlanScannerFilter.java | 64 ---- ....maven.surefire.providerapi.SurefireProvider | 2 +- .../junit5/JUnitPlatformProviderTests.java | 325 +++++++++++++++++++ .../junit5/RunListenerAdapterTests.java | 262 +++++++++++++++ .../junit5/TestPlanScannerFilterTests.java | 190 +++++++++++ .../provider/JUnitPlatformProviderTests.java | 325 ------------------- .../provider/RunListenerAdapterTests.java | 263 --------------- .../provider/TestPlanScannerFilterTests.java | 190 ----------- 13 files changed, 1192 insertions(+), 1193 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/c197b926/surefire-providers/surefire-junit5/src/main/java/org/apache/maven/surefire/junit5/JUnitPlatformProvider.java ---------------------------------------------------------------------- diff --git a/surefire-providers/surefire-junit5/src/main/java/org/apache/maven/surefire/junit5/JUnitPlatformProvider.java b/surefire-providers/surefire-junit5/src/main/java/org/apache/maven/surefire/junit5/JUnitPlatformProvider.java new file mode 100644 index 0000000..ee93165 --- /dev/null +++ b/surefire-providers/surefire-junit5/src/main/java/org/apache/maven/surefire/junit5/JUnitPlatformProvider.java @@ -0,0 +1,202 @@ +package org.apache.maven.surefire.junit5; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import org.apache.maven.surefire.providerapi.AbstractProvider; +import org.apache.maven.surefire.providerapi.ProviderParameters; +import org.apache.maven.surefire.report.ReporterException; +import org.apache.maven.surefire.report.ReporterFactory; +import org.apache.maven.surefire.report.RunListener; +import org.apache.maven.surefire.report.SimpleReportEntry; +import org.apache.maven.surefire.suite.RunResult; +import org.apache.maven.surefire.testset.TestSetFailedException; +import org.apache.maven.surefire.util.TestsToRun; +import org.junit.platform.engine.Filter; +import org.junit.platform.launcher.Launcher; +import org.junit.platform.launcher.LauncherDiscoveryRequest; +import org.junit.platform.launcher.TagFilter; +import org.junit.platform.launcher.core.LauncherFactory; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Optional; +import java.util.logging.Level; +import java.util.logging.Logger; + +import static org.junit.platform.engine.discovery.DiscoverySelectors.selectClass; +import static org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder.request; + +/** + * @since 1.0 + */ +public class JUnitPlatformProvider + extends AbstractProvider +{ + + // Parameter names processed to determine which @Tags should be executed. + static final String EXCLUDE_GROUPS = "excludedGroups"; + + static final String EXCLUDE_TAGS = "excludeTags"; + + static final String INCLUDE_GROUPS = "groups"; + + static final String INCLUDE_TAGS = "includeTags"; + + static final String EXCEPTION_MESSAGE_BOTH_NOT_ALLOWED = "The " + INCLUDE_GROUPS + " and " + INCLUDE_TAGS + + " parameters (or the " + EXCLUDE_GROUPS + " and " + EXCLUDE_TAGS + " parameters) are synonyms - " + + "only one of each is allowed (though neither is required)."; + + private final ProviderParameters parameters; + + private final Launcher launcher; + + final Filter<?>[] includeAndExcludeFilters; + + public JUnitPlatformProvider( ProviderParameters parameters ) + { + this( parameters, LauncherFactory.create() ); + } + + JUnitPlatformProvider( ProviderParameters parameters, Launcher launcher ) + { + this.parameters = parameters; + this.launcher = launcher; + this.includeAndExcludeFilters = getIncludeAndExcludeFilters(); + Logger.getLogger( "org.junit" ).setLevel( Level.WARNING ); + } + + @Override + public Iterable<Class<?>> getSuites() + { + return scanClasspath(); + } + + @Override + public RunResult invoke( Object forkTestSet ) + throws TestSetFailedException, ReporterException, InvocationTargetException + { + if ( forkTestSet instanceof TestsToRun ) + { + return invokeAllTests( (TestsToRun) forkTestSet ); + } + else if ( forkTestSet instanceof Class ) + { + return invokeAllTests( TestsToRun.fromClass( (Class<?>) forkTestSet ) ); + } + else if ( forkTestSet == null ) + { + return invokeAllTests( scanClasspath() ); + } + else + { + throw new IllegalArgumentException( "Unexpected value of forkTestSet: " + forkTestSet ); + } + } + + private TestsToRun scanClasspath() + { + TestsToRun scannedClasses = parameters.getScanResult().applyFilter( + new TestPlanScannerFilter( launcher, includeAndExcludeFilters ), parameters.getTestClassLoader() ); + return parameters.getRunOrderCalculator().orderTestClasses( scannedClasses ); + } + + private RunResult invokeAllTests( TestsToRun testsToRun ) + { + RunResult runResult; + ReporterFactory reporterFactory = parameters.getReporterFactory(); + try + { + RunListener runListener = reporterFactory.createReporter(); + launcher.registerTestExecutionListeners( new RunListenerAdapter( runListener ) ); + + for ( Class<?> testClass : testsToRun ) + { + invokeSingleClass( testClass, runListener ); + } + } + finally + { + runResult = reporterFactory.close(); + } + return runResult; + } + + private void invokeSingleClass( Class<?> testClass, RunListener runListener ) + { + SimpleReportEntry classEntry = new SimpleReportEntry( getClass().getName(), testClass.getName() ); + runListener.testSetStarting( classEntry ); + + LauncherDiscoveryRequest discoveryRequest = request().selectors( selectClass( testClass ) ).filters( + includeAndExcludeFilters ).build(); + launcher.execute( discoveryRequest ); + + runListener.testSetCompleted( classEntry ); + } + + private Filter<?>[] getIncludeAndExcludeFilters() + { + List<Filter<?>> filters = new ArrayList<>(); + + Optional<List<String>> includes = getGroupsOrTags( getPropertiesList( INCLUDE_GROUPS ), + getPropertiesList( INCLUDE_TAGS ) ); + includes.map( TagFilter::includeTags ).ifPresent( filters::add ); + + Optional<List<String>> excludes = getGroupsOrTags( getPropertiesList( EXCLUDE_GROUPS ), + getPropertiesList( EXCLUDE_TAGS ) ); + excludes.map( TagFilter::excludeTags ).ifPresent( filters::add ); + + return filters.toArray( new Filter<?>[filters.size()] ); + } + + private Optional<List<String>> getPropertiesList( String key ) + { + List<String> compoundProperties = null; + String property = parameters.getProviderProperties().get( key ); + if ( property != null ) + { + compoundProperties = Arrays.asList( property.split( "[, ]+" ) ); + } + return Optional.ofNullable( compoundProperties ); + } + + private Optional<List<String>> getGroupsOrTags( Optional<List<String>> groups, Optional<List<String>> tags ) + { + Optional<List<String>> elements = Optional.empty(); + + if ( groups.isPresent() && tags.isPresent() ) + { + throw new IllegalStateException( EXCEPTION_MESSAGE_BOTH_NOT_ALLOWED ); + } + + if ( groups.isPresent() ) + { + elements = groups; + } + else if ( tags.isPresent() ) + { + elements = tags; + } + + return elements; + } + +} http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/c197b926/surefire-providers/surefire-junit5/src/main/java/org/apache/maven/surefire/junit5/RunListenerAdapter.java ---------------------------------------------------------------------- diff --git a/surefire-providers/surefire-junit5/src/main/java/org/apache/maven/surefire/junit5/RunListenerAdapter.java b/surefire-providers/surefire-junit5/src/main/java/org/apache/maven/surefire/junit5/RunListenerAdapter.java new file mode 100644 index 0000000..8e1a2e2 --- /dev/null +++ b/surefire-providers/surefire-junit5/src/main/java/org/apache/maven/surefire/junit5/RunListenerAdapter.java @@ -0,0 +1,148 @@ +package org.apache.maven.surefire.junit5; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import static org.apache.maven.surefire.report.SimpleReportEntry.ignored; +import static org.junit.platform.engine.TestExecutionResult.Status.ABORTED; +import static org.junit.platform.engine.TestExecutionResult.Status.FAILED; + +import java.util.Optional; + +import org.apache.maven.surefire.report.PojoStackTraceWriter; +import org.apache.maven.surefire.report.RunListener; +import org.apache.maven.surefire.report.SimpleReportEntry; +import org.apache.maven.surefire.report.StackTraceWriter; +import org.junit.platform.engine.TestExecutionResult; +import org.junit.platform.engine.TestSource; +import org.junit.platform.engine.support.descriptor.ClassSource; +import org.junit.platform.engine.support.descriptor.MethodSource; +import org.junit.platform.launcher.TestExecutionListener; +import org.junit.platform.launcher.TestIdentifier; +import org.junit.platform.launcher.TestPlan; + +/** + * @since 1.0 + */ +final class RunListenerAdapter + implements TestExecutionListener +{ + + private final RunListener runListener; + + private Optional<TestPlan> testPlan = Optional.empty(); + + public RunListenerAdapter( RunListener runListener ) + { + this.runListener = runListener; + } + + @Override + public void testPlanExecutionStarted( TestPlan testPlan ) + { + this.testPlan = Optional.of( testPlan ); + } + + @Override + public void testPlanExecutionFinished( TestPlan testPlan ) + { + this.testPlan = Optional.empty(); + } + + @Override + public void executionStarted( TestIdentifier testIdentifier ) + { + if ( testIdentifier.isTest() ) + { + runListener.testStarting( createReportEntry( testIdentifier, Optional.empty() ) ); + } + } + + @Override + public void executionSkipped( TestIdentifier testIdentifier, String reason ) + { + String source = getClassName( testIdentifier ).orElseGet( () -> parentDisplayName( testIdentifier ) ); + runListener.testSkipped( ignored( source, testIdentifier.getDisplayName(), reason ) ); + } + + @Override + public void executionFinished( TestIdentifier testIdentifier, TestExecutionResult testExecutionResult ) + { + if ( testExecutionResult.getStatus() == ABORTED ) + { + runListener.testAssumptionFailure( createReportEntry( testIdentifier, + testExecutionResult.getThrowable() ) ); + } + else if ( testExecutionResult.getStatus() == FAILED ) + { + runListener.testFailed( createReportEntry( testIdentifier, testExecutionResult.getThrowable() ) ); + } + else if ( testIdentifier.isTest() ) + { + runListener.testSucceeded( createReportEntry( testIdentifier, Optional.empty() ) ); + } + } + + private SimpleReportEntry createReportEntry( TestIdentifier testIdentifier, Optional<Throwable> throwable ) + { + Optional<String> className = getClassName( testIdentifier ); + if ( className.isPresent() ) + { + StackTraceWriter traceWriter = new PojoStackTraceWriter( className.get(), + getMethodName( testIdentifier ).orElse( "" ), throwable.orElse( null ) ); + return new SimpleReportEntry( className.get(), testIdentifier.getDisplayName(), traceWriter, (Integer) null ); + } + else + { + return new SimpleReportEntry( parentDisplayName( testIdentifier ), testIdentifier.getDisplayName(), (Integer) null ); + } + } + + private Optional<String> getClassName( TestIdentifier testIdentifier ) + { + TestSource testSource = testIdentifier.getSource().orElse( null ); + if ( testSource instanceof ClassSource ) + { + return Optional.of( ( (ClassSource) testSource ).getJavaClass().getName() ); + } + if ( testSource instanceof MethodSource ) + { + return Optional.of( ( (MethodSource) testSource ).getClassName() ); + } + return Optional.empty(); + } + + private Optional<String> getMethodName( TestIdentifier testIdentifier ) + { + TestSource testSource = testIdentifier.getSource().orElse( null ); + if ( testSource instanceof MethodSource ) + { + return Optional.of( ( (MethodSource) testSource ).getMethodName() ); + } + return Optional.empty(); + } + + private String parentDisplayName( TestIdentifier testIdentifier ) + { + return testPlan + .flatMap( plan -> plan.getParent( testIdentifier ) ) + .map( TestIdentifier::getDisplayName ) + .orElseGet( testIdentifier::getUniqueId ); + } +} http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/c197b926/surefire-providers/surefire-junit5/src/main/java/org/apache/maven/surefire/junit5/TestPlanScannerFilter.java ---------------------------------------------------------------------- diff --git a/surefire-providers/surefire-junit5/src/main/java/org/apache/maven/surefire/junit5/TestPlanScannerFilter.java b/surefire-providers/surefire-junit5/src/main/java/org/apache/maven/surefire/junit5/TestPlanScannerFilter.java new file mode 100644 index 0000000..123c58d --- /dev/null +++ b/surefire-providers/surefire-junit5/src/main/java/org/apache/maven/surefire/junit5/TestPlanScannerFilter.java @@ -0,0 +1,64 @@ +package org.apache.maven.surefire.junit5; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import static org.junit.platform.engine.discovery.DiscoverySelectors.selectClass; +import static org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder.request; + +import java.util.function.Predicate; + +import org.apache.maven.surefire.util.ScannerFilter; +import org.junit.platform.engine.Filter; +import org.junit.platform.launcher.Launcher; +import org.junit.platform.launcher.LauncherDiscoveryRequest; +import org.junit.platform.launcher.TestIdentifier; +import org.junit.platform.launcher.TestPlan; + +/** + * @since 1.0 + */ +final class TestPlanScannerFilter + implements ScannerFilter +{ + + private static final Predicate<TestIdentifier> HAS_TESTS = testIdentifier -> testIdentifier.isTest() + || testIdentifier.isContainer(); + + private final Launcher launcher; + + private final Filter<?>[] includeAndExcludeFilters; + + public TestPlanScannerFilter( Launcher launcher, Filter<?>[] includeAndExcludeFilters ) + { + this.launcher = launcher; + this.includeAndExcludeFilters = includeAndExcludeFilters; + } + + @Override + @SuppressWarnings( "rawtypes" ) + public boolean accept( Class testClass ) + { + LauncherDiscoveryRequest discoveryRequest = request().selectors( selectClass( testClass ) ).filters( + includeAndExcludeFilters ).build(); + TestPlan testPlan = launcher.discover( discoveryRequest ); + return testPlan.countTestIdentifiers( HAS_TESTS ) > 0; + } + +} http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/c197b926/surefire-providers/surefire-junit5/src/main/java/org/junit/platform/surefire/provider/JUnitPlatformProvider.java ---------------------------------------------------------------------- diff --git a/surefire-providers/surefire-junit5/src/main/java/org/junit/platform/surefire/provider/JUnitPlatformProvider.java b/surefire-providers/surefire-junit5/src/main/java/org/junit/platform/surefire/provider/JUnitPlatformProvider.java deleted file mode 100644 index 3ee8acb..0000000 --- a/surefire-providers/surefire-junit5/src/main/java/org/junit/platform/surefire/provider/JUnitPlatformProvider.java +++ /dev/null @@ -1,202 +0,0 @@ -package org.junit.platform.surefire.provider; - -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import org.apache.maven.surefire.providerapi.AbstractProvider; -import org.apache.maven.surefire.providerapi.ProviderParameters; -import org.apache.maven.surefire.report.ReporterException; -import org.apache.maven.surefire.report.ReporterFactory; -import org.apache.maven.surefire.report.RunListener; -import org.apache.maven.surefire.report.SimpleReportEntry; -import org.apache.maven.surefire.suite.RunResult; -import org.apache.maven.surefire.testset.TestSetFailedException; -import org.apache.maven.surefire.util.TestsToRun; -import org.junit.platform.engine.Filter; -import org.junit.platform.launcher.Launcher; -import org.junit.platform.launcher.LauncherDiscoveryRequest; -import org.junit.platform.launcher.TagFilter; -import org.junit.platform.launcher.core.LauncherFactory; - -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Optional; -import java.util.logging.Level; -import java.util.logging.Logger; - -import static org.junit.platform.engine.discovery.DiscoverySelectors.selectClass; -import static org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder.request; - -/** - * @since 1.0 - */ -public class JUnitPlatformProvider - extends AbstractProvider -{ - - // Parameter names processed to determine which @Tags should be executed. - static final String EXCLUDE_GROUPS = "excludedGroups"; - - static final String EXCLUDE_TAGS = "excludeTags"; - - static final String INCLUDE_GROUPS = "groups"; - - static final String INCLUDE_TAGS = "includeTags"; - - static final String EXCEPTION_MESSAGE_BOTH_NOT_ALLOWED = "The " + INCLUDE_GROUPS + " and " + INCLUDE_TAGS - + " parameters (or the " + EXCLUDE_GROUPS + " and " + EXCLUDE_TAGS + " parameters) are synonyms - " - + "only one of each is allowed (though neither is required)."; - - private final ProviderParameters parameters; - - private final Launcher launcher; - - final Filter<?>[] includeAndExcludeFilters; - - public JUnitPlatformProvider( ProviderParameters parameters ) - { - this( parameters, LauncherFactory.create() ); - } - - JUnitPlatformProvider( ProviderParameters parameters, Launcher launcher ) - { - this.parameters = parameters; - this.launcher = launcher; - this.includeAndExcludeFilters = getIncludeAndExcludeFilters(); - Logger.getLogger( "org.junit" ).setLevel( Level.WARNING ); - } - - @Override - public Iterable<Class<?>> getSuites() - { - return scanClasspath(); - } - - @Override - public RunResult invoke( Object forkTestSet ) - throws TestSetFailedException, ReporterException, InvocationTargetException - { - if ( forkTestSet instanceof TestsToRun ) - { - return invokeAllTests( (TestsToRun) forkTestSet ); - } - else if ( forkTestSet instanceof Class ) - { - return invokeAllTests( TestsToRun.fromClass( (Class<?>) forkTestSet ) ); - } - else if ( forkTestSet == null ) - { - return invokeAllTests( scanClasspath() ); - } - else - { - throw new IllegalArgumentException( "Unexpected value of forkTestSet: " + forkTestSet ); - } - } - - private TestsToRun scanClasspath() - { - TestsToRun scannedClasses = parameters.getScanResult().applyFilter( - new TestPlanScannerFilter( launcher, includeAndExcludeFilters ), parameters.getTestClassLoader() ); - return parameters.getRunOrderCalculator().orderTestClasses( scannedClasses ); - } - - private RunResult invokeAllTests( TestsToRun testsToRun ) - { - RunResult runResult; - ReporterFactory reporterFactory = parameters.getReporterFactory(); - try - { - RunListener runListener = reporterFactory.createReporter(); - launcher.registerTestExecutionListeners( new RunListenerAdapter( runListener ) ); - - for ( Class<?> testClass : testsToRun ) - { - invokeSingleClass( testClass, runListener ); - } - } - finally - { - runResult = reporterFactory.close(); - } - return runResult; - } - - private void invokeSingleClass( Class<?> testClass, RunListener runListener ) - { - SimpleReportEntry classEntry = new SimpleReportEntry( getClass().getName(), testClass.getName() ); - runListener.testSetStarting( classEntry ); - - LauncherDiscoveryRequest discoveryRequest = request().selectors( selectClass( testClass ) ).filters( - includeAndExcludeFilters ).build(); - launcher.execute( discoveryRequest ); - - runListener.testSetCompleted( classEntry ); - } - - private Filter<?>[] getIncludeAndExcludeFilters() - { - List<Filter<?>> filters = new ArrayList<>(); - - Optional<List<String>> includes = getGroupsOrTags( getPropertiesList( INCLUDE_GROUPS ), - getPropertiesList( INCLUDE_TAGS ) ); - includes.map( TagFilter::includeTags ).ifPresent( filters::add ); - - Optional<List<String>> excludes = getGroupsOrTags( getPropertiesList( EXCLUDE_GROUPS ), - getPropertiesList( EXCLUDE_TAGS ) ); - excludes.map( TagFilter::excludeTags ).ifPresent( filters::add ); - - return filters.toArray( new Filter<?>[filters.size()] ); - } - - private Optional<List<String>> getPropertiesList( String key ) - { - List<String> compoundProperties = null; - String property = parameters.getProviderProperties().get( key ); - if ( property != null ) - { - compoundProperties = Arrays.asList( property.split( "[, ]+" ) ); - } - return Optional.ofNullable( compoundProperties ); - } - - private Optional<List<String>> getGroupsOrTags( Optional<List<String>> groups, Optional<List<String>> tags ) - { - Optional<List<String>> elements = Optional.empty(); - - if ( groups.isPresent() && tags.isPresent() ) - { - throw new IllegalStateException( EXCEPTION_MESSAGE_BOTH_NOT_ALLOWED ); - } - - if ( groups.isPresent() ) - { - elements = groups; - } - else if ( tags.isPresent() ) - { - elements = tags; - } - - return elements; - } - -} http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/c197b926/surefire-providers/surefire-junit5/src/main/java/org/junit/platform/surefire/provider/RunListenerAdapter.java ---------------------------------------------------------------------- diff --git a/surefire-providers/surefire-junit5/src/main/java/org/junit/platform/surefire/provider/RunListenerAdapter.java b/surefire-providers/surefire-junit5/src/main/java/org/junit/platform/surefire/provider/RunListenerAdapter.java deleted file mode 100644 index 6319a14..0000000 --- a/surefire-providers/surefire-junit5/src/main/java/org/junit/platform/surefire/provider/RunListenerAdapter.java +++ /dev/null @@ -1,148 +0,0 @@ -package org.junit.platform.surefire.provider; - -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import static org.apache.maven.surefire.report.SimpleReportEntry.ignored; -import static org.junit.platform.engine.TestExecutionResult.Status.ABORTED; -import static org.junit.platform.engine.TestExecutionResult.Status.FAILED; - -import java.util.Optional; - -import org.apache.maven.surefire.report.PojoStackTraceWriter; -import org.apache.maven.surefire.report.RunListener; -import org.apache.maven.surefire.report.SimpleReportEntry; -import org.apache.maven.surefire.report.StackTraceWriter; -import org.junit.platform.engine.TestExecutionResult; -import org.junit.platform.engine.TestSource; -import org.junit.platform.engine.support.descriptor.ClassSource; -import org.junit.platform.engine.support.descriptor.MethodSource; -import org.junit.platform.launcher.TestExecutionListener; -import org.junit.platform.launcher.TestIdentifier; -import org.junit.platform.launcher.TestPlan; - -/** - * @since 1.0 - */ -final class RunListenerAdapter - implements TestExecutionListener -{ - - private final RunListener runListener; - - private Optional<TestPlan> testPlan = Optional.empty(); - - public RunListenerAdapter( RunListener runListener ) - { - this.runListener = runListener; - } - - @Override - public void testPlanExecutionStarted( TestPlan testPlan ) - { - this.testPlan = Optional.of( testPlan ); - } - - @Override - public void testPlanExecutionFinished( TestPlan testPlan ) - { - this.testPlan = Optional.empty(); - } - - @Override - public void executionStarted( TestIdentifier testIdentifier ) - { - if ( testIdentifier.isTest() ) - { - runListener.testStarting( createReportEntry( testIdentifier, Optional.empty() ) ); - } - } - - @Override - public void executionSkipped( TestIdentifier testIdentifier, String reason ) - { - String source = getClassName( testIdentifier ).orElseGet( () -> parentDisplayName( testIdentifier ) ); - runListener.testSkipped( ignored( source, testIdentifier.getDisplayName(), reason ) ); - } - - @Override - public void executionFinished( TestIdentifier testIdentifier, TestExecutionResult testExecutionResult ) - { - if ( testExecutionResult.getStatus() == ABORTED ) - { - runListener.testAssumptionFailure( createReportEntry( testIdentifier, - testExecutionResult.getThrowable() ) ); - } - else if ( testExecutionResult.getStatus() == FAILED ) - { - runListener.testFailed( createReportEntry( testIdentifier, testExecutionResult.getThrowable() ) ); - } - else if ( testIdentifier.isTest() ) - { - runListener.testSucceeded( createReportEntry( testIdentifier, Optional.empty() ) ); - } - } - - private SimpleReportEntry createReportEntry( TestIdentifier testIdentifier, Optional<Throwable> throwable ) - { - Optional<String> className = getClassName( testIdentifier ); - if ( className.isPresent() ) - { - StackTraceWriter traceWriter = new PojoStackTraceWriter( className.get(), - getMethodName( testIdentifier ).orElse( "" ), throwable.orElse( null ) ); - return new SimpleReportEntry( className.get(), testIdentifier.getDisplayName(), traceWriter, (Integer) null ); - } - else - { - return new SimpleReportEntry( parentDisplayName( testIdentifier ), testIdentifier.getDisplayName(), (Integer) null ); - } - } - - private Optional<String> getClassName( TestIdentifier testIdentifier ) - { - TestSource testSource = testIdentifier.getSource().orElse( null ); - if ( testSource instanceof ClassSource ) - { - return Optional.of( ( (ClassSource) testSource ).getJavaClass().getName() ); - } - if ( testSource instanceof MethodSource ) - { - return Optional.of( ( (MethodSource) testSource ).getClassName() ); - } - return Optional.empty(); - } - - private Optional<String> getMethodName( TestIdentifier testIdentifier ) - { - TestSource testSource = testIdentifier.getSource().orElse( null ); - if ( testSource instanceof MethodSource ) - { - return Optional.of( ( (MethodSource) testSource ).getMethodName() ); - } - return Optional.empty(); - } - - private String parentDisplayName( TestIdentifier testIdentifier ) - { - return testPlan - .flatMap( plan -> plan.getParent( testIdentifier ) ) - .map( TestIdentifier::getDisplayName ) - .orElseGet( testIdentifier::getUniqueId ); - } -} http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/c197b926/surefire-providers/surefire-junit5/src/main/java/org/junit/platform/surefire/provider/TestPlanScannerFilter.java ---------------------------------------------------------------------- diff --git a/surefire-providers/surefire-junit5/src/main/java/org/junit/platform/surefire/provider/TestPlanScannerFilter.java b/surefire-providers/surefire-junit5/src/main/java/org/junit/platform/surefire/provider/TestPlanScannerFilter.java deleted file mode 100644 index 12edea0..0000000 --- a/surefire-providers/surefire-junit5/src/main/java/org/junit/platform/surefire/provider/TestPlanScannerFilter.java +++ /dev/null @@ -1,64 +0,0 @@ -package org.junit.platform.surefire.provider; - -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import static org.junit.platform.engine.discovery.DiscoverySelectors.selectClass; -import static org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder.request; - -import java.util.function.Predicate; - -import org.apache.maven.surefire.util.ScannerFilter; -import org.junit.platform.engine.Filter; -import org.junit.platform.launcher.Launcher; -import org.junit.platform.launcher.LauncherDiscoveryRequest; -import org.junit.platform.launcher.TestIdentifier; -import org.junit.platform.launcher.TestPlan; - -/** - * @since 1.0 - */ -final class TestPlanScannerFilter - implements ScannerFilter -{ - - private static final Predicate<TestIdentifier> HAS_TESTS = testIdentifier -> testIdentifier.isTest() - || testIdentifier.isContainer(); - - private final Launcher launcher; - - private final Filter<?>[] includeAndExcludeFilters; - - public TestPlanScannerFilter( Launcher launcher, Filter<?>[] includeAndExcludeFilters ) - { - this.launcher = launcher; - this.includeAndExcludeFilters = includeAndExcludeFilters; - } - - @Override - @SuppressWarnings( "rawtypes" ) - public boolean accept( Class testClass ) - { - LauncherDiscoveryRequest discoveryRequest = request().selectors( selectClass( testClass ) ).filters( - includeAndExcludeFilters ).build(); - TestPlan testPlan = launcher.discover( discoveryRequest ); - return testPlan.countTestIdentifiers( HAS_TESTS ) > 0; - } - -} http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/c197b926/surefire-providers/surefire-junit5/src/main/resources/META-INF/services/org.apache.maven.surefire.providerapi.SurefireProvider ---------------------------------------------------------------------- diff --git a/surefire-providers/surefire-junit5/src/main/resources/META-INF/services/org.apache.maven.surefire.providerapi.SurefireProvider b/surefire-providers/surefire-junit5/src/main/resources/META-INF/services/org.apache.maven.surefire.providerapi.SurefireProvider index bb76525..44861d6 100644 --- a/surefire-providers/surefire-junit5/src/main/resources/META-INF/services/org.apache.maven.surefire.providerapi.SurefireProvider +++ b/surefire-providers/surefire-junit5/src/main/resources/META-INF/services/org.apache.maven.surefire.providerapi.SurefireProvider @@ -1 +1 @@ -org.junit.platform.surefire.provider.JUnitPlatformProvider +org.apache.maven.surefire.junit5.JUnitPlatformProvider http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/c197b926/surefire-providers/surefire-junit5/src/test/java/org/apache/maven/surefire/junit5/JUnitPlatformProviderTests.java ---------------------------------------------------------------------- diff --git a/surefire-providers/surefire-junit5/src/test/java/org/apache/maven/surefire/junit5/JUnitPlatformProviderTests.java b/surefire-providers/surefire-junit5/src/test/java/org/apache/maven/surefire/junit5/JUnitPlatformProviderTests.java new file mode 100644 index 0000000..cce0755 --- /dev/null +++ b/surefire-providers/surefire-junit5/src/test/java/org/apache/maven/surefire/junit5/JUnitPlatformProviderTests.java @@ -0,0 +1,325 @@ +package org.apache.maven.surefire.junit5; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assumptions.assumeTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; + +import org.apache.maven.surefire.providerapi.ProviderParameters; +import org.apache.maven.surefire.report.ReporterFactory; +import org.apache.maven.surefire.report.RunListener; +import org.apache.maven.surefire.util.RunOrderCalculator; +import org.apache.maven.surefire.util.ScanResult; +import org.apache.maven.surefire.util.TestsToRun; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.junit.platform.commons.util.PreconditionViolationException; +import org.junit.platform.launcher.Launcher; +import org.junit.platform.launcher.TestPlan; +import org.junit.platform.launcher.core.LauncherFactory; +import org.junit.platform.launcher.listeners.SummaryGeneratingListener; +import org.junit.platform.launcher.listeners.TestExecutionSummary; + +/** + * Unit tests for {@link JUnitPlatformProvider}. + * + * @since 1.0 + */ +class JUnitPlatformProviderTests +{ + + @Test + void getSuitesReturnsScannedClasses() + throws Exception + { + ProviderParameters providerParameters = providerParametersMock( TestClass1.class, TestClass2.class ); + JUnitPlatformProvider provider = new JUnitPlatformProvider( providerParameters ); + + assertThat( provider.getSuites() ).containsOnly( TestClass1.class, TestClass2.class ); + } + + @Test + void invokeThrowsForWrongForkTestSet() + throws Exception + { + ProviderParameters providerParameters = providerParametersMock( Integer.class ); + JUnitPlatformProvider provider = new JUnitPlatformProvider( providerParameters ); + + assertThrows( IllegalArgumentException.class, () -> provider.invoke( "wrong forkTestSet" ) ); + } + + @Test + void allGivenTestsToRunAreInvoked() + throws Exception + { + Launcher launcher = LauncherFactory.create(); + JUnitPlatformProvider provider = new JUnitPlatformProvider( providerParametersMock(), launcher ); + + TestPlanSummaryListener executionListener = new TestPlanSummaryListener(); + launcher.registerTestExecutionListeners( executionListener ); + + TestsToRun testsToRun = newTestsToRun( TestClass1.class, TestClass2.class ); + provider.invoke( testsToRun ); + + assertThat( executionListener.summaries ).hasSize( 2 ); + TestClass1.verifyExecutionSummary( executionListener.summaries.get( 0 ) ); + TestClass2.verifyExecutionSummary( executionListener.summaries.get( 1 ) ); + } + + @Test + void singleTestClassIsInvoked() + throws Exception + { + Launcher launcher = LauncherFactory.create(); + JUnitPlatformProvider provider = new JUnitPlatformProvider( providerParametersMock(), launcher ); + + TestPlanSummaryListener executionListener = new TestPlanSummaryListener(); + launcher.registerTestExecutionListeners( executionListener ); + + provider.invoke( TestClass1.class ); + + assertThat( executionListener.summaries ).hasSize( 1 ); + TestClass1.verifyExecutionSummary( executionListener.summaries.get( 0 ) ); + } + + @Test + void allDiscoveredTestsAreInvokedForNullArgument() + throws Exception + { + ProviderParameters providerParameters = providerParametersMock( TestClass1.class, TestClass2.class ); + Launcher launcher = LauncherFactory.create(); + JUnitPlatformProvider provider = new JUnitPlatformProvider( providerParameters, launcher ); + + TestPlanSummaryListener executionListener = new TestPlanSummaryListener(); + launcher.registerTestExecutionListeners( executionListener ); + + provider.invoke( null ); + + assertThat( executionListener.summaries ).hasSize( 2 ); + TestClass1.verifyExecutionSummary( executionListener.summaries.get( 0 ) ); + TestClass2.verifyExecutionSummary( executionListener.summaries.get( 1 ) ); + } + + @Test + void bothGroupsAndIncludeTagsThrowsException() + { + Map<String, String> properties = new HashMap<>(); + properties.put( JUnitPlatformProvider.INCLUDE_GROUPS, "groupOne, groupTwo" ); + properties.put( JUnitPlatformProvider.INCLUDE_TAGS, "tagOne, tagTwo" ); + verifyPreconditionViolationException( properties ); + } + + @Test + void bothExcludedGroupsAndExcludeTagsThrowsException() { + Map<String, String> properties = new HashMap<>(); + properties.put(JUnitPlatformProvider.EXCLUDE_GROUPS, "groupOne, groupTwo"); + properties.put(JUnitPlatformProvider.EXCLUDE_TAGS, "tagOne, tagTwo"); + verifyPreconditionViolationException(properties); + } + + @Test + void onlyGroupsIsDeclared() + throws Exception + { + Map<String, String> properties = new HashMap<>(); + properties.put( JUnitPlatformProvider.INCLUDE_GROUPS, "groupOne, groupTwo" ); + + ProviderParameters providerParameters = providerParametersMock( TestClass1.class ); + when( providerParameters.getProviderProperties() ).thenReturn( properties ); + + JUnitPlatformProvider provider = new JUnitPlatformProvider( providerParameters ); + + assertEquals( 1, provider.includeAndExcludeFilters.length ); + } + + @Test + void onlyExcludeTagsIsDeclared() + throws Exception + { + Map<String, String> properties = new HashMap<>(); + properties.put( JUnitPlatformProvider.EXCLUDE_TAGS, "tagOne, tagTwo" ); + + ProviderParameters providerParameters = providerParametersMock( TestClass1.class ); + when( providerParameters.getProviderProperties() ).thenReturn( properties ); + + JUnitPlatformProvider provider = new JUnitPlatformProvider( providerParameters ); + + assertEquals( 1, provider.includeAndExcludeFilters.length ); + } + + @Test + void bothIncludeAndExcludeAreAllowed() + throws Exception + { + Map<String, String> properties = new HashMap<>(); + properties.put( JUnitPlatformProvider.INCLUDE_TAGS, "tagOne, tagTwo" ); + properties.put( JUnitPlatformProvider.EXCLUDE_TAGS, "tagThree, tagFour" ); + + ProviderParameters providerParameters = providerParametersMock( TestClass1.class ); + when( providerParameters.getProviderProperties() ).thenReturn( properties ); + + JUnitPlatformProvider provider = new JUnitPlatformProvider( providerParameters ); + + assertEquals( 2, provider.includeAndExcludeFilters.length ); + } + + @Test + void noFiltersAreCreatedIfNoPropertiesAreDeclared() + throws Exception + { + ProviderParameters providerParameters = providerParametersMock( TestClass1.class ); + + JUnitPlatformProvider provider = new JUnitPlatformProvider( providerParameters ); + + assertEquals( 0, provider.includeAndExcludeFilters.length ); + } + + private void verifyPreconditionViolationException( Map<String, String> properties ) + { + ProviderParameters providerParameters = providerParametersMock( TestClass1.class ); + when( providerParameters.getProviderProperties() ).thenReturn( properties ); + + Throwable throwable = assertThrows( PreconditionViolationException.class, () -> + new JUnitPlatformProvider(providerParameters) ); + + assertEquals( JUnitPlatformProvider.EXCEPTION_MESSAGE_BOTH_NOT_ALLOWED, throwable.getMessage() ); + } + + private static ProviderParameters providerParametersMock( Class<?>... testClasses ) + { + TestsToRun testsToRun = newTestsToRun( testClasses ); + + ScanResult scanResult = mock( ScanResult.class ); + when( scanResult.applyFilter( any(), any() ) ).thenReturn( testsToRun ); + + RunOrderCalculator runOrderCalculator = mock( RunOrderCalculator.class ); + when( runOrderCalculator.orderTestClasses( any() ) ).thenReturn( testsToRun ); + + ReporterFactory reporterFactory = mock( ReporterFactory.class ); + RunListener runListener = mock( RunListener.class ); + when( reporterFactory.createReporter() ).thenReturn( runListener ); + + ProviderParameters providerParameters = mock( ProviderParameters.class ); + when( providerParameters.getScanResult() ).thenReturn( scanResult ); + when( providerParameters.getRunOrderCalculator() ).thenReturn( runOrderCalculator ); + when( providerParameters.getReporterFactory() ).thenReturn( reporterFactory ); + + return providerParameters; + } + + private static TestsToRun newTestsToRun( Class<?>... testClasses ) + { + List<Class<?>> classesList = Arrays.asList( testClasses ); + return new TestsToRun( new LinkedHashSet<>( classesList ) ); + } + + private class TestPlanSummaryListener + extends SummaryGeneratingListener + { + + final List<TestExecutionSummary> summaries = new ArrayList<>(); + + @Override + public void testPlanExecutionFinished( TestPlan testPlan ) + { + super.testPlanExecutionFinished( testPlan ); + summaries.add( getSummary() ); + } + } + + private static class TestClass1 + { + + @Test + void test1() + { + } + + @Test + void test2() + { + } + + @Disabled + @Test + void test3() + { + } + + @Test + void test4() + { + throw new RuntimeException(); + } + + static void verifyExecutionSummary( TestExecutionSummary summary ) + { + assertEquals( 4, summary.getTestsFoundCount() ); + assertEquals( 3, summary.getTestsStartedCount() ); + assertEquals( 2, summary.getTestsSucceededCount() ); + assertEquals( 1, summary.getTestsSkippedCount() ); + assertEquals( 0, summary.getTestsAbortedCount() ); + assertEquals( 1, summary.getTestsFailedCount() ); + } + } + + private static class TestClass2 + { + + @Test + void test1() + { + } + + @Test + void test2() + { + throw new RuntimeException(); + } + + @Test + void test3() + { + assumeTrue( false ); + } + + static void verifyExecutionSummary( TestExecutionSummary summary ) + { + assertEquals( 3, summary.getTestsFoundCount() ); + assertEquals( 3, summary.getTestsStartedCount() ); + assertEquals( 1, summary.getTestsSucceededCount() ); + assertEquals( 0, summary.getTestsSkippedCount() ); + assertEquals( 1, summary.getTestsAbortedCount() ); + assertEquals( 1, summary.getTestsFailedCount() ); + } + } +} http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/c197b926/surefire-providers/surefire-junit5/src/test/java/org/apache/maven/surefire/junit5/RunListenerAdapterTests.java ---------------------------------------------------------------------- diff --git a/surefire-providers/surefire-junit5/src/test/java/org/apache/maven/surefire/junit5/RunListenerAdapterTests.java b/surefire-providers/surefire-junit5/src/test/java/org/apache/maven/surefire/junit5/RunListenerAdapterTests.java new file mode 100644 index 0000000..5518b29 --- /dev/null +++ b/surefire-providers/surefire-junit5/src/test/java/org/apache/maven/surefire/junit5/RunListenerAdapterTests.java @@ -0,0 +1,262 @@ +package org.apache.maven.surefire.junit5; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import static java.util.Collections.singletonList; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.util.Optional; + +import org.apache.maven.surefire.report.ReportEntry; +import org.apache.maven.surefire.report.RunListener; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.engine.descriptor.ClassTestDescriptor; +import org.junit.jupiter.engine.descriptor.MethodTestDescriptor; +import org.junit.platform.engine.TestDescriptor; +import org.junit.platform.engine.TestExecutionResult; +import org.junit.platform.engine.UniqueId; +import org.junit.platform.engine.support.descriptor.EngineDescriptor; +import org.junit.platform.launcher.TestIdentifier; +import org.junit.platform.launcher.TestPlan; +import org.mockito.ArgumentCaptor; + +/** + * Unit tests for {@link RunListenerAdapter}. + * + * @since 1.0 + */ +class RunListenerAdapterTests +{ + + private RunListener listener; + + private RunListenerAdapter adapter; + + @BeforeEach + public void setUp() + { + listener = mock( RunListener.class ); + adapter = new RunListenerAdapter( listener ); + } + + @Test + void notifiedWithCorrectNamesWhenMethodExecutionStarted() + throws Exception + { + ArgumentCaptor<ReportEntry> entryCaptor = ArgumentCaptor.forClass( ReportEntry.class ); + + adapter.executionStarted( newMethodIdentifier() ); + verify( listener ).testStarting( entryCaptor.capture() ); + + ReportEntry entry = entryCaptor.getValue(); + assertEquals( MY_TEST_METHOD_NAME + "()", entry.getName() ); + assertEquals( MyTestClass.class.getName(), entry.getSourceName() ); + assertNotNull( entry.getStackTraceWriter() ); + } + + @Test + void notNotifiedWhenClassExecutionStarted() + throws Exception + { + adapter.executionStarted( newClassIdentifier() ); + verify( listener, never() ).testStarting( any() ); + } + + @Test + void notNotifiedWhenEngineExecutionStarted() + throws Exception + { + adapter.executionStarted( newEngineIdentifier() ); + verify( listener, never() ).testStarting( any() ); + } + + @Test + void notifiedWhenMethodExecutionSkipped() + throws Exception + { + adapter.executionSkipped( newMethodIdentifier(), "test" ); + verify( listener ).testSkipped( any() ); + } + + @Test + void notifiedWithCorrectNamesWhenClassExecutionSkipped() + throws Exception + { + ArgumentCaptor<ReportEntry> entryCaptor = ArgumentCaptor.forClass( ReportEntry.class ); + + adapter.executionSkipped( newClassIdentifier(), "test" ); + verify( listener ).testSkipped( entryCaptor.capture() ); + + ReportEntry entry = entryCaptor.getValue(); + assertTrue( MyTestClass.class.getTypeName().contains( entry.getName() ) ); + assertEquals( MyTestClass.class.getName(), entry.getSourceName() ); + } + + @Test + void notifiedWhenEngineExecutionSkipped() + throws Exception + { + adapter.executionSkipped( newEngineIdentifier(), "test" ); + verify( listener ).testSkipped( any() ); + } + + @Test + void notifiedWhenMethodExecutionAborted() + throws Exception + { + adapter.executionFinished( newMethodIdentifier(), TestExecutionResult.aborted( null ) ); + verify( listener ).testAssumptionFailure( any() ); + } + + @Test + void notifiedWhenClassExecutionAborted() + throws Exception + { + adapter.executionFinished( newClassIdentifier(), TestExecutionResult.aborted( null ) ); + verify( listener ).testAssumptionFailure( any() ); + } + + @Test + void notifiedWhenMethodExecutionFailed() + throws Exception + { + adapter.executionFinished( newMethodIdentifier(), TestExecutionResult.failed( new RuntimeException() ) ); + verify( listener ).testFailed( any() ); + } + + @Test + void notifiedWithCorrectNamesWhenClassExecutionFailed() + throws Exception + { + ArgumentCaptor<ReportEntry> entryCaptor = ArgumentCaptor.forClass( ReportEntry.class ); + + adapter.executionFinished( newClassIdentifier(), TestExecutionResult.failed( new RuntimeException() ) ); + verify( listener ).testFailed( entryCaptor.capture() ); + + ReportEntry entry = entryCaptor.getValue(); + assertEquals( MyTestClass.class.getName(), entry.getSourceName() ); + assertNotNull( entry.getStackTraceWriter() ); + } + + @Test + void notifiedWhenMethodExecutionSucceeded() + throws Exception + { + adapter.executionFinished( newMethodIdentifier(), TestExecutionResult.successful() ); + verify( listener ).testSucceeded( any() ); + } + + @Test + void notNotifiedWhenClassExecutionSucceeded() + throws Exception + { + adapter.executionFinished( newClassIdentifier(), TestExecutionResult.successful() ); + verify( listener, never() ).testSucceeded( any() ); + } + + @Test + void notifiedWithParentDisplayNameWhenTestClassUnknown() + throws Exception + { + // Set up a test plan + TestPlan plan = TestPlan.from( singletonList( new EngineDescriptor( newId(), "Luke's Plan" ) ) ); + adapter.testPlanExecutionStarted( plan ); + + // Use the test plan to set up child with parent. + final String parentDisplay = "I am your father"; + TestIdentifier child = newSourcelessIdentifierWithParent( plan, parentDisplay ); + adapter.executionStarted( child ); + + // Check that the adapter has informed Surefire that the test has been invoked, + // with the parent name as source (since the test case itself had no source). + ArgumentCaptor<ReportEntry> entryCaptor = ArgumentCaptor.forClass( ReportEntry.class ); + verify( listener ).testStarting( entryCaptor.capture() ); + assertEquals( parentDisplay, entryCaptor.getValue().getSourceName() ); + } + + private static TestIdentifier newMethodIdentifier() + throws Exception + { + TestDescriptor testDescriptor = new MethodTestDescriptor( newId(), MyTestClass.class, + MyTestClass.class.getDeclaredMethod( MY_TEST_METHOD_NAME ) ); + return TestIdentifier.from( testDescriptor ); + } + + private static TestIdentifier newClassIdentifier() + { + TestDescriptor testDescriptor = new ClassTestDescriptor( newId(), MyTestClass.class ); + return TestIdentifier.from( testDescriptor ); + } + + private static TestIdentifier newSourcelessIdentifierWithParent( TestPlan testPlan, String parentDisplay ) + { + // A parent test identifier with a name. + TestDescriptor parent = mock( TestDescriptor.class ); + when( parent.getUniqueId() ).thenReturn( newId() ); + when( parent.getDisplayName() ).thenReturn( parentDisplay ); + TestIdentifier parentId = TestIdentifier.from( parent ); + + // The (child) test case that is to be executed as part of a test plan. + TestDescriptor child = mock( TestDescriptor.class ); + when( child.getUniqueId() ).thenReturn( newId() ); + when( child.isTest() ).thenReturn( true ); + + // Ensure the child source is null yet that there is a parent -- the special case to be tested. + when( child.getSource() ).thenReturn( Optional.empty() ); + when( child.getParent() ).thenReturn( Optional.of(parent) ); + TestIdentifier childId = TestIdentifier.from( child ); + + testPlan.add( childId ); + testPlan.add( parentId ); + + return childId; + } + + private static TestIdentifier newEngineIdentifier() + { + TestDescriptor testDescriptor = new EngineDescriptor( newId(), "engine" ); + return TestIdentifier.from( testDescriptor ); + } + + private static UniqueId newId() + { + return UniqueId.forEngine( "engine" ); + } + + private static final String MY_TEST_METHOD_NAME = "myTestMethod"; + + private static class MyTestClass { + + @Test + void myTestMethod() + { + } + + } + +} http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/c197b926/surefire-providers/surefire-junit5/src/test/java/org/apache/maven/surefire/junit5/TestPlanScannerFilterTests.java ---------------------------------------------------------------------- diff --git a/surefire-providers/surefire-junit5/src/test/java/org/apache/maven/surefire/junit5/TestPlanScannerFilterTests.java b/surefire-providers/surefire-junit5/src/test/java/org/apache/maven/surefire/junit5/TestPlanScannerFilterTests.java new file mode 100644 index 0000000..aa52b78 --- /dev/null +++ b/surefire-providers/surefire-junit5/src/test/java/org/apache/maven/surefire/junit5/TestPlanScannerFilterTests.java @@ -0,0 +1,190 @@ +package org.apache.maven.surefire.junit5; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import static java.util.Collections.emptyList; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.List; +import java.util.stream.Stream; + +import org.junit.jupiter.api.DynamicTest; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestFactory; +import org.junit.platform.engine.Filter; +import org.junit.platform.launcher.core.LauncherFactory; + +/** + * Unit tests for {@link TestPlanScannerFilter}. + * + * @since 1.0 + */ +public class TestPlanScannerFilterTests +{ + + @Test + void emptyClassAccepted() + { + assertTrue( newFilter().accept( EmptyClass.class ), "accepts empty class because it is a container" ); + } + + @Test + void classWithNoTestMethodsIsAccepted() + { + assertTrue( newFilter().accept( ClassWithMethods.class ), + "accepts class with no @Test methods because it is a container" ); + } + + @Test + void classWithTestMethodsIsAccepted() + { + assertTrue( newFilter().accept( ClassWithTestMethods.class ) ); + } + + @Test + void classWithNestedTestClassIsAccepted() + { + assertTrue( newFilter().accept( ClassWithNestedTestClass.class ) ); + } + + @Test + void classWithDeeplyNestedTestClassIsAccepted() + { + assertTrue( newFilter().accept( ClassWithDeeplyNestedTestClass.class ) ); + } + + @Test + void classWithTestFactoryIsAccepted() + { + assertTrue( newFilter().accept( ClassWithTestFactory.class ) ); + } + + @Test + void classWithNestedTestFactoryIsAccepted() + { + assertTrue( newFilter().accept( ClassWithNestedTestFactory.class ) ); + } + + private TestPlanScannerFilter newFilter() + { + return new TestPlanScannerFilter( LauncherFactory.create(), new Filter<?>[0] ); + } + + private static class EmptyClass + { + } + + @SuppressWarnings("unused") + private static class ClassWithMethods + { + + void method1() + { + } + + void method2() + { + } + } + + private static class ClassWithTestMethods + { + + @Test + void test1() + { + } + + @Test + public void test2() + { + } + } + + private static class ClassWithNestedTestClass + { + + @SuppressWarnings("unused") + void method() + { + } + + @Nested + class TestClass + { + + @Test + void test1() + { + } + } + } + + private static class ClassWithDeeplyNestedTestClass + { + + @Nested + class Level1 + { + + @Nested + class Level2 + { + + @Nested + class TestClass + { + + @Test + void test1() + { + } + } + } + } + } + + private static class ClassWithTestFactory + { + + @TestFactory + Stream<DynamicTest> tests() + { + return Stream.empty(); + } + } + + private static class ClassWithNestedTestFactory + { + + @Nested + class TestClass + { + + @TestFactory + List<DynamicTest> tests() + { + return emptyList(); + } + } + } + +} http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/c197b926/surefire-providers/surefire-junit5/src/test/java/org/junit/platform/surefire/provider/JUnitPlatformProviderTests.java ---------------------------------------------------------------------- diff --git a/surefire-providers/surefire-junit5/src/test/java/org/junit/platform/surefire/provider/JUnitPlatformProviderTests.java b/surefire-providers/surefire-junit5/src/test/java/org/junit/platform/surefire/provider/JUnitPlatformProviderTests.java deleted file mode 100644 index 9cc054d..0000000 --- a/surefire-providers/surefire-junit5/src/test/java/org/junit/platform/surefire/provider/JUnitPlatformProviderTests.java +++ /dev/null @@ -1,325 +0,0 @@ -package org.junit.platform.surefire.provider; - -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assumptions.assumeTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; - -import org.apache.maven.surefire.providerapi.ProviderParameters; -import org.apache.maven.surefire.report.ReporterFactory; -import org.apache.maven.surefire.report.RunListener; -import org.apache.maven.surefire.util.RunOrderCalculator; -import org.apache.maven.surefire.util.ScanResult; -import org.apache.maven.surefire.util.TestsToRun; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; -import org.junit.platform.commons.util.PreconditionViolationException; -import org.junit.platform.launcher.Launcher; -import org.junit.platform.launcher.TestPlan; -import org.junit.platform.launcher.core.LauncherFactory; -import org.junit.platform.launcher.listeners.SummaryGeneratingListener; -import org.junit.platform.launcher.listeners.TestExecutionSummary; - -/** - * Unit tests for {@link JUnitPlatformProvider}. - * - * @since 1.0 - */ -class JUnitPlatformProviderTests -{ - - @Test - void getSuitesReturnsScannedClasses() - throws Exception - { - ProviderParameters providerParameters = providerParametersMock( TestClass1.class, TestClass2.class ); - JUnitPlatformProvider provider = new JUnitPlatformProvider( providerParameters ); - - assertThat( provider.getSuites() ).containsOnly( TestClass1.class, TestClass2.class ); - } - - @Test - void invokeThrowsForWrongForkTestSet() - throws Exception - { - ProviderParameters providerParameters = providerParametersMock( Integer.class ); - JUnitPlatformProvider provider = new JUnitPlatformProvider( providerParameters ); - - assertThrows( IllegalArgumentException.class, () -> provider.invoke( "wrong forkTestSet" ) ); - } - - @Test - void allGivenTestsToRunAreInvoked() - throws Exception - { - Launcher launcher = LauncherFactory.create(); - JUnitPlatformProvider provider = new JUnitPlatformProvider( providerParametersMock(), launcher ); - - TestPlanSummaryListener executionListener = new TestPlanSummaryListener(); - launcher.registerTestExecutionListeners( executionListener ); - - TestsToRun testsToRun = newTestsToRun( TestClass1.class, TestClass2.class ); - provider.invoke( testsToRun ); - - assertThat( executionListener.summaries ).hasSize( 2 ); - TestClass1.verifyExecutionSummary( executionListener.summaries.get( 0 ) ); - TestClass2.verifyExecutionSummary( executionListener.summaries.get( 1 ) ); - } - - @Test - void singleTestClassIsInvoked() - throws Exception - { - Launcher launcher = LauncherFactory.create(); - JUnitPlatformProvider provider = new JUnitPlatformProvider( providerParametersMock(), launcher ); - - TestPlanSummaryListener executionListener = new TestPlanSummaryListener(); - launcher.registerTestExecutionListeners( executionListener ); - - provider.invoke( TestClass1.class ); - - assertThat( executionListener.summaries ).hasSize( 1 ); - TestClass1.verifyExecutionSummary( executionListener.summaries.get( 0 ) ); - } - - @Test - void allDiscoveredTestsAreInvokedForNullArgument() - throws Exception - { - ProviderParameters providerParameters = providerParametersMock( TestClass1.class, TestClass2.class ); - Launcher launcher = LauncherFactory.create(); - JUnitPlatformProvider provider = new JUnitPlatformProvider( providerParameters, launcher ); - - TestPlanSummaryListener executionListener = new TestPlanSummaryListener(); - launcher.registerTestExecutionListeners( executionListener ); - - provider.invoke( null ); - - assertThat( executionListener.summaries ).hasSize( 2 ); - TestClass1.verifyExecutionSummary( executionListener.summaries.get( 0 ) ); - TestClass2.verifyExecutionSummary( executionListener.summaries.get( 1 ) ); - } - - @Test - void bothGroupsAndIncludeTagsThrowsException() - { - Map<String, String> properties = new HashMap<>(); - properties.put( JUnitPlatformProvider.INCLUDE_GROUPS, "groupOne, groupTwo" ); - properties.put( JUnitPlatformProvider.INCLUDE_TAGS, "tagOne, tagTwo" ); - verifyPreconditionViolationException( properties ); - } - - @Test - void bothExcludedGroupsAndExcludeTagsThrowsException() { - Map<String, String> properties = new HashMap<>(); - properties.put(JUnitPlatformProvider.EXCLUDE_GROUPS, "groupOne, groupTwo"); - properties.put(JUnitPlatformProvider.EXCLUDE_TAGS, "tagOne, tagTwo"); - verifyPreconditionViolationException(properties); - } - - @Test - void onlyGroupsIsDeclared() - throws Exception - { - Map<String, String> properties = new HashMap<>(); - properties.put( JUnitPlatformProvider.INCLUDE_GROUPS, "groupOne, groupTwo" ); - - ProviderParameters providerParameters = providerParametersMock( TestClass1.class ); - when( providerParameters.getProviderProperties() ).thenReturn( properties ); - - JUnitPlatformProvider provider = new JUnitPlatformProvider( providerParameters ); - - assertEquals( 1, provider.includeAndExcludeFilters.length ); - } - - @Test - void onlyExcludeTagsIsDeclared() - throws Exception - { - Map<String, String> properties = new HashMap<>(); - properties.put( JUnitPlatformProvider.EXCLUDE_TAGS, "tagOne, tagTwo" ); - - ProviderParameters providerParameters = providerParametersMock( TestClass1.class ); - when( providerParameters.getProviderProperties() ).thenReturn( properties ); - - JUnitPlatformProvider provider = new JUnitPlatformProvider( providerParameters ); - - assertEquals( 1, provider.includeAndExcludeFilters.length ); - } - - @Test - void bothIncludeAndExcludeAreAllowed() - throws Exception - { - Map<String, String> properties = new HashMap<>(); - properties.put( JUnitPlatformProvider.INCLUDE_TAGS, "tagOne, tagTwo" ); - properties.put( JUnitPlatformProvider.EXCLUDE_TAGS, "tagThree, tagFour" ); - - ProviderParameters providerParameters = providerParametersMock( TestClass1.class ); - when( providerParameters.getProviderProperties() ).thenReturn( properties ); - - JUnitPlatformProvider provider = new JUnitPlatformProvider( providerParameters ); - - assertEquals( 2, provider.includeAndExcludeFilters.length ); - } - - @Test - void noFiltersAreCreatedIfNoPropertiesAreDeclared() - throws Exception - { - ProviderParameters providerParameters = providerParametersMock( TestClass1.class ); - - JUnitPlatformProvider provider = new JUnitPlatformProvider( providerParameters ); - - assertEquals( 0, provider.includeAndExcludeFilters.length ); - } - - private void verifyPreconditionViolationException( Map<String, String> properties ) - { - ProviderParameters providerParameters = providerParametersMock( TestClass1.class ); - when( providerParameters.getProviderProperties() ).thenReturn( properties ); - - Throwable throwable = assertThrows( PreconditionViolationException.class, () -> - new JUnitPlatformProvider(providerParameters) ); - - assertEquals( JUnitPlatformProvider.EXCEPTION_MESSAGE_BOTH_NOT_ALLOWED, throwable.getMessage() ); - } - - private static ProviderParameters providerParametersMock( Class<?>... testClasses ) - { - TestsToRun testsToRun = newTestsToRun( testClasses ); - - ScanResult scanResult = mock( ScanResult.class ); - when( scanResult.applyFilter( any(), any() ) ).thenReturn( testsToRun ); - - RunOrderCalculator runOrderCalculator = mock( RunOrderCalculator.class ); - when( runOrderCalculator.orderTestClasses( any() ) ).thenReturn( testsToRun ); - - ReporterFactory reporterFactory = mock( ReporterFactory.class ); - RunListener runListener = mock( RunListener.class ); - when( reporterFactory.createReporter() ).thenReturn( runListener ); - - ProviderParameters providerParameters = mock( ProviderParameters.class ); - when( providerParameters.getScanResult() ).thenReturn( scanResult ); - when( providerParameters.getRunOrderCalculator() ).thenReturn( runOrderCalculator ); - when( providerParameters.getReporterFactory() ).thenReturn( reporterFactory ); - - return providerParameters; - } - - private static TestsToRun newTestsToRun( Class<?>... testClasses ) - { - List<Class<?>> classesList = Arrays.asList( testClasses ); - return new TestsToRun( new LinkedHashSet<>( classesList ) ); - } - - private class TestPlanSummaryListener - extends SummaryGeneratingListener - { - - final List<TestExecutionSummary> summaries = new ArrayList<>(); - - @Override - public void testPlanExecutionFinished( TestPlan testPlan ) - { - super.testPlanExecutionFinished( testPlan ); - summaries.add( getSummary() ); - } - } - - private static class TestClass1 - { - - @Test - void test1() - { - } - - @Test - void test2() - { - } - - @Disabled - @Test - void test3() - { - } - - @Test - void test4() - { - throw new RuntimeException(); - } - - static void verifyExecutionSummary( TestExecutionSummary summary ) - { - assertEquals( 4, summary.getTestsFoundCount() ); - assertEquals( 3, summary.getTestsStartedCount() ); - assertEquals( 2, summary.getTestsSucceededCount() ); - assertEquals( 1, summary.getTestsSkippedCount() ); - assertEquals( 0, summary.getTestsAbortedCount() ); - assertEquals( 1, summary.getTestsFailedCount() ); - } - } - - private static class TestClass2 - { - - @Test - void test1() - { - } - - @Test - void test2() - { - throw new RuntimeException(); - } - - @Test - void test3() - { - assumeTrue( false ); - } - - static void verifyExecutionSummary( TestExecutionSummary summary ) - { - assertEquals( 3, summary.getTestsFoundCount() ); - assertEquals( 3, summary.getTestsStartedCount() ); - assertEquals( 1, summary.getTestsSucceededCount() ); - assertEquals( 0, summary.getTestsSkippedCount() ); - assertEquals( 1, summary.getTestsAbortedCount() ); - assertEquals( 1, summary.getTestsFailedCount() ); - } - } -} http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/c197b926/surefire-providers/surefire-junit5/src/test/java/org/junit/platform/surefire/provider/RunListenerAdapterTests.java ---------------------------------------------------------------------- diff --git a/surefire-providers/surefire-junit5/src/test/java/org/junit/platform/surefire/provider/RunListenerAdapterTests.java b/surefire-providers/surefire-junit5/src/test/java/org/junit/platform/surefire/provider/RunListenerAdapterTests.java deleted file mode 100644 index e841b53..0000000 --- a/surefire-providers/surefire-junit5/src/test/java/org/junit/platform/surefire/provider/RunListenerAdapterTests.java +++ /dev/null @@ -1,263 +0,0 @@ -package org.junit.platform.surefire.provider; - -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import static java.util.Collections.singletonList; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import java.util.Collections; -import java.util.Optional; - -import org.apache.maven.surefire.report.ReportEntry; -import org.apache.maven.surefire.report.RunListener; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.engine.descriptor.ClassTestDescriptor; -import org.junit.jupiter.engine.descriptor.MethodTestDescriptor; -import org.junit.platform.engine.TestDescriptor; -import org.junit.platform.engine.TestExecutionResult; -import org.junit.platform.engine.UniqueId; -import org.junit.platform.engine.support.descriptor.EngineDescriptor; -import org.junit.platform.launcher.TestIdentifier; -import org.junit.platform.launcher.TestPlan; -import org.mockito.ArgumentCaptor; - -/** - * Unit tests for {@link RunListenerAdapter}. - * - * @since 1.0 - */ -class RunListenerAdapterTests -{ - - private RunListener listener; - - private RunListenerAdapter adapter; - - @BeforeEach - public void setUp() - { - listener = mock( RunListener.class ); - adapter = new RunListenerAdapter( listener ); - } - - @Test - void notifiedWithCorrectNamesWhenMethodExecutionStarted() - throws Exception - { - ArgumentCaptor<ReportEntry> entryCaptor = ArgumentCaptor.forClass( ReportEntry.class ); - - adapter.executionStarted( newMethodIdentifier() ); - verify( listener ).testStarting( entryCaptor.capture() ); - - ReportEntry entry = entryCaptor.getValue(); - assertEquals( MY_TEST_METHOD_NAME + "()", entry.getName() ); - assertEquals( MyTestClass.class.getName(), entry.getSourceName() ); - assertNotNull( entry.getStackTraceWriter() ); - } - - @Test - void notNotifiedWhenClassExecutionStarted() - throws Exception - { - adapter.executionStarted( newClassIdentifier() ); - verify( listener, never() ).testStarting( any() ); - } - - @Test - void notNotifiedWhenEngineExecutionStarted() - throws Exception - { - adapter.executionStarted( newEngineIdentifier() ); - verify( listener, never() ).testStarting( any() ); - } - - @Test - void notifiedWhenMethodExecutionSkipped() - throws Exception - { - adapter.executionSkipped( newMethodIdentifier(), "test" ); - verify( listener ).testSkipped( any() ); - } - - @Test - void notifiedWithCorrectNamesWhenClassExecutionSkipped() - throws Exception - { - ArgumentCaptor<ReportEntry> entryCaptor = ArgumentCaptor.forClass( ReportEntry.class ); - - adapter.executionSkipped( newClassIdentifier(), "test" ); - verify( listener ).testSkipped( entryCaptor.capture() ); - - ReportEntry entry = entryCaptor.getValue(); - assertTrue( MyTestClass.class.getTypeName().contains( entry.getName() ) ); - assertEquals( MyTestClass.class.getName(), entry.getSourceName() ); - } - - @Test - void notifiedWhenEngineExecutionSkipped() - throws Exception - { - adapter.executionSkipped( newEngineIdentifier(), "test" ); - verify( listener ).testSkipped( any() ); - } - - @Test - void notifiedWhenMethodExecutionAborted() - throws Exception - { - adapter.executionFinished( newMethodIdentifier(), TestExecutionResult.aborted( null ) ); - verify( listener ).testAssumptionFailure( any() ); - } - - @Test - void notifiedWhenClassExecutionAborted() - throws Exception - { - adapter.executionFinished( newClassIdentifier(), TestExecutionResult.aborted( null ) ); - verify( listener ).testAssumptionFailure( any() ); - } - - @Test - void notifiedWhenMethodExecutionFailed() - throws Exception - { - adapter.executionFinished( newMethodIdentifier(), TestExecutionResult.failed( new RuntimeException() ) ); - verify( listener ).testFailed( any() ); - } - - @Test - void notifiedWithCorrectNamesWhenClassExecutionFailed() - throws Exception - { - ArgumentCaptor<ReportEntry> entryCaptor = ArgumentCaptor.forClass( ReportEntry.class ); - - adapter.executionFinished( newClassIdentifier(), TestExecutionResult.failed( new RuntimeException() ) ); - verify( listener ).testFailed( entryCaptor.capture() ); - - ReportEntry entry = entryCaptor.getValue(); - assertEquals( MyTestClass.class.getName(), entry.getSourceName() ); - assertNotNull( entry.getStackTraceWriter() ); - } - - @Test - void notifiedWhenMethodExecutionSucceeded() - throws Exception - { - adapter.executionFinished( newMethodIdentifier(), TestExecutionResult.successful() ); - verify( listener ).testSucceeded( any() ); - } - - @Test - void notNotifiedWhenClassExecutionSucceeded() - throws Exception - { - adapter.executionFinished( newClassIdentifier(), TestExecutionResult.successful() ); - verify( listener, never() ).testSucceeded( any() ); - } - - @Test - void notifiedWithParentDisplayNameWhenTestClassUnknown() - throws Exception - { - // Set up a test plan - TestPlan plan = TestPlan.from( singletonList( new EngineDescriptor( newId(), "Luke's Plan" ) ) ); - adapter.testPlanExecutionStarted( plan ); - - // Use the test plan to set up child with parent. - final String parentDisplay = "I am your father"; - TestIdentifier child = newSourcelessIdentifierWithParent( plan, parentDisplay ); - adapter.executionStarted( child ); - - // Check that the adapter has informed Surefire that the test has been invoked, - // with the parent name as source (since the test case itself had no source). - ArgumentCaptor<ReportEntry> entryCaptor = ArgumentCaptor.forClass( ReportEntry.class ); - verify( listener ).testStarting( entryCaptor.capture() ); - assertEquals( parentDisplay, entryCaptor.getValue().getSourceName() ); - } - - private static TestIdentifier newMethodIdentifier() - throws Exception - { - TestDescriptor testDescriptor = new MethodTestDescriptor( newId(), MyTestClass.class, - MyTestClass.class.getDeclaredMethod( MY_TEST_METHOD_NAME ) ); - return TestIdentifier.from( testDescriptor ); - } - - private static TestIdentifier newClassIdentifier() - { - TestDescriptor testDescriptor = new ClassTestDescriptor( newId(), MyTestClass.class ); - return TestIdentifier.from( testDescriptor ); - } - - private static TestIdentifier newSourcelessIdentifierWithParent( TestPlan testPlan, String parentDisplay ) - { - // A parent test identifier with a name. - TestDescriptor parent = mock( TestDescriptor.class ); - when( parent.getUniqueId() ).thenReturn( newId() ); - when( parent.getDisplayName() ).thenReturn( parentDisplay ); - TestIdentifier parentId = TestIdentifier.from( parent ); - - // The (child) test case that is to be executed as part of a test plan. - TestDescriptor child = mock( TestDescriptor.class ); - when( child.getUniqueId() ).thenReturn( newId() ); - when( child.isTest() ).thenReturn( true ); - - // Ensure the child source is null yet that there is a parent -- the special case to be tested. - when( child.getSource() ).thenReturn( Optional.empty() ); - when( child.getParent() ).thenReturn( Optional.of(parent) ); - TestIdentifier childId = TestIdentifier.from( child ); - - testPlan.add( childId ); - testPlan.add( parentId ); - - return childId; - } - - private static TestIdentifier newEngineIdentifier() - { - TestDescriptor testDescriptor = new EngineDescriptor( newId(), "engine" ); - return TestIdentifier.from( testDescriptor ); - } - - private static UniqueId newId() - { - return UniqueId.forEngine( "engine" ); - } - - private static final String MY_TEST_METHOD_NAME = "myTestMethod"; - - private static class MyTestClass { - - @Test - void myTestMethod() - { - } - - } - -}