Skip to content

Commit

Permalink
fix(arquillian#278): if custom surefire provider is specified then th…
Browse files Browse the repository at this point in the history
…e logic is

delegated to it and known providers resolution is skipped
  • Loading branch information
MatousJobanek committed Dec 8, 2017
1 parent 38c8f11 commit 009eead
Show file tree
Hide file tree
Showing 28 changed files with 526 additions and 226 deletions.
Expand Up @@ -31,6 +31,7 @@ public class Configuration implements ConfigurationSection {
public static final String SMART_TESTING_MODE = "smart.testing.mode";
public static final String SMART_TESTING_CUSTOM_STRATEGIES = "smart.testing.strategy";
public static final String SMART_TESTING_CUSTOM_STRATEGIES_PATTERN = SMART_TESTING_CUSTOM_STRATEGIES + ".*";
public static final String SMART_TESTING_CUSTOM_PROVIDERS = "smart.testing.custom.providers";
public static final String SMART_TESTING_APPLY_TO = "smart.testing.apply.to";
public static final String SMART_TESTING_VERSION = "smart.testing.version";
public static final String SMART_TESTING_DISABLE = "smart.testing.disable";
Expand All @@ -39,6 +40,7 @@ public class Configuration implements ConfigurationSection {

private String[] strategies = new String[0];
private String[] customStrategies = new String[0];
private String[] customProviders = new String[0];
private RunMode mode;
private String applyTo;

Expand Down Expand Up @@ -138,6 +140,14 @@ public void setStrategiesConfig(Map<String, Object> strategiesConfig) {
this.strategiesConfig = strategiesConfig;
}

public String[] getCustomProviders() {
return customProviders;
}

public void setCustomProviders(String[] customProviders) {
this.customProviders = customProviders;
}

public List<ConfigurationItem> registerConfigurationItems() {
List<ConfigurationItem> configItems = new ArrayList<>();
configItems.add(new ConfigurationItem("strategies", SMART_TESTING, new String[0]));
Expand All @@ -147,6 +157,7 @@ public List<ConfigurationItem> registerConfigurationItems() {
configItems.add(new ConfigurationItem("debug", SMART_TESTING_DEBUG, false));
configItems.add(new ConfigurationItem("autocorrect", SMART_TESTING_AUTOCORRECT, false));
configItems.add(new ConfigurationItem("customStrategies", SMART_TESTING_CUSTOM_STRATEGIES_PATTERN));
configItems.add(new ConfigurationItem("customProviders", SMART_TESTING_CUSTOM_PROVIDERS, new String[0]));
return configItems;
}

Expand Down
Expand Up @@ -6,25 +6,32 @@ public class TemporaryInternalFiles {

private static final String TEMP_REPORT_DIR = "reports";
private static final String SMART_TESTING_SCM_CHANGES = "scm-changes";
private static final String JUNIT_5_PLATFORM_VERSION = "junit5PlatformVersion";
private static final String CUSTOM_PROVIDERS_DIRECTORY = "customProviders";

private TemporaryInternalFiles() {
}

public static String getScmChangesFileName(){
return SMART_TESTING_SCM_CHANGES;
}

public static String getJunit5PlatformVersionFileName(String pluginArtifactId){
return pluginArtifactId + "_" + JUNIT_5_PLATFORM_VERSION;
public static String getCustomProvidersDirectoryName(String pluginArtifactId) {
return pluginArtifactId + "_" + CUSTOM_PROVIDERS_DIRECTORY;
}

public String getTestReportDirectoryName(){
return TEMP_REPORT_DIR;
public static LocalStorageDirectoryAction createCustomProvidersDirectoryAction(File rootDir,
String pluginArtifactId) {
return new LocalStorage(rootDir)
.duringExecution()
.temporary()
.directory(getCustomProvidersDirectoryName(pluginArtifactId));
}

public LocalStorageDirectoryAction createTestReportDirectoryAction(String rootDir){
return createTestReportDirectoryAction(new File(rootDir));
public static String getTestReportDirectoryName() {
return TEMP_REPORT_DIR;
}

public LocalStorageDirectoryAction createTestReportDirectoryAction(File rootDir){
public static LocalStorageDirectoryAction createTestReportDirectoryAction(File rootDir) {
return new LocalStorage(rootDir)
.duringExecution()
.temporary()
Expand Down
Expand Up @@ -165,7 +165,7 @@ private TestResults accumulatedTestResults() {

private boolean isSurefireReportFile(Path path) {
return !path.toFile().getAbsolutePath()
.contains(File.separator + new TemporaryInternalFiles().getTestReportDirectoryName()) && path.getFileName()
.contains(File.separator + TemporaryInternalFiles.getTestReportDirectoryName()) && path.getFileName()
.toString().startsWith(TEST_REPORT_PREFIX);
}
}
Expand Up @@ -62,6 +62,6 @@ public void should_only_execute_previously_failing_tests_when_failed_is_enabled(
.containsAll(expectedTestResults)
.hasSameSizeAs(expectedTestResults);

softly.assertThat(project).doesNotContainDirectory(new TemporaryInternalFiles().getTestReportDirectoryName());
softly.assertThat(project).doesNotContainDirectory(TemporaryInternalFiles.getTestReportDirectoryName());
}
}
Expand Up @@ -58,6 +58,6 @@ public void should_only_execute_previously_failing_tests_when_failed_is_enabled(
.containsAll(expectedTestResults)
.hasSameSizeAs(expectedTestResults);

softly.assertThat(project).doesNotContainDirectory(new TemporaryInternalFiles().getTestReportDirectoryName());
softly.assertThat(project).doesNotContainDirectory(TemporaryInternalFiles.getTestReportDirectoryName());
}
}
14 changes: 14 additions & 0 deletions known-surefire-providers/pom.xml
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent>
<artifactId>smart-testing-parent</artifactId>
<groupId>org.arquillian.smart.testing</groupId>
<version>0.0.6-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>known-surefire-providers</artifactId>

</project>
@@ -0,0 +1,46 @@
package org.arquillian.smart.testing.known.surefire.providers;

public enum KnownProvider {

JUNIT_4(
"org.apache.maven.surefire",
"surefire-junit4",
"org.apache.maven.surefire.junit4.JUnit4Provider"),

JUNIT_47(
"org.apache.maven.surefire",
"surefire-junit47",
"org.apache.maven.surefire.junitcore.JUnitCoreProvider"),

JUNIT_5(
"org.junit.platform",
"junit-platform-surefire-provider",
"org.junit.platform.surefire.provider.JUnitPlatformProvider"),

TESTNG(
"org.apache.maven.surefire",
"surefire-testng",
"org.apache.maven.surefire.testng.TestNGProvider");

private final String groupId;
private final String artifactId;
private final String providerClassName;

KnownProvider(String groupId, String artifactId, String providerClassName) {
this.groupId = groupId;
this.artifactId = artifactId;
this.providerClassName = providerClassName;
}

public String getGroupId() {
return groupId;
}

public String getArtifactId() {
return artifactId;
}

public String getProviderClassName() {
return providerClassName;
}
}
5 changes: 5 additions & 0 deletions mvn-extension/pom.xml
Expand Up @@ -25,6 +25,11 @@
<artifactId>core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.arquillian.smart.testing</groupId>
<artifactId>known-surefire-providers</artifactId>
<version>${project.version}</version>
</dependency>

<!--
This explicit include prevents us from adding new implementations dynamically,
Expand Down
@@ -1,23 +1,17 @@
package org.arquillian.smart.testing.mvn.ext;

import java.io.IOException;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import org.apache.maven.model.Dependency;
import org.apache.maven.model.Model;
import org.apache.maven.model.Plugin;
import org.arquillian.smart.testing.configuration.Configuration;
import org.arquillian.smart.testing.hub.storage.local.LocalStorage;
import org.arquillian.smart.testing.logger.Log;
import org.arquillian.smart.testing.logger.Logger;
import org.arquillian.smart.testing.mvn.ext.dependencies.DependencyResolver;
import org.arquillian.smart.testing.mvn.ext.dependencies.ExtensionVersion;
import org.arquillian.smart.testing.mvn.ext.dependencies.Version;

import static org.arquillian.smart.testing.hub.storage.local.TemporaryInternalFiles.getJunit5PlatformVersionFileName;

class MavenProjectConfigurator {

private static final Version MINIMUM_VERSION = Version.from("2.19.1");
Expand All @@ -44,23 +38,10 @@ boolean configureTestRunner(Model model) {

dependencyResolver.addRequiredDependencies(model);

final LocalStorage localStorage = new LocalStorage(model.getProjectDirectory());
effectiveTestRunnerPluginConfigurations
.forEach(plugin -> {
dependencyResolver.removeAndRegisterFirstCustomProvider(model, plugin);
dependencyResolver.addAsPluginDependency(plugin);

final Optional<Dependency> dependency = dependencyResolver.findJUnit5PlatformDependency(plugin);
dependency.ifPresent(d -> {
try {
localStorage.duringExecution()
.temporary()
.file(getJunit5PlatformVersionFileName(plugin.getArtifactId()))
.create(d.getVersion().getBytes());
plugin.removeDependency(dependency.get());
} catch (IOException e) {
throw new IllegalStateException(e);
}
});
});
return true;
} else {
Expand Down
Expand Up @@ -29,7 +29,7 @@ static void copySurefireReports(Model model) {

private static void copyReportsDirectory(Model model, File surefireReportsDir) {
LocalStorageDirectoryAction reportsDirectory =
new TemporaryInternalFiles().createTestReportDirectoryAction(model.getProjectDirectory());
TemporaryInternalFiles.createTestReportDirectoryAction(model.getProjectDirectory());
logger.debug("Copying surefire report directory from [%s] to [%s]", surefireReportsDir,
reportsDirectory.getPath());

Expand Down
@@ -1,14 +1,19 @@
package org.arquillian.smart.testing.mvn.ext.dependencies;

import java.io.IOException;
import java.io.UncheckedIOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
import org.apache.maven.model.Dependency;
import org.apache.maven.model.Model;
import org.apache.maven.model.Plugin;
import org.arquillian.smart.testing.configuration.Configuration;
import org.arquillian.smart.testing.hub.storage.local.LocalStorageDirectoryAction;
import org.arquillian.smart.testing.hub.storage.local.TemporaryInternalFiles;
import org.arquillian.smart.testing.logger.Log;
import org.arquillian.smart.testing.logger.Logger;
import org.arquillian.smart.testing.mvn.ext.ApplicablePlugins;
Expand Down Expand Up @@ -53,13 +58,30 @@ public void addAsPluginDependency(Plugin plugin) {
plugin.addDependency(smartTestingProviderDependency());
}

public Optional<Dependency> findJUnit5PlatformDependency(Plugin plugin) {
return plugin.getDependencies()
.stream()
.filter(JUnit5SurefireProviderDependency::matches)
.findFirst();
public void removeAndRegisterFirstCustomProvider(Model model, Plugin plugin) {
final List<SurefireProviderDependency> providerDeps = findSurefireProviderDependencies(plugin);
if (providerDeps.isEmpty()) {
return;
}
final LocalStorageDirectoryAction customProvidersDir =
TemporaryInternalFiles.createCustomProvidersDirectoryAction(model.getProjectDirectory(),
plugin.getArtifactId());
SurefireProviderDependency providerDep = providerDeps.get(0);
try {
customProvidersDir.createWithFile(providerDep.getGAV(), providerDep.getProviderClassName().getBytes());
plugin.removeDependency(providerDep.getDependency());
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}

private List<SurefireProviderDependency> findSurefireProviderDependencies(Plugin plugin) {
SurefireProviderResolver surefireProviderResolver = new SurefireProviderResolver(configuration);
return plugin.getDependencies()
.stream()
.map(surefireProviderResolver::createSurefireProviderDepIfMathes)
.collect(Collectors.toList());
}

private void addSurefireApiDependency(Model model) {
boolean alreadyContains = model.getDependencies()
Expand All @@ -84,20 +106,6 @@ private Dependency smartTestingProviderDependency() {
return smartTestingSurefireProvider;
}

static class JUnit5SurefireProviderDependency extends Dependency {
private static final String GROUP_ID = "org.junit.platform";
private static final String ARTIFACT_ID = "junit-platform-surefire-provider";

JUnit5SurefireProviderDependency() {
setGroupId(GROUP_ID);
setArtifactId(ARTIFACT_ID);
}

public static boolean matches(Dependency dependency) {
return GROUP_ID.equals(dependency.getGroupId()) && ARTIFACT_ID.equals(dependency.getArtifactId());
}
}

static class SurefireApiDependency extends Dependency {
private static final String GROUP_ID = "org.apache.maven.surefire";
private static final String ARTIFACT_ID = "surefire-api";
Expand Down
@@ -0,0 +1,26 @@
package org.arquillian.smart.testing.mvn.ext.dependencies;

import org.apache.maven.model.Dependency;

class SurefireProviderDependency {

private final Dependency dependency;
private final SurefireProviderResolver.SurefireProviderDefinition provider;

SurefireProviderDependency(Dependency dependency, SurefireProviderResolver.SurefireProviderDefinition provider) {
this.dependency = dependency;
this.provider = provider;
}

String getGAV(){
return String.join(":", dependency.getGroupId(), dependency.getArtifactId(), dependency.getVersion());
}

String getProviderClassName() {
return provider.getProviderClassName();
}

Dependency getDependency() {
return dependency;
}
}

0 comments on commit 009eead

Please sign in to comment.