/*
 * Licensed to Elasticsearch under one or more contributor
 * license agreements. See the NOTICE file distributed with
 * this work for additional information regarding copyright
 * ownership. Elasticsearch 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.
 */
import org.elasticsearch.gradle.test.RestIntegTestTask
import org.gradle.api.internal.provider.Providers

apply plugin: 'elasticsearch.build'
apply plugin: 'elasticsearch.rest-test'
apply plugin: 'nebula.maven-base-publish'
apply plugin: 'nebula.maven-scm'
apply plugin: 'com.github.johnrengelman.shadow'

group = 'org.elasticsearch.client'
archivesBaseName = 'elasticsearch-rest-high-level-client'

publishing {
  publications {
    nebula {
      artifactId = archivesBaseName
    }
  }
}

//we need to copy the yaml spec so we can check naming (see RestHighlevelClientTests#testApiNamingConventions)
Task copyRestSpec = RestIntegTestTask.createCopyRestSpecTask(project, Providers.FALSE)
test.dependsOn(copyRestSpec)

dependencies {
  /*
   * Everything in the "shadow" configuration is *not* copied into the
   * shadowJar.
   */
  compile "org.elasticsearch:elasticsearch:${version}"
  compile "org.elasticsearch.client:elasticsearch-rest-client:${version}"
  compile "org.elasticsearch.plugin:parent-join-client:${version}"
  compile "org.elasticsearch.plugin:aggs-matrix-stats-client:${version}"
  compile "org.elasticsearch.plugin:rank-eval-client:${version}"
  compile "org.elasticsearch.plugin:lang-mustache-client:${version}"

  testCompile "org.elasticsearch.client:test:${version}"
  testCompile "org.elasticsearch.test:framework:${version}"
  testCompile "com.carrotsearch.randomizedtesting:randomizedtesting-runner:${versions.randomizedrunner}"
  testCompile "junit:junit:${versions.junit}"
  testCompile "org.hamcrest:hamcrest-all:${versions.hamcrest}"
  //this is needed to make RestHighLevelClientTests#testApiNamingConventions work from IDEs
  testCompile "org.elasticsearch:rest-api-spec:${version}"
}

dependencyLicenses {
  // Don't check licenses for dependency that are part of the elasticsearch project
  // But any other dependency should have its license/notice/sha1
  dependencies = project.configurations.runtime.fileCollection {
    it.group.startsWith('org.elasticsearch') == false
  }
}

forbiddenApisMain {
  // core does not depend on the httpclient for compile so we add the signatures here. We don't add them for test as they are already
  // specified
  addSignatureFiles 'http-signatures'
  signaturesFiles += files('src/main/resources/forbidden/rest-high-level-signatures.txt')
}
File nodeCert = file("./testnode.crt")
File nodeTrustStore = file("./testnode.jks")

integTestRunner {
  systemProperty 'tests.rest.cluster.username', System.getProperty('tests.rest.cluster.username', 'test_user')
  systemProperty 'tests.rest.cluster.password', System.getProperty('tests.rest.cluster.password', 'test-password')
}

integTestCluster {
  systemProperty 'es.scripting.update.ctx_in_params', 'false'
  setting 'xpack.license.self_generated.type', 'trial'
  setting 'xpack.security.enabled', 'true'
  setting 'xpack.security.authc.token.enabled', 'true'
  // Truststore settings are not used since TLS is not enabled. Included for testing the get certificates API
  setting 'xpack.ssl.certificate_authorities', 'testnode.crt'
  setting 'xpack.security.transport.ssl.truststore.path', 'testnode.jks'
  keystoreSetting 'xpack.security.transport.ssl.truststore.secure_password', 'testnode'
  setupCommand 'setupDummyUser',
          'bin/elasticsearch-users',
          'useradd', System.getProperty('tests.rest.cluster.username', 'test_user'),
          '-p', System.getProperty('tests.rest.cluster.password', 'test-password'),
          '-r', 'superuser'
  extraConfigFile nodeCert.name, nodeCert
  extraConfigFile nodeTrustStore.name, nodeTrustStore
  waitCondition = { node, ant ->
    File tmpFile = new File(node.cwd, 'wait.success')
    ant.get(src: "http://${node.httpUri()}/_cluster/health?wait_for_nodes=>=${numNodes}&wait_for_status=yellow",
            dest: tmpFile.toString(),
            username: System.getProperty('tests.rest.cluster.username', 'test_user'),
            password: System.getProperty('tests.rest.cluster.password', 'test-password'),
            ignoreerrors: true,
            retries: 10)
    return tmpFile.exists()
  }
}