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

// TODO(https://github.com/apache/beam/issues/20209): Move this definition into common.gradle.

plugins { id 'org.apache.beam.module' }
applyJavaNature(publish: false, exportJavadoc: false)

import org.apache.beam.gradle.BeamModulePlugin

project.evaluationDependsOn(":sdks:python")
project.evaluationDependsOn(":runners:portability:java")

def envDir = project.project(":sdks:python").envdir
def crossLanguageTestClasspath = project.project(":runners:portability:java").sourceSets.test.runtimeClasspath
def jobPort = BeamModulePlugin.getRandomPort()
def tmpDir = System.getenv("TMPDIR") ?: System.getenv("WORKSPACE") ?: "/tmp"
def pidFile = "${tmpDir}/local_job_service_main-${jobPort}.pid"

def setupTask = project.tasks.register("fnApiJobServerSetup", Exec) {
  dependsOn ':sdks:python:installGcpTest'

  executable 'sh'
  args '-c', ". ${envDir}/bin/activate && python -m apache_beam.runners.portability.local_job_service_main --job_port ${jobPort} --pid_file ${pidFile} --background --stdout_file ${tmpDir}/beam-fnapi-job-server.log"
}

def cleanupTask = project.tasks.register("fnApiJobServerCleanup", Exec) {
  executable 'sh'
  args '-c', ". ${envDir}/bin/activate && python -m apache_beam.runners.portability.local_job_service_main --pid_file ${pidFile} --stop"
}

def gcpProject = project.findProperty('gcpProject') ?: 'apache-beam-testing'

createCrossLanguageValidatesRunnerTask(
  startJobServer: setupTask,
  cleanupJobServer: cleanupTask,
  numParallelTests: 1,
  classpath: crossLanguageTestClasspath,
  pythonPipelineOptions: [
    "--runner=PortableRunner",
    "--job_endpoint=localhost:${jobPort}",
    "--environment_cache_millis=10000",
    "--experiments=beam_fn_api",
  ],
  javaPipelineOptions: [
    "--runner=PortableRunner",
    "--jobEndpoint=localhost:${jobPort}",
    "--environmentCacheMillis=10000",
    "--experiments=beam_fn_api",
    "--customBeamRequirement=${project.project(":sdks:python").projectDir}/build/apache-beam.tar.gz",
  ],
  goScriptOptions: [
    "--runner portable",
    "--tests \"./test/integration/xlang ./test/integration/io/xlang/...\"",
    "--endpoint localhost:${jobPort}",
  ],
)

createTransformServiceTask(
        startJobServer: setupTask,
        cleanupJobServer: cleanupTask,
        numParallelTests: 1,
        collectMarker: 'uses_transform_service',
        pythonPipelineOptions: [
                "--runner=TestDirectRunner",
                "--project=${gcpProject}",
        ],
        pytestOptions: [
                "--capture=no",  // print stdout instantly
                "--timeout=4500", // timeout of whole command execution
                "--color=yes", // console color
                "--log-cli-level=INFO" //log level info
        ]
)
