// 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
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// 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.

apply plugin: "nebula.clojure"

// Clojure doesn't support Java 12+
// https://clojure.org/releases/downloads#_java_compatibility
if(JavaVersion.current().isJava12Compatible()) {
  // Disable all tasks for the `kudu-jepsen` sub-project.
  gradle.taskGraph.whenReady {
    gradle.taskGraph.allTasks.each {
      it.onlyIf { it.project != project }
    }
  }
}

repositories {
  maven { url "https://clojars.org/repo/" }
}

dependencies {
  compile project(path: ":kudu-client", configuration: "shadow")
  compile project(path: ":kudu-test-utils", configuration: "shadow")
  compile libs.clojure
  compile libs.clojureToolsCli
  compile libs.jepsen

  optional libs.yetusAnnotations
}

compileClojure {
  aotCompile = true
}
// Jepsen tests require specific infrastructure and do not run as part of the regular tests.
clojureTest.enabled = false

// Run the Jepsen tests.
task runJepsen(type: JavaExec) {
  def masterNodes = propertyWithDefault("masterNodes", "m0")
  def tserverNodes = propertyWithDefault("tserverNodes", "t0,t1,t2,t3,t4")
  def sshKeyPath = propertyWithDefault("sshKeyPath", "")
  def iterNum = propertyWithDefault("iterNum", "1")
  classpath sourceSets.main.clojure.srcDirs,
      sourceSets.test.clojure.srcDirs,
      sourceSets.test.runtimeClasspath,
      sourceSets.main.runtimeClasspath,
  main = "clojure.main"
  args = [
      "$projectDir/src/utils/kudu_test_runner.clj",
      "--masters=${masterNodes}",
      "--tservers=${tserverNodes}",
      "--ssh-key-path=${sshKeyPath}",
      "--iter-num=${iterNum}"
  ]
}

// We don't publish kudu-jepsen
uploadArchives.enabled = false
install.enabled = false

// SpotBugs doesn't work on Clojure.
spotbugsMain.enabled = false
spotbugsTest.enabled = false