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

plugins { id 'org.apache.beam.module' }
applyJavaNature(
    exportJavadoc: false,
    automaticModuleName: 'org.apache.beam.sdk.testutils',
    archivesBaseName: 'beam-sdks-java-test-utils'
)

description = "Apache Beam :: SDKs :: Java :: Test Utils"

dependencies {
  implementation enforcedPlatform(library.java.google_cloud_platform_libraries_bom)
  implementation project(path: ":sdks:java:core", configuration: "shadow")
  implementation library.java.vendored_guava_32_1_2_jre
  implementation library.java.google_cloud_bigquery
  implementation library.java.google_code_gson
  implementation library.java.joda_time
  implementation library.java.commons_compress
  implementation library.java.commons_lang3
  implementation library.java.http_client
  implementation library.java.http_core
  implementation library.java.slf4j_api
  provided library.java.jmh_core

  testImplementation library.java.junit
  testRuntimeOnly project(path: ":runners:direct-java", configuration: "shadow")
}

['8', '11', '17', '21', '25'].each { String ver ->
  tasks.create(name: "verifyJavaVersion${ver}", type: Test) {
    filter {
      includeTestsMatching "org.apache.beam.sdk.testutils.jvmverification.JvmVerification.verifyCodeIsCompiledWithJava8"
      includeTestsMatching "org.apache.beam.sdk.testutils.jvmverification.JvmVerification.verifyTestCodeIsCompiledWithJava${ver}"
      includeTestsMatching "org.apache.beam.sdk.testutils.jvmverification.JvmVerification.verifyRunningJVMVersionIs${ver}"
    }
    doLast {
      println 'Java verified'
    }
  }
}
