// Copyright 2017 The gRPC Authors // // Licensed 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. description = 'gRPC: gae interop testing (jdk8)' buildscript { // Configuration for building repositories { jcenter() // Bintray's repository - a fast Maven Central mirror & more maven { // The google mirror is less flaky than mavenCentral() url "https://maven-central.storage-download.googleapis.com/repos/central/data/" } } dependencies { classpath 'com.google.cloud.tools:appengine-gradle-plugin:1.3.5' classpath 'com.squareup.okhttp:okhttp:2.5.0' } } repositories { // repositories for Jar's you access in your code mavenLocal() maven { // The google mirror is less flaky than mavenCentral() url "https://maven-central.storage-download.googleapis.com/repos/central/data/" } jcenter() } apply plugin: 'java' // standard Java tasks apply plugin: 'war' // standard Web Archive plugin apply plugin: 'com.google.cloud.tools.appengine' // App Engine tasks dependencies { providedCompile group: 'javax.servlet', name: 'servlet-api', version:'2.5' compile 'com.google.appengine:appengine-api-1.0-sdk:1.9.59' // Deps needed by all gRPC apps in GAE compile libraries.google_api_protos compile project(":grpc-okhttp") compile project(":grpc-protobuf") compile project(":grpc-stub") compile project(":grpc-interop-testing") compile libraries.netty_tcnative } compileJava { // Disable "No processor claimed any of these annotations: org.junit.Ignore" options.compilerArgs += ["-Xlint:-processing"] } def createDefaultVersion() { return new java.text.SimpleDateFormat("yyyyMMdd't'HHmmss").format(new Date()) } // [START model] appengine { // App Engine tasks configuration run { // local (dev_appserver) configuration (standard environments only) port = 8080 // default } deploy { // deploy configuration // default - stop the current version stopPreviousVersion = System.getProperty('gaeStopPreviousVersion') ?: true // default - do not make this the promoted version promote = System.getProperty('gaePromote') ?: false // Use -DgaeDeployVersion if set, otherwise the version is null and the plugin will generate it version = System.getProperty('gaeDeployVersion', createDefaultVersion()) } } // [END model] group = 'io.grpc' // Generated output GroupId version = '1.0-SNAPSHOT' // Version in generated output sourceCompatibility = 1.8 targetCompatibility = 1.8 /** Returns the service name. */ String getGaeProject() { def stream = new ByteArrayOutputStream() exec { executable 'gcloud' args = [ 'config', 'get-value', 'project' ] standardOutput = stream } return stream.toString().trim() } String getService(java.nio.file.Path projectPath) { Node xml = new XmlParser().parse(projectPath.resolve("src/main/webapp/WEB-INF/appengine-web.xml").toFile()) if (xml.service.isEmpty()) { return "default" } else { return xml.service.text() } } String getAppUrl(String project, String service, String version) { return "http://${version}.${service}.${project}.appspot.com" } task runInteropTestRemote(dependsOn: 'appengineDeploy') { doLast { // give remote app some time to settle down sleep(20000) def appUrl = getAppUrl( getGaeProject(), getService(project.getProjectDir().toPath()), appengine.deploy.version) logger.log(LogLevel.INFO, "the appURL=" + appUrl) def client = new com.squareup.okhttp.OkHttpClient() // The '?jdk8' argument is ignored by the server, it exists only to tag the request log entry client.setReadTimeout(30, java.util.concurrent.TimeUnit.SECONDS) def request = new com.squareup.okhttp.Request.Builder() .url("${appUrl}/long_lived_channel?jdk8").build() def result1 = client.newCall(request).execute() def result2 = client.newCall(request).execute() if (result1.code() != 200 || result2.code() != 200) { throw new GradleException("Unable to reuse same channel across requests") } // The test suite can take a while to run client.setReadTimeout(3, java.util.concurrent.TimeUnit.MINUTES) // The '?jdk8' argument is ignored by the server, it exists only to tag the request log entry def interopRequest = new com.squareup.okhttp.Request.Builder() .url("${appUrl}/?jdk8").build() // Retry in case GAE is slow and times out int maxRetries = 5 String result = null Throwable caught = null for (int attempt = 0; attempt < maxRetries; attempt++) { try { def response = client.newCall(interopRequest).execute() result = response.body().string() project.println(result) if (response.code() == 200) { return } } catch (Throwable t) { caught = t logger.log(LogLevel.ERROR, "caught exception. will retry if possible", t) } } throw new GradleException("Interop test failed:\nthrowable:${caught}") } }