/*
 * 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 com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar

plugins { id 'org.apache.beam.module' }
applyJavaNature(
  publish: false,
  automaticModuleName: 'org.apache.beam.sdk.testing.expansion',
)

description = "Apache Beam :: SDKs :: Java :: Test Expansion Service"
ext.summary = """Testing Expansion Service used for executing cross-language transform tests."""


dependencies {
  testImplementation project(path: ":sdks:java:core", configuration: "shadow")
  testImplementation project(":sdks:java:io:parquet")
  testImplementation project(":sdks:java:expansion-service")
  testImplementation project(path: ":sdks:java:extensions:avro", configuration: "testRuntimeMigration")
  testRuntimeOnly project(":sdks:java:extensions:google-cloud-platform-core")
  testRuntimeOnly library.java.hadoop_client
}

task runTestExpansionService (type: JavaExec) {
  mainClass = "org.apache.beam.sdk.expansion.service.ExpansionService"
  classpath = sourceSets.test.runtimeClasspath
  args = [project.findProperty("constructionService.port") ?: "8097"]
}

task buildTestExpansionServiceJar(type: ShadowJar) {
  archiveAppendix = "testExpansionService"
  // Use zip64 mode to avoid "Archive contains more than 65535 entries".
  zip64 = true
  mergeServiceFiles()
  manifest {
    attributes(
            'Main-Class': 'org.apache.beam.sdk.expansion.service.ExpansionService',
            "Multi-Release": true
    )
  }
  exclude "META-INF/INDEX.LIST"
  exclude "META-INF/*.SF"
  exclude "META-INF/*.DSA"
  exclude "META-INF/*.RSA"
  configurations = [
    project.configurations.testRuntimeClasspath
  ]
  from sourceSets.main.output
  from sourceSets.test.output
}
