Skip to content

Commit a529389

Browse files
authored
[7.15] Introduce simple public yaml-rest-test plugin (7.x backport) (#77054) (#77586) (#77595)
1 parent cff5ed1 commit a529389

File tree

67 files changed

+292
-82
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

67 files changed

+292
-82
lines changed

build-tools-internal/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,8 +148,8 @@ gradlePlugin {
148148
implementationClass = 'org.elasticsearch.gradle.internal.precommit.ValidateRestSpecPlugin'
149149
}
150150
yamlRestTest {
151-
id = 'elasticsearch.yaml-rest-test'
152-
implementationClass = 'org.elasticsearch.gradle.internal.test.rest.YamlRestTestPlugin'
151+
id = 'elasticsearch.internal-yaml-rest-test'
152+
implementationClass = 'org.elasticsearch.gradle.internal.test.rest.InternalYamlRestTestPlugin'
153153
}
154154
}
155155
}
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,13 @@ package org.elasticsearch.gradle.internal.test.rest
1111
import org.elasticsearch.gradle.fixtures.AbstractRestResourcesFuncTest
1212
import org.gradle.testkit.runner.TaskOutcome
1313

14-
class YamlRestTestPluginFuncTest extends AbstractRestResourcesFuncTest {
14+
class InternalYamlRestTestPluginFuncTest extends AbstractRestResourcesFuncTest {
1515

1616
def "yamlRestTest does nothing when there are no tests"() {
1717
given:
1818
buildFile << """
1919
plugins {
20-
id 'elasticsearch.yaml-rest-test'
20+
id 'elasticsearch.internal-yaml-rest-test'
2121
}
2222
"""
2323

@@ -34,7 +34,7 @@ class YamlRestTestPluginFuncTest extends AbstractRestResourcesFuncTest {
3434
given:
3535
internalBuild()
3636
buildFile << """
37-
apply plugin: 'elasticsearch.yaml-rest-test'
37+
apply plugin: 'elasticsearch.internal-yaml-rest-test'
3838
3939
dependencies {
4040
yamlRestTestImplementation "junit:junit:4.12"
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
/**
2929
* Apply this plugin to run the YAML based REST tests.
3030
*/
31-
public class YamlRestTestPlugin implements Plugin<Project> {
31+
public class InternalYamlRestTestPlugin implements Plugin<Project> {
3232

3333
public static final String SOURCE_SET_NAME = "yamlRestTest";
3434

build-tools/build.gradle

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ gradlePlugin {
6161
id = 'elasticsearch.test-gradle-policy'
6262
implementationClass = 'org.elasticsearch.gradle.test.GradleTestPolicySetupPlugin'
6363
}
64+
yamlTests {
65+
id = 'elasticsearch.yaml-rest-test'
66+
implementationClass = 'org.elasticsearch.gradle.test.YamlRestTestPlugin'
67+
}
6468
}
6569
}
6670

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License
4+
* 2.0 and the Server Side Public License, v 1; you may not use this file except
5+
* in compliance with, at your election, the Elastic License 2.0 or the Server
6+
* Side Public License, v 1.
7+
*/
8+
9+
package org.elasticsearch.gradle.test
10+
11+
import org.elasticsearch.gradle.VersionProperties
12+
import org.elasticsearch.gradle.fixtures.AbstractGradleFuncTest
13+
import org.gradle.testkit.runner.TaskOutcome
14+
15+
class YamlRestTestPluginFuncTest extends AbstractGradleFuncTest {
16+
17+
def "declares default dependencies"() {
18+
given:
19+
buildFile << """
20+
plugins {
21+
id 'elasticsearch.yaml-rest-test'
22+
}
23+
"""
24+
25+
when:
26+
def result = gradleRunner("dependencies").build()
27+
def output = normalized(result.output)
28+
then:
29+
output.contains("""
30+
restTestSpecs
31+
/--- org.elasticsearch:rest-api-spec:${VersionProperties.elasticsearch} FAILED""")
32+
output.contains(normalized("""
33+
yamlRestTestImplementation - Implementation only dependencies for source set 'yaml rest test'. (n)
34+
/--- org.elasticsearch.test:framework:${VersionProperties.elasticsearch} (n)"""))
35+
}
36+
37+
def "yamlRestTest does nothing when there are no tests"() {
38+
given:
39+
buildFile << """
40+
plugins {
41+
id 'elasticsearch.yaml-rest-test'
42+
}
43+
44+
repositories {
45+
mavenCentral()
46+
}
47+
48+
dependencies {
49+
yamlRestTestImplementation "org.elasticsearch.test:framework:7.14.0"
50+
restTestSpecs "org.elasticsearch:rest-api-spec:7.14.0"
51+
}
52+
"""
53+
54+
when:
55+
def result = gradleRunner("yamlRestTest").build()
56+
then:
57+
result.task(':compileYamlRestTestJava').outcome == TaskOutcome.NO_SOURCE
58+
result.task(':processYamlRestTestResources').outcome == TaskOutcome.NO_SOURCE
59+
result.task(':yamlRestTest').outcome == TaskOutcome.NO_SOURCE
60+
}
61+
62+
}

build-tools/src/main/java/org/elasticsearch/gradle/plugin/PluginBuildPlugin.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@
5959
* Encapsulates build configuration for an Elasticsearch plugin.
6060
*/
6161
public class PluginBuildPlugin implements Plugin<Project> {
62+
63+
public static final String BUNDLE_PLUGIN_TASK_NAME = "bundlePlugin";
64+
6265
@Override
6366
public void apply(final Project project) {
6467
project.getPluginManager().apply(JavaPlugin.class);
@@ -129,7 +132,7 @@ public void apply(final Project project) {
129132

130133
project.getTasks().register("run", RunTask.class, runTask -> {
131134
runTask.useCluster(runCluster);
132-
runTask.dependsOn(project.getTasks().named("bundlePlugin"));
135+
runTask.dependsOn(project.getTasks().named(BUNDLE_PLUGIN_TASK_NAME));
133136
});
134137
}
135138

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License
4+
* 2.0 and the Server Side Public License, v 1; you may not use this file except
5+
* in compliance with, at your election, the Elastic License 2.0 or the Server
6+
* Side Public License, v 1.
7+
*/
8+
9+
package org.elasticsearch.gradle.test;
10+
11+
import org.elasticsearch.gradle.VersionProperties;
12+
import org.elasticsearch.gradle.plugin.PluginBuildPlugin;
13+
import org.elasticsearch.gradle.testclusters.ElasticsearchCluster;
14+
import org.elasticsearch.gradle.testclusters.StandaloneRestIntegTestTask;
15+
import org.elasticsearch.gradle.testclusters.TestClustersPlugin;
16+
import org.elasticsearch.gradle.transform.UnzipTransform;
17+
import org.gradle.api.Action;
18+
import org.gradle.api.NamedDomainObjectContainer;
19+
import org.gradle.api.Plugin;
20+
import org.gradle.api.Project;
21+
import org.gradle.api.Task;
22+
import org.gradle.api.artifacts.Configuration;
23+
import org.gradle.api.artifacts.ConfigurationContainer;
24+
import org.gradle.api.artifacts.dsl.DependencyHandler;
25+
import org.gradle.api.artifacts.type.ArtifactTypeDefinition;
26+
import org.gradle.api.attributes.Attribute;
27+
import org.gradle.api.internal.artifacts.ArtifactAttributes;
28+
import org.gradle.api.plugins.JavaBasePlugin;
29+
import org.gradle.api.tasks.Copy;
30+
import org.gradle.api.tasks.SourceSet;
31+
import org.gradle.api.tasks.SourceSetContainer;
32+
import org.gradle.api.tasks.TaskProvider;
33+
import org.gradle.api.tasks.bundling.Zip;
34+
35+
import java.io.File;
36+
37+
import static org.elasticsearch.gradle.plugin.PluginBuildPlugin.BUNDLE_PLUGIN_TASK_NAME;
38+
39+
public class YamlRestTestPlugin implements Plugin<Project> {
40+
41+
public static final String REST_TEST_SPECS_CONFIGURATION_NAME = "restTestSpecs";
42+
public static final String YAML_REST_TEST = "yamlRestTest";
43+
44+
@Override
45+
public void apply(Project project) {
46+
project.getPluginManager().apply(GradleTestPolicySetupPlugin.class);
47+
project.getPluginManager().apply(TestClustersPlugin.class);
48+
project.getPluginManager().apply(JavaBasePlugin.class);
49+
50+
Attribute<Boolean> restAttribute = Attribute.of("restSpecs", Boolean.class);
51+
project.getDependencies().getAttributesSchema().attribute(restAttribute);
52+
project.getDependencies().getArtifactTypes().maybeCreate(ArtifactTypeDefinition.JAR_TYPE);
53+
project.getDependencies().registerTransform(UnzipTransform.class, transformSpec -> {
54+
transformSpec.getFrom()
55+
.attribute(ArtifactAttributes.ARTIFACT_FORMAT, ArtifactTypeDefinition.JAR_TYPE)
56+
.attribute(restAttribute, true);
57+
transformSpec.getTo()
58+
.attribute(ArtifactAttributes.ARTIFACT_FORMAT, ArtifactTypeDefinition.DIRECTORY_TYPE)
59+
.attribute(restAttribute, true);
60+
});
61+
62+
ConfigurationContainer configurations = project.getConfigurations();
63+
Configuration restTestSpecs = configurations.create(REST_TEST_SPECS_CONFIGURATION_NAME);
64+
restTestSpecs.getAttributes().attribute(ArtifactAttributes.ARTIFACT_FORMAT, ArtifactTypeDefinition.DIRECTORY_TYPE);
65+
restTestSpecs.getAttributes().attribute(restAttribute, true);
66+
67+
TaskProvider<Copy> copyRestTestSpecs = project.getTasks().register("copyRestTestSpecs", Copy.class, t -> {
68+
t.from(restTestSpecs);
69+
t.into(new File(project.getBuildDir(), "restResources/restspec"));
70+
});
71+
72+
var sourceSets = project.getExtensions().getByType(SourceSetContainer.class);
73+
var testSourceSet = sourceSets.maybeCreate(YAML_REST_TEST);
74+
NamedDomainObjectContainer<ElasticsearchCluster> testClusters = (NamedDomainObjectContainer<ElasticsearchCluster>) project
75+
.getExtensions()
76+
.getByName(TestClustersPlugin.EXTENSION_NAME);
77+
78+
testSourceSet.getOutput().dir(copyRestTestSpecs.map(Task::getOutputs));
79+
Configuration yamlRestTestImplementation = configurations.getByName(testSourceSet.getImplementationConfigurationName());
80+
setupDefaultDependencies(project.getDependencies(), restTestSpecs, yamlRestTestImplementation);
81+
var cluster = testClusters.maybeCreate(YAML_REST_TEST);
82+
TaskProvider<StandaloneRestIntegTestTask> yamlRestTestTask = setupTestTask(project, testSourceSet, cluster);
83+
project.getPlugins().withType(PluginBuildPlugin.class, p -> {
84+
TaskProvider<Zip> bundle = project.getTasks().withType(Zip.class).named(BUNDLE_PLUGIN_TASK_NAME);
85+
cluster.plugin(bundle.flatMap(Zip::getArchiveFile));
86+
yamlRestTestTask.configure(t -> t.dependsOn(bundle));
87+
});
88+
}
89+
90+
private static void setupDefaultDependencies(
91+
DependencyHandler dependencyHandler,
92+
Configuration restTestSpecs,
93+
Configuration yamlRestTestImplementation
94+
) {
95+
String elasticsearchVersion = VersionProperties.getElasticsearch();
96+
yamlRestTestImplementation.defaultDependencies(
97+
deps -> deps.add(dependencyHandler.create("org.elasticsearch.test:framework:" + elasticsearchVersion))
98+
);
99+
100+
restTestSpecs.defaultDependencies(
101+
deps -> deps.add(dependencyHandler.create("org.elasticsearch:rest-api-spec:" + elasticsearchVersion))
102+
);
103+
}
104+
105+
private TaskProvider<StandaloneRestIntegTestTask> setupTestTask(
106+
Project project,
107+
SourceSet testSourceSet,
108+
ElasticsearchCluster cluster
109+
) {
110+
return project.getTasks().register("yamlRestTest", StandaloneRestIntegTestTask.class, task -> {
111+
task.useCluster(cluster);
112+
task.setTestClassesDirs(testSourceSet.getOutput().getClassesDirs());
113+
task.setClasspath(testSourceSet.getRuntimeClasspath());
114+
115+
var nonInputProperties = new SystemPropertyCommandLineArgumentProvider();
116+
nonInputProperties.systemProperty("tests.rest.cluster", () -> String.join(",", cluster.getAllHttpSocketURI()));
117+
nonInputProperties.systemProperty("tests.cluster", () -> String.join(",", cluster.getAllTransportPortURI()));
118+
nonInputProperties.systemProperty("tests.clustername", () -> cluster.getName());
119+
task.getJvmArgumentProviders().add(nonInputProperties);
120+
task.systemProperty("tests.rest.load_packaged", Boolean.FALSE.toString());
121+
});
122+
}
123+
124+
}

modules/aggs-matrix-stats/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
* in compliance with, at your election, the Elastic License 2.0 or the Server
66
* Side Public License, v 1.
77
*/
8-
apply plugin: 'elasticsearch.yaml-rest-test'
8+
apply plugin: 'elasticsearch.internal-yaml-rest-test'
99

1010
esplugin {
1111
description 'Adds aggregations whose input are a list of numeric fields and output includes a matrix.'

modules/analysis-common/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
* in compliance with, at your election, the Elastic License 2.0 or the Server
66
* Side Public License, v 1.
77
*/
8-
apply plugin: 'elasticsearch.yaml-rest-test'
8+
apply plugin: 'elasticsearch.internal-yaml-rest-test'
99
apply plugin: 'elasticsearch.internal-cluster-test'
1010

1111
esplugin {

modules/geo/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
* in compliance with, at your election, the Elastic License 2.0 or the Server
66
* Side Public License, v 1.
77
*/
8-
apply plugin: 'elasticsearch.yaml-rest-test'
8+
apply plugin: 'elasticsearch.internal-yaml-rest-test'
99

1010
import org.elasticsearch.gradle.internal.info.BuildParams
1111

0 commit comments

Comments
 (0)