/* * Copyright 2015-2017 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.vintage.engine; import static java.text.MessageFormat.format; import static java.util.Collections.singleton; import static java.util.function.Predicate.isEqual; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.platform.commons.util.CollectionUtils.getOnlyElement; import static org.junit.platform.commons.util.FunctionUtils.where; import static org.junit.platform.engine.discovery.ClassNameFilter.includeClassNamePatterns; import static org.junit.platform.engine.discovery.DiscoverySelectors.selectClass; import static org.junit.platform.engine.discovery.DiscoverySelectors.selectClasspathRoots; import static org.junit.platform.engine.discovery.DiscoverySelectors.selectMethod; import static org.junit.platform.engine.discovery.DiscoverySelectors.selectPackage; import static org.junit.platform.engine.discovery.DiscoverySelectors.selectUniqueId; import static org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder.request; import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader; import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Base64; import java.util.List; import java.util.Set; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.platform.commons.util.ClassUtils; import org.junit.platform.engine.TestDescriptor; import org.junit.platform.engine.TestTag; import org.junit.platform.engine.UniqueId; import org.junit.platform.engine.support.descriptor.ClassSource; import org.junit.platform.engine.support.descriptor.MethodSource; import org.junit.platform.launcher.LauncherDiscoveryRequest; import org.junit.runner.manipulation.Filter; import org.junit.vintage.engine.samples.PlainOldJavaClassWithoutAnyTest; import org.junit.vintage.engine.samples.junit3.JUnit3SuiteWithSingleTestCaseWithSingleTestWhichFails; import org.junit.vintage.engine.samples.junit3.PlainJUnit3TestCaseWithSingleTestWhichFails; import org.junit.vintage.engine.samples.junit4.Categories.Failing; import org.junit.vintage.engine.samples.junit4.Categories.Plain; import org.junit.vintage.engine.samples.junit4.Categories.Skipped; import org.junit.vintage.engine.samples.junit4.Categories.SkippedWithReason; import org.junit.vintage.engine.samples.junit4.IgnoredJUnit4TestCase; import org.junit.vintage.engine.samples.junit4.JUnit4SuiteWithPlainJUnit4TestCaseWithSingleTestWhichIsIgnored; import org.junit.vintage.engine.samples.junit4.JUnit4SuiteWithTwoTestCases; import org.junit.vintage.engine.samples.junit4.JUnit4TestCaseWithOverloadedMethod; import org.junit.vintage.engine.samples.junit4.JUnit4TestCaseWithRunnerWithCustomUniqueIds; import org.junit.vintage.engine.samples.junit4.ParameterizedTestCase; import org.junit.vintage.engine.samples.junit4.PlainJUnit4TestCaseWithFiveTestMethods; import org.junit.vintage.engine.samples.junit4.PlainJUnit4TestCaseWithSingleInheritedTestWhichFails; import org.junit.vintage.engine.samples.junit4.PlainJUnit4TestCaseWithSingleTestWhichFails; import org.junit.vintage.engine.samples.junit4.PlainJUnit4TestCaseWithSingleTestWhichIsIgnored; import org.junit.vintage.engine.samples.junit4.PlainJUnit4TestCaseWithTwoTestMethods; import org.junit.vintage.engine.samples.junit4.SingleFailingTheoryTestCase; import org.junit.vintage.engine.samples.junit4.TestCaseRunWithJUnitPlatformRunner; /** * @since 4.12 */ class VintageTestEngineDiscoveryTests { VintageTestEngine engine = new VintageTestEngine(); @Test void resolvesSimpleJUnit4TestClass() throws Exception { Class<?> testClass = PlainJUnit4TestCaseWithSingleTestWhichFails.class; LauncherDiscoveryRequest discoveryRequest = discoveryRequestForClass(testClass); TestDescriptor engineDescriptor = discoverTests(discoveryRequest); TestDescriptor runnerDescriptor = getOnlyElement(engineDescriptor.getChildren()); assertRunnerTestDescriptor(runnerDescriptor, testClass); TestDescriptor childDescriptor = getOnlyElement(runnerDescriptor.getChildren()); assertTestMethodDescriptor(childDescriptor, testClass, "failingTest", VintageUniqueIdBuilder.uniqueIdForClass(testClass)); } @Test void resolvesIgnoredJUnit4TestClass() { Class<?> testClass = IgnoredJUnit4TestCase.class; LauncherDiscoveryRequest discoveryRequest = discoveryRequestForClass(testClass); TestDescriptor engineDescriptor = discoverTests(discoveryRequest); TestDescriptor runnerDescriptor = getOnlyElement(engineDescriptor.getChildren()); assertFalse(runnerDescriptor.isContainer()); assertTrue(runnerDescriptor.isTest()); assertEquals(testClass.getName(), runnerDescriptor.getDisplayName()); Assertions.assertEquals(VintageUniqueIdBuilder.uniqueIdForClass(testClass), runnerDescriptor.getUniqueId()); assertThat(runnerDescriptor.getChildren()).isEmpty(); } @Test void resolvesJUnit4TestClassWithCustomRunner() throws Exception { Class<?> testClass = SingleFailingTheoryTestCase.class; LauncherDiscoveryRequest discoveryRequest = discoveryRequestForClass(testClass); TestDescriptor engineDescriptor = discoverTests(discoveryRequest); TestDescriptor runnerDescriptor = getOnlyElement(engineDescriptor.getChildren()); assertRunnerTestDescriptor(runnerDescriptor, testClass); TestDescriptor childDescriptor = getOnlyElement(runnerDescriptor.getChildren()); assertTestMethodDescriptor(childDescriptor, testClass, "theory", VintageUniqueIdBuilder.uniqueIdForClass(testClass)); } @Test void resolvesJUnit3TestCase() throws Exception { Class<?> testClass = PlainJUnit3TestCaseWithSingleTestWhichFails.class; LauncherDiscoveryRequest discoveryRequest = discoveryRequestForClass(testClass); TestDescriptor engineDescriptor = discoverTests(discoveryRequest); TestDescriptor runnerDescriptor = getOnlyElement(engineDescriptor.getChildren()); assertRunnerTestDescriptor(runnerDescriptor, testClass); TestDescriptor childDescriptor = getOnlyElement(runnerDescriptor.getChildren()); assertTestMethodDescriptor(childDescriptor, testClass, "test", VintageUniqueIdBuilder.uniqueIdForClass(testClass)); } @Test void resolvesJUnit3SuiteWithSingleTestCaseWithSingleTestWhichFails() throws Exception { Class<?> suiteClass = JUnit3SuiteWithSingleTestCaseWithSingleTestWhichFails.class; Class<?> testClass = PlainJUnit3TestCaseWithSingleTestWhichFails.class; LauncherDiscoveryRequest discoveryRequest = discoveryRequestForClass(suiteClass); TestDescriptor engineDescriptor = discoverTests(discoveryRequest); TestDescriptor suiteDescriptor = getOnlyElement(engineDescriptor.getChildren()); assertRunnerTestDescriptor(suiteDescriptor, suiteClass); TestDescriptor testClassDescriptor = getOnlyElement(suiteDescriptor.getChildren()); assertContainerTestDescriptor(testClassDescriptor, suiteClass, testClass); TestDescriptor testMethodDescriptor = getOnlyElement(testClassDescriptor.getChildren()); assertTestMethodDescriptor(testMethodDescriptor, testClass, "test", VintageUniqueIdBuilder.uniqueIdForClasses(suiteClass, testClass)); } @Test void resolvesJUnit4SuiteWithPlainJUnit4TestCaseWithSingleTestWhichIsIgnored() throws Exception { Class<?> suiteClass = JUnit4SuiteWithPlainJUnit4TestCaseWithSingleTestWhichIsIgnored.class; Class<?> testClass = PlainJUnit4TestCaseWithSingleTestWhichIsIgnored.class; LauncherDiscoveryRequest discoveryRequest = discoveryRequestForClass(suiteClass); TestDescriptor engineDescriptor = discoverTests(discoveryRequest); TestDescriptor suiteDescriptor = getOnlyElement(engineDescriptor.getChildren()); assertRunnerTestDescriptor(suiteDescriptor, suiteClass); TestDescriptor testClassDescriptor = getOnlyElement(suiteDescriptor.getChildren()); assertContainerTestDescriptor(testClassDescriptor, suiteClass, testClass); TestDescriptor testMethodDescriptor = getOnlyElement(testClassDescriptor.getChildren()); assertTestMethodDescriptor(testMethodDescriptor, testClass, "ignoredTest", VintageUniqueIdBuilder.uniqueIdForClasses(suiteClass, testClass)); } @Test void resolvesJUnit4TestCaseWithOverloadedMethod() { Class<?> testClass = JUnit4TestCaseWithOverloadedMethod.class; LauncherDiscoveryRequest discoveryRequest = discoveryRequestForClass(testClass); TestDescriptor engineDescriptor = discoverTests(discoveryRequest); TestDescriptor runnerDescriptor = getOnlyElement(engineDescriptor.getChildren()); assertRunnerTestDescriptor(runnerDescriptor, testClass); List<TestDescriptor> testMethodDescriptors = new ArrayList<>(runnerDescriptor.getChildren()); assertThat(testMethodDescriptors).hasSize(2); TestDescriptor testMethodDescriptor = testMethodDescriptors.get(0); assertEquals("theory", testMethodDescriptor.getDisplayName()); Assertions.assertEquals(VintageUniqueIdBuilder.uniqueIdForMethod(testClass, "theory", "0"), testMethodDescriptor.getUniqueId()); assertClassSource(testClass, testMethodDescriptor); testMethodDescriptor = testMethodDescriptors.get(1); assertEquals("theory", testMethodDescriptor.getDisplayName()); Assertions.assertEquals(VintageUniqueIdBuilder.uniqueIdForMethod(testClass, "theory", "1"), testMethodDescriptor.getUniqueId()); assertClassSource(testClass, testMethodDescriptor); } @Test void doesNotResolvePlainOldJavaClassesWithoutAnyTest() { assertYieldsNoDescriptors(PlainOldJavaClassWithoutAnyTest.class); } @Test void doesNotResolveClassRunWithJUnitPlatform() { assertYieldsNoDescriptors(TestCaseRunWithJUnitPlatformRunner.class); } @Test void resolvesClasspathSelector() throws Exception { Path root = getClasspathRoot(PlainJUnit4TestCaseWithSingleTestWhichFails.class); LauncherDiscoveryRequest discoveryRequest = request().selectors(selectClasspathRoots(singleton(root))).build(); TestDescriptor engineDescriptor = discoverTests(discoveryRequest); // @formatter:off assertThat(engineDescriptor.getChildren()) .extracting(TestDescriptor::getDisplayName) .contains(PlainJUnit4TestCaseWithSingleTestWhichFails.class.getName()) .contains(PlainJUnit3TestCaseWithSingleTestWhichFails.class.getName()) .doesNotContain(PlainOldJavaClassWithoutAnyTest.class.getName()); // @formatter:on } @Test void resolvesClasspathSelectorForJarFile() throws Exception { URL jarUrl = getClass().getResource("/vintage-testjar.jar"); Path jarFile = Paths.get(jarUrl.toURI()); ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader(); try (URLClassLoader classLoader = new URLClassLoader(new URL[] { jarUrl })) { Thread.currentThread().setContextClassLoader(classLoader); LauncherDiscoveryRequest discoveryRequest = request().selectors( selectClasspathRoots(singleton(jarFile))).build(); TestDescriptor engineDescriptor = discoverTests(discoveryRequest); // @formatter:off assertThat(engineDescriptor.getChildren()) .extracting(TestDescriptor::getDisplayName) .containsExactly("com.example.project.JUnit4Test"); // @formatter:on } finally { Thread.currentThread().setContextClassLoader(originalClassLoader); } } @Test void resolvesApplyingClassNameFilters() throws Exception { Path root = getClasspathRoot(PlainJUnit4TestCaseWithSingleTestWhichFails.class); LauncherDiscoveryRequest discoveryRequest = request().selectors(selectClasspathRoots(singleton(root))).filters( includeClassNamePatterns(".*JUnit4.*"), includeClassNamePatterns(".*Plain.*")).build(); TestDescriptor engineDescriptor = discoverTests(discoveryRequest); // @formatter:off assertThat(engineDescriptor.getChildren()) .extracting(TestDescriptor::getDisplayName) .contains(PlainJUnit4TestCaseWithSingleTestWhichFails.class.getName()) .doesNotContain(JUnit4TestCaseWithOverloadedMethod.class.getName()) .doesNotContain(PlainJUnit3TestCaseWithSingleTestWhichFails.class.getName()); // @formatter:on } @Test void resolvesPackageSelectorForJUnit4SamplesPackage() { Class<?> testClass = PlainJUnit4TestCaseWithSingleTestWhichFails.class; LauncherDiscoveryRequest discoveryRequest = request().selectors( selectPackage(testClass.getPackage().getName())).build(); TestDescriptor engineDescriptor = discoverTests(discoveryRequest); // @formatter:off assertThat(engineDescriptor.getChildren()) .extracting(TestDescriptor::getDisplayName) .contains(testClass.getName()) .doesNotContain(PlainJUnit3TestCaseWithSingleTestWhichFails.class.getName()); // @formatter:on } @Test void resolvesPackageSelectorForJUnit3SamplesPackage() { Class<?> testClass = PlainJUnit3TestCaseWithSingleTestWhichFails.class; LauncherDiscoveryRequest discoveryRequest = request().selectors( selectPackage(testClass.getPackage().getName())).build(); TestDescriptor engineDescriptor = discoverTests(discoveryRequest); // @formatter:off assertThat(engineDescriptor.getChildren()) .extracting(TestDescriptor::getDisplayName) .contains(testClass.getName()) .doesNotContain(PlainJUnit4TestCaseWithSingleTestWhichFails.class.getName()); // @formatter:on } @Test void resolvesClassesWithInheritedMethods() throws Exception { Class<?> superclass = PlainJUnit4TestCaseWithSingleTestWhichFails.class; Class<?> testClass = PlainJUnit4TestCaseWithSingleInheritedTestWhichFails.class; LauncherDiscoveryRequest discoveryRequest = discoveryRequestForClass(testClass); TestDescriptor engineDescriptor = discoverTests(discoveryRequest); TestDescriptor runnerDescriptor = getOnlyElement(engineDescriptor.getChildren()); assertEquals(testClass.getName(), runnerDescriptor.getDisplayName()); assertClassSource(testClass, runnerDescriptor); TestDescriptor testDescriptor = getOnlyElement(runnerDescriptor.getChildren()); assertEquals("failingTest", testDescriptor.getDisplayName()); assertMethodSource(superclass.getMethod("failingTest"), testDescriptor); } @Test void resolvesCategoriesIntoTags() { Class<?> testClass = PlainJUnit4TestCaseWithFiveTestMethods.class; LauncherDiscoveryRequest discoveryRequest = discoveryRequestForClass(testClass); TestDescriptor engineDescriptor = discoverTests(discoveryRequest); TestDescriptor runnerDescriptor = getOnlyElement(engineDescriptor.getChildren()); assertThat(runnerDescriptor.getTags()).containsOnly(TestTag.create(Plain.class.getName())); TestDescriptor failingTest = findChildByDisplayName(runnerDescriptor, "failingTest"); assertThat(failingTest.getTags()).containsOnly(// TestTag.create(Plain.class.getName()), // TestTag.create(Failing.class.getName())); TestDescriptor ignoredWithoutReason = findChildByDisplayName(runnerDescriptor, "ignoredTest1_withoutReason"); assertThat(ignoredWithoutReason.getTags()).containsOnly(// TestTag.create(Plain.class.getName()), // TestTag.create(Skipped.class.getName())); TestDescriptor ignoredWithReason = findChildByDisplayName(runnerDescriptor, "ignoredTest2_withReason"); assertThat(ignoredWithReason.getTags()).containsOnly(// TestTag.create(Plain.class.getName()), // TestTag.create(Skipped.class.getName()), // TestTag.create(SkippedWithReason.class.getName())); } @Test void resolvesMethodSelectorForSingleMethod() throws Exception { Class<?> testClass = PlainJUnit4TestCaseWithFiveTestMethods.class; LauncherDiscoveryRequest discoveryRequest = request().selectors( selectMethod(testClass, testClass.getMethod("failingTest"))).build(); TestDescriptor engineDescriptor = discoverTests(discoveryRequest); TestDescriptor runnerDescriptor = getOnlyElement(engineDescriptor.getChildren()); assertRunnerTestDescriptor(runnerDescriptor, testClass); TestDescriptor childDescriptor = getOnlyElement(runnerDescriptor.getChildren()); assertTestMethodDescriptor(childDescriptor, testClass, "failingTest", VintageUniqueIdBuilder.uniqueIdForClass(testClass)); } @Test void resolvesMethodSelectorForTwoMethodsOfSameClass() throws Exception { Class<?> testClass = PlainJUnit4TestCaseWithFiveTestMethods.class; LauncherDiscoveryRequest discoveryRequest = request().selectors( selectMethod(testClass, testClass.getMethod("failingTest")), selectMethod(testClass, testClass.getMethod("successfulTest"))).build(); TestDescriptor engineDescriptor = discoverTests(discoveryRequest); TestDescriptor runnerDescriptor = getOnlyElement(engineDescriptor.getChildren()); assertRunnerTestDescriptor(runnerDescriptor, testClass); List<TestDescriptor> testMethodDescriptors = new ArrayList<>(runnerDescriptor.getChildren()); assertThat(testMethodDescriptors).hasSize(2); TestDescriptor failingTest = testMethodDescriptors.get(0); assertTestMethodDescriptor(failingTest, testClass, "failingTest", VintageUniqueIdBuilder.uniqueIdForClass(testClass)); TestDescriptor successfulTest = testMethodDescriptors.get(1); assertTestMethodDescriptor(successfulTest, testClass, "successfulTest", VintageUniqueIdBuilder.uniqueIdForClass(testClass)); } @Test void resolvesUniqueIdSelectorForSingleMethod() throws Exception { Class<?> testClass = PlainJUnit4TestCaseWithFiveTestMethods.class; LauncherDiscoveryRequest discoveryRequest = request().selectors( selectUniqueId(VintageUniqueIdBuilder.uniqueIdForMethod(testClass, "failingTest"))).build(); TestDescriptor engineDescriptor = discoverTests(discoveryRequest); TestDescriptor runnerDescriptor = getOnlyElement(engineDescriptor.getChildren()); assertRunnerTestDescriptor(runnerDescriptor, testClass); TestDescriptor childDescriptor = getOnlyElement(runnerDescriptor.getChildren()); assertTestMethodDescriptor(childDescriptor, testClass, "failingTest", VintageUniqueIdBuilder.uniqueIdForClass(testClass)); } @Test void resolvesUniqueIdSelectorForSingleClass() throws Exception { Class<?> testClass = PlainJUnit4TestCaseWithFiveTestMethods.class; LauncherDiscoveryRequest discoveryRequest = request().selectors( selectUniqueId(VintageUniqueIdBuilder.uniqueIdForClass(testClass))).build(); TestDescriptor engineDescriptor = discoverTests(discoveryRequest); TestDescriptor runnerDescriptor = getOnlyElement(engineDescriptor.getChildren()); assertRunnerTestDescriptor(runnerDescriptor, testClass); assertThat(runnerDescriptor.getChildren()).hasSize(5); } @Test void resolvesUniqueIdSelectorOfSingleClassWithinSuite() throws Exception { Class<?> suiteClass = JUnit4SuiteWithTwoTestCases.class; Class<?> testClass = PlainJUnit4TestCaseWithSingleTestWhichFails.class; LauncherDiscoveryRequest discoveryRequest = request().selectors( selectUniqueId(VintageUniqueIdBuilder.uniqueIdForClasses(suiteClass, testClass))).build(); TestDescriptor engineDescriptor = discoverTests(discoveryRequest); TestDescriptor suiteDescriptor = getOnlyElement(engineDescriptor.getChildren()); assertRunnerTestDescriptor(suiteDescriptor, suiteClass); TestDescriptor testClassDescriptor = getOnlyElement(suiteDescriptor.getChildren()); assertContainerTestDescriptor(testClassDescriptor, suiteClass, testClass); TestDescriptor testMethodDescriptor = getOnlyElement(testClassDescriptor.getChildren()); assertTestMethodDescriptor(testMethodDescriptor, testClass, "failingTest", VintageUniqueIdBuilder.uniqueIdForClasses(suiteClass, testClass)); } @Test void resolvesUniqueIdSelectorOfSingleMethodWithinSuite() throws Exception { Class<?> suiteClass = JUnit4SuiteWithTwoTestCases.class; Class<?> testClass = PlainJUnit4TestCaseWithTwoTestMethods.class; LauncherDiscoveryRequest discoveryRequest = request().selectors(selectUniqueId( VintageUniqueIdBuilder.uniqueIdForMethod(VintageUniqueIdBuilder.uniqueIdForClasses(suiteClass, testClass), testClass, "successfulTest"))).build(); TestDescriptor engineDescriptor = discoverTests(discoveryRequest); TestDescriptor suiteDescriptor = getOnlyElement(engineDescriptor.getChildren()); assertRunnerTestDescriptor(suiteDescriptor, suiteClass); TestDescriptor testClassDescriptor = getOnlyElement(suiteDescriptor.getChildren()); assertContainerTestDescriptor(testClassDescriptor, suiteClass, testClass); TestDescriptor testMethodDescriptor = getOnlyElement(testClassDescriptor.getChildren()); assertTestMethodDescriptor(testMethodDescriptor, testClass, "successfulTest", VintageUniqueIdBuilder.uniqueIdForClasses(suiteClass, testClass)); } @Test void resolvesMultipleUniqueIdSelectorsForMethodsOfSameClass() throws Exception { Class<?> testClass = PlainJUnit4TestCaseWithTwoTestMethods.class; LauncherDiscoveryRequest discoveryRequest = request().selectors( selectUniqueId(VintageUniqueIdBuilder.uniqueIdForMethod(testClass, "successfulTest")), selectUniqueId(VintageUniqueIdBuilder.uniqueIdForMethod(testClass, "failingTest"))).build(); TestDescriptor engineDescriptor = discoverTests(discoveryRequest); TestDescriptor runnerDescriptor = getOnlyElement(engineDescriptor.getChildren()); assertRunnerTestDescriptor(runnerDescriptor, testClass); List<TestDescriptor> testMethodDescriptors = new ArrayList<>(runnerDescriptor.getChildren()); assertThat(testMethodDescriptors).hasSize(2); assertTestMethodDescriptor(testMethodDescriptors.get(0), testClass, "failingTest", VintageUniqueIdBuilder.uniqueIdForClass(testClass)); assertTestMethodDescriptor(testMethodDescriptors.get(1), testClass, "successfulTest", VintageUniqueIdBuilder.uniqueIdForClass(testClass)); } @Test void doesNotResolveMissingUniqueIdSelectorForSingleClass() throws Exception { Class<?> testClass = PlainJUnit4TestCaseWithFiveTestMethods.class; LauncherDiscoveryRequest discoveryRequest = request().selectors( selectUniqueId(VintageUniqueIdBuilder.uniqueIdForClass(testClass) + "/[test:doesNotExist]")).build(); TestDescriptor engineDescriptor = discoverTests(discoveryRequest); TestDescriptor runnerDescriptor = getOnlyElement(engineDescriptor.getChildren()); assertRunnerTestDescriptor(runnerDescriptor, testClass); TestDescriptor testDescriptor = getOnlyElement(runnerDescriptor.getChildren()); assertInitializationError(testDescriptor, Filter.class, testClass); } @Test void ignoresMoreFineGrainedSelectorsWhenClassIsSelectedAsWell() throws Exception { Class<?> testClass = PlainJUnit4TestCaseWithFiveTestMethods.class; LauncherDiscoveryRequest discoveryRequest = request().selectors( // selectMethod(testClass, testClass.getMethod("failingTest")), // selectUniqueId(VintageUniqueIdBuilder.uniqueIdForMethod(testClass, "abortedTest")), selectClass(testClass) // ).build(); TestDescriptor engineDescriptor = discoverTests(discoveryRequest); TestDescriptor runnerDescriptor = getOnlyElement(engineDescriptor.getChildren()); assertRunnerTestDescriptor(runnerDescriptor, testClass); assertThat(runnerDescriptor.getChildren()).hasSize(5); } @Test void resolvesCombinationOfMethodAndUniqueIdSelector() throws Exception { Class<?> testClass = PlainJUnit4TestCaseWithFiveTestMethods.class; LauncherDiscoveryRequest discoveryRequest = request().selectors( // selectMethod(testClass, testClass.getMethod("failingTest")), // selectUniqueId(VintageUniqueIdBuilder.uniqueIdForMethod(testClass, "abortedTest") // )).build(); TestDescriptor engineDescriptor = discoverTests(discoveryRequest); TestDescriptor runnerDescriptor = getOnlyElement(engineDescriptor.getChildren()); assertRunnerTestDescriptor(runnerDescriptor, testClass); List<TestDescriptor> testMethodDescriptors = new ArrayList<>(runnerDescriptor.getChildren()); assertThat(testMethodDescriptors).hasSize(2); assertTestMethodDescriptor(testMethodDescriptors.get(0), testClass, "abortedTest", VintageUniqueIdBuilder.uniqueIdForClass(testClass)); assertTestMethodDescriptor(testMethodDescriptors.get(1), testClass, "failingTest", VintageUniqueIdBuilder.uniqueIdForClass(testClass)); } @Test void ignoresRedundantSelector() throws Exception { Class<?> testClass = PlainJUnit4TestCaseWithFiveTestMethods.class; LauncherDiscoveryRequest discoveryRequest = request().selectors( // selectMethod(testClass, testClass.getMethod("failingTest")), // selectUniqueId(VintageUniqueIdBuilder.uniqueIdForMethod(testClass, "failingTest") // )).build(); TestDescriptor engineDescriptor = discoverTests(discoveryRequest); TestDescriptor runnerDescriptor = getOnlyElement(engineDescriptor.getChildren()); assertRunnerTestDescriptor(runnerDescriptor, testClass); TestDescriptor testMethodDescriptor = getOnlyElement(runnerDescriptor.getChildren()); assertTestMethodDescriptor(testMethodDescriptor, testClass, "failingTest", VintageUniqueIdBuilder.uniqueIdForClass(testClass)); } @Test void doesNotResolveMethodOfClassNotAcceptedByClassNameFilter() throws Exception { Class<?> testClass = PlainJUnit4TestCaseWithFiveTestMethods.class; // @formatter:off LauncherDiscoveryRequest request = request() .selectors(selectMethod(testClass, testClass.getMethod("failingTest"))) .filters(includeClassNamePatterns("Foo")) .build(); // @formatter:on assertYieldsNoDescriptors(request); } @Test void resolvesClassForMethodSelectorForClassWithNonFilterableRunner() throws Exception { Class<?> testClass = IgnoredJUnit4TestCase.class; // @formatter:off LauncherDiscoveryRequest request = request() .selectors(selectMethod(testClass, testClass.getMethod("test"))) .build(); // @formatter:on TestDescriptor engineDescriptor = discoverTests(request); TestDescriptor runnerDescriptor = getOnlyElement(engineDescriptor.getChildren()); assertEquals(testClass.getName(), runnerDescriptor.getDisplayName()); Assertions.assertEquals(VintageUniqueIdBuilder.uniqueIdForClass(testClass), runnerDescriptor.getUniqueId()); assertThat(runnerDescriptor.getChildren()).isEmpty(); } @Test void usesCustomUniqueIdsWhenPresent() throws Exception { Class<?> testClass = JUnit4TestCaseWithRunnerWithCustomUniqueIds.class; LauncherDiscoveryRequest request = request().selectors(selectClass(testClass)).build(); TestDescriptor engineDescriptor = discoverTests(request); TestDescriptor runnerDescriptor = getOnlyElement(engineDescriptor.getChildren()); assertRunnerTestDescriptor(runnerDescriptor, testClass); TestDescriptor childDescriptor = getOnlyElement(runnerDescriptor.getChildren()); UniqueId prefix = VintageUniqueIdBuilder.uniqueIdForClass(testClass); assertThat(childDescriptor.getUniqueId().toString()).startsWith(prefix.toString()); String customUniqueIdValue = childDescriptor.getUniqueId().getSegments().get(2).getType(); assertNotNull(Base64.getDecoder().decode(customUniqueIdValue.getBytes(StandardCharsets.UTF_8)), "is a valid Base64 encoding scheme"); } @Test void resolvesTestSourceForParameterizedTests() throws Exception { Class<?> testClass = ParameterizedTestCase.class; LauncherDiscoveryRequest request = request().selectors(selectClass(testClass)).build(); TestDescriptor engineDescriptor = discoverTests(request); TestDescriptor runnerDescriptor = getOnlyElement(engineDescriptor.getChildren()); assertRunnerTestDescriptor(runnerDescriptor, testClass); TestDescriptor fooParentDescriptor = findChildByDisplayName(runnerDescriptor, "[foo]"); assertTrue(fooParentDescriptor.isContainer()); assertFalse(fooParentDescriptor.isTest()); assertThat(fooParentDescriptor.getSource()).isEmpty(); TestDescriptor testMethodDescriptor = getOnlyElement(fooParentDescriptor.getChildren()); assertEquals("test[foo]", testMethodDescriptor.getDisplayName()); assertTrue(testMethodDescriptor.isTest()); assertFalse(testMethodDescriptor.isContainer()); assertMethodSource(testClass.getMethod("test"), testMethodDescriptor); } private TestDescriptor findChildByDisplayName(TestDescriptor runnerDescriptor, String displayName) { // @formatter:off Set<? extends TestDescriptor> children = runnerDescriptor.getChildren(); return children .stream() .filter(where(TestDescriptor::getDisplayName, isEqual(displayName))) .findAny() .orElseThrow(() -> new AssertionError(format("No child with display name \"{0}\" in {1}", displayName, children))); // @formatter:on } private TestDescriptor discoverTests(LauncherDiscoveryRequest discoveryRequest) { return engine.discover(discoveryRequest, UniqueId.forEngine(engine.getId())); } private Path getClasspathRoot(Class<?> testClass) throws Exception { URL location = testClass.getProtectionDomain().getCodeSource().getLocation(); return Paths.get(location.toURI()); } private void assertYieldsNoDescriptors(Class<?> testClass) { LauncherDiscoveryRequest request = discoveryRequestForClass(testClass); assertYieldsNoDescriptors(request); } private void assertYieldsNoDescriptors(LauncherDiscoveryRequest request) { TestDescriptor engineDescriptor = discoverTests(request); assertThat(engineDescriptor.getChildren()).isEmpty(); } private static void assertRunnerTestDescriptor(TestDescriptor runnerDescriptor, Class<?> testClass) { assertTrue(runnerDescriptor.isContainer()); assertFalse(runnerDescriptor.isTest()); assertEquals(testClass.getName(), runnerDescriptor.getDisplayName()); Assertions.assertEquals(VintageUniqueIdBuilder.uniqueIdForClass(testClass), runnerDescriptor.getUniqueId()); assertClassSource(testClass, runnerDescriptor); } private static void assertTestMethodDescriptor(TestDescriptor testMethodDescriptor, Class<?> testClass, String methodName, UniqueId uniqueContainerId) throws Exception { assertTrue(testMethodDescriptor.isTest()); assertFalse(testMethodDescriptor.isContainer()); assertEquals(methodName, testMethodDescriptor.getDisplayName()); Assertions.assertEquals(VintageUniqueIdBuilder.uniqueIdForMethod(uniqueContainerId, testClass, methodName), testMethodDescriptor.getUniqueId()); assertThat(testMethodDescriptor.getChildren()).isEmpty(); assertMethodSource(testClass.getMethod(methodName), testMethodDescriptor); } private static void assertContainerTestDescriptor(TestDescriptor containerDescriptor, Class<?> suiteClass, Class<?> testClass) { assertTrue(containerDescriptor.isContainer()); assertFalse(containerDescriptor.isTest()); assertEquals(testClass.getName(), containerDescriptor.getDisplayName()); Assertions.assertEquals(VintageUniqueIdBuilder.uniqueIdForClasses(suiteClass, testClass), containerDescriptor.getUniqueId()); assertClassSource(testClass, containerDescriptor); } private static void assertInitializationError(TestDescriptor testDescriptor, Class<?> failingClass, Class<?> testClass) { assertTrue(testDescriptor.isTest()); assertFalse(testDescriptor.isContainer()); assertEquals("initializationError", testDescriptor.getDisplayName()); Assertions.assertEquals(VintageUniqueIdBuilder.uniqueIdForErrorInClass(testClass, failingClass), testDescriptor.getUniqueId()); assertThat(testDescriptor.getChildren()).isEmpty(); assertClassSource(failingClass, testDescriptor); } private static void assertClassSource(Class<?> expectedClass, TestDescriptor testDescriptor) { assertThat(testDescriptor.getSource()).containsInstanceOf(ClassSource.class); ClassSource classSource = (ClassSource) testDescriptor.getSource().get(); assertThat(classSource.getJavaClass()).isEqualTo(expectedClass); } private static void assertMethodSource(Method expectedMethod, TestDescriptor testDescriptor) { assertThat(testDescriptor.getSource()).containsInstanceOf(MethodSource.class); MethodSource methodSource = (MethodSource) testDescriptor.getSource().get(); assertThat(methodSource.getClassName()).isEqualTo(expectedMethod.getDeclaringClass().getName()); assertThat(methodSource.getMethodName()).isEqualTo(expectedMethod.getName()); assertThat(methodSource.getMethodParameterTypes()).isEqualTo( ClassUtils.nullSafeToString(expectedMethod.getParameterTypes())); } private static LauncherDiscoveryRequest discoveryRequestForClass(Class<?> testClass) { return request().selectors(selectClass(testClass)).build(); } }