From c5f1eb88feee0cf57243d41c5afdd55fb11504fb Mon Sep 17 00:00:00 2001 From: Andy Bristol Date: Mon, 19 Mar 2018 10:19:39 -0700 Subject: [PATCH 1/4] [test] packaging: add groovy test project Adds behavior to the vagrant test plugin that runs jars from the packagingTest configuration inside test VMs. Makes :qa:vagrant a project which builds such a packaging test uberjar. This test project doesn't run anything yet. For #26741 --- Vagrantfile | 2 ++ .../gradle/vagrant/VagrantTestPlugin.groovy | 32 ++++++++++++----- qa/vagrant/build.gradle | 36 +++++++++++++++++-- .../packaging/PackagingMain.groovy | 27 ++++++++++++++ 4 files changed, 86 insertions(+), 11 deletions(-) create mode 100644 qa/vagrant/src/main/groovy/org/elasticsearch/packaging/PackagingMain.groovy diff --git a/Vagrantfile b/Vagrantfile index 6f81ba0273c9f..6761fec07dab2 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -337,6 +337,7 @@ export BATS=/project/build/bats export BATS_UTILS=/project/build/packaging/bats/utils export BATS_TESTS=/project/build/packaging/bats/tests export PACKAGING_ARCHIVES=/project/build/packaging/archives +export PACKAGING_TESTS=/project/build/packaging/tests VARS cat \<\ /etc/sudoers.d/elasticsearch_vars Defaults env_keep += "ZIP" @@ -347,6 +348,7 @@ Defaults env_keep += "BATS" Defaults env_keep += "BATS_UTILS" Defaults env_keep += "BATS_TESTS" Defaults env_keep += "PACKAGING_ARCHIVES" +Defaults env_keep += "PACKAGING_TESTS" SUDOERS_VARS chmod 0440 /etc/sudoers.d/elasticsearch_vars SHELL diff --git a/buildSrc/src/main/groovy/org/elasticsearch/gradle/vagrant/VagrantTestPlugin.groovy b/buildSrc/src/main/groovy/org/elasticsearch/gradle/vagrant/VagrantTestPlugin.groovy index d7d1c01e7dd00..189a25f1b3c39 100644 --- a/buildSrc/src/main/groovy/org/elasticsearch/gradle/vagrant/VagrantTestPlugin.groovy +++ b/buildSrc/src/main/groovy/org/elasticsearch/gradle/vagrant/VagrantTestPlugin.groovy @@ -43,6 +43,7 @@ class VagrantTestPlugin implements Plugin { static List UPGRADE_FROM_ARCHIVES = ['rpm', 'deb'] private static final PACKAGING_CONFIGURATION = 'packaging' + private static final PACKAGING_TEST_CONFIGURATION = 'packagingTest' private static final BATS = 'bats' private static final String BATS_TEST_COMMAND ="cd \$PACKAGING_ARCHIVES && sudo bats --tap \$BATS_TESTS/*.$BATS" private static final String PLATFORM_TEST_COMMAND ="rm -rf ~/elasticsearch && rsync -r /elasticsearch/ ~/elasticsearch && cd ~/elasticsearch && ./gradlew test integTest" @@ -58,6 +59,7 @@ class VagrantTestPlugin implements Plugin { // Creates custom configurations for Bats testing files (and associated scripts and archives) createPackagingConfiguration(project) + project.configurations.create(PACKAGING_TEST_CONFIGURATION) // Creates all the main Vagrant tasks createVagrantTasks(project) @@ -134,10 +136,12 @@ class VagrantTestPlugin implements Plugin { } private static void createCleanTask(Project project) { - project.tasks.create('clean', Delete.class) { - description 'Clean the project build directory' - group 'Build' - delete project.buildDir + if (project.tasks.findByName('clean') == null) { + project.tasks.create('clean', Delete.class) { + description 'Clean the project build directory' + group 'Build' + delete project.buildDir + } } } @@ -164,6 +168,12 @@ class VagrantTestPlugin implements Plugin { from project.configurations[PACKAGING_CONFIGURATION] } + File testsDir = new File(packagingDir, 'tests') + Copy copyPackagingTests = project.tasks.create('copyPackagingTests', Copy) { + into testsDir + from project.configurations[PACKAGING_TEST_CONFIGURATION] + } + Task createVersionFile = project.tasks.create('createVersionFile', FileContentsTask) { dependsOn copyPackagingArchives file "${archivesDir}/version" @@ -214,7 +224,7 @@ class VagrantTestPlugin implements Plugin { Task vagrantSetUpTask = project.tasks.create('setupPackagingTest') vagrantSetUpTask.dependsOn 'vagrantCheckVersion' - vagrantSetUpTask.dependsOn copyPackagingArchives, createVersionFile, createUpgradeFromFile + vagrantSetUpTask.dependsOn copyPackagingArchives, copyPackagingTests, createVersionFile, createUpgradeFromFile vagrantSetUpTask.dependsOn copyBatsTests, copyBatsUtils } @@ -373,10 +383,14 @@ class VagrantTestPlugin implements Plugin { packagingTest.dependsOn(batsPackagingTest) } - // This task doesn't do anything yet. In the future it will execute a jar containing tests on the vm - Task groovyPackagingTest = project.tasks.create("vagrant${boxTask}#groovyPackagingTest") - groovyPackagingTest.dependsOn(up) - groovyPackagingTest.finalizedBy(halt) + Task groovyPackagingTest = project.tasks.create("vagrant${boxTask}#groovyPackagingTest", VagrantCommandTask) { + command 'ssh' + boxName box + environmentVars vagrantEnvVars + dependsOn up, setupPackagingTest + finalizedBy halt + args '--command', 'set -e; for jar in $PACKAGING_TESTS/*.jar; do java -jar $jar; done' + } TaskExecutionAdapter groovyPackagingReproListener = createReproListener(project, groovyPackagingTest.path) groovyPackagingTest.doFirst { diff --git a/qa/vagrant/build.gradle b/qa/vagrant/build.gradle index 4086cf2205785..6c1416f5ddd65 100644 --- a/qa/vagrant/build.gradle +++ b/qa/vagrant/build.gradle @@ -17,8 +17,27 @@ * under the License. */ -apply plugin: 'elasticsearch.vagrantsupport' -apply plugin: 'elasticsearch.vagrant' +plugins { + id 'groovy' + id 'application' + id 'com.github.johnrengelman.shadow' version '2.0.2' + id 'elasticsearch.build' + id 'elasticsearch.vagrantsupport' + id 'elasticsearch.vagrant' +} + +dependencies { + compile localGroovy() + compile "org.hamcrest:hamcrest-all:${versions.hamcrest}" + runtime project(':libs:elasticsearch-core') // needs to be on the classpath for JarHell + packagingTest project(path: project.path, configuration: 'shadow') +} + +shadowJar { + dependencies { + exclude(project(":libs:elasticsearch-core")) // isn't needed in tests + } +} List plugins = [] for (Project subproj : project.rootProject.subprojects) { @@ -39,3 +58,16 @@ setupPackagingTest { expectedPlugins.setText(plugins.join('\n'), 'UTF-8') } } + +mainClassName = 'org.elasticsearch.packaging.PackagingMain' + +tasks.test.enabled = false + +tasks.dependencyLicenses.enabled = false +tasks.dependenciesInfo.enabled = false + +tasks.thirdPartyAudit.enabled = false + +tasks.forbiddenApis.enabled = false +tasks.forbiddenApisMain.enabled = false +tasks.forbiddenApisTest.enabled = false diff --git a/qa/vagrant/src/main/groovy/org/elasticsearch/packaging/PackagingMain.groovy b/qa/vagrant/src/main/groovy/org/elasticsearch/packaging/PackagingMain.groovy new file mode 100644 index 0000000000000..cc58b5dba3825 --- /dev/null +++ b/qa/vagrant/src/main/groovy/org/elasticsearch/packaging/PackagingMain.groovy @@ -0,0 +1,27 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.elasticsearch.packaging + +/** + * This class doesn't do anything yet + */ +class PackagingMain { + static void main(String[] args) {} +} From c16706da663535be39254be3b7398cd0143fdbbe Mon Sep 17 00:00:00 2001 From: Andy Bristol Date: Mon, 2 Apr 2018 12:22:20 -0700 Subject: [PATCH 2/4] packaging test use dir of jars rather than uberjar --- .../vagrant/VagrantPropertiesExtension.groovy | 3 +++ .../gradle/vagrant/VagrantTestPlugin.groovy | 2 +- qa/vagrant/build.gradle | 18 ++++++++---------- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/buildSrc/src/main/groovy/org/elasticsearch/gradle/vagrant/VagrantPropertiesExtension.groovy b/buildSrc/src/main/groovy/org/elasticsearch/gradle/vagrant/VagrantPropertiesExtension.groovy index c6d0f1d0425d0..354ce1ff68dda 100644 --- a/buildSrc/src/main/groovy/org/elasticsearch/gradle/vagrant/VagrantPropertiesExtension.groovy +++ b/buildSrc/src/main/groovy/org/elasticsearch/gradle/vagrant/VagrantPropertiesExtension.groovy @@ -40,6 +40,9 @@ class VagrantPropertiesExtension { @Input Boolean inheritTestUtils + @Input + String testMainClass + VagrantPropertiesExtension(List availableBoxes) { this.boxes = availableBoxes this.batsDir = 'src/test/resources/packaging' diff --git a/buildSrc/src/main/groovy/org/elasticsearch/gradle/vagrant/VagrantTestPlugin.groovy b/buildSrc/src/main/groovy/org/elasticsearch/gradle/vagrant/VagrantTestPlugin.groovy index 189a25f1b3c39..6f8ac06ab58e5 100644 --- a/buildSrc/src/main/groovy/org/elasticsearch/gradle/vagrant/VagrantTestPlugin.groovy +++ b/buildSrc/src/main/groovy/org/elasticsearch/gradle/vagrant/VagrantTestPlugin.groovy @@ -389,7 +389,7 @@ class VagrantTestPlugin implements Plugin { environmentVars vagrantEnvVars dependsOn up, setupPackagingTest finalizedBy halt - args '--command', 'set -e; for jar in $PACKAGING_TESTS/*.jar; do java -jar $jar; done' + args '--command', "java -cp \"\$PACKAGING_TESTS/*\" ${-> project.extensions.esvagrant.testMainClass}" } TaskExecutionAdapter groovyPackagingReproListener = createReproListener(project, groovyPackagingTest.path) diff --git a/qa/vagrant/build.gradle b/qa/vagrant/build.gradle index 6c1416f5ddd65..e3a607c1591c1 100644 --- a/qa/vagrant/build.gradle +++ b/qa/vagrant/build.gradle @@ -19,8 +19,6 @@ plugins { id 'groovy' - id 'application' - id 'com.github.johnrengelman.shadow' version '2.0.2' id 'elasticsearch.build' id 'elasticsearch.vagrantsupport' id 'elasticsearch.vagrant' @@ -29,14 +27,12 @@ plugins { dependencies { compile localGroovy() compile "org.hamcrest:hamcrest-all:${versions.hamcrest}" - runtime project(':libs:elasticsearch-core') // needs to be on the classpath for JarHell - packagingTest project(path: project.path, configuration: 'shadow') -} -shadowJar { - dependencies { - exclude(project(":libs:elasticsearch-core")) // isn't needed in tests - } + // needs to be on the classpath for JarHell but not actually needed for tests + runtime project(':libs:elasticsearch-core') + + // pulls in the jar built by this project and its dependencies + packagingTest project(path: project.path, configuration: 'runtime') } List plugins = [] @@ -59,7 +55,9 @@ setupPackagingTest { } } -mainClassName = 'org.elasticsearch.packaging.PackagingMain' +esvagrant { + testMainClass 'org.elasticsearch.packaging.PackagingMain' +} tasks.test.enabled = false From 249d57a7a4f5963e381522fb74d9e876c784e3aa Mon Sep 17 00:00:00 2001 From: Andy Bristol Date: Tue, 3 Apr 2018 14:58:44 -0700 Subject: [PATCH 3/4] packaging tests are now java and use junit --- .../vagrant/VagrantPropertiesExtension.groovy | 2 +- .../gradle/vagrant/VagrantTestPlugin.groovy | 12 +++++----- qa/vagrant/build.gradle | 24 +++++++++++-------- .../packaging/PackagingTests.java} | 12 ++++++---- 4 files changed, 29 insertions(+), 21 deletions(-) rename qa/vagrant/src/main/{groovy/org/elasticsearch/packaging/PackagingMain.groovy => java/org/elasticsearch/packaging/PackagingTests.java} (82%) diff --git a/buildSrc/src/main/groovy/org/elasticsearch/gradle/vagrant/VagrantPropertiesExtension.groovy b/buildSrc/src/main/groovy/org/elasticsearch/gradle/vagrant/VagrantPropertiesExtension.groovy index 354ce1ff68dda..c0754042745a2 100644 --- a/buildSrc/src/main/groovy/org/elasticsearch/gradle/vagrant/VagrantPropertiesExtension.groovy +++ b/buildSrc/src/main/groovy/org/elasticsearch/gradle/vagrant/VagrantPropertiesExtension.groovy @@ -41,7 +41,7 @@ class VagrantPropertiesExtension { Boolean inheritTestUtils @Input - String testMainClass + String testClass VagrantPropertiesExtension(List availableBoxes) { this.boxes = availableBoxes diff --git a/buildSrc/src/main/groovy/org/elasticsearch/gradle/vagrant/VagrantTestPlugin.groovy b/buildSrc/src/main/groovy/org/elasticsearch/gradle/vagrant/VagrantTestPlugin.groovy index 6f8ac06ab58e5..485e0f35b06a8 100644 --- a/buildSrc/src/main/groovy/org/elasticsearch/gradle/vagrant/VagrantTestPlugin.groovy +++ b/buildSrc/src/main/groovy/org/elasticsearch/gradle/vagrant/VagrantTestPlugin.groovy @@ -383,24 +383,24 @@ class VagrantTestPlugin implements Plugin { packagingTest.dependsOn(batsPackagingTest) } - Task groovyPackagingTest = project.tasks.create("vagrant${boxTask}#groovyPackagingTest", VagrantCommandTask) { + Task javaPackagingTest = project.tasks.create("vagrant${boxTask}#javaPackagingTest", VagrantCommandTask) { command 'ssh' boxName box environmentVars vagrantEnvVars dependsOn up, setupPackagingTest finalizedBy halt - args '--command', "java -cp \"\$PACKAGING_TESTS/*\" ${-> project.extensions.esvagrant.testMainClass}" + args '--command', "java -cp \"\$PACKAGING_TESTS/*\" org.junit.runner.JUnitCore ${-> project.extensions.esvagrant.testClass}" } - TaskExecutionAdapter groovyPackagingReproListener = createReproListener(project, groovyPackagingTest.path) - groovyPackagingTest.doFirst { + TaskExecutionAdapter groovyPackagingReproListener = createReproListener(project, javaPackagingTest.path) + javaPackagingTest.doFirst { project.gradle.addListener(groovyPackagingReproListener) } - groovyPackagingTest.doLast { + javaPackagingTest.doLast { project.gradle.removeListener(groovyPackagingReproListener) } if (project.extensions.esvagrant.boxes.contains(box)) { - packagingTest.dependsOn(groovyPackagingTest) + packagingTest.dependsOn(javaPackagingTest) } Task platform = project.tasks.create("vagrant${boxTask}#platformTest", VagrantCommandTask) { diff --git a/qa/vagrant/build.gradle b/qa/vagrant/build.gradle index e3a607c1591c1..3ff0dcd1a9e82 100644 --- a/qa/vagrant/build.gradle +++ b/qa/vagrant/build.gradle @@ -1,3 +1,5 @@ +import org.elasticsearch.gradle.precommit.PrecommitTasks + /* * Licensed to Elasticsearch under one or more contributor * license agreements. See the NOTICE file distributed with @@ -18,15 +20,15 @@ */ plugins { - id 'groovy' + id 'java' id 'elasticsearch.build' id 'elasticsearch.vagrantsupport' id 'elasticsearch.vagrant' } dependencies { - compile localGroovy() - compile "org.hamcrest:hamcrest-all:${versions.hamcrest}" + compile "junit:junit:${versions.junit}" + compile "org.hamcrest:hamcrest-core:${versions.hamcrest}" // needs to be on the classpath for JarHell but not actually needed for tests runtime project(':libs:elasticsearch-core') @@ -56,16 +58,18 @@ setupPackagingTest { } esvagrant { - testMainClass 'org.elasticsearch.packaging.PackagingMain' + testClass 'org.elasticsearch.packaging.PackagingTests' +} + +forbiddenApisMain { + signaturesURLs = [ + PrecommitTasks.getResource('/forbidden/jdk-signatures.txt') + ] } +// we don't have additional tests for the tests themselves tasks.test.enabled = false +// this project doesn't get published tasks.dependencyLicenses.enabled = false tasks.dependenciesInfo.enabled = false - -tasks.thirdPartyAudit.enabled = false - -tasks.forbiddenApis.enabled = false -tasks.forbiddenApisMain.enabled = false -tasks.forbiddenApisTest.enabled = false diff --git a/qa/vagrant/src/main/groovy/org/elasticsearch/packaging/PackagingMain.groovy b/qa/vagrant/src/main/java/org/elasticsearch/packaging/PackagingTests.java similarity index 82% rename from qa/vagrant/src/main/groovy/org/elasticsearch/packaging/PackagingMain.groovy rename to qa/vagrant/src/main/java/org/elasticsearch/packaging/PackagingTests.java index cc58b5dba3825..0b5e7a3b6e0d2 100644 --- a/qa/vagrant/src/main/groovy/org/elasticsearch/packaging/PackagingMain.groovy +++ b/qa/vagrant/src/main/java/org/elasticsearch/packaging/PackagingTests.java @@ -17,11 +17,15 @@ * under the License. */ -package org.elasticsearch.packaging +package org.elasticsearch.packaging; + +import org.junit.Test; /** - * This class doesn't do anything yet + * This class doesn't have any tests yet */ -class PackagingMain { - static void main(String[] args) {} +public class PackagingTests { + + @Test + public void testDummy() {} } From 8dee0e66dd8830c82669382727ae947df17c560e Mon Sep 17 00:00:00 2001 From: Andy Bristol Date: Tue, 3 Apr 2018 17:20:35 -0700 Subject: [PATCH 4/4] write packaging test runner script alongside tests --- .../elasticsearch/gradle/FileContentsTask.groovy | 4 ++++ .../gradle/vagrant/VagrantTestPlugin.groovy | 13 ++++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/buildSrc/src/main/groovy/org/elasticsearch/gradle/FileContentsTask.groovy b/buildSrc/src/main/groovy/org/elasticsearch/gradle/FileContentsTask.groovy index 248083af5e0d5..a6ede79f87173 100644 --- a/buildSrc/src/main/groovy/org/elasticsearch/gradle/FileContentsTask.groovy +++ b/buildSrc/src/main/groovy/org/elasticsearch/gradle/FileContentsTask.groovy @@ -36,6 +36,9 @@ class FileContentsTask extends DefaultTask { @Input Object contents + @Input + boolean executable = false + /** * The file to be built. Takes any objecct and coerces to a file. */ @@ -47,5 +50,6 @@ class FileContentsTask extends DefaultTask { void setContents() { file = file as File file.text = contents.toString() + file.setExecutable(executable) } } diff --git a/buildSrc/src/main/groovy/org/elasticsearch/gradle/vagrant/VagrantTestPlugin.groovy b/buildSrc/src/main/groovy/org/elasticsearch/gradle/vagrant/VagrantTestPlugin.groovy index 485e0f35b06a8..d84de5752fab7 100644 --- a/buildSrc/src/main/groovy/org/elasticsearch/gradle/vagrant/VagrantTestPlugin.groovy +++ b/buildSrc/src/main/groovy/org/elasticsearch/gradle/vagrant/VagrantTestPlugin.groovy @@ -174,6 +174,13 @@ class VagrantTestPlugin implements Plugin { from project.configurations[PACKAGING_TEST_CONFIGURATION] } + Task createTestRunnerScript = project.tasks.create('createTestRunnerScript', FileContentsTask) { + dependsOn copyPackagingTests + file "${testsDir}/run-tests.sh" + contents "java -cp \"*\" org.junit.runner.JUnitCore ${-> project.extensions.esvagrant.testClass}" + executable true + } + Task createVersionFile = project.tasks.create('createVersionFile', FileContentsTask) { dependsOn copyPackagingArchives file "${archivesDir}/version" @@ -224,8 +231,8 @@ class VagrantTestPlugin implements Plugin { Task vagrantSetUpTask = project.tasks.create('setupPackagingTest') vagrantSetUpTask.dependsOn 'vagrantCheckVersion' - vagrantSetUpTask.dependsOn copyPackagingArchives, copyPackagingTests, createVersionFile, createUpgradeFromFile - vagrantSetUpTask.dependsOn copyBatsTests, copyBatsUtils + vagrantSetUpTask.dependsOn copyPackagingArchives, copyPackagingTests, createTestRunnerScript, createVersionFile, + createUpgradeFromFile, copyBatsTests, copyBatsUtils } private static void createPackagingTestTask(Project project) { @@ -389,7 +396,7 @@ class VagrantTestPlugin implements Plugin { environmentVars vagrantEnvVars dependsOn up, setupPackagingTest finalizedBy halt - args '--command', "java -cp \"\$PACKAGING_TESTS/*\" org.junit.runner.JUnitCore ${-> project.extensions.esvagrant.testClass}" + args '--command', "cd \$PACKAGING_TESTS && ./run-tests.sh" } TaskExecutionAdapter groovyPackagingReproListener = createReproListener(project, javaPackagingTest.path)