/**
 * 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 = '2.5.4'
  ext.hadoopVersion = '2.7.4'
  ext.hbaseVersion = '1.1.9'
  ext.solrVersion = '4.6.0'
  ext.slf4jVersion = '1.6.6'
  // 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.doLast {
    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
}
