You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by ti...@apache.org on 2020/04/18 11:07:20 UTC

[maven-surefire] branch pull/248 updated (d73f78a -> 74706a0)

This is an automated email from the ASF dual-hosted git repository.

tibordigana pushed a change to branch pull/248
in repository https://gitbox.apache.org/repos/asf/maven-surefire.git.


 discard d73f78a  fixed checkstyle
 discard 29dec2b  automated tests
    omit 84fc351  SUREFIRE-1695 Category inheritance
     add 83b1b98  fixed the grammar in new configuration parameter 'enableProcessChecker' in 3.0.0-M4
     add d013902  a debug log printed in a condition only when necessary
     add 6d8b670  [SUREFIRE-1740] Prerequisite implementation for SUREFIRE-1658
     add 25d204c  excluded H26
     add 993214d  GitHub CI: removed on: pull_request
     add 2e65fb2  [SUREFIRE-1719] Race condition results in "VM crash or System.exit called?" failure
     add 5148b02  [SUREFIRE-1516] Poor performance in reuseForks=false
     add 6b3a796  [SUREFIRE-1742] Updated JUnit 4.12 to JUnit 4.13 in the unit/IT tests.
     add bfe1dbd  [README.md] set style=for-the-badge and added Maven icon
     add db835ce  keep the order of failures to rerun
     add acf7733  [SUREFIRE-1725] Surefire in JUnit Vintage mode distributes tests very unevenly between forks, causing poor parallelism
     add bbce91a  Use Surefire's StringUtils instead of JUnit's
     add d49f4da  Upgrade JUnit to 5.6 and JQwik to 1.2.2
     add 72aa2c1  Delete is{Not}Blank from internal StringUtils
     add 8868523  [SUREFIRE-1746] Dependencies for dynamic provider contain Maven artifacts from the MOJO plugin
     add fd986fd  The workaround on Ubuntu. It should be removed after M5.
     add 1cc6ef6  The workaround on Ubuntu. It should be removed after M5.
     add 3a4efc0  fixed warnings in AbstractSurefireMojo upon the reports in IntelliJ IDEA
     add 7fad650  excluded H23, H29 and H30
     add 733d92f  prune local repo in Travis CI
     add fb76d32  [jenkinsfile] excluded H40 and H41
     add 5e8ee4f  exluded H24 and explicit GC setting
     add 761851e  [SUREFIRE-1741] JUnit5: Detect failed containers (#267)
     add b803256  SUREFIRE-1744 - enable system-out for successful tests as well
     add a341e13  [SUREFIRE-1748] JUnit 5 Assertions.fail() breaks reporting
     add 873da28  [SUREFIRE-1749] Correct useSystemClassloader used in message
     add b0c2593  docs: codehaus is defunct
     add 220652a  Merge pull request #271 from apache/elharo-patch-1
     add 8d9a5cd  improved JUnit47ConcurrencyIT
     add cfdd9ea  [SUREFIRE-1758] JUnit Platform provider isn't mentioned in the docu about groups and excludeGroups
     add 10b2578  [SUREFIRE-1754] Upgrade Doxia and Doxia Site Tools to remove struts dependency
     add 5534bd7  [SUREFIRE-1762] skipAfterFailureCount>0 with testng 7.1.0 resulting in java.lang.NoSuchMethodError: org.testng.TestNG.addListener(Lorg/testng/ITestListener;)V
     add a7ac73e  Revert "[SUREFIRE-1762] skipAfterFailureCount>0 with testng 7.1.0 resulting in java.lang.NoSuchMethodError: org.testng.TestNG.addListener(Lorg/testng/ITestListener;)V" (#277)
     add e23253e5 [SUREFIRE-1762] skipAfterFailureCount>0 with testng 7.1.0 resulting in java.lang.NoSuchMethodError: org.testng.TestNG.addListener(Lorg/testng/ITestListener;)V
     add 348b7c8  debug log with provider class name
     add 59de698  JDK 15
     add 01e546f  [SUREFIRE-1769] Upgrade Plexus Java to 1.0.5
     add f49ac58  avoided parallel downloads of artifacts in the integration test
     add c799b3c  added ASF Jira badge
     add 3a6807c  fixed broken links (MPIR 3)
     add c3ef6d8  fixed broken links (MPIR 3)
     add 31461e2  added GitHub configuration
     add 5f2c5ba  update commons compress
     add b1f7a69  Merge pull request #282 from apache/pom
     add ebbcdbf  README improvement
     add 5e3348c  [SUREFIRE-1658] TCP/IP Channel for forked Surefire JVM. Extensions API and SPI. Polymorphism for remote and local process communication.
     add 521efbf  [SUREFIRE-1774] Upgrade Maven Parent to Version 34
     add e0387fb  [jenkins][github][travis] build supports single JDK 9+ (GH JDK11 and TravisCI JDK14)
     add a592032  maven-assembly-plugin:2.6 crashed on JDK14, Updated to Version 3.2.0
     add e9a60af  NPE (SystemUtils.isJavaVersionAtLeast) in the maven-javadoc-plugin
     add fda1ce2  prevent from failing the IT 855 on JDK 15
     new 74706a0  [SUREFIRE-1695] Support multiple inheritance of @Categories

This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version.  This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:

 * -- * -- B -- O -- O -- O   (d73f78a)
            \
             N -- N -- N   refs/heads/pull/248 (74706a0)

You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.

Any revisions marked "omit" are not gone; other references still
refer to them.  Any revisions marked "discard" are gone forever.

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .asf.yaml                                          |   26 +
 .github/workflows/maven.yml                        |    6 +-
 .github/workflows/{maven.yml => smoketest.yml}     |   18 +-
 .travis.yml                                        |   11 +-
 Jenkinsfile                                        |   14 +-
 README.md                                          |   31 +-
 maven-failsafe-plugin/pom.xml                      |   47 -
 .../maven/plugin/failsafe/IntegrationTestMojo.java |   30 +-
 .../apache/maven/plugin/failsafe/VerifyMojo.java   |    2 +-
 .../failsafe/util/FailsafeSummaryXmlUtils.java     |    8 +-
 maven-surefire-common/pom.xml                      |   56 +-
 .../plugin/surefire/AbstractSurefireMojo.java      |  133 +-
 .../maven/plugin/surefire/CommonReflector.java     |   18 +-
 .../surefire/StartupReportConfiguration.java       |    2 +-
 .../surefire/SurefireDependencyResolver.java       |   79 +-
 .../maven/plugin/surefire/SurefireHelper.java      |    2 +-
 .../maven/plugin/surefire/SurefireProperties.java  |    2 +-
 .../maven/plugin/surefire/TestClassPath.java       |    2 +-
 .../AbstractClasspathForkConfiguration.java        |    7 +-
 .../surefire/booterclient/BooterSerializer.java    |    5 +-
 .../booterclient/ClasspathForkConfiguration.java   |    9 +-
 .../booterclient/DefaultForkConfiguration.java     |   13 +-
 .../surefire/booterclient/ForkConfiguration.java   |    2 +
 .../plugin/surefire/booterclient/ForkStarter.java  |  209 +++-
 .../booterclient/JarManifestForkConfiguration.java |   13 +-
 .../ModularClasspathForkConfiguration.java         |    9 +-
 ...InputStream.java => AbstractCommandReader.java} |   16 +-
 ...ommandStream.java => DefaultCommandReader.java} |   60 +-
 .../DefferedChannelCommandSender.java}             |   12 +-
 .../lazytestprovider/NotifiableTestStream.java     |   10 +-
 .../OutputStreamFlushableCommandline.java          |    6 +-
 .../lazytestprovider/TestLessInputStream.java      |   81 +-
 .../lazytestprovider/TestProvidingInputStream.java |   14 +-
 .../surefire/booterclient/output/ForkClient.java   |  187 +--
 .../booterclient/output/ForkedChannelDecoder.java  |  352 ------
 .../output/ForkedProcessEventNotifier.java         |  248 ++++
 .../output/ForkedProcessExitErrorListener.java     |    4 +-
 .../ForkedProcessStackTraceEventListener.java      |    6 +-
 .../output/NativeStdErrStreamConsumer.java         |    8 +-
 ...andler.java => NativeStdOutStreamConsumer.java} |   24 +-
 .../output/ThreadedStreamConsumer.java             |   91 +-
 .../surefire/extensions/EventConsumerThread.java   |  478 ++++++++
 .../surefire/extensions/LegacyForkChannel.java     |   87 ++
 .../surefire/extensions/LegacyForkNodeFactory.java |   22 +-
 .../plugin/surefire/extensions/StreamFeeder.java   |  203 ++++
 .../surefire/extensions/SurefireForkChannel.java   |  169 +++
 .../extensions/SurefireForkNodeFactory.java        |   24 +-
 .../plugin/surefire/report/ConsoleReporter.java    |    4 +-
 .../surefire/report/DefaultReporterFactory.java    |    4 +-
 .../maven/plugin/surefire/report/FileReporter.java |    2 +-
 .../plugin/surefire/report/FileReporterUtils.java  |    2 +-
 .../surefire/report/StatelessXmlReporter.java      |    8 +-
 .../maven/plugin/surefire/report/TestSetStats.java |    4 +-
 .../Utf8RecodingDeferredFileOutputStream.java      |    2 +-
 .../plugin/surefire/report/WrappedReportEntry.java |    2 +-
 .../maven/plugin/surefire/util/FileScanner.java    |    2 +-
 .../maven/plugin/surefire/util/ScannerUtil.java    |    2 +-
 .../plugin/surefire/util/SpecificFileFilter.java   |    2 +-
 .../AbstractSurefireMojoJava7PlusTest.java         |   27 +-
 .../plugin/surefire/AbstractSurefireMojoTest.java  |   70 +-
 .../maven/plugin/surefire/CommonReflectorTest.java |   50 +
 .../maven/plugin/surefire/MojoMocklessTest.java    |    7 +
 .../surefire/SurefireDependencyResolverTest.java   |  195 ++-
 .../maven/plugin/surefire/SurefireHelperTest.java  |    2 +-
 .../plugin/surefire/SurefireReflectorTest.java     |   71 --
 ...ooterDeserializerProviderConfigurationTest.java |   10 +-
 ...BooterDeserializerStartupConfigurationTest.java |   23 +-
 .../booterclient/DefaultForkConfigurationTest.java |   48 +-
 .../booterclient/ForkConfigurationTest.java        |   25 +-
 .../surefire/booterclient/ForkStarterTest.java     |  273 +++++
 .../booterclient/ForkingRunListenerTest.java       |  202 +--
 .../plugin/surefire/booterclient/MainClass.java    |   35 +-
 .../ModularClasspathForkConfigurationTest.java     |   10 +-
 .../OutputStreamFlushableCommandlineTest.java      |    4 +-
 .../TestLessInputStreamBuilderTest.java            |  107 +-
 .../TestProvidingInputStreamTest.java              |  152 ++-
 .../booterclient/output/ForkClientTest.java        |  959 ++++-----------
 .../output/ForkedChannelDecoderTest.java           |  864 -------------
 .../extensions/ConsoleOutputReporterTest.java      |    8 +-
 .../maven/plugin/surefire/extensions/E2ETest.java  |  182 +++
 .../extensions/ForkedProcessEventNotifierTest.java | 1284 ++++++++++++++++++++
 .../surefire/extensions/StatelessReporterTest.java |    5 +-
 .../surefire/extensions/StreamFeederTest.java      |  162 +++
 .../report/DefaultReporterFactoryTest.java         |    4 +-
 .../surefire/report/StatelessXmlReporterTest.java  |    6 +-
 .../plugin/surefire/report/TestSetStatsTest.java   |    2 +-
 .../runorder/RunEntryStatisticsMapTest.java        |    2 +-
 .../org/apache/maven/surefire/JUnit4SuiteTest.java |   18 +-
 .../maven/surefire/extensions/ForkChannelTest.java |  189 +++
 .../StatelessTestsetInfoReporterTest.java          |    2 +-
 .../report/ConsoleOutputFileReporterTest.java      |    2 +-
 maven-surefire-plugin/pom.xml                      |    1 -
 .../maven/plugin/surefire/SurefirePlugin.java      |   30 +-
 .../src/site/apt/examples/junit-platform.apt.vm    |    2 +-
 .../src/site/apt/examples/process-communication.vm |  153 +++
 maven-surefire-plugin/src/site/apt/index.apt.vm    |    8 +-
 maven-surefire-plugin/src/site/fml/faq.fml         |    4 +-
 maven-surefire-plugin/src/site/markdown/docker.md  |    2 +-
 maven-surefire-plugin/src/site/site.xml            |    1 +
 .../src/site/apt/index.apt                         |    8 +-
 pom.xml                                            |   45 +-
 surefire-api/pom.xml                               |   39 +-
 .../maven/surefire/SpecificTestClassFilter.java    |    2 +-
 .../maven/surefire/booter/BaseProviderFactory.java |   80 +-
 .../org/apache/maven/surefire/booter/Command.java  |   23 +-
 ...ocessEvent.java => ForkedProcessEventType.java} |   20 +-
 .../surefire/booter/ForkingReporterFactory.java    |    4 +-
 .../maven/surefire/booter/ForkingRunListener.java  |    4 +-
 .../booter/MasterProcessChannelDecoder.java        |   46 +
 .../booter/MasterProcessChannelEncoder.java        |   86 ++
 .../surefire/booter/MasterProcessCommand.java      |  147 +--
 .../surefire/booter/RunOrderParametersAware.java   |   30 -
 .../maven/surefire/cli/CommandLineOption.java      |   10 -
 .../surefire/eventapi/AbstractConsoleEvent.java    |   85 ++
 .../eventapi/AbstractStandardStreamEvent.java      |   93 ++
 .../eventapi/AbstractTestControlEvent.java         |   95 ++
 .../ConsoleDebugEvent.java}                        |   16 +-
 .../maven/surefire/eventapi/ConsoleErrorEvent.java |   87 ++
 .../ConsoleInfoEvent.java}                         |   18 +-
 .../ConsoleWarningEvent.java}                      |   16 +-
 .../ControlByeEvent.java}                          |   57 +-
 .../ControlNextTestEvent.java}                     |   57 +-
 .../eventapi/ControlStopOnNextTestEvent.java       |   77 ++
 .../org/apache/maven/surefire/eventapi/Event.java  |   41 +-
 .../maven/surefire/eventapi/JvmExitErrorEvent.java |   87 ++
 .../StandardStreamErrEvent.java}                   |   18 +-
 .../StandardStreamErrWithNewLineEvent.java}        |   18 +-
 .../StandardStreamOutEvent.java}                   |   18 +-
 .../StandardStreamOutWithNewLineEvent.java}        |   18 +-
 .../surefire/eventapi/SystemPropertyEvent.java     |  101 ++
 .../TestAssumptionFailureEvent.java}               |   19 +-
 .../TestErrorEvent.java}                           |   19 +-
 .../TestFailedEvent.java}                          |   19 +-
 .../TestSkippedEvent.java}                         |   19 +-
 .../TestStartingEvent.java}                        |   19 +-
 .../TestSucceededEvent.java}                       |   19 +-
 .../TestsetCompletedEvent.java}                    |   19 +-
 .../TestsetStartingEvent.java}                     |   19 +-
 .../CommandChainReader.java}                       |   20 +-
 .../{booter => providerapi}/CommandListener.java   |    4 +-
 .../surefire/providerapi/ProviderParameters.java   |    6 +-
 .../apache/maven/surefire/report/ReportEntry.java  |    2 +-
 .../maven/surefire/report/SimpleReportEntry.java   |    2 +
 .../org/apache/maven/surefire/suite/RunResult.java |    2 +-
 .../maven/surefire/testset/ResolvedTest.java       |   14 +-
 .../maven/surefire/testset/TestListResolver.java   |   12 +-
 .../surefire/util/DefaultDirectoryScanner.java     |    4 +-
 .../maven/surefire/util/ReflectionUtils.java       |   31 +-
 .../AbstractNoninterruptibleReadableChannel.java   |   69 ++
 .../AbstractNoninterruptibleWritableChannel.java   |   97 ++
 .../maven/surefire/util/internal/Channels.java     |  256 ++++
 .../maven/surefire/util/internal/ClassMethod.java  |    2 +-
 .../util/internal/DaemonThreadFactory.java         |   35 +-
 .../maven/surefire/util/internal/StringUtils.java  |   26 -
 .../internal/WritableBufferedByteChannel.java}     |   16 +-
 .../java/org/apache/maven/JUnit4SuiteTest.java     |   14 +-
 .../surefire/booter/ForkingRunListenerTest.java    |   24 +-
 .../surefire/booter/MasterProcessCommandTest.java  |  164 ---
 .../surefire/booter/SurefireReflectorTest.java     |  198 ---
 .../surefire/util/internal/AsyncSocketTest.java    |  227 ++++
 .../surefire/util/internal/ChannelsReaderTest.java |  545 +++++++++
 .../surefire/util/internal/ChannelsWriterTest.java |  453 +++++++
 surefire-booter/pom.xml                            |   83 +-
 .../maven/surefire/booter/BooterConstants.java     |    1 +
 .../maven/surefire/booter/BooterDeserializer.java  |   14 +
 .../apache/maven/surefire/booter/Classpath.java    |   13 +-
 .../maven/surefire/booter/CommandReader.java       |  161 +--
 .../apache/maven/surefire/booter/ForkedBooter.java |  122 +-
 .../maven/surefire/booter/LazyTestsToRun.java      |   12 +-
 .../apache/maven/surefire/booter/PpidChecker.java  |   12 +-
 .../maven/surefire/booter/ProcessCheckerType.java  |    2 +-
 .../maven/surefire/booter/PropertiesWrapper.java   |    2 +-
 .../surefire/booter/ProviderConfiguration.java     |    2 -
 .../maven/surefire/booter/ProviderFactory.java     |    4 +-
 .../surefire/booter/StartupConfiguration.java      |   22 +-
 .../booter/SurefireBooterForkException.java        |    2 +-
 .../maven/surefire/booter/SurefireReflector.java   |  120 +-
 .../apache/maven/surefire/booter/SystemUtils.java  |   12 +-
 .../spi/LegacyMasterProcessChannelDecoder.java     |  190 +++
 .../spi/LegacyMasterProcessChannelEncoder.java     |  283 +++--
 ...LegacyMasterProcessChannelProcessorFactory.java |   72 ++
 ...refireMasterProcessChannelProcessorFactory.java |  122 ++
 ...refire.spi.MasterProcessChannelProcessorFactory |   21 +-
 .../surefire/booter/BooterDeserializerTest.java    |    2 +-
 .../maven/surefire/booter/ClasspathTest.java       |   88 +-
 .../maven/surefire/booter/CommandReaderTest.java   |   57 +-
 .../java/org/apache/maven/surefire/booter/Foo.java |   48 +-
 .../surefire/booter/ForkedBooterMockTest.java      |  264 +++-
 .../maven/surefire/booter/ForkedBooterTest.java    |   27 +-
 .../surefire/booter/IsolatedClassLoaderTest.java   |   66 +
 .../maven/surefire/booter/JUnit4SuiteTest.java     |    7 +
 .../surefire/booter/NewClassLoaderRunner.java      |    2 +-
 .../maven/surefire/booter/PpidCheckerTest.java     |    4 +-
 .../surefire/booter/SurefireReflectorTest.java     |  408 +++++++
 .../maven/surefire/booter/SystemUtilsTest.java     |   12 +-
 .../spi/LegacyMasterProcessChannelDecoderTest.java |  243 ++++
 .../spi/LegacyMasterProcessChannelEncoderTest.java |  236 ++--
 surefire-extensions-api/pom.xml                    |   46 +-
 .../surefire/extensions/CloseableDaemonThread.java |   22 +-
 .../maven/surefire/extensions/CommandReader.java   |   23 +-
 .../surefire/extensions/ConsoleOutputReporter.java |    2 +-
 .../maven/surefire/extensions/EventHandler.java    |   12 +-
 .../maven/surefire/extensions/ForkChannel.java     |  105 ++
 .../surefire/extensions/ForkNodeArguments.java     |   30 +-
 .../maven/surefire/extensions/ForkNodeFactory.java |   23 +-
 .../surefire/extensions/StatelessReporter.java     |    2 +-
 .../surefire/extensions/StdOutStreamLine.java      |    8 +-
 .../extensions/util/CommandlineExecutor.java       |  128 ++
 .../extensions/util/CommandlineStreams.java        |   88 ++
 .../extensions/util/CountdownCloseable.java        |   70 ++
 .../extensions/util/LineConsumerThread.java        |  100 ++
 .../extensions/CommandlineExecutorTest.java        |  104 ++
 .../surefire/extensions/JUnit4SuiteTest.java       |   21 +-
 .../junit4 => surefire-extensions-spi}/pom.xml     |   33 +-
 .../spi/MasterProcessChannelProcessorFactory.java  |   62 +
 surefire-its/pom.xml                               |    2 +
 .../maven/surefire/its/AbstractFailFastIT.java     |   28 +-
 .../apache/maven/surefire/its/ConsoleOutputIT.java |  106 +-
 .../apache/maven/surefire/its/FailFastJUnitIT.java |   31 +-
 .../maven/surefire/its/FailFastTestNgIT.java       |   18 +-
 .../maven/surefire/its/JUnit47ConcurrencyIT.java   |    7 +-
 .../its/JUnit47RerunFailingTestWithCucumberIT.java |   83 +-
 .../surefire/its/JUnit4RerunFailingTestsIT.java    |   40 +-
 .../maven/surefire/its/JUnit4VersionsIT.java       |    4 +-
 .../maven/surefire/its/JUnitPlatformEnginesIT.java |  154 ++-
 .../apache/maven/surefire/its/JUnitPlatformIT.java |    4 +-
 .../apache/maven/surefire/its/JUnitVersion.java    |    3 +-
 .../maven/surefire/its/TestMethodPatternIT.java    |   84 +-
 .../surefire/its/fixture/SurefireLauncher.java     |    2 +
 .../Surefire1744AlwaysIncludeOutputLogsIT.java     |   36 +-
 ...fire735ForkFailWithRedirectConsoleOutputIT.java |    8 +-
 .../resources/assumpationFailureReport/pom.xml     |    2 +-
 .../src/test/resources/consoleOutput/pom.xml       |   17 +
 .../src/test/java/consoleOutput/Test1.java         |   26 +-
 .../src/test/resources/consoleoutput-noisy/pom.xml |   17 +
 .../src/test/java/consoleoutput_noisy/Test1.java   |    2 +
 .../src/test/java/consoleoutput_noisy/Test3.java   |   42 +-
 .../src/test/resources/fail-fast-junit/pom.xml     |   14 +
 .../src/test/resources/fail-fast-testng/pom.xml    |   17 +
 .../src/test/java/forktimeout/BaseForkTimeout.java |    2 +-
 .../src/test/resources/java9-full-api/pom.xml      |    2 +-
 surefire-its/src/test/resources/junit4/pom.xml     |    2 +-
 .../test/resources/junit44-method-pattern/pom.xml  |   17 +
 .../pom.xml                                        |   20 +
 .../test/resources/junit48-method-pattern/pom.xml  |   14 +
 .../{surefire-1688 => surefire-1727}/pom.xml       |    0
 .../jira1727/ErrorInTestFactoryJupiterTest.java    |   17 +-
 .../test/java/jira1727/ErrorInTestProvider.java    |   28 +-
 .../jira1727/ErrorInTestTemplateProviderTest.java  |   15 +-
 .../jira1727/FailureInTestFactoryJupiterTest.java  |   23 +-
 .../test/java/jira1727/FailureInTestProvider.java  |   35 +-
 .../FailureInTestTemplateProviderTest.java         |   15 +-
 .../{surefire-1688 => surefire-1741}/pom.xml       |    0
 .../java/jira1741/ErrorInBeforeAllJupiterTest.java |   21 +-
 .../ErrorInParameterizedSourceJupiterTest.java     |   26 +-
 .../FailureInParameterizedSourceJupiterTest.java   |   27 +-
 .../pom.xml                                        |   26 +-
 .../src/main/resources/log4j.properties            |    0
 .../alwaysIncludeOutputLogs/TestSurefire3.java     |   20 +-
 .../pom.xml                                        |    0
 .../AssertionsFailNoParametersJupiterTest.java     |   17 +-
 .../{surefire-1688 => surefire-1748}/pom.xml       |    0
 ...ertionsFailEmptyStringParameterJupiterTest.java |   17 +-
 .../surefire-855-failsafe-use-bundle/pom.xml       |   12 +-
 .../surefire-855-failsafe-use-jar/pom.xml          |   12 +-
 .../surefire-855-failsafe-use-war/pom.xml          |   12 +-
 .../resources/testng-method-pattern-after/pom.xml  |   14 +
 .../resources/testng-method-pattern-before/pom.xml |   14 +
 .../test/resources/testng-method-pattern/pom.xml   |   14 +
 surefire-logger-api/pom.xml                        |    4 +-
 surefire-providers/common-java5/pom.xml            |   30 +-
 .../surefire/report/SmartStackTraceParser.java     |    6 +-
 .../common/junit4/JUnit4RunListenerFactory.java    |    2 +-
 .../surefire/common/junit48/FilterFactory.java     |    2 +-
 .../junitplatform/JUnitPlatformProvider.java       |   44 +-
 .../surefire/junitplatform/RunListenerAdapter.java |   30 +-
 .../junitplatform/JUnitPlatformProviderTest.java   |  209 ++++
 .../junitplatform/RunListenerAdapterTest.java      |   66 +
 .../maven/surefire/junit4/JUnit4Provider.java      |    9 +-
 .../maven/surefire/junit4/JUnit4ProviderTest.java  |    2 +-
 .../surefire/junitcore/JUnitCoreProvider.java      |    9 +-
 .../maven/surefire/junitcore/Surefire746Test.java  |    3 +-
 .../surefire/testng/TestNGDirectoryTestSuite.java  |    2 +-
 .../maven/surefire/testng/TestNGExecutor.java      |   11 +-
 .../maven/surefire/testng/TestNGProvider.java      |    9 +-
 surefire-report-parser/pom.xml                     |   30 +-
 .../plugins/surefire/report/ReportTestCase.java    |    2 +-
 .../surefire/report/SurefireReportParser.java      |    4 +-
 .../surefire/report/TestSuiteXmlParser.java        |    2 +-
 surefire-shadefire/pom.xml                         |    5 +
 290 files changed, 12103 insertions(+), 5074 deletions(-)
 create mode 100644 .asf.yaml
 copy .github/workflows/{maven.yml => smoketest.yml} (80%)
 rename maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/lazytestprovider/{AbstractForkInputStream.java => AbstractCommandReader.java} (84%)
 rename maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/lazytestprovider/{AbstractCommandStream.java => DefaultCommandReader.java} (63%)
 copy maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/{output/ForkedChannelDecoderErrorHandler.java => lazytestprovider/DefferedChannelCommandSender.java} (67%)
 delete mode 100644 maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ForkedChannelDecoder.java
 create mode 100644 maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ForkedProcessEventNotifier.java
 copy maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/{ForkedChannelDecoderErrorHandler.java => NativeStdOutStreamConsumer.java} (62%)
 create mode 100644 maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/EventConsumerThread.java
 create mode 100644 maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/LegacyForkChannel.java
 copy surefire-api/src/main/java/org/apache/maven/surefire/booter/MainCliOptionsAware.java => maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/LegacyForkNodeFactory.java (60%)
 create mode 100644 maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/StreamFeeder.java
 create mode 100644 maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/SurefireForkChannel.java
 copy surefire-api/src/main/java/org/apache/maven/surefire/booter/MainCliOptionsAware.java => maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/SurefireForkNodeFactory.java (57%)
 delete mode 100644 maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/SurefireReflectorTest.java
 create mode 100644 maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/ForkStarterTest.java
 copy surefire-api/src/test/java/org/apache/maven/surefire/booter/ForkingRunListenerTest.java => maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/MainClass.java (53%)
 delete mode 100644 maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/output/ForkedChannelDecoderTest.java
 rename maven-surefire-common/src/test/java/org/apache/maven/{ => plugin}/surefire/extensions/ConsoleOutputReporterTest.java (95%)
 create mode 100644 maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/extensions/E2ETest.java
 create mode 100644 maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/extensions/ForkedProcessEventNotifierTest.java
 rename maven-surefire-common/src/test/java/org/apache/maven/{ => plugin}/surefire/extensions/StatelessReporterTest.java (98%)
 create mode 100644 maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/extensions/StreamFeederTest.java
 create mode 100644 maven-surefire-common/src/test/java/org/apache/maven/surefire/extensions/ForkChannelTest.java
 create mode 100644 maven-surefire-plugin/src/site/apt/examples/process-communication.vm
 rename surefire-api/src/main/java/org/apache/maven/surefire/booter/{ForkedProcessEvent.java => ForkedProcessEventType.java} (86%)
 create mode 100644 surefire-api/src/main/java/org/apache/maven/surefire/booter/MasterProcessChannelDecoder.java
 create mode 100644 surefire-api/src/main/java/org/apache/maven/surefire/booter/MasterProcessChannelEncoder.java
 delete mode 100644 surefire-api/src/main/java/org/apache/maven/surefire/booter/RunOrderParametersAware.java
 create mode 100644 surefire-api/src/main/java/org/apache/maven/surefire/eventapi/AbstractConsoleEvent.java
 create mode 100644 surefire-api/src/main/java/org/apache/maven/surefire/eventapi/AbstractStandardStreamEvent.java
 create mode 100644 surefire-api/src/main/java/org/apache/maven/surefire/eventapi/AbstractTestControlEvent.java
 rename surefire-api/src/main/java/org/apache/maven/surefire/{booter/ShutdownAware.java => eventapi/ConsoleDebugEvent.java} (67%)
 create mode 100644 surefire-api/src/main/java/org/apache/maven/surefire/eventapi/ConsoleErrorEvent.java
 copy surefire-api/src/main/java/org/apache/maven/surefire/{booter/MainCliOptionsAware.java => eventapi/ConsoleInfoEvent.java} (68%)
 rename surefire-api/src/main/java/org/apache/maven/surefire/{booter/FailFastAware.java => eventapi/ConsoleWarningEvent.java} (67%)
 copy surefire-api/src/main/java/org/apache/maven/surefire/{booter/ForkingReporterFactory.java => eventapi/ControlByeEvent.java} (50%)
 copy surefire-api/src/main/java/org/apache/maven/surefire/{booter/ForkingReporterFactory.java => eventapi/ControlNextTestEvent.java} (50%)
 create mode 100644 surefire-api/src/main/java/org/apache/maven/surefire/eventapi/ControlStopOnNextTestEvent.java
 copy maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/lazytestprovider/NotifiableTestStream.java => surefire-api/src/main/java/org/apache/maven/surefire/eventapi/Event.java (53%)
 create mode 100644 surefire-api/src/main/java/org/apache/maven/surefire/eventapi/JvmExitErrorEvent.java
 copy surefire-api/src/main/java/org/apache/maven/surefire/{booter/MainCliOptionsAware.java => eventapi/StandardStreamErrEvent.java} (64%)
 copy surefire-api/src/main/java/org/apache/maven/surefire/{booter/MainCliOptionsAware.java => eventapi/StandardStreamErrWithNewLineEvent.java} (62%)
 copy surefire-api/src/main/java/org/apache/maven/surefire/{booter/MainCliOptionsAware.java => eventapi/StandardStreamOutEvent.java} (64%)
 copy surefire-api/src/main/java/org/apache/maven/surefire/{booter/MainCliOptionsAware.java => eventapi/StandardStreamOutWithNewLineEvent.java} (62%)
 create mode 100644 surefire-api/src/main/java/org/apache/maven/surefire/eventapi/SystemPropertyEvent.java
 copy surefire-api/src/main/java/org/apache/maven/surefire/{booter/MainCliOptionsAware.java => eventapi/TestAssumptionFailureEvent.java} (59%)
 copy surefire-api/src/main/java/org/apache/maven/surefire/{booter/MainCliOptionsAware.java => eventapi/TestErrorEvent.java} (61%)
 copy surefire-api/src/main/java/org/apache/maven/surefire/{booter/MainCliOptionsAware.java => eventapi/TestFailedEvent.java} (61%)
 copy surefire-api/src/main/java/org/apache/maven/surefire/{booter/MainCliOptionsAware.java => eventapi/TestSkippedEvent.java} (61%)
 copy surefire-api/src/main/java/org/apache/maven/surefire/{booter/MainCliOptionsAware.java => eventapi/TestStartingEvent.java} (61%)
 copy surefire-api/src/main/java/org/apache/maven/surefire/{booter/MainCliOptionsAware.java => eventapi/TestSucceededEvent.java} (60%)
 copy surefire-api/src/main/java/org/apache/maven/surefire/{booter/MainCliOptionsAware.java => eventapi/TestsetCompletedEvent.java} (59%)
 copy surefire-api/src/main/java/org/apache/maven/surefire/{booter/MainCliOptionsAware.java => eventapi/TestsetStartingEvent.java} (59%)
 copy surefire-api/src/main/java/org/apache/maven/surefire/{booter/MainCliOptionsAware.java => providerapi/CommandChainReader.java} (68%)
 rename surefire-api/src/main/java/org/apache/maven/surefire/{booter => providerapi}/CommandListener.java (90%)
 create mode 100644 surefire-api/src/main/java/org/apache/maven/surefire/util/internal/AbstractNoninterruptibleReadableChannel.java
 create mode 100644 surefire-api/src/main/java/org/apache/maven/surefire/util/internal/AbstractNoninterruptibleWritableChannel.java
 create mode 100644 surefire-api/src/main/java/org/apache/maven/surefire/util/internal/Channels.java
 copy surefire-api/src/main/java/org/apache/maven/surefire/{booter/DirectoryScannerParametersAware.java => util/internal/WritableBufferedByteChannel.java} (58%)
 delete mode 100644 surefire-api/src/test/java/org/apache/maven/surefire/booter/MasterProcessCommandTest.java
 delete mode 100644 surefire-api/src/test/java/org/apache/maven/surefire/booter/SurefireReflectorTest.java
 create mode 100644 surefire-api/src/test/java/org/apache/maven/surefire/util/internal/AsyncSocketTest.java
 create mode 100644 surefire-api/src/test/java/org/apache/maven/surefire/util/internal/ChannelsReaderTest.java
 create mode 100644 surefire-api/src/test/java/org/apache/maven/surefire/util/internal/ChannelsWriterTest.java
 rename {surefire-api => surefire-booter}/src/main/java/org/apache/maven/surefire/booter/CommandReader.java (73%)
 rename {surefire-api => surefire-booter}/src/main/java/org/apache/maven/surefire/booter/SurefireReflector.java (74%)
 create mode 100644 surefire-booter/src/main/java/org/apache/maven/surefire/booter/spi/LegacyMasterProcessChannelDecoder.java
 rename surefire-api/src/main/java/org/apache/maven/surefire/booter/ForkedChannelEncoder.java => surefire-booter/src/main/java/org/apache/maven/surefire/booter/spi/LegacyMasterProcessChannelEncoder.java (61%)
 create mode 100644 surefire-booter/src/main/java/org/apache/maven/surefire/booter/spi/LegacyMasterProcessChannelProcessorFactory.java
 create mode 100644 surefire-booter/src/main/java/org/apache/maven/surefire/booter/spi/SurefireMasterProcessChannelProcessorFactory.java
 copy .travis.yml => surefire-booter/src/main/resources/META-INF/services/org.apache.maven.surefire.spi.MasterProcessChannelProcessorFactory (69%)
 rename {surefire-api => surefire-booter}/src/test/java/org/apache/maven/surefire/booter/CommandReaderTest.java (77%)
 rename {surefire-api => surefire-booter}/src/test/java/org/apache/maven/surefire/booter/Foo.java (71%)
 create mode 100644 surefire-booter/src/test/java/org/apache/maven/surefire/booter/IsolatedClassLoaderTest.java
 rename {surefire-api => surefire-booter}/src/test/java/org/apache/maven/surefire/booter/NewClassLoaderRunner.java (99%)
 create mode 100644 surefire-booter/src/test/java/org/apache/maven/surefire/booter/SurefireReflectorTest.java
 create mode 100644 surefire-booter/src/test/java/org/apache/maven/surefire/booter/spi/LegacyMasterProcessChannelDecoderTest.java
 rename surefire-api/src/test/java/org/apache/maven/surefire/booter/ForkedChannelEncoderTest.java => surefire-booter/src/test/java/org/apache/maven/surefire/booter/spi/LegacyMasterProcessChannelEncoderTest.java (81%)
 copy surefire-api/src/main/java/org/apache/maven/surefire/booter/MainCliOptionsAware.java => surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/CloseableDaemonThread.java (65%)
 rename maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ForkedChannelDecoderErrorHandler.java => surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/CommandReader.java (62%)
 copy surefire-api/src/main/java/org/apache/maven/surefire/booter/TestRequestAware.java => surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/EventHandler.java (78%)
 create mode 100644 surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/ForkChannel.java
 copy surefire-api/src/main/java/org/apache/maven/surefire/booter/MainCliOptionsAware.java => surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/ForkNodeArguments.java (59%)
 copy surefire-api/src/main/java/org/apache/maven/surefire/booter/MainCliOptionsAware.java => surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/ForkNodeFactory.java (61%)
 rename surefire-api/src/main/java/org/apache/maven/surefire/booter/SurefireClassLoadersAware.java => surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/StdOutStreamLine.java (82%)
 create mode 100644 surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/util/CommandlineExecutor.java
 create mode 100644 surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/util/CommandlineStreams.java
 create mode 100644 surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/util/CountdownCloseable.java
 create mode 100644 surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/util/LineConsumerThread.java
 create mode 100644 surefire-extensions-api/src/test/java/org/apache/maven/plugin/surefire/extensions/CommandlineExecutorTest.java
 copy surefire-api/src/main/java/org/apache/maven/surefire/booter/MainCliOptionsAware.java => surefire-extensions-api/src/test/java/org/apache/maven/plugin/surefire/extensions/JUnit4SuiteTest.java (66%)
 copy {surefire-its/src/test/resources/junit4 => surefire-extensions-spi}/pom.xml (60%)
 create mode 100644 surefire-extensions-spi/src/main/java/org/apache/maven/surefire/spi/MasterProcessChannelProcessorFactory.java
 copy maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/FileReporterUtils.java => surefire-its/src/test/java/org/apache/maven/surefire/its/jiras/Surefire1744AlwaysIncludeOutputLogsIT.java (50%)
 copy maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/FileReporterUtils.java => surefire-its/src/test/resources/consoleoutput-noisy/src/test/java/consoleoutput_noisy/Test3.java (52%)
 copy surefire-its/src/test/resources/{surefire-1688 => surefire-1727}/pom.xml (100%)
 rename surefire-api/src/main/java/org/apache/maven/surefire/booter/ReporterConfigurationAware.java => surefire-its/src/test/resources/surefire-1727/src/test/java/jira1727/ErrorInTestFactoryJupiterTest.java (71%)
 copy surefire-api/src/main/java/org/apache/maven/surefire/booter/MainCliOptionsAware.java => surefire-its/src/test/resources/surefire-1727/src/test/java/jira1727/ErrorInTestProvider.java (53%)
 copy surefire-api/src/main/java/org/apache/maven/surefire/booter/TestArtifactInfoAware.java => surefire-its/src/test/resources/surefire-1727/src/test/java/jira1727/ErrorInTestTemplateProviderTest.java (77%)
 copy surefire-api/src/main/java/org/apache/maven/surefire/booter/MainCliOptionsAware.java => surefire-its/src/test/resources/surefire-1727/src/test/java/jira1727/FailureInTestFactoryJupiterTest.java (67%)
 copy surefire-api/src/test/java/org/apache/maven/surefire/booter/ForkingRunListenerTest.java => surefire-its/src/test/resources/surefire-1727/src/test/java/jira1727/FailureInTestProvider.java (51%)
 rename surefire-api/src/main/java/org/apache/maven/surefire/booter/TestArtifactInfoAware.java => surefire-its/src/test/resources/surefire-1727/src/test/java/jira1727/FailureInTestTemplateProviderTest.java (77%)
 copy surefire-its/src/test/resources/{surefire-1688 => surefire-1741}/pom.xml (100%)
 copy surefire-api/src/main/java/org/apache/maven/surefire/booter/DirectoryScannerParametersAware.java => surefire-its/src/test/resources/surefire-1741/src/test/java/jira1741/ErrorInBeforeAllJupiterTest.java (73%)
 copy surefire-api/src/main/java/org/apache/maven/surefire/booter/MainCliOptionsAware.java => surefire-its/src/test/resources/surefire-1741/src/test/java/jira1741/ErrorInParameterizedSourceJupiterTest.java (64%)
 rename surefire-api/src/main/java/org/apache/maven/surefire/booter/MainCliOptionsAware.java => surefire-its/src/test/resources/surefire-1741/src/test/java/jira1741/FailureInParameterizedSourceJupiterTest.java (61%)
 copy surefire-its/src/test/resources/{junit4 => surefire-1744-alwaysIncludeOutputLogs}/pom.xml (77%)
 copy surefire-its/src/test/resources/{surefire-812-log4j-classloader => surefire-1744-alwaysIncludeOutputLogs}/src/main/resources/log4j.properties (100%)
 rename surefire-api/src/main/java/org/apache/maven/surefire/booter/DirectoryScannerParametersAware.java => surefire-its/src/test/resources/surefire-1744-alwaysIncludeOutputLogs/src/test/java/alwaysIncludeOutputLogs/TestSurefire3.java (67%)
 copy surefire-its/src/test/resources/{surefire-1688 => surefire-1748-fail-no-parameters}/pom.xml (100%)
 rename surefire-api/src/main/java/org/apache/maven/surefire/booter/ProviderPropertiesAware.java => surefire-its/src/test/resources/surefire-1748-fail-no-parameters/src/test/java/jira1748/AssertionsFailNoParametersJupiterTest.java (79%)
 copy surefire-its/src/test/resources/{surefire-1688 => surefire-1748}/pom.xml (100%)
 rename surefire-api/src/main/java/org/apache/maven/surefire/booter/TestRequestAware.java => surefire-its/src/test/resources/surefire-1748/src/test/java/jira1748/AssertionsFailEmptyStringParameterJupiterTest.java (78%)


