// 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. buildscript { // Configuration for building repositories { maven { // The google mirror is less flaky than mavenCentral() url "https://maven-central.storage-download.googleapis.com/maven2/" } } dependencies { classpath 'com.squareup.okhttp:okhttp:2.7.4' } } plugins { id "java" id "war" id "ru.vyarus.animalsniffer" id 'com.google.cloud.tools.appengine' version '2.3.0' } description = 'gRPC: gae interop testing (jdk8)' 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/maven2/" } } apply plugin: 'com.google.cloud.tools.appengine' // App Engine tasks dependencies { providedCompile group: 'javax.servlet', name: 'servlet-api', version:'2.5' runtimeOnly 'com.google.appengine:appengine-api-1.0-sdk:1.9.59' implementation project(':grpc-netty') implementation project(":grpc-stub") implementation (project(':grpc-interop-testing')) { // Avoid grpc-netty-shaded dependency exclude group: 'io.grpc', module: 'grpc-alts' exclude group: 'io.grpc', module: 'grpc-xds' } implementation libraries.junit implementation libraries.protobuf.java runtimeOnly libraries.netty.tcnative, libraries.netty.tcnative.classes signature libraries.signature.java } tasks.named("compileJava").configure { // 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 projectId = 'GCLOUD_CONFIG' // 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" } tasks.register("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}") } }