import org.apache.geode.gradle.TestPropertiesWriter
import org.apache.geode.gradle.RepeatTest
import org.apache.geode.gradle.plugins.DependencyConstraints

/*
 * 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.
 */

// This configuration might be safely removed once the CategoryWithParameterizedRunnerFactory
// and associated classes are themselves removed, per GEODE-5606
configurations {
  apt
}

compileTestJava {
  options.annotationProcessorPath = files(configurations['apt'])
}

test {
  doFirst {
    TestPropertiesWriter.writeTestProperties(buildDir, name)
  }
  if (project.hasProperty('testMaxParallelForks')) {
    maxParallelForks = Integer.parseUnsignedInt(project.testMaxParallelForks)
  } else {
    maxParallelForks = Runtime.runtime.availableProcessors().intdiv(2) ?: 1
  }
}

apply plugin: 'nebula.facet'
facets {
  integrationTest {
    testTaskName = 'integrationTest'
    includeInCheckLifecycle = false
  }
  distributedTest {
    testTaskName = 'distributedTest'
    includeInCheckLifecycle = false
  }
  performanceTest {
    testTaskName = 'performanceTest'
    includeInCheckLifecycle = false
  }
  acceptanceTest {
    testTaskName = 'acceptanceTest'
    includeInCheckLifecycle = false
  }
  uiTest {
    testTaskName = 'uiTest'
    includeInCheckLifecycle = false
  }
  upgradeTest {
    testTaskName = 'upgradeTest'
    includeInCheckLifecycle = false
  }
}

configurations {
  testAnnotationProcessor.extendsFrom annotationProcessor
  integrationTestAnnotationProcessor.extendsFrom annotationProcessor
  distributedTestAnnotationProcessor.extendsFrom annotationProcessor
  performanceTestAnnotationProcessor.extendsFrom annotationProcessor
  acceptanceTestAnnotationProcessor.extendsFrom annotationProcessor
  uiTestAnnotationProcessor.extendsFrom annotationProcessor
  upgradeTestAnnotationProcessor.extendsFrom annotationProcessor
  // Facets does not extend the new runtimeOnly configurations
  integrationTestRuntimeOnly.extendsFrom(runtimeOnly)
  distributedTestRuntimeOnly.extendsFrom(runtimeOnly)
  performanceTestRuntimeOnly.extendsFrom(runtimeOnly)
  acceptanceTestRuntimeOnly.extendsFrom(runtimeOnly)
  uiTestRuntimeOnly.extendsFrom(runtimeOnly)
  upgradeTestRuntimeOnly.extendsFrom(runtimeOnly)
}

dependencies {
  // Do not add dependencies here that are not part of a custom configuration.
  // Dependencies should be explicit in the relevant build.gradle files to keep our modules
  //  as decoupled as possible.

  // This 'apt' configuration to be removed by GEODE-5606.
  apt files("${rootProject.projectDir}/buildSrc/build/libs/buildSrc.jar")
  apt('junit:junit:' + DependencyConstraints.get('junit.version')) {
    transitive = false
  }

  testRuntime('cglib:cglib:' + DependencyConstraints.get('cglib.version')) {
    exclude module: 'org.apache.ant'
  }
}

configure([integrationTest, distributedTest, performanceTest, acceptanceTest, uiTest,
           upgradeTest]) {
  forkEvery 1

  doFirst {
    TestPropertiesWriter.writeTestProperties(buildDir, name)
  }
  outputs.upToDateWhen { false }
}

configure([integrationTest, distributedTest, performanceTest]) {
  useJUnit {
    if (project.hasProperty("testCategory")) {
      includeCategories += project.testCategory
    }
  }
}

if (project.hasProperty("forceTest")) {
  // All test facets already force rerun.  Only :test can be upToDate.
  test {
    outputs.upToDateWhen { false }
  }
}

task repeatDistributedTest(type: RepeatTest) {
  dependsOn { distributedTest.taskDependencies }
  classpath = project.sourceSets.distributedTest.runtimeClasspath
  testClassesDirs = project.sourceSets.distributedTest.output.classesDirs
}

task repeatIntegrationTest(type: RepeatTest) {
  dependsOn { integrationTest.taskDependencies }
  classpath = project.sourceSets.integrationTest.runtimeClasspath
  testClassesDirs = project.sourceSets.integrationTest.output.classesDirs
}

task repeatAcceptanceTest(type: RepeatTest) {
  dependsOn { acceptanceTest.taskDependencies }
  classpath = project.sourceSets.acceptanceTest.runtimeClasspath
  testClassesDirs = project.sourceSets.acceptanceTest.output.classesDirs
}