[maven-surefire] 01/01: [SUREFIRE-1695] Support multiple inheritance of @Categories

Posted by ti...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

tibordigana pushed a commit to branch pull/248
in repository https://gitbox.apache.org/repos/asf/maven-surefire.git

commit 74706a0404a677ac60090faa94079cd48369c157
Author: Ioannis Dermitzakis <io...@gebit.de>
AuthorDate: Thu Aug 29 09:48:43 2019 +0200

    [SUREFIRE-1695] Support multiple inheritance of @Categories
---
 .../jiras/Surefire995CategoryInheritanceIT.java    | 122 +++++++++---
 .../surefire-995-categoryInheritance/pom.xml       |   7 +-
 .../test/java/jiras/surefire955/group/ABCTest.java |  36 ++++
 .../test/java/jiras/surefire955/group/ATest.java   |  36 ++++
 .../jiras/surefire955/group/AbstractBCTest.java    |  37 ++++
 .../jiras/surefire955/group/AbstractCTest.java     |  37 ++++
 .../test/java/jiras/surefire955/group/BBCTest.java |  36 ++++
 .../test/java/jiras/surefire955/group/BCTest.java  |  33 ++++
 .../test/java/jiras/surefire955/group/BTest.java   |  37 ++++
 .../jiras/surefire955/group/UncategorizedTest.java |  33 ++++
 .../jiras/surefire955/group/marker/CategoryA.java  |  24 +++
 .../jiras/surefire955/group/marker/CategoryB.java  |  24 +++
 .../jiras/surefire955/group/marker/CategoryC.java  |  24 +++
 surefire-providers/common-junit48/pom.xml          | 220 ++++++++++++++-------
 .../common/junit48/GroupMatcherCategoryFilter.java |  49 ++++-
 .../GroupMatcherCategoryFilterPreJUnit412Test.java | 100 ++++++++++
 .../junit48/GroupMatcherCategoryFilterTest.java    | 138 +++++++++++++
 .../junit48/tests/group/ABCParameterizedTest.java  |  63 ++++++
 .../common/junit48/tests/group/ABCTest.java        |  40 ++++
 .../common/junit48/tests/group/ABMethodTest.java   |  47 +++++
 .../surefire/common/junit48/tests/group/ATest.java |  39 ++++
 .../common/junit48/tests/group/AbstractBCTest.java |  40 ++++
 .../common/junit48/tests/group/AbstractCTest.java  |  39 ++++
 .../common/junit48/tests/group/BBCTest.java        |  40 ++++
 .../common/junit48/tests/group/BCTest.java         |  37 ++++
 .../surefire/common/junit48/tests/group/BTest.java |  39 ++++
 .../junit48/tests/group/UncategorizedTest.java     |  36 ++++
 .../junit48/tests/group/marker/CategoryA.java      |  27 +++
 .../junit48/tests/group/marker/CategoryB.java      |  27 +++
 .../junit48/tests/group/marker/CategoryC.java      |  27 +++
 30 files changed, 1389 insertions(+), 105 deletions(-)

