apply plugin: 'scala'
apply plugin: 'eclipse'
compileTestScala.options.encoding = 'UTF-8'

repositories {
    mavenCentral()
}

tasks.withType(Test) {
    systemProperties(System.getProperties())

    testLogging {
        events "passed", "skipped", "failed"
        showStandardStreams = true
        exceptionFormat = 'full'
    }
    outputs.upToDateWhen { false } // force tests to run every time
}

task testLean(type: Test) {
    exclude '**/*Swift*'
    exclude '**/*Python*'
    exclude '**/*Java*'
    exclude '**/*ThrottleTests*'
    exclude '**/MaxActionDurationTests*'
    exclude '**/*ApiGwTests*'
}

// Add all images needed for local testing here
test.dependsOn([
    ':core:nodejs6Action:distDocker',
    ':core:actionProxy:distDocker',
    ':core:pythonAction:distDocker',
    ':core:python2Action:distDocker',
    ':core:javaAction:distDocker',
    ':core:swift3Action:distDocker',
    ':core:swift3.1.1Action:distDocker',
    ':sdk:docker:distDocker',
    ':tests:dat:blackbox:badaction:distDocker',
    ':tests:dat:blackbox:badproxy:distDocker'
])

dependencies {
    compile "org.scala-lang:scala-library:${gradle.scala.version}"
    compile 'org.apache.commons:commons-lang3:3.3.2'
    compile 'org.apache.httpcomponents:httpclient:4.5.2:tests'
    compile 'org.apache.httpcomponents:httpmime:4.3.6'
    compile 'junit:junit:4.11'
    compile 'com.jayway.restassured:rest-assured:2.6.0'
    compile 'org.scalatest:scalatest_2.11:3.0.1'
    compile 'com.google.code.gson:gson:2.3.1'
    compile 'org.scalamock:scalamock-scalatest-support_2.11:3.4.2'
    compile 'com.typesafe.akka:akka-testkit_2.11:2.4.16'
    compile 'com.typesafe.akka:akka-http-testkit_2.11:10.0.9'
    compile project(':common:scala')
    compile project(':core:controller')
    compile project(':core:invoker')
}

tasks.withType(ScalaCompile) {
    scalaCompileOptions.additionalParameters = gradle.scala.compileFlags
}

def keystorePath = new File(buildDir, 'classes/test/keystore')
task deleteKeystore(type: Delete) {
    delete keystorePath
}
task createKeystore(dependsOn: deleteKeystore) {
    doLast {
        Properties props = new Properties()
        props.load(new FileInputStream(file('../whisk.properties')))
        def cmd = ['keytool', '-import', '-alias', 'Whisk', '-noprompt', '-trustcacerts', '-file', file(props['whisk.ssl.cert']), '-keystore', keystorePath, '-storepass', 'openwhisk']
        cmd.execute().waitForProcessOutput(System.out, System.err)
    }
}
compileTestScala.finalizedBy createKeystore
