From 01cb89b2cbc5c5910e64ab7a8efa4ef53a1270a1 Mon Sep 17 00:00:00 2001 From: fabriciorby Date: Sat, 30 Nov 2024 21:49:24 +0100 Subject: [PATCH] create surefire emulator --- .../plugin/surefire}/DynamicExampleTest.java | 3 +- .../maven/plugin/surefire}/ExampleTest.java | 2 + .../plugin/surefire}/LongNameExampleTest.java | 2 + .../plugin/surefire}/NestedExampleTest.java | 2 + .../surefire}/ParameterizedExampleTest.java | 2 + .../report/ConsoleTreeReporterTest.java | 41 +++--- .../surefire/report/SurefireEmulator.java | 126 ++++++++++++++++++ 7 files changed, 162 insertions(+), 16 deletions(-) rename src/test/java/{ => org/apache/maven/plugin/surefire}/DynamicExampleTest.java (94%) rename src/test/java/{ => org/apache/maven/plugin/surefire}/ExampleTest.java (95%) rename src/test/java/{ => org/apache/maven/plugin/surefire}/LongNameExampleTest.java (98%) rename src/test/java/{ => org/apache/maven/plugin/surefire}/NestedExampleTest.java (97%) rename src/test/java/{ => org/apache/maven/plugin/surefire}/ParameterizedExampleTest.java (96%) create mode 100644 src/test/java/org/apache/maven/plugin/surefire/report/SurefireEmulator.java diff --git a/src/test/java/DynamicExampleTest.java b/src/test/java/org/apache/maven/plugin/surefire/DynamicExampleTest.java similarity index 94% rename from src/test/java/DynamicExampleTest.java rename to src/test/java/org/apache/maven/plugin/surefire/DynamicExampleTest.java index bf4e9ba..74db3f4 100644 --- a/src/test/java/DynamicExampleTest.java +++ b/src/test/java/org/apache/maven/plugin/surefire/DynamicExampleTest.java @@ -1,8 +1,9 @@ +package org.apache.maven.plugin.surefire; + import org.junit.jupiter.api.*; import java.util.Arrays; import java.util.Collection; -import java.util.Collections; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/src/test/java/ExampleTest.java b/src/test/java/org/apache/maven/plugin/surefire/ExampleTest.java similarity index 95% rename from src/test/java/ExampleTest.java rename to src/test/java/org/apache/maven/plugin/surefire/ExampleTest.java index a202e70..facc5a9 100644 --- a/src/test/java/ExampleTest.java +++ b/src/test/java/org/apache/maven/plugin/surefire/ExampleTest.java @@ -1,3 +1,5 @@ +package org.apache.maven.plugin.surefire; + import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; diff --git a/src/test/java/LongNameExampleTest.java b/src/test/java/org/apache/maven/plugin/surefire/LongNameExampleTest.java similarity index 98% rename from src/test/java/LongNameExampleTest.java rename to src/test/java/org/apache/maven/plugin/surefire/LongNameExampleTest.java index 1043220..f548058 100644 --- a/src/test/java/LongNameExampleTest.java +++ b/src/test/java/org/apache/maven/plugin/surefire/LongNameExampleTest.java @@ -1,3 +1,5 @@ +package org.apache.maven.plugin.surefire; + import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; diff --git a/src/test/java/NestedExampleTest.java b/src/test/java/org/apache/maven/plugin/surefire/NestedExampleTest.java similarity index 97% rename from src/test/java/NestedExampleTest.java rename to src/test/java/org/apache/maven/plugin/surefire/NestedExampleTest.java index 3fccbf4..671f8bb 100644 --- a/src/test/java/NestedExampleTest.java +++ b/src/test/java/org/apache/maven/plugin/surefire/NestedExampleTest.java @@ -1,3 +1,5 @@ +package org.apache.maven.plugin.surefire; + import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; diff --git a/src/test/java/ParameterizedExampleTest.java b/src/test/java/org/apache/maven/plugin/surefire/ParameterizedExampleTest.java similarity index 96% rename from src/test/java/ParameterizedExampleTest.java rename to src/test/java/org/apache/maven/plugin/surefire/ParameterizedExampleTest.java index 36f4c9d..63fc599 100644 --- a/src/test/java/ParameterizedExampleTest.java +++ b/src/test/java/org/apache/maven/plugin/surefire/ParameterizedExampleTest.java @@ -1,3 +1,5 @@ +package org.apache.maven.plugin.surefire; + import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; diff --git a/src/test/java/org/apache/maven/plugin/surefire/report/ConsoleTreeReporterTest.java b/src/test/java/org/apache/maven/plugin/surefire/report/ConsoleTreeReporterTest.java index ff4de5c..d66ac83 100644 --- a/src/test/java/org/apache/maven/plugin/surefire/report/ConsoleTreeReporterTest.java +++ b/src/test/java/org/apache/maven/plugin/surefire/report/ConsoleTreeReporterTest.java @@ -1,5 +1,6 @@ package org.apache.maven.plugin.surefire.report; +import org.apache.maven.plugin.surefire.NestedExampleTest; import org.apache.maven.plugin.surefire.log.PluginConsoleLogger; import org.apache.maven.surefire.api.report.RunMode; import org.apache.maven.surefire.api.report.SimpleReportEntry; @@ -14,7 +15,7 @@ @ExtendWith(MockitoExtension.class) class ConsoleTreeReporterTest { - //Test for NestedExampleTest + //Test for org.apache.maven.plugin.surefire.NestedExampleTest Utf8RecodingDeferredFileOutputStream stdout = new Utf8RecodingDeferredFileOutputStream("stdout"); Utf8RecodingDeferredFileOutputStream stderr = new Utf8RecodingDeferredFileOutputStream("stderr"); @@ -27,13 +28,21 @@ static void setupContainer() throws PlexusContainerException { logger = container.getLogger(); } + @Test + void testEmulator() { + // Now we can check the output of any Test class using this + // TODO: Add some proxy before the logger or something so we can assert the output + // TODO: Add some objects with relevant information inside the emulator + new SurefireEmulator().run(NestedExampleTest.class); + } + @Test void testSetStarting() { //Runs 4 times for this class - SimpleReportEntry simpleReportEntry1 = new SimpleReportEntry(RunMode.NORMAL_RUN, 123L, "NestedExampleTest", "Nested Sample", null, null); - SimpleReportEntry simpleReportEntry2 = new SimpleReportEntry(RunMode.NORMAL_RUN, 123L, "NestedExampleTest$InnerTest", "Inner Test", null, null); - SimpleReportEntry simpleReportEntry3 = new SimpleReportEntry(RunMode.NORMAL_RUN, 123L, "NestedExampleTest$InnerTest$InnerInnerTest", "Inner Inner Test", null, null); - SimpleReportEntry simpleReportEntry4 = new SimpleReportEntry(RunMode.NORMAL_RUN, 123L, "NestedExampleTest$InnerTest$InnerInnerTest$InnerInnerInnerTest", "Inner Inner Inner Test", null, null); + SimpleReportEntry simpleReportEntry1 = new SimpleReportEntry(RunMode.NORMAL_RUN, 123L, "org.apache.maven.plugin.surefire.NestedExampleTest", "Nested Sample", null, null); + SimpleReportEntry simpleReportEntry2 = new SimpleReportEntry(RunMode.NORMAL_RUN, 123L, "org.apache.maven.plugin.surefire.NestedExampleTest$InnerTest", "Inner Test", null, null); + SimpleReportEntry simpleReportEntry3 = new SimpleReportEntry(RunMode.NORMAL_RUN, 123L, "org.apache.maven.plugin.surefire.NestedExampleTest$InnerTest$InnerInnerTest", "Inner Inner Test", null, null); + SimpleReportEntry simpleReportEntry4 = new SimpleReportEntry(RunMode.NORMAL_RUN, 123L, "org.apache.maven.plugin.surefire.NestedExampleTest$InnerTest$InnerInnerTest$InnerInnerInnerTest", "Inner Inner Inner Test", null, null); ConsoleTreeReporter consoleTreeReporter = new ConsoleTreeReporter(new PluginConsoleLogger(logger), ReporterOptions.builder().build()); consoleTreeReporter.testSetStarting(simpleReportEntry1); @@ -46,19 +55,19 @@ void testSetStarting() { void testSetCompleted() { //TestStarting parameters - SimpleReportEntry simpleReportEntry1 = new SimpleReportEntry(RunMode.NORMAL_RUN, 123L, "NestedExampleTest", "Nested Sample", null, null); - SimpleReportEntry simpleReportEntry2 = new SimpleReportEntry(RunMode.NORMAL_RUN, 123L, "NestedExampleTest$InnerTest", "Inner Test", null, null); - SimpleReportEntry simpleReportEntry3 = new SimpleReportEntry(RunMode.NORMAL_RUN, 123L, "NestedExampleTest$InnerTest$InnerInnerTest", "Inner Inner Test", null, null); - SimpleReportEntry simpleReportEntry4 = new SimpleReportEntry(RunMode.NORMAL_RUN, 123L, "NestedExampleTest$InnerTest$InnerInnerTest$InnerInnerInnerTest", "Inner Inner Inner Test", null, null); + SimpleReportEntry simpleReportEntry1 = new SimpleReportEntry(RunMode.NORMAL_RUN, 123L, "org.apache.maven.plugin.surefire.NestedExampleTest", "Nested Sample", null, null); + SimpleReportEntry simpleReportEntry2 = new SimpleReportEntry(RunMode.NORMAL_RUN, 123L, "org.apache.maven.plugin.surefire.NestedExampleTest$InnerTest", "Inner Test", null, null); + SimpleReportEntry simpleReportEntry3 = new SimpleReportEntry(RunMode.NORMAL_RUN, 123L, "org.apache.maven.plugin.surefire.NestedExampleTest$InnerTest$InnerInnerTest", "Inner Inner Test", null, null); + SimpleReportEntry simpleReportEntry4 = new SimpleReportEntry(RunMode.NORMAL_RUN, 123L, "org.apache.maven.plugin.surefire.NestedExampleTest$InnerTest$InnerInnerTest$InnerInnerInnerTest", "Inner Inner Inner Test", null, null); //Runs 1 time with all the information //Gets all SingleReportEntries with test names and add on a list of WrapperReportEntries to create a TestSetStats - SimpleReportEntry firstTest = new SimpleReportEntry(RunMode.NORMAL_RUN, 123L, "NestedExampleTest", "Nested Sample", "test", "Should pass"); - SimpleReportEntry secondTest = new SimpleReportEntry(RunMode.NORMAL_RUN, 123L, "NestedExampleTest", "Nested Sample", "test2", "Should pass2"); - SimpleReportEntry thirdTest = new SimpleReportEntry(RunMode.NORMAL_RUN, 123L, "NestedExampleTest$InnerTest", "Inner Test", "test", "Inner test should pass"); - SimpleReportEntry fourthTest = new SimpleReportEntry(RunMode.NORMAL_RUN, 123L, "NestedExampleTest$InnerTest$InnerInnerTest", "Inner Inner Test", "test", "Inner Inner Test should pass"); - SimpleReportEntry fifthTest = new SimpleReportEntry(RunMode.NORMAL_RUN, 123L, "NestedExampleTest$InnerTest$InnerInnerTest$InnerInnerInnerTest", "Inner Inner Inner Test", "test", "Inner Inner Inner Test should pass"); - SimpleReportEntry sixthTest = new SimpleReportEntry(RunMode.NORMAL_RUN, 123L, "NestedExampleTest$FirstInnerTest", "First Inner Test", "test", "FirstInnerTest should show up"); + SimpleReportEntry firstTest = new SimpleReportEntry(RunMode.NORMAL_RUN, 123L, "org.apache.maven.plugin.surefire.NestedExampleTest", "Nested Sample", "test", "Should pass"); + SimpleReportEntry secondTest = new SimpleReportEntry(RunMode.NORMAL_RUN, 123L, "org.apache.maven.plugin.surefire.NestedExampleTest", "Nested Sample", "test2", "Should pass2"); + SimpleReportEntry thirdTest = new SimpleReportEntry(RunMode.NORMAL_RUN, 123L, "org.apache.maven.plugin.surefire.NestedExampleTest$InnerTest", "Inner Test", "test", "Inner test should pass"); + SimpleReportEntry fourthTest = new SimpleReportEntry(RunMode.NORMAL_RUN, 123L, "org.apache.maven.plugin.surefire.NestedExampleTest$InnerTest$InnerInnerTest", "Inner Inner Test", "test", "Inner Inner Test should pass"); + SimpleReportEntry fifthTest = new SimpleReportEntry(RunMode.NORMAL_RUN, 123L, "org.apache.maven.plugin.surefire.NestedExampleTest$InnerTest$InnerInnerTest$InnerInnerInnerTest", "Inner Inner Inner Test", "test", "Inner Inner Inner Test should pass"); + SimpleReportEntry sixthTest = new SimpleReportEntry(RunMode.NORMAL_RUN, 123L, "org.apache.maven.plugin.surefire.NestedExampleTest$FirstInnerTest", "First Inner Test", "test", "FirstInnerTest should show up"); WrappedReportEntry wrappedReportEntry1 = new WrappedReportEntry(firstTest, ReportEntryType.SUCCESS, 1, stdout, stderr); WrappedReportEntry wrappedReportEntry2 = new WrappedReportEntry(secondTest, ReportEntryType.SUCCESS, 1, stdout, stderr); @@ -78,10 +87,12 @@ void testSetCompleted() { TestSetStats testSetStatsForClass = new TestSetStats(false, true); ConsoleTreeReporter consoleTreeReporter = new ConsoleTreeReporter(new PluginConsoleLogger(logger), ReporterOptions.builder().build()); + //This prepares the nested tests by filling the classNames consoleTreeReporter.testSetStarting(simpleReportEntry1); consoleTreeReporter.testSetStarting(simpleReportEntry2); consoleTreeReporter.testSetStarting(simpleReportEntry3); consoleTreeReporter.testSetStarting(simpleReportEntry4); + //As soon as it finished to add tests for all the nested classes that were prepared, then it prints consoleTreeReporter.testSetCompleted(wrappedReportEntry5, testSetStats, null); consoleTreeReporter.testSetCompleted(wrappedReportEntry4, testSetStatsForClass, null); consoleTreeReporter.testSetCompleted(wrappedReportEntry3, testSetStatsForClass, null); diff --git a/src/test/java/org/apache/maven/plugin/surefire/report/SurefireEmulator.java b/src/test/java/org/apache/maven/plugin/surefire/report/SurefireEmulator.java new file mode 100644 index 0000000..8f05cff --- /dev/null +++ b/src/test/java/org/apache/maven/plugin/surefire/report/SurefireEmulator.java @@ -0,0 +1,126 @@ +package org.apache.maven.plugin.surefire.report; + +import org.apache.maven.plugin.surefire.log.PluginConsoleLogger; +import org.apache.maven.surefire.api.report.RunMode; +import org.apache.maven.surefire.api.report.SimpleReportEntry; +import org.codehaus.plexus.DefaultPlexusContainer; +import org.codehaus.plexus.PlexusContainerException; +import org.codehaus.plexus.logging.Logger; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.platform.commons.util.StringUtils; + +import java.lang.reflect.AnnotatedElement; +import java.lang.reflect.Method; +import java.util.*; +import java.util.function.Function; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +import static java.util.stream.Collectors.toList; +import static org.junit.platform.commons.util.AnnotationUtils.findAnnotation; + +public class SurefireEmulator { + + Utf8RecodingDeferredFileOutputStream stdout = new Utf8RecodingDeferredFileOutputStream("stdout"); + Utf8RecodingDeferredFileOutputStream stderr = new Utf8RecodingDeferredFileOutputStream("stderr"); + + static DefaultPlexusContainer container; + static Logger logger; + static DisplayNameGenerator displayNameGenerator; + + static { + try { + container = new DefaultPlexusContainer(); + logger = container.getLogger(); + displayNameGenerator = DisplayNameGenerator.getDisplayNameGenerator(DisplayNameGenerator.Standard.class); + } catch (PlexusContainerException e) { + throw new RuntimeException(e); + } + } + + public void run(Class clazz) { + TestSetStats testSetStats = new TestSetStats(false, true); + getAllMethods(getAllInnerClasses(clazz)) + .entrySet().stream() + .flatMap((k) -> k.getValue().stream() + .map(i -> this.simpleReportEntryGenerator(k.getKey(), i)) + .map(this::wrappedReportEntryGenerator)) + .forEachOrdered(testSetStats::testSucceeded); + + TestSetStats testSetStatsForClass = new TestSetStats(false, true); + ConsoleTreeReporter consoleTreeReporter = new ConsoleTreeReporter(new PluginConsoleLogger(logger), ReporterOptions.builder().build()); + getAllInnerClasses(clazz).stream() + .map(this::simpleReportEntryGenerator) + .forEachOrdered(consoleTreeReporter::testSetStarting); + + List completedWrappedEntries = + getAllInnerClasses(clazz).stream() + .map(this::simpleReportEntryGenerator) + .map(this::wrappedReportEntryGenerator) + .collect(toList()); + + completedWrappedEntries.stream() + .findFirst() + .ifPresent(i -> consoleTreeReporter.testSetCompleted(i, testSetStats, null)); + completedWrappedEntries.stream() + .skip(1) + .forEachOrdered(i -> consoleTreeReporter.testSetCompleted(i, testSetStatsForClass, null)); + } + + private SimpleReportEntry simpleReportEntryGenerator(Class clazz) { + return new SimpleReportEntry(RunMode.NORMAL_RUN, 123L, clazz.getName(), getClassDisplayName(clazz), null, null); + } + + private SimpleReportEntry simpleReportEntryGenerator(Class clazz, Method method) { + return new SimpleReportEntry(RunMode.NORMAL_RUN, 123L, clazz.getName(), getClassDisplayName(clazz), method.getName(), getMethodDisplayName(clazz, method)); + } + + private WrappedReportEntry wrappedReportEntryGenerator(SimpleReportEntry simpleReportEntry) { + return new WrappedReportEntry(simpleReportEntry, ReportEntryType.SUCCESS, 1, stdout, stderr); + } + + private List> getAllInnerClasses(Class clazz) { + return getAllInnerClasses(clazz, new ArrayList<>()); + } + + private List> getAllInnerClasses(Class clazz, List> acc) { + if (clazz.getDeclaredClasses().length == 0) { + acc.add(clazz); + return acc; + } + acc.add(clazz); + acc.addAll(Arrays.stream(clazz.getDeclaredClasses()) + .flatMap(i -> getAllInnerClasses(i, new ArrayList<>()).stream()) + .collect(toList())); + return acc; + } + + private Map, List> getAllMethods(List> classes) { + return classes.stream() + .collect(Collectors.toMap(Function.identity(), + i -> Arrays.asList(i.getDeclaredMethods()), + (x, y) -> y, LinkedHashMap::new)); + } + + private String getDisplayName(AnnotatedElement element, Supplier displayNameSupplier) { + Optional displayNameAnnotation = findAnnotation(element, DisplayName.class); + if (displayNameAnnotation.isPresent()) { + String displayName = displayNameAnnotation.get().value().trim(); + if (!StringUtils.isBlank(displayName)) return displayName; + } + return displayNameSupplier.get(); + } + + private String getClassDisplayName(Class clazz) { + if (clazz.getEnclosingClass() == null) { + return getDisplayName(clazz, () -> displayNameGenerator.generateDisplayNameForClass(clazz)); + } else { + return getDisplayName(clazz, () -> displayNameGenerator.generateDisplayNameForNestedClass(clazz)); + } + } + + private String getMethodDisplayName(Class clazz, Method method) { + return getDisplayName(method, () -> displayNameGenerator.generateDisplayNameForMethod(clazz, method)); + } +}