/* * 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. */ import org.elasticsearch.gradle.MavenFilteringHack import org.elasticsearch.gradle.test.AntFixture import java.security.KeyPair import java.security.KeyPairGenerator import static org.elasticsearch.gradle.PropertyNormalization.IGNORE_VALUE apply plugin: 'elasticsearch.standalone-rest-test' apply plugin: 'elasticsearch.rest-test' boolean useFixture = false String gcsServiceAccount = System.getenv("google_storage_service_account") String gcsBucket = System.getenv("google_storage_bucket") String gcsBasePath = System.getenv("google_storage_base_path") File serviceAccountFile = null if (!gcsServiceAccount && !gcsBucket && !gcsBasePath) { serviceAccountFile = new File(project.buildDir, 'generated-resources/service_account_test.json') gcsBucket = 'bucket_test' gcsBasePath = 'integration_test' useFixture = true } else { serviceAccountFile = new File(gcsServiceAccount) if (serviceAccountFile.exists() == false || serviceAccountFile.canRead() == false) { throw new FileNotFoundException(gcsServiceAccount, "Google Storage service account file does not exist or is not readable") } } /** A task to start the GoogleCloudStorageFixture which emulates a Google Cloud Storage service **/ task googleCloudStorageFixture(type: AntFixture) { dependsOn testClasses env 'CLASSPATH', "${ -> project.sourceSets.test.runtimeClasspath.asPath }" executable = new File(project.runtimeJavaHome, 'bin/java') args 'org.elasticsearch.repositories.gcs.GoogleCloudStorageFixture', baseDir, 'bucket_test' } /** A service account file that points to the Google Cloud Storage service emulated by the fixture **/ task createServiceAccountFile() { doLast { KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA") keyPairGenerator.initialize(1024) KeyPair keyPair = keyPairGenerator.generateKeyPair() String encodedKey = Base64.getEncoder().encodeToString(keyPair.private.getEncoded()) serviceAccountFile.parentFile.mkdirs() serviceAccountFile.setText("{\n" + ' "type": "service_account",\n' + ' "project_id": "integration_test",\n' + ' "private_key_id": "' + UUID.randomUUID().toString() + '",\n' + ' "private_key": "-----BEGIN PRIVATE KEY-----\\n' + encodedKey + '\\n-----END PRIVATE KEY-----\\n",\n' + ' "client_email": "integration_test@appspot.gserviceaccount.com",\n' + ' "client_id": "123456789101112130594"\n' + '}', 'UTF-8') } } Map expansions = [ 'bucket': gcsBucket, 'base_path': gcsBasePath ] processTestResources { inputs.properties(expansions) MavenFilteringHack.filter(it, expansions) } integTest { dependsOn project(':plugins:repository-gcs').bundlePlugin } testClusters.integTest { plugin file(project(':plugins:repository-gcs').bundlePlugin.archiveFile) keystore 'gcs.client.integration_test.credentials_file', serviceAccountFile, IGNORE_VALUE if (useFixture) { tasks.integTest.dependsOn createServiceAccountFile, googleCloudStorageFixture /* Use a closure on the string to delay evaluation until tests are executed */ setting 'gcs.client.integration_test.endpoint', { "http://${googleCloudStorageFixture.addressAndPort}" }, IGNORE_VALUE setting 'gcs.client.integration_test.token_uri', { "http://${googleCloudStorageFixture.addressAndPort}/o/oauth2/token" }, IGNORE_VALUE } else { println "Using an external service to test the repository-gcs plugin" } }