[7.x] Make yamlRestTest and javaRestTest tasks lazy (#62515) (#62632)

This commit changes the yamlRestTest and javaRestTest tasks to be lazily created.
This change requires pro-actively creating the testClusters container so that the
configuration can be applied without any changes to the build.gradle files.

related: #60261
related: #47804
This commit is contained in:
Jake Landis 2020-09-18 12:49:37 -05:00 committed by GitHub
parent 6a298970fd
commit 392f99d695
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 47 additions and 39 deletions

View File

@ -41,7 +41,7 @@ public class RestTestBasePlugin implements Plugin<Project> {
NamedDomainObjectContainer<ElasticsearchCluster> testClusters = (NamedDomainObjectContainer<ElasticsearchCluster>) project NamedDomainObjectContainer<ElasticsearchCluster> testClusters = (NamedDomainObjectContainer<ElasticsearchCluster>) project
.getExtensions() .getExtensions()
.getByName(TestClustersPlugin.EXTENSION_NAME); .getByName(TestClustersPlugin.EXTENSION_NAME);
ElasticsearchCluster cluster = testClusters.create(restIntegTestTask.getName()); ElasticsearchCluster cluster = testClusters.maybeCreate(restIntegTestTask.getName());
restIntegTestTask.useCluster(cluster); restIntegTestTask.useCluster(cluster);
restIntegTestTask.include("**/*IT.class"); restIntegTestTask.include("**/*IT.class");
restIntegTestTask.systemProperty("tests.rest.load_packaged", Boolean.FALSE.toString()); restIntegTestTask.systemProperty("tests.rest.load_packaged", Boolean.FALSE.toString());

View File

@ -27,12 +27,13 @@ import org.elasticsearch.gradle.util.GradleUtils;
import org.gradle.api.Plugin; import org.gradle.api.Plugin;
import org.gradle.api.Project; import org.gradle.api.Project;
import org.gradle.api.plugins.JavaBasePlugin; import org.gradle.api.plugins.JavaBasePlugin;
import org.gradle.api.provider.Provider;
import org.gradle.api.tasks.SourceSet; import org.gradle.api.tasks.SourceSet;
import org.gradle.api.tasks.SourceSetContainer; import org.gradle.api.tasks.SourceSetContainer;
import static org.elasticsearch.gradle.test.rest.RestTestUtil.createTestCluster;
import static org.elasticsearch.gradle.test.rest.RestTestUtil.registerTask;
import static org.elasticsearch.gradle.test.rest.RestTestUtil.setupDependencies; import static org.elasticsearch.gradle.test.rest.RestTestUtil.setupDependencies;
import static org.elasticsearch.gradle.test.rest.RestTestUtil.setupRunnerTask;
import static org.elasticsearch.gradle.test.rest.RestTestUtil.setupTask;
/** /**
* Apply this plugin to run the Java based REST tests. * Apply this plugin to run the Java based REST tests.
@ -52,11 +53,11 @@ public class JavaRestTestPlugin implements Plugin<Project> {
SourceSetContainer sourceSets = project.getExtensions().getByType(SourceSetContainer.class); SourceSetContainer sourceSets = project.getExtensions().getByType(SourceSetContainer.class);
SourceSet javaTestSourceSet = sourceSets.create(SOURCE_SET_NAME); SourceSet javaTestSourceSet = sourceSets.create(SOURCE_SET_NAME);
// setup the javaRestTest task // create the test cluster container
RestIntegTestTask javaRestTestTask = setupTask(project, SOURCE_SET_NAME); createTestCluster(project, javaTestSourceSet);
// setup the runner task // setup the javaRestTest task
setupRunnerTask(project, javaRestTestTask, javaTestSourceSet); Provider<RestIntegTestTask> javaRestTestTask = registerTask(project, javaTestSourceSet);
// setup dependencies // setup dependencies
setupDependencies(project, javaTestSourceSet); setupDependencies(project, javaTestSourceSet);

View File

@ -22,8 +22,12 @@ package org.elasticsearch.gradle.test.rest;
import org.elasticsearch.gradle.VersionProperties; import org.elasticsearch.gradle.VersionProperties;
import org.elasticsearch.gradle.info.BuildParams; import org.elasticsearch.gradle.info.BuildParams;
import org.elasticsearch.gradle.test.RestIntegTestTask; import org.elasticsearch.gradle.test.RestIntegTestTask;
import org.elasticsearch.gradle.testclusters.ElasticsearchCluster;
import org.elasticsearch.gradle.testclusters.TestClustersPlugin;
import org.gradle.api.NamedDomainObjectContainer;
import org.gradle.api.Project; import org.gradle.api.Project;
import org.gradle.api.plugins.JavaBasePlugin; import org.gradle.api.plugins.JavaBasePlugin;
import org.gradle.api.provider.Provider;
import org.gradle.api.tasks.SourceSet; import org.gradle.api.tasks.SourceSet;
import org.gradle.api.tasks.bundling.Zip; import org.gradle.api.tasks.bundling.Zip;
@ -34,37 +38,39 @@ public class RestTestUtil {
private RestTestUtil() {} private RestTestUtil() {}
/** static ElasticsearchCluster createTestCluster(Project project, SourceSet sourceSet) {
* Creates a task with the source set name of type {@link RestIntegTestTask} // eagerly create the testCluster container so it is easily available for configuration
*/ @SuppressWarnings("unchecked")
static RestIntegTestTask setupTask(Project project, String sourceSetName) { NamedDomainObjectContainer<ElasticsearchCluster> testClusters = (NamedDomainObjectContainer<ElasticsearchCluster>) project
// create task - note can not use .register due to the work in RestIntegTestTask's constructor :( .getExtensions()
// see: https://github.com/elastic/elasticsearch/issues/47804 .getByName(TestClustersPlugin.EXTENSION_NAME);
RestIntegTestTask testTask = project.getTasks().create(sourceSetName, RestIntegTestTask.class); return testClusters.create(sourceSet.getName());
testTask.setGroup(JavaBasePlugin.VERIFICATION_GROUP);
testTask.setDescription("Runs the REST tests against an external cluster");
// make the new test run after unit tests
testTask.mustRunAfter(project.getTasks().named("test"));
return testTask;
} }
/** /**
* Creates the runner task and configures the test clusters * Creates a task with the source set name of type {@link RestIntegTestTask}
*/ */
static void setupRunnerTask(Project project, RestIntegTestTask testTask, SourceSet sourceSet) { static Provider<RestIntegTestTask> registerTask(Project project, SourceSet sourceSet) {
testTask.setTestClassesDirs(sourceSet.getOutput().getClassesDirs()); // lazily create the test task
testTask.setClasspath(sourceSet.getRuntimeClasspath()); Provider<RestIntegTestTask> testProvider = project.getTasks().register(sourceSet.getName(), RestIntegTestTask.class, testTask -> {
testTask.setGroup(JavaBasePlugin.VERIFICATION_GROUP);
// if this a module or plugin, it may have an associated zip file with it's contents, add that to the test cluster testTask.setDescription("Runs the REST tests against an external cluster");
project.getPluginManager().withPlugin("elasticsearch.esplugin", plugin -> { testTask.mustRunAfter(project.getTasks().named("test"));
Zip bundle = (Zip) project.getTasks().getByName("bundlePlugin"); testTask.setTestClassesDirs(sourceSet.getOutput().getClassesDirs());
testTask.dependsOn(bundle); testTask.setClasspath(sourceSet.getRuntimeClasspath());
if (project.getPath().contains("modules:")) { // if this a module or plugin, it may have an associated zip file with it's contents, add that to the test cluster
testTask.getClusters().forEach(c -> c.module(bundle.getArchiveFile())); project.getPluginManager().withPlugin("elasticsearch.esplugin", plugin -> {
} else { Zip bundle = (Zip) project.getTasks().getByName("bundlePlugin");
testTask.getClusters().forEach(c -> c.plugin(project.getObjects().fileProperty().value(bundle.getArchiveFile()))); testTask.dependsOn(bundle);
} if (project.getPath().contains("modules:")) {
testTask.getClusters().forEach(c -> c.module(bundle.getArchiveFile()));
} else {
testTask.getClusters().forEach(c -> c.plugin(project.getObjects().fileProperty().value(bundle.getArchiveFile())));
}
});
}); });
return testProvider;
} }
/** /**

View File

@ -27,12 +27,13 @@ import org.elasticsearch.gradle.util.GradleUtils;
import org.gradle.api.Plugin; import org.gradle.api.Plugin;
import org.gradle.api.Project; import org.gradle.api.Project;
import org.gradle.api.plugins.JavaBasePlugin; import org.gradle.api.plugins.JavaBasePlugin;
import org.gradle.api.provider.Provider;
import org.gradle.api.tasks.SourceSet; import org.gradle.api.tasks.SourceSet;
import org.gradle.api.tasks.SourceSetContainer; import org.gradle.api.tasks.SourceSetContainer;
import static org.elasticsearch.gradle.test.rest.RestTestUtil.createTestCluster;
import static org.elasticsearch.gradle.test.rest.RestTestUtil.registerTask;
import static org.elasticsearch.gradle.test.rest.RestTestUtil.setupDependencies; import static org.elasticsearch.gradle.test.rest.RestTestUtil.setupDependencies;
import static org.elasticsearch.gradle.test.rest.RestTestUtil.setupRunnerTask;
import static org.elasticsearch.gradle.test.rest.RestTestUtil.setupTask;
/** /**
* Apply this plugin to run the YAML based REST tests. * Apply this plugin to run the YAML based REST tests.
@ -53,11 +54,11 @@ public class YamlRestTestPlugin implements Plugin<Project> {
SourceSetContainer sourceSets = project.getExtensions().getByType(SourceSetContainer.class); SourceSetContainer sourceSets = project.getExtensions().getByType(SourceSetContainer.class);
SourceSet yamlTestSourceSet = sourceSets.create(SOURCE_SET_NAME); SourceSet yamlTestSourceSet = sourceSets.create(SOURCE_SET_NAME);
// setup the yamlRestTest task // create the test cluster container
RestIntegTestTask yamlRestTestTask = setupTask(project, SOURCE_SET_NAME); createTestCluster(project, yamlTestSourceSet);
// setup the runner task // setup the yamlRestTest task
setupRunnerTask(project, yamlRestTestTask, yamlTestSourceSet); Provider<RestIntegTestTask> yamlRestTestTask = registerTask(project, yamlTestSourceSet);
// setup the dependencies // setup the dependencies
setupDependencies(project, yamlTestSourceSet); setupDependencies(project, yamlTestSourceSet);