/**
 * 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.
 */
def tests_to_include() {
  return [
      "Test.*"
  ];
}

def junitVersion = '4.11'
dependencies {
  compile group: 'junit', name: 'junit', version: junitVersion, transitive: 'true'
  compile group: 'org.apache.hadoop', name: 'hadoop-common',
      version: hadoopVersion, classifier: 'tests', transitive: 'true'
  compile group: 'org.apache.hadoop', name: 'hadoop-hdfs',
      version: hadoopVersion, classifier: 'tests', transitive: 'true'
  compile group: 'org.apache.hadoop', name: 'hadoop-common', version: hadoopVersion, transitive: 'true'
  compile group: 'org.apache.hadoop', name: 'hadoop-hdfs', version: hadoopVersion, transitive: 'true'
  if (System.env.HADOOP_CONF_DIR) testRuntime files(System.env.HADOOP_CONF_DIR)
}

sourceSets {
  main {
    java {
      srcDirs = [
        "${BIGTOP_HOME}/bigtop-tests/test-artifacts/hadoop/src/main/groovy/org/apache/bigtop/itest/hadoop/hcfs",
      ]
    }
  }
  test {
    groovy {
      resources {
        srcDirs = [
            "${BIGTOP_HOME}/bigtop-tests/test-artifacts/hadoop/src/main/resources",
        ]
      }
      srcDirs = [
        "${BIGTOP_HOME}/bigtop-tests/test-artifacts/hadoop/src/main/groovy/org/apache/bigtop/itest/hadoop/hcfs"
      ]
      exclude {
        FileTreeElement elem -> (doExclude(elem.getName()))
      }
    }
  }
}

test.doFirst {
  checkEnv(["HADOOP_CONF_DIR"])
}

test {
  // Change the default location where configuration file is picked up
  systemProperty 'test.cache.data', "${buildDir}/resources/test/clitest_data/"
  // default user for HCFS CLI test is file-system superuser. Default is 'hdfs'
  // However, running that test in provisioned is done under root, hence the
  // change to avoid test assert of the effective user
  systemProperty 'hcfs.root.username', System.properties['user.name']
}
