/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.
 */

import org.gradle.util.VersionNumber

plugins { id 'java-library' }

group 'org.apache.geode-benchmark'
version '1.0-SNAPSHOT'

def outputDir = project.hasProperty('outputDir') ? project.findProperty('outputDir') : new File(project.buildDir, "benchmarks_" + getDate()).getAbsolutePath()
def geodeVersion = project.hasProperty('geodeVersion') ? project.findProperty('geodeVersion') : '1.+'

def getDate() {
  new Date().format('yyyyMMddHHmmss')
}


repositories {
  /*
   This is used in CI to benchmark various new/old versions of Geode.
   Also useful in dev where you can clone geode and publishToMavenLocal
   */
  mavenLocal() {
    metadataSources {
      mavenPom()
      ignoreGradleMetadataRedirection()
    }
  }
  // fall back to mavenCentral, which has lots of released versions of Geode
  mavenCentral() {
    metadataSources {
      mavenPom()
      ignoreGradleMetadataRedirection()
    }
  }
}

configurations {
  geodeVersionResolver
}

dependencies {
  geodeVersionResolver(group: 'org.apache.geode', name: 'geode-core', version: geodeVersion)
  geodeVersion = configurations.geodeVersionResolver.resolvedConfiguration.resolvedArtifacts.find {it.name == 'geode-core'}.moduleVersion.id.version
  logger.info("Building with Geode ${geodeVersion}.")

  implementation platform("org.apache.geode:geode-all-bom:${geodeVersion}")

  implementation(project(':harness'))

  implementation(group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: project.'junit-jupiter.version')
  implementation(group: 'org.junit-pioneer', name: 'junit-pioneer', version: project.'junit-pioneer.version')
  implementation(group: 'org.assertj', name: 'assertj-core', version: project.'assertj-core.version')

  implementation(group: 'org.slf4j', name: 'slf4j-simple', version: project.'slf4j-simple.version')

  implementation(group: 'org.apache.geode', name: 'geode-core')
  if (VersionNumber.parse(geodeVersion) >= VersionNumber.parse("1.11.0.+")) {
    runtimeOnly(group: 'org.apache.geode', name: 'geode-log4j')
  } else {
    runtimeOnly(group: 'org.apache.logging.log4j', name: 'log4j-core')
  }

  // Required for missing dependency on geode-core.
  runtimeOnly(group: 'org.eclipse.jetty', name: 'jetty-webapp')

  testImplementation(group: 'org.junit.jupiter', name: 'junit-jupiter-params', version: project.'junit-jupiter.version')
  testImplementation(group: 'org.mockito', name: 'mockito-core', version: project.'mockito.version')
  testImplementation(group: 'io.github.classgraph', name: 'classgraph', version: project.'classgraph.version')
}

compileJava {
  options.compilerArgs << '-Xlint:unchecked' << "-Werror"
  options.deprecation = true
}

test{
  afterTest { desc, result ->
    logger.quiet "Executing test ${desc.className}.${desc.name} with result: ${result.resultType}"
  }
  useJUnitPlatform()
  systemProperty 'org.slf4j.simpleLogger.showDateTime', 'true'
  systemProperty 'org.slf4j.simpleLogger.dateTimeFormat', 'yyyy-MM-dd HH:mm:ss.SSS'
  systemProperty 'org.slf4j.simpleLogger.showThreadNam', 'false'
  systemProperty 'org.slf4j.simpleLogger.showShortLogName', 'true'
}

task benchmark(type: Test) {
  if (project.hasProperty('testJVM') && !testJVM.trim().isEmpty()) {
    executable = "${testJVM}/bin/java"
  }
  outputs.upToDateWhen { false }
  testClassesDirs = project.sourceSets.main.output.classesDirs
  classpath = project.sourceSets.main.runtimeClasspath
  useJUnitPlatform()
  testLogging {
    exceptionFormat = 'full'
    showStandardStreams = true
  }

  exclude "**/NoopBenchmark.class"
  exclude "**/P2pPartitionedPutLongBenchmark.class"

  forkEvery 1
  failFast = true

  systemProperty 'org.slf4j.simpleLogger.showDateTime', 'true'
  systemProperty 'org.slf4j.simpleLogger.dateTimeFormat', 'yyyy-MM-dd HH:mm:ss.SSS'
  systemProperty 'org.slf4j.simpleLogger.showThreadName', 'false'
  systemProperty 'org.slf4j.simpleLogger.showShortLogName', 'true'
  systemProperty 'benchmark.TEST_HOSTS', project.findProperty('hosts')
  systemProperty 'benchmark.TEST_METADATA', project.findProperty('metadata')
  systemProperty 'OUTPUT_DIR', outputDir
  systemProperty 'benchmark.OUTPUT_DIR', outputDir

  //Set all project properties starting with "benchmark." as system properties in the test
  //JVM
  project.properties.findAll {
    it.key.startsWith("benchmark.")
  }.each {
    systemProperty(it.getKey(), it.getValue())
  }

  //------------------------------------------------------------
  //Legacy properties - these properties were added before the benchmark.
  //prefix convention. They will be passed on to the JVM for now to not break
  //CI or peoples scripts. Remove these soon!
  //------------------------------------------------------------
  if (project.hasProperty('withGc')) {
    systemProperty 'benchmark.withGc', project.findProperty('withGc')
  }
  if (project.hasProperty('withHeap')) {
    systemProperty 'benchmark.withHeap', project.findProperty('withHeap')
  }
  if (project.hasProperty('withThreads')) {
    systemProperty 'benchmark.withThreads', project.findProperty('withThreads')
  }
  if (project.hasProperty('withWarmup')) {
    systemProperty 'benchmark.withWarmup', project.findProperty('withWarmup')
  }
  if (project.hasProperty('withDuration')) {
    systemProperty 'benchmark.withDuration', project.findProperty('withDuration')
  }

  systemProperty 'benchmark.withSsl', project.hasProperty('withSsl')
  systemProperty 'benchmark.withSslProtocols', project.findProperty('withSslProtocols')
  systemProperty 'benchmark.withSslCiphers', project.findProperty('withSslCiphers')

  if (project.hasProperty('withSniProxy')) {
    systemProperty 'benchmark.withSniProxy', project.findProperty('withSniProxy')
  }
  systemProperty 'benchmark.withSniProxyImage', project.findProperty('withSniProxyImage')

  if (project.hasProperty('withRouter')) {
    systemProperty 'benchmark.withRouter', project.findProperty('withRouter')
  }
  systemProperty 'benchmark.withRouterImage', project.findProperty('withRouterImage')

  systemProperty 'benchmark.withSecurityManager', project.hasProperty('withSecurityManager')

  doFirst {
    if(!project.hasProperty('hosts')) {
      throw new GradleException("You must set the hosts property to a comma separated list of hosts. Eg ./gradlew benchmark -Phosts=localhost,localhost,localhost")
    }
  }
}
