// 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}")
    }
}
