apply plugin: 'groovy'
apply plugin: 'jacoco'

repositories {
    maven { url = uri(rootProject.cloneArtifacts.repository) }
}

dependencies {
    compile gradleApi()
    compile localGroovy()
    testCompile project(':base:builder-model')
    testCompile project(':base:builder')
    testCompile project(':base:sdk-common')
    testCompile 'com.google.truth:truth:0.26'
    testCompile 'org.jacoco:org.jacoco.agent:0.7.4.201502262128'

    // Add dependency on plugin code.  Exclude transitive dependencies to avoid conflict due to
    // Groovy versions.
    testCompile(project(':base:gradle-core')) {
        transitive = false
    }
    testCompile(project(':base:gradle')) {
        transitive = false
    }
    testCompile(project(':base:gradle-experimental')) {
        transitive = false
    }
}

def testEnvironment = [
    PROJECT_BUILD_DIR: project.buildDir,
    CUSTOM_REPO: rootProject.file("../out/repo"),
    CUSTOM_GRADLE: System.env.CUSTOM_GRADLE ?: rootProject.ext.buildVersion,
    CUSTOM_EXPERIMENTAL_GRADLE: System.env.CUSTOM_EXPERIMENTAL_GRADLE ?:rootProject.ext.experimentalVersion,
    ANDROID_HOME: System.env.ANDROID_HOME,
    ANDROID_NDK_HOME: System.env.ANDROID_NDK_HOME,
    CUSTOM_BUILDTOOLS: System.env.CUSTOM_BUILDTOOLS,
    CUSTOM_JACK: System.env.CUSTOM_JACK,
    DEBUG_INNER_TEST: System.env.DEBUG_INNER_TEST,
    RECORD_SPANS: System.env.RECORD_SPANS,
].findAll { it.value != null }

// These tasks will not depend on publishLocal, so they will run integration
// tests against whatever version of the plugin is in ../../../out/repo. This
// allows us to run integration tests with different versions of Java, without
// rebuilding the plugin.
task testPrebuilts(type: Test)
task connectedIntegrationTestPrebuilts(type: Test)

configure([test, testPrebuilts]) {
    description =
            "Runs the project integration tests. This requires an SDK either from the Android " +
                    "source tree, under out/..., or an env var ANDROID_HOME."
    systemProperties['jar.path'] = jar.archivePath
    environment = testEnvironment

    // Always run the task, when requested.
    outputs.upToDateWhen { false }

    forkEvery = 1
    maxParallelForks = Runtime.runtime.availableProcessors() / 2

    useJUnit {
        if (System.properties['test.includeCategories'] != null) {
            def categories = System.properties['test.includeCategories'].split(',')
            String defaultPackage = "com.android.build.gradle.integration.common.category."
            categories = categories.collect { it.charAt(0).isUpperCase() ? defaultPackage + it : it }
            includeCategories categories as String[]
        }
        excludeCategories "com.android.build.gradle.integration.common.category.DeviceTests"
    }
    exclude "com/android/build/gradle/integration/performance/**"
}

task connectedIntegrationTest(type: Test)

configure([connectedIntegrationTest, connectedIntegrationTestPrebuilts]) {
    testClassesDir = sourceSets.test.output.classesDir
    classpath = sourceSets.test.runtimeClasspath

    description =
            "Runs the project integration tests with device tests. This requires an SDK either " +
                    "from the Android source tree, under out/..., or an env var ANDROID_HOME " +
                    "and a device."
    group = "verification"
    systemProperties['jar.path'] = jar.archivePath
    // Add to, rather than replace the environment, so that TEST_CLASSPATH_DEPENDENCY,
    // REMOTE_TEST_PROVIDER, ADDITIONAL_TEST_CUSTOM_REPO and any dependencies of the remote test
    // provider are present in the test environment only for these tests.
    environment testEnvironment

    // Always run the task, when requested.
    outputs.upToDateWhen { false }

    forkEvery= 1
    maxParallelForks = System.env.containsKey("REMOTE_TEST_PROVIDER") ? Runtime.runtime.availableProcessors() : 1

    useJUnit {
        includeCategories "com.android.build.gradle.integration.common.category.DeviceTests"
    }
    exclude "com/android/build/gradle/integration/performance/**"
}

task performanceTest(type: Test) {
    include "com/android/build/gradle/integration/performance/**"

    testClassesDir = sourceSets.test.output.classesDir
    classpath = sourceSets.test.runtimeClasspath

    description =
            "Runs the project performance tests. This requires an SDK either " +
                    "from the Android source tree, under out/..., or an env var ANDROID_HOME."
    group = "verification"
    systemProperties['jar.path'] = jar.archivePath
    environment = testEnvironment

    reports {
        junitXml.destination "${project.buildDir}/perf-results"
    }
}

test.dependsOn ':publishLocal'
connectedIntegrationTest.dependsOn ':publishLocal'
performanceTest.dependsOn ':publishLocal'

jacocoTestReport {
    sourceSets project(':base:gradle-experimental').sourceSets.main
    sourceSets project(':base:gradle').sourceSets.main
    sourceSets project(':base:gradle-core').sourceSets.main
    sourceSets project(':base:builder').sourceSets.main
    sourceSets project(':base:builder-model').sourceSets.main
    sourceSets project(':base:builder-test-api').sourceSets.main
}

// Due to memory constraints, apply jacoco only when jacocoTestReport is invoked.  Make sure to
// rerun tests when generating report jacoco.
gradle.taskGraph.whenReady { TaskExecutionGraph taskGraph ->
    if (taskGraph.hasTask(jacocoTestReport)) {
        test.environment("ATTACH_JACOCO_AGENT", "yes")
    }
}
