package org.infernus.idea.checkstyle.build; import java.io.File; import java.util.Set; import groovy.lang.Closure; import org.gradle.api.Project; import org.gradle.api.artifacts.ConfigurationContainer; import org.gradle.api.artifacts.Dependency; import org.gradle.api.file.FileCollection; import org.gradle.api.plugins.JavaPluginConvention; import org.gradle.api.tasks.SourceSet; import org.gradle.api.tasks.SourceSetContainer; import org.gradle.api.tasks.testing.Test; import org.gradle.language.base.plugins.LifecycleBasePlugin; /** * Gradle task that runs the unit tests in 'csaccessTest' against one of the supported Checkstyle versions. */ public class CsaccessTestTask extends Test { public static final String XTEST_GROUP_NAME = "xtest"; public static final String XTEST_TASK_NAME = "xtest"; public static final String NAME = "runCsaccessTests"; public static final String CSVERSION_SYSPROP_NAME = "org.infernus.idea.checkstyle.version"; private String csVersion = null; public CsaccessTestTask() { super(); final Project project = getProject(); final JavaPluginConvention javaConvention = project.getConvention().getPlugin(JavaPluginConvention.class); final SourceSet csaccessTestSourceSet = javaConvention.getSourceSets().getByName(CustomSourceSetCreator .CSACCESSTEST_SOURCESET_NAME); dependsOn(project.getTasks().getByName(csaccessTestSourceSet.getClassesTaskName())); configure((Closure<?>) project.getProperties().get("testConfigClosure")); setTestClassesDir(csaccessTestSourceSet.getOutput().getClassesDir()); } public static String getTaskName(final String pCheckstyleVersion) { return "xtest_" + CheckstyleVersions.toGradleVersion(pCheckstyleVersion); } public void setCheckstyleVersion(final String pCheckstyleVersion, final boolean isBaseVersion) { csVersion = pCheckstyleVersion; setDescription("Runs the '" + CustomSourceSetCreator.CSACCESSTEST_SOURCESET_NAME + "' unit tests against a " + "Checkstyle " + pCheckstyleVersion + " runtime."); getReports().getJunitXml().setEnabled(false); if (isBaseVersion) { setGroup(LifecycleBasePlugin.VERIFICATION_GROUP); getReports().getHtml().setEnabled(true); } else { setGroup(XTEST_GROUP_NAME); getReports().getHtml().setEnabled(false); } // Make the Checkstyle version available to the test cases via a system property. configure(new Closure<Void>(this) { @Override public Void call() { systemProperty(CSVERSION_SYSPROP_NAME, pCheckstyleVersion); return null; } }); } /** * Overriding getClasspath() in order to set the final classpath is an unusual solution, but it was the only * solution which included the classpath entries generated by the IntelliJ plugin creation plugin (which, in my * humble opinion, should be considered seriously broken). * * @return the classpath to use to execute the tests */ @Override public FileCollection getClasspath() { final FileCollection originalClasspath = super.getClasspath(); FileCollection effectiveClasspath = null; if (originalClasspath != null) { final Project project = getProject(); final JavaPluginConvention javaConvention = project.getConvention().getPlugin(JavaPluginConvention.class); final SourceSetContainer sourceSets = javaConvention.getSourceSets(); final SourceSet mainSourceSet = sourceSets.getByName(SourceSet.MAIN_SOURCE_SET_NAME); final SourceSet testSourceSet = sourceSets.getByName(SourceSet.TEST_SOURCE_SET_NAME); final SourceSet csaccessSourceSet = sourceSets.getByName(CustomSourceSetCreator.CSACCESS_SOURCESET_NAME); final SourceSet csaccessTestSrcSet = sourceSets.getByName(CustomSourceSetCreator .CSACCESSTEST_SOURCESET_NAME); final Dependency csDep = CheckstyleVersions.createCheckstyleDependency(project, csVersion); final ConfigurationContainer configurations = project.getConfigurations(); final Set<File> csJars = configurations.detachedConfiguration(csDep).getFiles(); effectiveClasspath = project.files( // csaccessTestSrcSet.getOutput().getClassesDir(), // csaccessTestSrcSet.getOutput().getResourcesDir(), // csaccessSourceSet.getOutput().getClassesDir(), // csaccessSourceSet.getOutput().getResourcesDir(), // mainSourceSet.getOutput().getClassesDir(), // mainSourceSet.getOutput().getResourcesDir()) // .plus(project.files(csJars)) // .plus(originalClasspath) // .minus(project.files( // testSourceSet.getOutput().getClassesDir(), // testSourceSet.getOutput().getResourcesDir())); //getLogger().lifecycle("--------------------------------------------------------------------------"); //getLogger().lifecycle("Effective classpath of " + getName() + ":"); //for (File f : effectiveClasspath) { // getLogger().lifecycle("\t- " + f.getAbsolutePath()); //} } return effectiveClasspath; } }