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.10'
    compile 'com.github.java-json-tools:json-schema-validator:2.2.8';

    compile project(':common:scala')
    compile project(':core:controller')
    compile project(':core:invoker')
}

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

def keystorePath = new File(sourceSets.test.scala.outputDir, '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
