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


apply plugin: org.apache.beam.gradle.BeamModulePlugin
applyPythonNature()

dependencies {
    distTarBall project(path: ":sdks:python", configuration: "distTarBall")
}

pythonVersion = '2.7'

description = "Apache Beam :: SDKs :: Python :: Load Tests"

def mainClassProperty = "loadTest.mainClass"
def mainClass = project.findProperty(mainClassProperty)

def loadTestArgsProperty = "loadTest.args"

def runnerProperty = "runner"

task run(type: Exec, dependsOn: installGcpTest) {
    def loadTestArgs = project.findProperty(loadTestArgsProperty) ?: ""

    def runnerArg = project.findProperty(runnerProperty) ?: ""
    if (runnerArg == 'DataflowRunner' || runnerArg == 'TestDataflowRunner') {
        dependsOn ':sdks:python:sdist'
        loadTestArgs +=" --sdk_location=${files(configurations.distTarBall.files).singleFile}"
    }

    environment "LOAD_TEST_ENABLED", 'true'
    setWorkingDir "${project.rootDir}/sdks/python"

    commandLine 'sh', '-c', "${project.ext.envdir}/bin/python setup.py nosetests --test-pipeline-options=\"${parseOptions(loadTestArgs)}\" --tests ${mainClass} --ignore-files \'.*py3\\d?\\.py\$\'"
    ignoreExitValue true

    doLast {
        if (execResult.exitValue != 0) {
            throw new GradleException('error occurred')
        }
    }
}

def parseOptions(String option) {
    option.replace('\"', '\\"')
}