task repeatUpgradeTest(type: RepeatTest) {
  dependsOn { upgradeTest.taskDependencies }
  classpath = project.sourceSets.upgradeTest.runtimeClasspath
  testClassesDirs = project.sourceSets.upgradeTest.output.classesDirs
}

task repeatUnitTest(type: RepeatTest) {
  dependsOn { test.taskDependencies }
  // default classpath works for this one.
}

configure([integrationTest, distributedTest, performanceTest, acceptanceTest, uiTest, upgradeTest]) {
  if (project.hasProperty('excludeTest')) {
    exclude project.getProperty('excludeTest').split(',')
  }
}

configure([repeatDistributedTest, repeatIntegrationTest, repeatUpgradeTest, repeatUnitTest, repeatAcceptanceTest]) {
  times = Integer.parseInt(repeat)
  useJUnit {}
  outputs.upToDateWhen { false }

  if (project.hasProperty("failOnNoMatchingTests")) {
    filter {
      setFailOnNoMatchingTests(Boolean.valueOf(project.failOnNoMatchingTests))
    }
  }
}

// apply common test configuration
gradle.taskGraph.whenReady({ graph ->
  tasks.withType(Test).each { test ->
    check.dependsOn test
    test.configure {
      onlyIf { !Boolean.getBoolean('skip.tests') }

      def resultsDir = TestPropertiesWriter.testResultsDir(buildDir, test.name)
      test.workingDir = resultsDir

      reports.html.destination = file "$buildDir/reports/$name"
      testLogging {
        exceptionFormat = 'full'
      }

      maxHeapSize '768m'
      jvmArgs = ['-XX:+HeapDumpOnOutOfMemoryError', '-ea']
      if (project.hasProperty('testJVMVer') && testJVMVer.toInteger() >= 9) {
        jvmArgs += ["--add-opens", "java.xml/jdk.xml.internal=ALL-UNNAMED"]
        jvmArgs += ["--add-opens", "java.base/jdk.internal.module=ALL-UNNAMED"]
        jvmArgs += ["--add-opens", "java.base/java.lang.module=ALL-UNNAMED"]
      }
      if (project.hasProperty('testJVM') && !testJVM.trim().isEmpty()) {
        executable = "${testJVM}/bin/java"
      }

      systemProperty 'gemfire.DEFAULT_MAX_OPLOG_SIZE', '10'
      systemProperty 'gemfire.disallowMcastDefaults', 'true'
      systemProperty 'jline.terminal', 'jline.UnsupportedTerminal'
      def logLevel = System.getProperty('log-level')
      if (logLevel != null) {
        systemProperty 'log-level', logLevel
      }
      def log4jLocation = System.getProperty('log4j.configurationFile')
      if (log4jLocation != null) {
        systemProperty 'log4j.configurationFile', log4jLocation
      }

      // The distributed tests seem to need to use /tmp directly,
      // so exclude them from using the supplied temp directory.
      if (!test.name.contains("distributed")) {
        systemProperty 'java.io.tmpdir', System.getProperty('java.io.tmpdir')
      }

      def eol = System.getProperty('line.separator')
      def progress = new File(resultsDir, "$test.name-progress.txt")
      beforeTest { desc ->
        def now = new Date().format('yyyy-MM-dd HH:mm:ss.SSS Z')
        progress << "$now Starting test $desc.className $desc.name$eol"
      }
      afterTest { desc, result ->
        def now = new Date().format('yyyy-MM-dd HH:mm:ss.SSS Z')
        progress << "$now Completed test $desc.className $desc.name with result: ${result.resultType}$eol"
      }

      doFirst {
        resultsDir.deleteDir()
        resultsDir.mkdirs()
      }
    }
  }
})

acceptanceTest {
  // Acceptance tests may reach out and run a gfsh command from the assembled gfsh.
  // If the test JVM version is specified, we must have the correct JAVA_HOME set for gfsh to use.
  // See also environment configuration for parallel testing in docker.gradle
  if (project.hasProperty('testJVM') && !testJVM.trim().isEmpty()) {
    environment "JAVA_HOME", "${project.testJVM}"
  }
}


// Make precheckin task run all validation tests for checking in code.
task precheckin(dependsOn: [build, acceptanceTest, integrationTest, distributedTest, upgradeTest]) {
  description 'Run this task before checking in code to validate changes. It runs tests beyond unitTest'
}

tasks.withType(Test).plus([build, check]).each {
  it.finalizedBy rootProject.tasks.combineReports
  rootProject.tasks.combineReports.mustRunAfter it
}
