Skip to content

[Gradle] Rework internal test plugins to support test suites #126341

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
import org.gradle.api.tasks.TaskProvider;

import javax.inject.Inject;
import java.util.stream.Collectors;

public class LicenseHeadersPrecommitPlugin extends PrecommitPlugin {
@Inject
Expand All @@ -31,8 +30,7 @@ public TaskProvider<? extends Task> createTask(Project project) {
return project.getTasks().register("licenseHeaders", LicenseHeadersTask.class, licenseHeadersTask -> {
project.getPlugins().withType(JavaBasePlugin.class, javaBasePlugin -> {
final SourceSetContainer sourceSets = project.getExtensions().getByType(JavaPluginExtension.class).getSourceSets();
licenseHeadersTask.getSourceFolders()
.addAll(providerFactory.provider(() -> sourceSets.stream().map(s -> s.getAllJava()).collect(Collectors.toList())));
sourceSets.configureEach(sourceSet -> { licenseHeadersTask.getSourceFolders().add(sourceSet.getAllJava()); });
});
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public void apply(Project project) {
);
project.getPluginManager().withPlugin("java-base", p -> {
// run compilation as part of precommit
project.getExtensions().getByType(JavaPluginExtension.class).getSourceSets().all(sourceSet ->
project.getExtensions().getByType(JavaPluginExtension.class).getSourceSets().configureEach(sourceSet ->
precommit.configure(t -> t.dependsOn(sourceSet.getClassesTaskName()))
);
// make sure tests run after all precommit tasks
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -137,12 +137,12 @@ class BuildPluginFuncTest extends AbstractGradleFuncTest {
file("licenses/hamcrest-core-1.3.jar.sha1").text = "42a25dc3219429f0e5d060061f71acb49bf010a0"
file("licenses/hamcrest-core-LICENSE.txt").text = EXAMPLE_LICENSE
file("licenses/hamcrest-core-NOTICE.txt").text = "mock notice"
file("licenses/junit-4.12.jar.sha1").text = "2973d150c0dc1fefe998f834810d68f278ea58ec"
file("licenses/junit-4.13.2.jar.sha1").text = "2973d150c0dc1fefe998f834810d68f278ea58ec"
file("licenses/junit-LICENSE.txt").text = EXAMPLE_LICENSE
file("licenses/junit-NOTICE.txt").text = "mock notice"
buildFile << """
dependencies {
api "junit:junit:4.12"
api "junit:junit:4.13.2"
// missing classes in thirdparty audit
api 'org.hamcrest:hamcrest-core:1.3'
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ class TestingConventionsPrecommitPluginFuncTest extends AbstractGradleInternalPl
"org.elasticsearch.test.rest.yaml.ESClientYamlSuiteTestCase",
"org.elasticsearch.test.AbstractMultiClustersTestCase"
)
repository.generateJar('org.junit', 'junit', "4.42",
repository.generateJar('junit', 'junit', "4.42",
"org.junit.Assert", "org.junit.Test"
)
}
Expand Down Expand Up @@ -180,7 +180,7 @@ class TestingConventionsPrecommitPluginFuncTest extends AbstractGradleInternalPl

dependencies {
yamlRestTestImplementation "org.apache.lucene:tests.util:1.0"
yamlRestTestImplementation "org.junit:junit:4.42"
yamlRestTestImplementation "junit:junit:4.42"
}
"""

Expand Down Expand Up @@ -222,7 +222,7 @@ class TestingConventionsPrecommitPluginFuncTest extends AbstractGradleInternalPl

dependencies {
${sourceSetName}Implementation "org.apache.lucene:tests.util:1.0"
${sourceSetName}Implementation "org.junit:junit:4.42"
${sourceSetName}Implementation "junit:junit:4.42"
}
tasks.withType(TestingConventionsCheckTask).configureEach {
suffix 'IT'
Expand All @@ -243,7 +243,7 @@ class TestingConventionsPrecommitPluginFuncTest extends AbstractGradleInternalPl
}

when:
def result = gradleRunner("testingConventions").buildAndFail()
def result = gradleRunner(taskName).buildAndFail()
then:
result.task(taskName).outcome == TaskOutcome.FAILED
assertOutputContains(result.getOutput(), """\
Expand All @@ -266,7 +266,7 @@ class TestingConventionsPrecommitPluginFuncTest extends AbstractGradleInternalPl

dependencies {
testImplementation "org.apache.lucene:tests.util:1.0"
testImplementation "org.junit:junit:4.42"
testImplementation "junit:junit:4.42"
}
"""
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,12 @@
import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.artifacts.Configuration;
import org.gradle.api.artifacts.ExternalModuleDependency;
import org.gradle.api.artifacts.ResolutionStrategy;
import org.gradle.api.file.FileCollection;
import org.gradle.api.plugins.JavaBasePlugin;
import org.gradle.api.plugins.JavaPluginExtension;
import org.gradle.api.plugins.JvmTestSuitePlugin;
import org.gradle.api.plugins.jvm.JvmTestSuite;
import org.gradle.api.provider.Provider;
import org.gradle.api.tasks.SourceSet;
import org.gradle.api.tasks.SourceSetContainer;
Expand All @@ -35,6 +37,7 @@
import org.gradle.api.tasks.testing.Test;
import org.gradle.jvm.toolchain.JavaLanguageVersion;
import org.gradle.jvm.toolchain.JavaToolchainService;
import org.gradle.testing.base.TestingExtension;

import java.util.List;
import java.util.Map;
Expand All @@ -61,7 +64,18 @@ public void apply(Project project) {
// make sure the global build info plugin is applied to the root project
project.getRootProject().getPluginManager().apply(GlobalBuildInfoPlugin.class);
buildParams = project.getRootProject().getExtensions().getByType(BuildParameterExtension.class);
project.getPluginManager().apply(JavaBasePlugin.class);
project.getPluginManager().apply(JvmTestSuitePlugin.class);
TestingExtension testing = project.getExtensions().getByType(TestingExtension.class);
testing.getSuites().withType(JvmTestSuite.class).configureEach(suite -> {
if (suite.getName().equals("test") == false) {
// default test task behaves differently in gradle
suite.useJUnit();
}
ExternalModuleDependency junitDependency = suite.getDependencies()
.module("junit", "junit", VersionProperties.getVersions().get("junit"));
junitDependency.setTransitive(false);
suite.getDependencies().getImplementation().add(junitDependency);
});
// common repositories setup
project.getPluginManager().apply(RepositoriesSetupPlugin.class);
project.getPluginManager().apply(ElasticsearchTestBasePlugin.class);
Expand Down Expand Up @@ -99,7 +113,7 @@ public static void configureConfigurations(Project project) {
return;
}
// fail on any conflicting dependency versions
project.getConfigurations().all(configuration -> {
project.getConfigurations().configureEach(configuration -> {
if (configuration.getName().endsWith("Fixture")) {
// just a self contained test-fixture configuration, likely transitive and hellacious
return;
Expand All @@ -109,17 +123,17 @@ public static void configureConfigurations(Project project) {

// disable transitive dependency management
SourceSetContainer sourceSets = project.getExtensions().getByType(SourceSetContainer.class);
sourceSets.all(sourceSet -> disableTransitiveDependenciesForSourceSet(project, sourceSet));
sourceSets.configureEach(sourceSet -> disableTransitiveDependenciesForSourceSet(project, sourceSet));
}

private static void disableTransitiveDependenciesForSourceSet(Project project, SourceSet sourceSet) {

List<String> sourceSetConfigurationNames = List.of(
sourceSet.getApiConfigurationName(),
sourceSet.getImplementationConfigurationName(),
sourceSet.getCompileOnlyConfigurationName(),
sourceSet.getRuntimeOnlyConfigurationName()
);

project.getConfigurations()
.matching(c -> sourceSetConfigurationNames.contains(c.getName()))
.configureEach(GradleUtils::disableTransitiveDependencies);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
import org.gradle.api.Project;
import org.gradle.api.Task;
import org.gradle.api.artifacts.Configuration;
import org.gradle.api.artifacts.Dependency;
import org.gradle.api.artifacts.ProjectDependency;
import org.gradle.api.plugins.BasePluginExtension;
import org.gradle.api.plugins.JavaPlugin;
Expand All @@ -25,7 +24,6 @@
import org.gradle.external.javadoc.StandardJavadocDocletOptions;

import java.io.File;
import java.util.Comparator;
import java.util.List;

// Handle javadoc dependencies across projects. Order matters: the linksOffline for
Expand Down Expand Up @@ -77,12 +75,11 @@ public void execute(Task task) {
}

private void configureJavadocForConfiguration(Project project, boolean shadow, Configuration configuration) {
configuration.getAllDependencies()
.stream()
.sorted(Comparator.comparing(Dependency::getGroup))
.filter(d -> d instanceof ProjectDependency)
.map(d -> (ProjectDependency) d)
.forEach(projectDependency -> configureDependency(project, shadow, projectDependency));
configuration.getAllDependencies().configureEach(dependency -> {
if (dependency instanceof ProjectDependency) {
configureDependency(project, shadow, (ProjectDependency) dependency);
}
});
}

private void configureDependency(Project project, boolean shadowed, ProjectDependency dep) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public class InternalTestArtifactPlugin implements Plugin<Project> {
public void apply(Project project) {
project.getPlugins().apply(InternalTestArtifactBasePlugin.class);
InternalTestArtifactExtension testArtifactExtension = project.getExtensions().getByType(InternalTestArtifactExtension.class);
project.getExtensions().getByType(SourceSetContainer.class).all(sourceSet -> {
project.getExtensions().getByType(SourceSetContainer.class).configureEach(sourceSet -> {
if (sourceSet.getName().equals(SourceSet.MAIN_SOURCE_SET_NAME) == false) {
testArtifactExtension.registerTestArtifactFromSourceSet(sourceSet);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ public void execute(Task task) {
JavaBasePlugin.class,
javaBasePlugin -> project.getExtensions()
.getByType(SourceSetContainer.class)
.all(
.configureEach(
sourceSet -> project.getTasks()
.withType(Checkstyle.class)
.named(sourceSet.getTaskName("checkstyle", null))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,6 @@
import org.gradle.api.provider.ProviderFactory;
import org.gradle.api.tasks.TaskProvider;

import java.util.stream.Collectors;

import javax.inject.Inject;

public class FilePermissionsPrecommitPlugin extends PrecommitPlugin {
Expand All @@ -33,18 +31,10 @@ public FilePermissionsPrecommitPlugin(ProviderFactory providerFactory) {
@Override
public TaskProvider<? extends Task> createTask(Project project) {
return project.getTasks().register(FILEPERMISSIONS_TASK_NAME, FilePermissionsTask.class, t -> {
t.getSources()
.addAll(
providerFactory.provider(
() -> GradleUtils.getJavaSourceSets(project).stream().map(s -> s.getAllSource()).collect(Collectors.toList())
)
);
t.dependsOn(
GradleUtils.getJavaSourceSets(project)
.stream()
.map(sourceSet -> sourceSet.getProcessResourcesTaskName())
.collect(Collectors.toList())
);
GradleUtils.getJavaSourceSets(project).configureEach(sourceSet -> {
t.getSources().add(sourceSet.getAllSource());
t.dependsOn(sourceSet.getProcessResourcesTaskName());
});
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,6 @@
import org.gradle.api.provider.ProviderFactory;
import org.gradle.api.tasks.TaskProvider;

import java.util.stream.Collectors;

import javax.inject.Inject;

public class ForbiddenPatternsPrecommitPlugin extends PrecommitPlugin {
Expand All @@ -33,18 +31,10 @@ public ForbiddenPatternsPrecommitPlugin(ProviderFactory providerFactory) {
@Override
public TaskProvider<? extends Task> createTask(Project project) {
return project.getTasks().register(FORBIDDEN_PATTERNS_TASK_NAME, ForbiddenPatternsTask.class, forbiddenPatternsTask -> {
forbiddenPatternsTask.getSourceFolders()
.addAll(
providerFactory.provider(
() -> GradleUtils.getJavaSourceSets(project).stream().map(s -> s.getAllSource()).collect(Collectors.toList())
)
);
forbiddenPatternsTask.dependsOn(
GradleUtils.getJavaSourceSets(project)
.stream()
.map(sourceSet -> sourceSet.getProcessResourcesTaskName())
.collect(Collectors.toList())
);
GradleUtils.getJavaSourceSets(project).configureEach(sourceSet -> {
forbiddenPatternsTask.getSourceFolders().add(sourceSet.getAllSource());
forbiddenPatternsTask.dependsOn(sourceSet.getProcessResourcesTaskName());
});
forbiddenPatternsTask.getRootDir().set(project.getRootDir());
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,13 @@ public class JavaModulePrecommitPlugin extends PrecommitPlugin {
public TaskProvider<? extends Task> createTask(Project project) {
TaskProvider<JavaModulePrecommitTask> task = project.getTasks().register(TASK_NAME, JavaModulePrecommitTask.class);
task.configure(t -> {
SourceSet mainSourceSet = GradleUtils.getJavaSourceSets(project).findByName(SourceSet.MAIN_SOURCE_SET_NAME);
t.dependsOn(mainSourceSet.getClassesTaskName());
t.getSrcDirs().set(project.provider(() -> mainSourceSet.getAllSource().getSrcDirs()));
t.setClasspath(project.getConfigurations().getByName(JavaPlugin.COMPILE_CLASSPATH_CONFIGURATION_NAME));
t.setClassesDirs(mainSourceSet.getOutput().getClassesDirs());
t.setResourcesDirs(mainSourceSet.getOutput().getResourcesDir());
GradleUtils.getJavaSourceSets(project).named(SourceSet.MAIN_SOURCE_SET_NAME).configure(sourceSet -> {
t.dependsOn(sourceSet.getClassesTaskName());
t.getSrcDirs().set(project.provider(() -> sourceSet.getAllSource().getSrcDirs()));
t.setClasspath(project.getConfigurations().getByName(JavaPlugin.COMPILE_CLASSPATH_CONFIGURATION_NAME));
t.setClassesDirs(sourceSet.getOutput().getClassesDirs());
t.setResourcesDirs(sourceSet.getOutput().getResourcesDir());
});
});
return task;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public TaskProvider<? extends Task> createTask(Project project) {
sourceSets.matching(
sourceSet -> sourceSet.getName().equals(SourceSet.MAIN_SOURCE_SET_NAME)
|| sourceSet.getName().equals(SourceSet.TEST_SOURCE_SET_NAME)
).all(sourceSet -> loggerUsage.configure(t -> t.addSourceSet(sourceSet)));
).configureEach(sourceSet -> loggerUsage.configure(t -> t.addSourceSet(sourceSet)));

loggerUsage.configure(
t -> t.setClasspath(loggerUsageConfig)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,11 @@ public TaskProvider<? extends Task> createTask(Project project) {
task.configure(t -> {
t.setProjectBuildDirs(getProjectBuildDirs(project));
t.setClasspath(project.getConfigurations().getByName(JavaPlugin.COMPILE_CLASSPATH_CONFIGURATION_NAME));
SourceSet mainSourceSet = GradleUtils.getJavaSourceSets(project).findByName(SourceSet.MAIN_SOURCE_SET_NAME);
t.dependsOn(mainSourceSet.getJava().getSourceDirectories());
t.getSrcDirs().set(project.provider(() -> mainSourceSet.getAllSource().getSrcDirs()));
GradleUtils.getJavaSourceSets(project).named(SourceSet.MAIN_SOURCE_SET_NAME).configure(sourceSet -> {
t.dependsOn(sourceSet.getJava().getSourceDirectories());
t.getSrcDirs().set(project.provider(() -> sourceSet.getAllSource().getSrcDirs()));
});

});
return task;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,14 @@

import org.elasticsearch.gradle.internal.info.GlobalBuildInfoPlugin;
import org.elasticsearch.gradle.util.GradleUtils;
import org.gradle.api.JavaVersion;
import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.artifacts.dsl.DependencyCollector;
import org.gradle.api.plugins.JavaPlugin;
import org.gradle.api.plugins.JvmTestSuitePlugin;
import org.gradle.api.plugins.jvm.JvmTestSuite;
import org.gradle.api.tasks.SourceSet;
import org.gradle.api.tasks.TaskProvider;
import org.gradle.api.tasks.testing.Test;

import static org.elasticsearch.gradle.internal.util.ParamsUtils.loadBuildParams;
import org.gradle.testing.base.TestingExtension;

public class InternalClusterTestPlugin implements Plugin<Project> {

Expand All @@ -27,19 +27,20 @@ public class InternalClusterTestPlugin implements Plugin<Project> {
@Override
public void apply(Project project) {
project.getRootProject().getPlugins().apply(GlobalBuildInfoPlugin.class);
var buildParams = loadBuildParams(project).get();

TaskProvider<Test> internalClusterTest = GradleUtils.addTestSourceSet(project, SOURCE_SET_NAME);
internalClusterTest.configure(task -> {
// Set GC options to mirror defaults in jvm.options
if (buildParams.getRuntimeJavaVersion().get().compareTo(JavaVersion.VERSION_14) < 0) {
task.jvmArgs("-XX:+UseConcMarkSweepGC", "-XX:CMSInitiatingOccupancyFraction=75", "-XX:+UseCMSInitiatingOccupancyOnly");
} else {
task.jvmArgs("-XX:+UseG1GC");
}
project.getPluginManager().apply(JavaPlugin.class);
project.getPluginManager().apply(JvmTestSuitePlugin.class);
TestingExtension testing = project.getExtensions().getByType(TestingExtension.class);

testing.getSuites().register(SOURCE_SET_NAME, JvmTestSuite.class, suite -> {
suite.useJUnit();
DependencyCollector implementation = suite.getDependencies().getImplementation();
implementation.add(suite.getDependencies().project());
suite.getTargets().configureEach(target -> { target.getTestTask().configure(test -> { test.jvmArgs("-XX:+UseG1GC"); }); });
});

// TODO: fix usages of IT tests depending on Tests methods so this extension is not necessary
GradleUtils.extendSourceSet(project, SourceSet.TEST_SOURCE_SET_NAME, SOURCE_SET_NAME);
project.getPluginManager().withPlugin("java", plugin -> {
// TODO: fix usages of IT tests depending on Tests methods so this extension is not necessary
GradleUtils.extendSourceSet(project, SourceSet.TEST_SOURCE_SET_NAME, SOURCE_SET_NAME);
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ public void apply(final Project project) {
}

Configuration testImplementationConfig = project.getConfigurations().getByName("testImplementation");
testImplementationConfig.getDependencies().all(dep -> {
testImplementationConfig.getDependencies().configureEach(dep -> {
if (dep instanceof ProjectDependency && dep.getGroup().contains("plugin")) {
addPluginResources(project, ((ProjectDependency) dep));
}
Expand Down
Loading