• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright 2017 The gRPC Authors
2//
3//  Licensed under the Apache License, Version 2.0 (the "License");
4//  you may not use this file except in compliance with the License.
5//  You may obtain a copy of the License at
6//
7//        http://www.apache.org/licenses/LICENSE-2.0
8//
9//  Unless required by applicable law or agreed to in writing, software
10//  distributed under the License is distributed on an "AS IS" BASIS,
11//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12//  See the License for the specific language governing permissions and
13//  limitations under the License.
14description = 'gRPC: gae interop testing (jdk8)'
15
16buildscript {
17    // Configuration for building
18    repositories {
19        jcenter()    // Bintray's repository - a fast Maven Central mirror & more
20        maven { // The google mirror is less flaky than mavenCentral()
21            url "https://maven-central.storage-download.googleapis.com/repos/central/data/" }
22    }
23    dependencies {
24        classpath 'com.google.cloud.tools:appengine-gradle-plugin:1.3.5'
25        classpath 'com.squareup.okhttp:okhttp:2.5.0'
26    }
27}
28
29repositories {
30    // repositories for Jar's you access in your code
31    mavenLocal()
32    maven { // The google mirror is less flaky than mavenCentral()
33        url "https://maven-central.storage-download.googleapis.com/repos/central/data/" }
34    jcenter()
35}
36
37apply plugin: 'java'                              // standard Java tasks
38apply plugin: 'war'                               // standard Web Archive plugin
39apply plugin: 'com.google.cloud.tools.appengine'  // App Engine tasks
40
41dependencies {
42    providedCompile group: 'javax.servlet', name: 'servlet-api', version:'2.5'
43    compile 'com.google.appengine:appengine-api-1.0-sdk:1.9.59'
44    // Deps needed by all gRPC apps in GAE
45    compile libraries.google_api_protos
46    compile project(":grpc-okhttp")
47    compile project(":grpc-protobuf")
48    compile project(":grpc-stub")
49    compile project(":grpc-interop-testing")
50    compile libraries.netty_tcnative
51}
52
53compileJava {
54    // Disable "No processor claimed any of these annotations: org.junit.Ignore"
55    options.compilerArgs += ["-Xlint:-processing"]
56}
57
58def createDefaultVersion() {
59    return new java.text.SimpleDateFormat("yyyyMMdd't'HHmmss").format(new Date())
60}
61
62// [START model]
63appengine {
64    // App Engine tasks configuration
65    run {      // local (dev_appserver) configuration (standard environments only)
66        port = 8080                 // default
67    }
68
69    deploy {
70        // deploy configuration
71        // default - stop the current version
72        stopPreviousVersion = System.getProperty('gaeStopPreviousVersion') ?: true
73        // default - do not make this the promoted version
74        promote = System.getProperty('gaePromote') ?: false
75        // Use -DgaeDeployVersion if set, otherwise the version is null and the plugin will generate it
76        version = System.getProperty('gaeDeployVersion', createDefaultVersion())
77    }
78}
79// [END model]
80
81group = 'io.grpc'   // Generated output GroupId
82version = '1.0-SNAPSHOT'          // Version in generated output
83
84sourceCompatibility = 1.8
85targetCompatibility = 1.8
86
87/** Returns the service name. */
88String getGaeProject() {
89    def stream = new ByteArrayOutputStream()
90    exec {
91        executable 'gcloud'
92        args = [
93            'config',
94            'get-value',
95            'project'
96        ]
97        standardOutput = stream
98    }
99    return stream.toString().trim()
100}
101
102String getService(java.nio.file.Path projectPath) {
103    Node xml = new XmlParser().parse(projectPath.resolve("src/main/webapp/WEB-INF/appengine-web.xml").toFile())
104    if (xml.service.isEmpty()) {
105        return "default"
106    } else {
107        return xml.service.text()
108    }
109}
110
111String getAppUrl(String project, String service, String version) {
112    return "http://${version}.${service}.${project}.appspot.com"
113}
114
115task runInteropTestRemote(dependsOn: 'appengineDeploy') {
116    doLast {
117        // give remote app some time to settle down
118        sleep(20000)
119
120        def appUrl = getAppUrl(
121                getGaeProject(),
122                getService(project.getProjectDir().toPath()),
123                appengine.deploy.version)
124        logger.log(LogLevel.INFO, "the appURL=" + appUrl)
125        def client = new com.squareup.okhttp.OkHttpClient()
126        // The '?jdk8' argument is ignored by the server, it exists only to tag the request log entry
127        client.setReadTimeout(30, java.util.concurrent.TimeUnit.SECONDS)
128        def request = new com.squareup.okhttp.Request.Builder()
129                .url("${appUrl}/long_lived_channel?jdk8").build()
130        def result1 = client.newCall(request).execute()
131        def result2 = client.newCall(request).execute()
132        if (result1.code() != 200 || result2.code() != 200) {
133            throw new GradleException("Unable to reuse same channel across requests")
134        }
135
136        // The test suite can take a while to run
137        client.setReadTimeout(3, java.util.concurrent.TimeUnit.MINUTES)
138        // The '?jdk8' argument is ignored by the server, it exists only to tag the request log entry
139        def interopRequest = new com.squareup.okhttp.Request.Builder()
140                .url("${appUrl}/?jdk8").build()
141
142        // Retry in case GAE is slow and times out
143        int maxRetries = 5
144        String result = null
145        Throwable caught = null
146        for (int attempt = 0; attempt < maxRetries; attempt++) {
147            try {
148                def response = client.newCall(interopRequest).execute()
149                result = response.body().string()
150                project.println(result)
151                if (response.code() == 200) {
152                    return
153                }
154            } catch (Throwable t) {
155                caught = t
156                logger.log(LogLevel.ERROR, "caught exception. will retry if possible", t)
157            }
158        }
159        throw new GradleException("Interop test failed:\nthrowable:${caught}")
160    }
161}
162