/**
 * 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
 * <p/>
 * http://www.apache.org/licenses/LICENSE-2.0
 * <p/>
 * 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.
 */
subprojects {
  /**
   *  Utility function for tests to use to confirm EVN Variables.
   */
  ext.checkEnv = { env_vars ->
    env_vars.each() {
      def value = System.getenv("${it}")
      if (value == null || value == "null")
        throw new GradleException("undeclared env variable: ${it}")
    }
  }

  ext.groovyVersion = '1.8.0'
  ext.hadoopVersion = '2.7.1'
  // itest needs be greater than or equal to = 1.0.0
  ext.itestVersion = '1.0.0' // Might need to be able to read an input for alternate version?
  ext.BIGTOP_HOME   = rootDir

  dependencies {
    compile group: 'org.apache.bigtop.itest', name: 'itest-common', version: itestVersion, transitive: 'true'
    //needed to avoid groovy not on classpath error.
    testCompile group: 'org.codehaus.groovy', name: 'groovy', version: groovyVersion
    testCompile group: 'org.apache.hadoop', name: 'hadoop-common', version: hadoopVersion, transitive: 'true'
    testCompile group: 'org.apache.hadoop', name: 'hadoop-hdfs', version: hadoopVersion, transitive: 'true'
    testRuntime project(':bigtop-tests:smoke-tests:logger-test-config')
  }

  //Note you need a snapshot itest to run this.
  ext.doExclude = { String filename ->
    //print("Exclude? ${filename} ... ")
    def keep_this_test = true;
    if (filename.contains(".groovy") ||
        filename.contains(".java")) {
      keep_this_test =
          tests_to_include().find({
            filename ==~ it
          }) != null;
    }

    //println("Keep = ${keep_this_test} "+filename);
    return !keep_this_test;
  }

  test.doFirst {
    //  java_home should be declared in all cases.
    checkEnv(["JAVA_HOME"])
    // TestHadoopExamples and other tests rely on BIGTOP_HOME environment
    // variable to find some resources. Let's set it up, using ext.BIGTOP_HOME
    environment ("BIGTOP_HOME", BIGTOP_HOME)
  }

  test << {
    println("Now testing...");
    //todo, add back in 'basic' after BIGTOP-1392 .
    testLogging {
      events "passed", "skipped", "failed"
    }
  }

  // Let's make sure all system Properties are passed into the forked test JVM
  tasks.withType(Test) {
    systemProperties = System.getProperties()
  }
  test.dependsOn compileGroovy
  compileGroovy.dependsOn clean
}
