plugins {
    id "application"
    id "java"
    id "maven-publish"

    id "com.google.protobuf"
    id "me.champeau.jmh"
    id "ru.vyarus.animalsniffer"
}

description = "grpc Benchmarks"

tasks.named("jmh").configure {
    jvmArgs = ["-server", "-Xms2g", "-Xmx2g"]
}

configurations {
    alpnagent
}

dependencies {
    implementation project(':grpc-core'),
            project(':grpc-netty'),
            project(':grpc-okhttp'),
            project(':grpc-stub'),
            project(':grpc-protobuf'),
            project(':grpc-testing'),
            project(path: ':grpc-xds', configuration: 'shadow'),
            libraries.hdrhistogram,
            libraries.netty.tcnative,
            libraries.netty.tcnative.classes,
            libraries.commons.math3
    implementation (libraries.netty.transport.epoll) {
        artifact {
            classifier = "linux-x86_64"
        }
    }
    compileOnly libraries.javax.annotation
    alpnagent libraries.jetty.alpn.agent

    testImplementation libraries.junit,
            libraries.mockito.core

    signature libraries.signature.java
}

import net.ltgt.gradle.errorprone.CheckSeverity

tasks.named("compileJava").configure {
    // The Control.Void protobuf clashes
    options.errorprone.check("JavaLangClash", CheckSeverity.OFF)
}

configureProtoCompilation()

def vmArgs = [
    "-server",
    "-Xms2g",
    "-Xmx2g",
    "-XX:+PrintGCDetails"
]

tasks.named("startScripts").configure {
    enabled = false
}

tasks.named("run").configure {
    enabled = false
}

def qps_client = tasks.register("qps_client", CreateStartScripts) {
    mainClass = "io.grpc.benchmarks.qps.AsyncClient"
    applicationName = "qps_client"
    defaultJvmOpts = vmArgs
    outputDir = new File(project.buildDir, 'tmp/scripts/' + name)
    classpath = startScripts.classpath
}

def openloop_client = tasks.register("openloop_client", CreateStartScripts) {
    mainClass = "io.grpc.benchmarks.qps.OpenLoopClient"
    applicationName = "openloop_client"
    defaultJvmOpts = vmArgs
    outputDir = new File(project.buildDir, 'tmp/scripts/' + name)
    classpath = startScripts.classpath
}

def qps_server = tasks.register("qps_server", CreateStartScripts) {
    mainClass = "io.grpc.benchmarks.qps.AsyncServer"
    applicationName = "qps_server"
    outputDir = new File(project.buildDir, 'tmp/scripts/' + name)
    classpath = startScripts.classpath
}

def benchmark_worker = tasks.register("benchmark_worker", CreateStartScripts) {
    mainClass = "io.grpc.benchmarks.driver.LoadWorker"
    applicationName = "benchmark_worker"
    defaultJvmOpts = vmArgs
    outputDir = new File(project.buildDir, 'tmp/scripts/' + name)
    classpath = startScripts.classpath
}

applicationDistribution.into("bin") {
    from(qps_client)
    from(openloop_client)
    from(qps_server)
    from(benchmark_worker)
    fileMode = 0755
}

publishing {
    publications {
        maven(MavenPublication) {
            artifact distZip
            artifact distTar
        }
    }
}