diff --git a/surefire-its/src/test/java/org/apache/maven/surefire/its/jiras/Surefire995CategoryInheritanceIT.java b/surefire-its/src/test/java/org/apache/maven/surefire/its/jiras/Surefire995CategoryInheritanceIT.java
index d776724..c571556 100644
--- a/surefire-its/src/test/java/org/apache/maven/surefire/its/jiras/Surefire995CategoryInheritanceIT.java
+++ b/surefire-its/src/test/java/org/apache/maven/surefire/its/jiras/Surefire995CategoryInheritanceIT.java
@@ -19,68 +19,140 @@ package org.apache.maven.surefire.its.jiras;
  * under the License.
  */
 
+import org.apache.maven.it.VerificationException;
+import org.apache.maven.surefire.its.fixture.OutputValidator;
 import org.apache.maven.surefire.its.fixture.SurefireJUnit4IntegrationTestCase;
 import org.apache.maven.surefire.its.fixture.SurefireLauncher;
 import org.junit.Test;
 
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
+
 /**
  * @author <a href="mailto:tibordigana@apache.org">Tibor Digana (tibor17)</a>
  * @see <a href="https://issues.apache.org/jira/browse/SUREFIRE-995">SUREFIRE-995</a>
  * @since 2.18.1
  */
-public class Surefire995CategoryInheritanceIT
-    extends SurefireJUnit4IntegrationTestCase
+public class Surefire995CategoryInheritanceIT extends SurefireJUnit4IntegrationTestCase
 {
 
     @Test
     public void negativeTestShouldRunAllCategories()
     {
         unpack()
-            .setTestToRun( "Special*Test" )
-            .executeTest()
-            .verifyErrorFree( 3 );
+                .setTestToRun( "Special*Test" )
+                .executeTest()
+                .verifyErrorFree( 3 );
     }
 
     @Test
     public void junit411ShouldRunExplicitCategory()
     {
-        unpack()
-            .addGoal( "-Ppositive-tests" )
-            .sysProp( "version.junit", "4.11" )
-            .executeTest()
-            .verifyErrorFree( 1 )
-            .verifyTextInLog( "CategorizedTest#a" );
+        final OutputValidator outputValidator = unpack()
+                .addGoal( "-Ppositive-tests" )
+                .sysProp( "version.junit", "4.11" )
+                .executeTest();
+
+        outputValidator
+                .verifyErrorFree( 1 )
+                .verifyTextInLog( "CategorizedTest#a" );
     }
 
     @Test
     public void junit411ShouldExcludeExplicitCategory()
     {
-        unpack()
-            .addGoal( "-Ppositive-tests-excluded-categories" )
-            .sysProp( "version.junit", "4.11" )
-            .executeTest()
-            .verifyErrorFree( 2 );
+        final OutputValidator outputValidator = unpack()
+                .addGoal( "-Ppositive-tests-excluded-categories" )
+                .sysProp( "version.junit", "4.11" )
+                .executeTest();
+        // SpecialCategorizedTest inherits the excluded annotation but should still run as
+        // until junit 4.11, the Category annotation is not inherited
+        outputValidator
+                .verifyTextInLog( "SpecialCategorizedTest#b" )
+                .verifyErrorFree( 16 );
     }
 
     @Test
     public void junit412ShouldRunInheritedCategory()
     {
         unpack()
-            .setTestToRun( "Special*Test" )
-            .addGoal( "-Ppositive-tests" )
-            .executeTest()
-            .verifyErrorFree( 2 );
+                .setTestToRun( "Special*Test" )
+                .addGoal( "-Ppositive-tests" )
+                .executeTest()
+                .verifyErrorFree( 2 );
     }
 
     @Test
     public void junit412ShouldExcludeInheritedCategory()
     {
         unpack()
-            .setTestToRun( "Special*Test" )
-            .addGoal( "-Ppositive-tests-excluded-categories" )
-            .executeTest()
-            .verifyErrorFree( 1 )
-            .verifyTextInLog( "SpecialNonCategoryTest#test" );
+                .setTestToRun( "Special*Test" )
+                .addGoal( "-Ppositive-tests-excluded-categories" )
+                .executeTest()
+                .verifyErrorFree( 1 )
+                .verifyTextInLog( "SpecialNonCategoryTest#test" );
+    }
+
+    @Test
+    public void junit411ShouldIgnoreInheritedCategories() throws VerificationException
+    {
+        // GIVEN a project using junit 4.11
+        final OutputValidator outputValidator = unpack()
+                .addGoal( "-Ppositive-tests-included-and-excluded-categories" )
+                .sysProp( "version.junit", "4.11" )
+                // AND the tests marked with CategoryB are marked for execution
+                .setGroups( "jiras.surefire955.group.marker.CategoryB" )
+                // WHEN the tests are executed
+                .executeTest();
+
+        // THEN only the tests in classes directly annotated should be executed
+        outputValidator
+                // Test runs when the category is present in the concrete class
+                .verifyTextInLog( "Running jiras.surefire955.group.BBCTest" )
+                .verifyTextInLog( "BBCTest#bbc" )
+                .verifyTextInLog( "AbstractBCTest#pb" )
+                .verifyTextInLog( "AbstractCTest#pc" )
+                .verifyTextInLog( "Running jiras.surefire955.group.BTest" )
+                .verifyTextInLog( "BTest#b" )
+                // Test does not run when there is no category in the concrete class
+                .assertThatLogLine( containsString( "BCTest#bc" ), is( 0 ) )
+                .assertThatLogLine( containsString( "ABCTest#abc" ), is( 0 ) )
+                .verifyErrorFree( 4 );
+    }
+
+    @Test
+    public void junit412ShouldExecuteInheritedCategories() throws VerificationException
+    {
+        // GIVEN a project using junit 4.12
+        final OutputValidator outputValidator = unpack()
+                .addGoal( "-Ppositive-tests-included-and-excluded-categories" )
+                .sysProp( "version.junit", "4.12" )
+                // AND the tests marked with CategoryB are marked for execution
+                .setGroups( "jiras.surefire955.group.marker.CategoryB" )
+                // WHEN the tests are executed
+                .executeTest();
+
+        // THEN the tests in classes directly marked with the CategoryB
+        outputValidator
+                .verifyErrorFree( 10 )
+                .verifyTextInLog( "Running jiras.surefire955.group.BBCTest" )
+                // AND Test runs when an already existing category is added in the concrete class
+                .verifyTextInLog( "BBCTest#bbc" )
+                .verifyTextInLog( "AbstractBCTest#pb" )
+                .verifyTextInLog( "AbstractCTest#pc" )
+                .verifyTextInLog( "Running jiras.surefire955.group.BTest" )
+                .verifyTextInLog( "BTest#b" )
+                // AND the tests in classes inheriting the CategoryB category should be executed
+                .verifyTextInLog( "Running jiras.surefire955.group.ABCTest" )
+                // AND Test runs when the concrete class has an additional (not excluded) category
+                .verifyTextInLog( "ABCTest#abc" )
+                .verifyTextInLog( "AbstractBCTest#pb" )
+                .verifyTextInLog( "AbstractCTest#pc" )
+                .verifyTextInLog( "Running jiras.surefire955.group.BCTest" )
+                // AND Test runs when there is no category in the concrete class
+                .verifyTextInLog( "BCTest#bc" )
+                .verifyTextInLog( "AbstractBCTest#pb" )
+                .verifyTextInLog( "AbstractCTest#pc" );
     }
 
     private SurefireLauncher unpack()
diff --git a/surefire-its/src/test/resources/surefire-995-categoryInheritance/pom.xml b/surefire-its/src/test/resources/surefire-995-categoryInheritance/pom.xml
index 4662f24..f59e133 100644
--- a/surefire-its/src/test/resources/surefire-995-categoryInheritance/pom.xml
+++ b/surefire-its/src/test/resources/surefire-995-categoryInheritance/pom.xml
@@ -86,5 +86,8 @@
         </plugins>
       </build>
     </profile>
-  </profiles>
-</project>
+    <profile>
+      <id>positive-tests-included-and-excluded-categories</id>
+     </profile>
+   </profiles>
+ </project>
diff --git a/surefire-its/src/test/resources/surefire-995-categoryInheritance/src/test/java/jiras/surefire955/group/ABCTest.java b/surefire-its/src/test/resources/surefire-995-categoryInheritance/src/test/java/jiras/surefire955/group/ABCTest.java
new file mode 100644
index 0000000..1d37ff5
--- /dev/null
+++ b/surefire-its/src/test/resources/surefire-995-categoryInheritance/src/test/java/jiras/surefire955/group/ABCTest.java
@@ -0,0 +1,36 @@
+package jiras.surefire955.group;
+
+/*
+ * 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 jiras.surefire955.group.marker.CategoryA;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+@Category( CategoryA.class )
+public class ABCTest extends jiras.surefire955.group.AbstractBCTest
+{
+
+    @Test
+    public void abc()
+    {
+        System.out.println( "ABCTest#abc" );
+    }
+
+}
diff --git a/surefire-its/src/test/resources/surefire-995-categoryInheritance/src/test/java/jiras/surefire955/group/ATest.java b/surefire-its/src/test/resources/surefire-995-categoryInheritance/src/test/java/jiras/surefire955/group/ATest.java
new file mode 100644
index 0000000..0fef6c8
--- /dev/null
+++ b/surefire-its/src/test/resources/surefire-995-categoryInheritance/src/test/java/jiras/surefire955/group/ATest.java
@@ -0,0 +1,36 @@
+package jiras.surefire955.group;
+
+/*
+ * 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 jiras.surefire955.group.marker.CategoryA;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+@Category( CategoryA.class )
+public class ATest
+{
+
+    @Test
+    public void a()
+    {
+        System.out.println( "ATest#a" );
+    }
+
+}
diff --git a/surefire-its/src/test/resources/surefire-995-categoryInheritance/src/test/java/jiras/surefire955/group/AbstractBCTest.java b/surefire-its/src/test/resources/surefire-995-categoryInheritance/src/test/java/jiras/surefire955/group/AbstractBCTest.java
new file mode 100644
index 0000000..8511917
--- /dev/null
+++ b/surefire-its/src/test/resources/surefire-995-categoryInheritance/src/test/java/jiras/surefire955/group/AbstractBCTest.java
@@ -0,0 +1,37 @@
+package jiras.surefire955.group;
+
+/*
+ * 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 jiras.surefire955.group.marker.CategoryB;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+
+@Category( CategoryB.class )
+public abstract class AbstractBCTest extends jiras.surefire955.group.AbstractCTest
+{
+
+    @Test
+    public void pb()
+    {
+        System.out.println( "AbstractBCTest#pb" );
+    }
+
+}
diff --git a/surefire-its/src/test/resources/surefire-995-categoryInheritance/src/test/java/jiras/surefire955/group/AbstractCTest.java b/surefire-its/src/test/resources/surefire-995-categoryInheritance/src/test/java/jiras/surefire955/group/AbstractCTest.java
new file mode 100644
index 0000000..34745c6
--- /dev/null
+++ b/surefire-its/src/test/resources/surefire-995-categoryInheritance/src/test/java/jiras/surefire955/group/AbstractCTest.java
@@ -0,0 +1,37 @@
+package jiras.surefire955.group;
+
+/*
+ * 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 jiras.surefire955.group.marker.CategoryC;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+
+@Category( CategoryC.class )
+public abstract class AbstractCTest
+{
+
+    @Test
+    public void pc()
+    {
+        System.out.println( "AbstractCTest#pc" );
+    }
+
+}
diff --git a/surefire-its/src/test/resources/surefire-995-categoryInheritance/src/test/java/jiras/surefire955/group/BBCTest.java b/surefire-its/src/test/resources/surefire-995-categoryInheritance/src/test/java/jiras/surefire955/group/BBCTest.java
new file mode 100644
index 0000000..0fbe803
--- /dev/null
+++ b/surefire-its/src/test/resources/surefire-995-categoryInheritance/src/test/java/jiras/surefire955/group/BBCTest.java
@@ -0,0 +1,36 @@
+package jiras.surefire955.group;
+
+/*
+ * 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 jiras.surefire955.group.marker.CategoryB;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+@Category( CategoryB.class )
+public class BBCTest extends jiras.surefire955.group.AbstractBCTest
+{
+
+    @Test
+    public void bbc()
+    {
+        System.out.println( "BBCTest#bbc" );
+    }
+
+}
diff --git a/surefire-its/src/test/resources/surefire-995-categoryInheritance/src/test/java/jiras/surefire955/group/BCTest.java b/surefire-its/src/test/resources/surefire-995-categoryInheritance/src/test/java/jiras/surefire955/group/BCTest.java
new file mode 100644
index 0000000..e99c2b6
--- /dev/null
+++ b/surefire-its/src/test/resources/surefire-995-categoryInheritance/src/test/java/jiras/surefire955/group/BCTest.java
@@ -0,0 +1,33 @@
+package jiras.surefire955.group;
+
+/*
+ * 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.junit.Test;
+
+public class BCTest extends jiras.surefire955.group.AbstractBCTest
+{
+
+    @Test
+    public void bc()
+    {
+        System.out.println( "BCTest#bc" );
+    }
+
+}
diff --git a/surefire-its/src/test/resources/surefire-995-categoryInheritance/src/test/java/jiras/surefire955/group/BTest.java b/surefire-its/src/test/resources/surefire-995-categoryInheritance/src/test/java/jiras/surefire955/group/BTest.java
new file mode 100644
index 0000000..d0bf839
--- /dev/null
+++ b/surefire-its/src/test/resources/surefire-995-categoryInheritance/src/test/java/jiras/surefire955/group/BTest.java
@@ -0,0 +1,37 @@
+package jiras.surefire955.group;
+
+/*
+ * 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 jiras.surefire955.group.marker.CategoryB;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+
+@Category( CategoryB.class )
+public class BTest
+{
+
+    @Test
+    public void b()
+    {
+        System.out.println( "BTest#b" );
+    }
+
+}
diff --git a/surefire-its/src/test/resources/surefire-995-categoryInheritance/src/test/java/jiras/surefire955/group/UncategorizedTest.java b/surefire-its/src/test/resources/surefire-995-categoryInheritance/src/test/java/jiras/surefire955/group/UncategorizedTest.java
new file mode 100644
index 0000000..06f8554
--- /dev/null
+++ b/surefire-its/src/test/resources/surefire-995-categoryInheritance/src/test/java/jiras/surefire955/group/UncategorizedTest.java
@@ -0,0 +1,33 @@
+package jiras.surefire955.group;
+
+/*
+ * 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.junit.Test;
+
+public class UncategorizedTest
+{
+
+    @Test
+    public void a()
+    {
+        System.out.println( "Uncategorized#a" );
+    }
+
+}
diff --git a/surefire-its/src/test/resources/surefire-995-categoryInheritance/src/test/java/jiras/surefire955/group/marker/CategoryA.java b/surefire-its/src/test/resources/surefire-995-categoryInheritance/src/test/java/jiras/surefire955/group/marker/CategoryA.java
new file mode 100644
index 0000000..cfda982
--- /dev/null
+++ b/surefire-its/src/test/resources/surefire-995-categoryInheritance/src/test/java/jiras/surefire955/group/marker/CategoryA.java
@@ -0,0 +1,24 @@
+package jiras.surefire955.group.marker;
+
+/*
+ * 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.
+ */
+
+public interface CategoryA
+{
+}
diff --git a/surefire-its/src/test/resources/surefire-995-categoryInheritance/src/test/java/jiras/surefire955/group/marker/CategoryB.java b/surefire-its/src/test/resources/surefire-995-categoryInheritance/src/test/java/jiras/surefire955/group/marker/CategoryB.java
new file mode 100644
index 0000000..16f269e
--- /dev/null
+++ b/surefire-its/src/test/resources/surefire-995-categoryInheritance/src/test/java/jiras/surefire955/group/marker/CategoryB.java
@@ -0,0 +1,24 @@
+package jiras.surefire955.group.marker;
+
+/*
+ * 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.
+ */
+
+public interface CategoryB
+{
+}
diff --git a/surefire-its/src/test/resources/surefire-995-categoryInheritance/src/test/java/jiras/surefire955/group/marker/CategoryC.java b/surefire-its/src/test/resources/surefire-995-categoryInheritance/src/test/java/jiras/surefire955/group/marker/CategoryC.java
new file mode 100644
index 0000000..18dd3bb
--- /dev/null
+++ b/surefire-its/src/test/resources/surefire-995-categoryInheritance/src/test/java/jiras/surefire955/group/marker/CategoryC.java
@@ -0,0 +1,24 @@
+package jiras.surefire955.group.marker;
+
+/*
+ * 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.
+ */
+
+public interface CategoryC
+{
+}
diff --git a/surefire-providers/common-junit48/pom.xml b/surefire-providers/common-junit48/pom.xml
index fa80e47..a011654 100644
--- a/surefire-providers/common-junit48/pom.xml
+++ b/surefire-providers/common-junit48/pom.xml
@@ -17,77 +17,161 @@
   ~ under the License.
   -->
 
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
 
-  <parent>
-    <groupId>org.apache.maven.surefire</groupId>
-    <artifactId>surefire-providers</artifactId>
-    <version>3.0.0-SNAPSHOT</version>
-  </parent>
+    <parent>
+        <groupId>org.apache.maven.surefire</groupId>
+        <artifactId>surefire-providers</artifactId>
+        <version>3.0.0-SNAPSHOT</version>
+    </parent>
 
-  <artifactId>common-junit48</artifactId>
+    <artifactId>common-junit48</artifactId>
 
-  <name>Shared JUnit48 Provider Code</name>
-  <description>Shared JUnit48 Provider Code</description>
+    <name>Shared JUnit48 Provider Code</name>
+    <description>Shared JUnit48 Provider Code</description>
 
-  <dependencies>
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>4.8.1</version>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.maven.surefire</groupId>
-      <artifactId>common-junit4</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.maven.surefire</groupId>
-      <artifactId>surefire-grouper</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.maven.shared</groupId>
-      <artifactId>maven-shared-utils</artifactId>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.jacoco</groupId>
-        <artifactId>jacoco-maven-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>jacoco-agent</id>
-            <goals>
-              <goal>prepare-agent</goal>
-            </goals>
-          </execution>
-        </executions>
-        <configuration>
-          <propertyName>jacoco.agent</propertyName>
-        </configuration>
-      </plugin>
-      <plugin>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <argLine>${jvm.args.tests} ${jacoco.agent}</argLine>
-          <includes>
-            <include>**/JUnit4SuiteTest.java</include>
-          </includes>
-        </configuration>
-        <dependencies>
-          <dependency>
+    <dependencies>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.8.1</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.maven.surefire</groupId>
+            <artifactId>common-junit4</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
             <groupId>org.apache.maven.surefire</groupId>
-            <artifactId>surefire-shadefire</artifactId>
-            <version>3.0.0-M4</version> <!-- ${shadedVersion}, but resolved due to https://issues.apache.org/jira/browse/MRELEASE-799 -->
-          </dependency>
-        </dependencies>
-      </plugin>
-    </plugins>
-  </build>
+            <artifactId>surefire-grouper</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.maven.shared</groupId>
+            <artifactId>maven-shared-utils</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.jacoco</groupId>
+                <artifactId>jacoco-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>jacoco-agent</id>
+                        <goals>
+                            <goal>prepare-agent</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <configuration>
+                    <propertyName>jacoco.agent</propertyName>
+                </configuration>
+            </plugin>
+            <plugin>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>junit-4.11</id>
+                        <phase>process-test-sources</phase>
+                        <goals>
+                            <goal>copy</goal>
+                        </goals>
+                        <configuration>
+                            <outputDirectory>${project.build.directory}/endorsed-test</outputDirectory>
+                            <overWriteIfNewer>false</overWriteIfNewer>
+                            <artifactItems>
+                                <artifactItem>
+                                    <groupId>junit</groupId>
+                                    <artifactId>junit</artifactId>
+                                    <version>4.11</version>
+                                    <type>jar</type>
+                                </artifactItem>
+                            </artifactItems>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>test</id>
+                        <phase>process-test-sources</phase>
+                        <goals>
+                            <goal>copy</goal>
+                        </goals>
+                        <configuration>
+                            <outputDirectory>${project.build.directory}/endorsed-test</outputDirectory>
+                            <overWriteIfNewer>false</overWriteIfNewer>
+                            <artifactItems>
+                                <artifactItem>
+                                    <groupId>junit</groupId>
+                                    <artifactId>junit</artifactId>
+                                    <version>4.12</version>
+                                    <type>jar</type>
+                                </artifactItem>
+                            </artifactItems>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>default-test</id>
+                        <phase>test</phase>
+                        <goals>
+                            <goal>test</goal>
+                        </goals>
+                        <configuration>
+                            <includes>
+                                <include>**/JUnit4SuiteTest.java</include>
+                            </includes>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>junit-4.11</id>
+                        <phase>test</phase>
+                        <goals>
+                            <goal>test</goal>
+                        </goals>
+                        <configuration>
+                            <test>GroupMatcherCategoryFilterPreJUnit412Test$JUnit4SuiteTest</test>
+                            <classpathDependencyExcludes>junit:junit</classpathDependencyExcludes>
+                            <additionalClasspathElements>
+                                <additionalClasspathElement>${project.build.directory}/endorsed-test/junit-4.11.jar</additionalClasspathElement>
+                            </additionalClasspathElements>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>junit-4.12</id>
+                        <phase>test</phase>
+                        <goals>
+                            <goal>test</goal>
+                        </goals>
+                        <configuration>
+                            <test>GroupMatcherCategoryFilterTest$JUnit4SuiteTest</test>
+                            <classpathDependencyExcludes>junit:junit</classpathDependencyExcludes>
+                            <additionalClasspathElements>
+                                <additionalClasspathElement>${project.build.directory}/endorsed-test/junit-4.12.jar</additionalClasspathElement>
+                            </additionalClasspathElements>
+                        </configuration>
+                    </execution>
+                </executions>
+                <configuration>
+                    <argLine>${jvm.args.tests} ${jacoco.agent}</argLine>
+                </configuration>
+                <dependencies>
+                    <dependency>
+                        <groupId>org.apache.maven.surefire</groupId>
+                        <artifactId>surefire-shadefire</artifactId>
+                        <version>3.0.0-M4
+                        </version> <!-- ${shadedVersion}, but resolved due to https://issues.apache.org/jira/browse/MRELEASE-799 -->
+                    </dependency>
+                </dependencies>
+            </plugin>
+        </plugins>
+    </build>
 </project>
diff --git a/surefire-providers/common-junit48/src/main/java/org/apache/maven/surefire/common/junit48/GroupMatcherCategoryFilter.java b/surefire-providers/common-junit48/src/main/java/org/apache/maven/surefire/common/junit48/GroupMatcherCategoryFilter.java
index 484defd..287d327 100644
--- a/surefire-providers/common-junit48/src/main/java/org/apache/maven/surefire/common/junit48/GroupMatcherCategoryFilter.java
+++ b/surefire-providers/common-junit48/src/main/java/org/apache/maven/surefire/common/junit48/GroupMatcherCategoryFilter.java
@@ -26,6 +26,7 @@ import org.junit.experimental.categories.Category;
 import org.junit.runner.Description;
 import org.junit.runner.manipulation.Filter;
 
+import java.lang.annotation.Inherited;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.Set;
@@ -33,9 +34,13 @@ import java.util.Set;
 import static java.util.Collections.addAll;
 import static org.junit.runner.Description.createSuiteDescription;
 
-final class GroupMatcherCategoryFilter
-    extends Filter
+final class GroupMatcherCategoryFilter extends Filter
 {
+    /**
+     * Only traverse the tree if <code>@Category</code> annotation is inherited (since <code>junit 4.12</code>).
+     */
+    private static final boolean IS_CATEGORY_INHERITED = Category.class.isAnnotationPresent( Inherited.class );
+
     private final AndGroupMatcher matcher;
 
     GroupMatcherCategoryFilter( GroupMatcher included, GroupMatcher excluded )
@@ -63,33 +68,56 @@ final class GroupMatcherCategoryFilter
     @Override
     public boolean shouldRun( Description description )
     {
-        if ( description.getMethodName() == null || description.getTestClass() == null )
+        if ( invalidTestClass( description ) )
         {
             return shouldRun( description, null, null );
         }
+
+        if ( describesTestClass( description ) ) // is a test class
+        {
+            Class<?> testClass = description.getTestClass();
+            return shouldRun( description, null, testClass );
+        }
         else
+        // is a test method
         {
             Class<?> testClass = description.getTestClass();
             return shouldRun( description, createSuiteDescription( testClass ), testClass );
         }
     }
 
+    private boolean describesTestClass( Description description )
+    {
+        String methodName = description.getMethodName();
+        // Description parser in Junit 4.8 can return "null" String.
+        return methodName == null || methodName.equals( "null" );
+    }
+
+    private boolean invalidTestClass( Description description )
+    {
+        return description.getTestClass() == null;
+    }
+
     private static void findSuperclassCategories( Set<Class<?>> cats, Class<?> clazz )
     {
-        if ( clazz != null && clazz.getSuperclass() != null )
+        if ( IS_CATEGORY_INHERITED && hasSuperclass( clazz ) )
         {
             Category cat = clazz.getSuperclass().getAnnotation( Category.class );
             if ( cat != null )
             {
+                // Found categories in current superclass
                 addAll( cats, cat.value() );
             }
-            else
-            {
-                findSuperclassCategories( cats, clazz.getSuperclass() );
-            }
+            // Search the hierarchy
+            findSuperclassCategories( cats, clazz.getSuperclass() );
         }
     }
 
+    private static boolean hasSuperclass( Class<?> clazz )
+    {
+        return clazz != null && clazz.getSuperclass() != null;
+    }
+
     private boolean shouldRun( Description description, Description parent, Class<?> parentClass )
     {
         if ( matcher == null )
@@ -102,6 +130,7 @@ final class GroupMatcherCategoryFilter
             Category cat = description.getAnnotation( Category.class );
             if ( cat != null )
             {
+                // Found categories in current description
                 addAll( cats, cat.value() );
             }
 
@@ -110,10 +139,10 @@ final class GroupMatcherCategoryFilter
                 cat = parent.getAnnotation( Category.class );
                 if ( cat != null )
                 {
+                    // Found categories in current parent
                     addAll( cats, cat.value() );
                 }
             }
-
             if ( parentClass != null )
             {
                 findSuperclassCategories( cats, parentClass );
@@ -125,12 +154,12 @@ final class GroupMatcherCategoryFilter
                 cat = testClass.getAnnotation( Category.class );
                 if ( cat != null )
                 {
+                    // Found categories in current testClass
                     addAll( cats, cat.value() );
                 }
             }
 
             cats.remove( null );
-
             boolean result = matcher.enabled( cats.toArray( new Class<?>[cats.size()] ) );
 
             if ( !result )
diff --git a/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/GroupMatcherCategoryFilterPreJUnit412Test.java b/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/GroupMatcherCategoryFilterPreJUnit412Test.java
new file mode 100644
index 0000000..543e585
--- /dev/null
+++ b/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/GroupMatcherCategoryFilterPreJUnit412Test.java
@@ -0,0 +1,100 @@
+package org.apache.maven.surefire.common.junit48;
+
+/*
+ * 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 junit.framework.JUnit4TestAdapter;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+import junit.runner.Version;
+import org.apache.maven.surefire.common.junit48.tests.group.ABCParameterizedTest;
+import org.apache.maven.surefire.common.junit48.tests.group.ABCTest;
+import org.apache.maven.surefire.common.junit48.tests.group.ATest;
+import org.apache.maven.surefire.common.junit48.tests.group.BCTest;
+import org.apache.maven.surefire.group.match.GroupMatcher;
+import org.apache.maven.surefire.group.match.SingleGroupMatcher;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.runner.Description.createSuiteDescription;
+import static org.junit.runner.Description.createTestDescription;
+
+/**
+ * Before JUnit 4.12, @Category annotation was not @Inherited. These tests make sure the implied contract is honored.
+ */
+public class GroupMatcherCategoryFilterPreJUnit412Test
+{
+    private GroupMatcherCategoryFilter cut;
+
+    @BeforeClass
+    public static void printVersion()
+    {
+        System.out.println( Version.id() );
+    }
+
+    @Test
+    public void shouldNotMatchIncludedCategoryInParent()
+    {
+        GroupMatcher included =
+            new SingleGroupMatcher( "org.apache.maven.surefire.common.junit48.tests.group.marker.CategoryB" );
+        GroupMatcher excluded = null;
+        cut = new GroupMatcherCategoryFilter( included, excluded );
+        assertFalse( cut.shouldRun( createSuiteDescription( BCTest.class ) ) );
+        assertFalse( cut.shouldRun( createSuiteDescription( ATest.class ) ) );
+    }
+
+    @Test
+    public void shouldNotMatchIncludedCategoryInHierarchy()
+    {
+        GroupMatcher included =
+            new SingleGroupMatcher( "org.apache.maven.surefire.common.junit48.tests.group.marker.CategoryC" );
+        GroupMatcher excluded = null;
+        cut = new GroupMatcherCategoryFilter( included, excluded );
+        assertFalse( cut.shouldRun( createSuiteDescription( ABCTest.class ) ) );
+        assertFalse( cut.shouldRun( createSuiteDescription( BCTest.class ) ) );
+        assertFalse( cut.shouldRun( createSuiteDescription( ATest.class ) ) );
+    }
+
+    @Test
+    public void shouldNotMatchIncludedCategoryInParentWhenSelfHasAnother()
+    {
+        GroupMatcher included =
+            new SingleGroupMatcher( "org.apache.maven.surefire.common.junit48.tests.group.marker.CategoryB" );
+        GroupMatcher excluded = null;
+        cut = new GroupMatcherCategoryFilter( included, excluded );
+        assertFalse( cut.shouldRun( createSuiteDescription( ABCTest.class ) ) );
+        assertFalse( cut.shouldRun( createTestDescription( ABCTest.class, "abc" ) ) );
+        assertFalse( cut.shouldRun( createSuiteDescription( ABCParameterizedTest.class ) ) );
+        assertFalse( cut.shouldRun( createTestDescription( ABCParameterizedTest.class, "abc" ) ) );
+    }
+
+    /**
+     *
+     */
+    public static class JUnit4SuiteTest extends TestCase
+    {
+        public static junit.framework.Test suite()
+        {
+            TestSuite suite = new TestSuite();
+            suite.addTest( new JUnit4TestAdapter( GroupMatcherCategoryFilterPreJUnit412Test.class ) );
+            return suite;
+        }
+    }
+}
diff --git a/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/GroupMatcherCategoryFilterTest.java b/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/GroupMatcherCategoryFilterTest.java
new file mode 100644
index 0000000..6ddb11a
--- /dev/null
+++ b/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/GroupMatcherCategoryFilterTest.java
@@ -0,0 +1,138 @@
+package org.apache.maven.surefire.common.junit48;
+
+/*
+ * 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 junit.framework.JUnit4TestAdapter;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+import junit.runner.Version;
+import org.apache.maven.surefire.common.junit48.tests.group.ABCParameterizedTest;
+import org.apache.maven.surefire.common.junit48.tests.group.ABCTest;
+import org.apache.maven.surefire.common.junit48.tests.group.ATest;
+import org.apache.maven.surefire.common.junit48.tests.group.BBCTest;
+import org.apache.maven.surefire.common.junit48.tests.group.BCTest;
+import org.apache.maven.surefire.common.junit48.tests.group.BTest;
+import org.apache.maven.surefire.group.match.GroupMatcher;
+import org.apache.maven.surefire.group.match.SingleGroupMatcher;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.runner.Description.createSuiteDescription;
+import static org.junit.runner.Description.createTestDescription;
+
+/**
+ * Tests covering inheritance in @Categories for Test classes.
+ */
+public class GroupMatcherCategoryFilterTest
+{
+    private GroupMatcherCategoryFilter cut;
+
+    @BeforeClass
+    public static void printVersion()
+    {
+        System.out.println( Version.id() );
+    }
+
+    @Test
+    public void shouldMatchIncludedCategoryInSelf()
+    {
+        GroupMatcher included =
+            new SingleGroupMatcher( "org.apache.maven.surefire.common.junit48.tests.group.marker.CategoryB" );
+        GroupMatcher excluded = null;
+        cut = new GroupMatcherCategoryFilter( included, excluded );
+        assertTrue( cut.shouldRun( createSuiteDescription( BTest.class ) ) );
+    }
+
+    @Test
+    public void shouldMatchIncludedCategoryInParent()
+    {
+        GroupMatcher included =
+            new SingleGroupMatcher( "org.apache.maven.surefire.common.junit48.tests.group.marker.CategoryB" );
+        GroupMatcher excluded = null;
+        cut = new GroupMatcherCategoryFilter( included, excluded );
+        assertTrue( cut.shouldRun( createSuiteDescription( BCTest.class ) ) );
+        assertFalse( cut.shouldRun( createSuiteDescription( ATest.class ) ) );
+    }
+
+    @Test
+    public void shouldMatchIncludedCategoryInHierarchy()
+    {
+        GroupMatcher included =
+            new SingleGroupMatcher( "org.apache.maven.surefire.common.junit48.tests.group.marker.CategoryC" );
+        GroupMatcher excluded = null;
+        cut = new GroupMatcherCategoryFilter( included, excluded );
+        assertTrue( cut.shouldRun( createSuiteDescription( ABCTest.class ) ) );
+        assertTrue( cut.shouldRun( createSuiteDescription( BCTest.class ) ) );
+        assertFalse( cut.shouldRun( createSuiteDescription( ATest.class ) ) );
+    }
+
+    @Test
+    public void shouldMatchIncludedCategoryInParentWhenSelfHasAnother()
+    {
+        GroupMatcher included =
+            new SingleGroupMatcher( "org.apache.maven.surefire.common.junit48.tests.group.marker.CategoryB" );
+        GroupMatcher excluded = null;
+        cut = new GroupMatcherCategoryFilter( included, excluded );
+        assertTrue( cut.shouldRun( createSuiteDescription( ABCTest.class ) ) );
+        assertTrue( cut.shouldRun( createTestDescription( ABCTest.class, "abc" ) ) );
+        assertTrue( cut.shouldRun( createSuiteDescription( ABCParameterizedTest.class ) ) );
+        assertTrue( cut.shouldRun( createTestDescription( ABCParameterizedTest.class, "abc" ) ) );
+    }
+
+    @Test
+    public void shouldNotMatchIncludedCategoryInParentWhenSelfHasExcludedCategory()
+    {
+        GroupMatcher included =
+            new SingleGroupMatcher( "org.apache.maven.surefire.common.junit48.tests.group.marker.CategoryB" );
+        GroupMatcher excluded =
+            new SingleGroupMatcher( "org.apache.maven.surefire.common.junit48.tests.group.marker.CategoryA" );
+        cut = new GroupMatcherCategoryFilter( included, excluded );
+        assertFalse( cut.shouldRun( createSuiteDescription( ABCTest.class ) ) );
+        assertTrue( cut.shouldRun( createSuiteDescription( BBCTest.class ) ) );
+        assertTrue( cut.shouldRun( createSuiteDescription( BTest.class ) ) );
+    }
+
+    @Test
+    public void shouldMatchExcludedCategoryInSelf()
+    {
+        GroupMatcher included = null;
+        GroupMatcher excluded =
+            new SingleGroupMatcher( "org.apache.maven.surefire.common.junit48.tests.group.marker.CategoryA" );
+        cut = new GroupMatcherCategoryFilter( included, excluded );
+        assertFalse( cut.shouldRun( createSuiteDescription( ATest.class ) ) );
+        assertTrue( cut.shouldRun( createSuiteDescription( BTest.class ) ) );
+        assertTrue( cut.shouldRun( createSuiteDescription( BBCTest.class ) ) );
+    }
+
+    /**
+     *
+     */
+    public static class JUnit4SuiteTest extends TestCase
+    {
+        public static junit.framework.Test suite()
+        {
+            TestSuite suite = new TestSuite();
+            suite.addTest( new JUnit4TestAdapter( GroupMatcherCategoryFilterTest.class ) );
+            return suite;
+        }
+    }
+}
diff --git a/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/group/ABCParameterizedTest.java b/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/group/ABCParameterizedTest.java
new file mode 100644
index 0000000..a1cd44a
--- /dev/null
+++ b/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/group/ABCParameterizedTest.java
@@ -0,0 +1,63 @@
+package org.apache.maven.surefire.common.junit48.tests.group;
+
+/*
+ * 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.common.junit48.tests.group.marker.CategoryA;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * ABCParameterizedTest.
+ */
+@Category( CategoryA.class )
+@RunWith( Parameterized.class )
+public class ABCParameterizedTest
+    extends AbstractBCTest
+{
+    @Parameterized.Parameters
+    public static List<Object[]> data()
+    {
+        return Arrays.asList( 
+                              new Object[][] { 
+                                  { 0 }, 
+                                  { 1 }, 
+                                  { 6 } 
+                                  } );
+    }
+
+    private int number;
+
+    public ABCParameterizedTest( int number )
+    {
+        this.number = number;
+    }
+
+    @Test
+    public void abc()
+    {
+        System.out.println( "ABCTest#abc(" + number + ")" );
+    }
+
+}
diff --git a/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/group/ABCTest.java b/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/group/ABCTest.java
new file mode 100644
index 0000000..63749aa
--- /dev/null
+++ b/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/group/ABCTest.java
@@ -0,0 +1,40 @@
+package org.apache.maven.surefire.common.junit48.tests.group;
+
+/*
+ * 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.common.junit48.tests.group.marker.CategoryA;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+/**
+ * ABCTest.
+ */
+@Category( CategoryA.class )
+public class ABCTest
+    extends AbstractBCTest
+{
+
+    @Test
+    public void abc()
+    {
+        System.out.println( "ABCTest#abc" );
+    }
+
+}
diff --git a/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/group/ABMethodTest.java b/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/group/ABMethodTest.java
new file mode 100644
index 0000000..5146c55
--- /dev/null
+++ b/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/group/ABMethodTest.java
@@ -0,0 +1,47 @@
+package org.apache.maven.surefire.common.junit48.tests.group;
+
+/*
+ * 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.common.junit48.tests.group.marker.CategoryA;
+import org.apache.maven.surefire.common.junit48.tests.group.marker.CategoryB;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+/**
+ * ABMethodTest.
+ */
+@Category( CategoryA.class )
+public class ABMethodTest
+{
+
+    @Test
+    public void a()
+    {
+        System.out.println( "ATest#a" );
+    }
+
+    @Category( CategoryB.class )
+    @Test
+    public void b()
+    {
+        System.out.println( "ATest#b" );
+    }
+
+}
diff --git a/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/group/ATest.java b/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/group/ATest.java
new file mode 100644
index 0000000..3f2f9d5
--- /dev/null
+++ b/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/group/ATest.java
@@ -0,0 +1,39 @@
+package org.apache.maven.surefire.common.junit48.tests.group;
+
+/*
+ * 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.common.junit48.tests.group.marker.CategoryA;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+/**
+ * ATest.
+ */
+@Category( CategoryA.class )
+public class ATest
+{
+
+    @Test
+    public void a()
+    {
+        System.out.println( "ATest#a" );
+    }
+
+}
diff --git a/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/group/AbstractBCTest.java b/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/group/AbstractBCTest.java
new file mode 100644
index 0000000..8cef8ab
--- /dev/null
+++ b/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/group/AbstractBCTest.java
@@ -0,0 +1,40 @@
+package org.apache.maven.surefire.common.junit48.tests.group;
+
+/*
+ * 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.common.junit48.tests.group.marker.CategoryB;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+/**
+ * AbstractBCTest.
+ */
+@Category( CategoryB.class )
+public abstract class AbstractBCTest
+    extends AbstractCTest
+{
+
+    @Test
+    public void pb()
+    {
+        System.out.println( "AbstractBCTest#pb" );
+    }
+
+}
diff --git a/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/group/AbstractCTest.java b/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/group/AbstractCTest.java
new file mode 100644
index 0000000..942f915
--- /dev/null
+++ b/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/group/AbstractCTest.java
@@ -0,0 +1,39 @@
+package org.apache.maven.surefire.common.junit48.tests.group;
+
+/*
+ * 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.common.junit48.tests.group.marker.CategoryC;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+/**
+ * AbstractCTest.
+ */
+@Category( CategoryC.class )
+public abstract class AbstractCTest
+{
+
+    @Test
+    public void pc()
+    {
+        System.out.println( "AbstractCTest#pc" );
+    }
+
+}
diff --git a/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/group/BBCTest.java b/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/group/BBCTest.java
new file mode 100644
index 0000000..e48cbec
--- /dev/null
+++ b/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/group/BBCTest.java
@@ -0,0 +1,40 @@
+package org.apache.maven.surefire.common.junit48.tests.group;
+
+/*
+ * 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.common.junit48.tests.group.marker.CategoryB;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+/**
+ * BBCTest.
+ */
+@Category( CategoryB.class )
+public class BBCTest
+    extends AbstractBCTest
+{
+
+    @Test
+    public void bbc()
+    {
+        System.out.println( "BBCTest#bbc" );
+    }
+
+}
diff --git a/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/group/BCTest.java b/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/group/BCTest.java
new file mode 100644
index 0000000..0cd859c
--- /dev/null
+++ b/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/group/BCTest.java
@@ -0,0 +1,37 @@
+package org.apache.maven.surefire.common.junit48.tests.group;
+
+/*
+ * 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.junit.Test;
+
+/**
+ * BCTest.
+ */
+public class BCTest
+    extends AbstractBCTest
+{
+
+    @Test
+    public void bc()
+    {
+        System.out.println( "BCTest#bc" );
+    }
+
+}
diff --git a/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/group/BTest.java b/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/group/BTest.java
new file mode 100644
index 0000000..126678d
--- /dev/null
+++ b/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/group/BTest.java
@@ -0,0 +1,39 @@
+package org.apache.maven.surefire.common.junit48.tests.group;
+
+/*
+ * 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.common.junit48.tests.group.marker.CategoryB;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+/**
+ * BTest.
+ */
+@Category( CategoryB.class )
+public class BTest
+{
+
+    @Test
+    public void b()
+    {
+        System.out.println( "BTest#b" );
+    }
+
+}
diff --git a/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/group/UncategorizedTest.java b/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/group/UncategorizedTest.java
new file mode 100644
index 0000000..92a4a7a
--- /dev/null
+++ b/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/group/UncategorizedTest.java
@@ -0,0 +1,36 @@
+package org.apache.maven.surefire.common.junit48.tests.group;
+
+/*
+ * 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.junit.Test;
+
+/**
+ * UncategorizedTest.
+ */
+public class UncategorizedTest
+{
+
+    @Test
+    public void a()
+    {
+        System.out.println( "Uncategorized#a" );
+    }
+
+}
diff --git a/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/group/marker/CategoryA.java b/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/group/marker/CategoryA.java
new file mode 100644
index 0000000..5d69a12
--- /dev/null
+++ b/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/group/marker/CategoryA.java
@@ -0,0 +1,27 @@
+package org.apache.maven.surefire.common.junit48.tests.group.marker;
+
+/*
+ * 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.
+ */
+
+/**
+ * CategoryA marker.
+ */
+public interface CategoryA
+{
+}
diff --git a/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/group/marker/CategoryB.java b/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/group/marker/CategoryB.java
new file mode 100644
index 0000000..380b895
--- /dev/null
+++ b/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/group/marker/CategoryB.java
@@ -0,0 +1,27 @@
+package org.apache.maven.surefire.common.junit48.tests.group.marker;
+
+/*
+ * 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.
+ */
+
+/**
+ * CategoryB marker.
+ */
+public interface CategoryB
+{
+}
diff --git a/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/group/marker/CategoryC.java b/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/group/marker/CategoryC.java
new file mode 100644
index 0000000..df16556
--- /dev/null
+++ b/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/tests/group/marker/CategoryC.java
@@ -0,0 +1,27 @@
+package org.apache.maven.surefire.common.junit48.tests.group.marker;
+
+/*
+ * 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.
+ */
+
+/**
+ * CategoryC marker.
+ */
+public interface CategoryC
+{
+}