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

// Required to setup a Python 3 virtualenv.
pythonVersion = '3.6'

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

task postCommitIT {
  dependsOn 'installGcpTest'

  // Run IT tests with TestDirectRunner in batch in Python 3.
  doLast {
    def batchTests = [
        "apache_beam.examples.wordcount_it_test:WordCountIT.test_wordcount_it",
        "apache_beam.io.gcp.pubsub_integration_test:PubSubIntegrationTest",
        "apache_beam.io.gcp.big_query_query_to_table_it_test:BigQueryQueryToTableIT",
        "apache_beam.io.gcp.bigquery_io_read_it_test",
        "apache_beam.io.gcp.bigquery_read_it_test",
        "apache_beam.io.gcp.bigquery_write_it_test",
        "apache_beam.io.gcp.datastore.v1new.datastore_write_it_test",
    ]
    def testOpts = [
        "--tests=${batchTests.join(',')}",
        "--nocapture",    // Print stdout instantly
        "--processes=8",  // run tests in parallel
        "--process-timeout=4500", // timeout of whole command execution
    ]
    def argMap = ["runner": "TestDirectRunner",
                  "test_opts": testOpts,
                  "suite": "postCommitIT-direct-py36"]
    def batchCmdArgs = mapToArgString(argMap)
    exec {
      executable 'sh'
      args '-c', ". ${envdir}/bin/activate && ${runScriptsDir}/run_integration_test.sh $batchCmdArgs"
    }
  }
}
