/*
 * 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' }
applyPythonNature()

def runScriptsDir = "${project.rootDir}/sdks/python/scripts"

task preCommitIT(dependsOn: ['sdist', 'installGcpTest']) {
  doLast {
    // Basic integration tests to run in PreCommit
    def precommitTests = [
        "apache_beam.examples.wordcount_it_test:WordCountIT.test_wordcount_it",
        "apache_beam.examples.streaming_wordcount_it_test:StreamingWordCountIT.test_streaming_wordcount_it",
    ]
    def testOpts = [
        "--tests=${precommitTests.join(',')}",
        "--nocapture",    // Print stdout instantly
        "--processes=2",    // Number of tests running in parallel
        "--process-timeout=1800",   // Timeout of whole command execution
    ]
    def cmdArgs = project.mapToArgString([
        "test_opts": testOpts,
        "sdk_location": "${project.buildDir}/apache-beam.tar.gz"
    ])

    exec {
      executable 'sh'
      args '-c', ". ${project.ext.envdir}/bin/activate && ${runScriptsDir}/run_integration_test.sh $cmdArgs"
    }
  }
}
