/*
 * 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 from: "${rootDir}/${scriptDir}/standard-subproject-configuration.gradle"

apply from: "${project.projectDir}/../gradle/publish-java.gradle"
apply from: "${rootDir}/${scriptDir}/warnings.gradle"

apply plugin: 'nebula.facet'
facets {
  commonTest {
    testTaskName = 'commonTest'
    includeInCheckLifecycle = false
  }
}

dependencies {
  compile(platform(project(':boms:geode-all-bom')))
  implementation(project(':geode-serialization'))
  implementation(project(':geode-logging'))
  implementation(project(':geode-core'))
  implementation(project(':geode-gfsh'))
  implementation('com.github.davidmoten:geo')
  implementation('io.netty:netty-all')
  implementation('org.apache.logging.log4j:log4j-api')
  implementation('commons-codec:commons-codec')
  implementation('org.apache.commons:commons-lang3')

  testImplementation(project(':geode-junit'))
  testImplementation('org.mockito:mockito-core')

  commonTestImplementation(project(':geode-junit'))
  commonTestImplementation(project(':geode-dunit'))
  commonTestImplementation('org.testcontainers:testcontainers')
  commonTestImplementation('redis.clients:jedis')

  integrationTestImplementation(project(':geode-dunit'))
  integrationTestImplementation(project(':geode-junit'))
  integrationTestImplementation(sourceSets.commonTest.output)
  integrationTestImplementation('redis.clients:jedis')
  integrationTestImplementation('io.lettuce:lettuce-core')
  integrationTestImplementation('org.apache.logging.log4j:log4j-core')
  // This only exists for debugging PubSubNativeRedisAcceptanceTest
  integrationTestImplementation('org.buildobjects:jproc:2.3.0')
  integrationTestRuntime(project(':geode-log4j'))

  acceptanceTestImplementation(sourceSets.integrationTest.output)
  acceptanceTestImplementation(sourceSets.distributedTest.output)
  acceptanceTestImplementation(sourceSets.commonTest.output)
  acceptanceTestImplementation(project(':geode-dunit'))
  acceptanceTestImplementation(project(':geode-junit'))
  acceptanceTestImplementation('redis.clients:jedis')
  acceptanceTestImplementation('org.testcontainers:testcontainers')
  acceptanceTestRuntime(project(':geode-log4j'))
  acceptanceTestImplementation('org.springframework.boot:spring-boot-starter-web') {
    exclude module: 'spring-boot-starter-tomcat'
  }
  acceptanceTestImplementation('org.springframework.boot:spring-boot-starter-data-redis')
  acceptanceTestImplementation('org.springframework.session:spring-session-data-redis')
  acceptanceTestImplementation('org.apache.logging.log4j:log4j-core')
  // This only exists for debugging PubSubNativeRedisAcceptanceTest
  acceptanceTestImplementation('org.buildobjects:jproc:2.3.0')

  distributedTestCompile('org.apache.logging.log4j:log4j-core')
  distributedTestImplementation(project(':geode-dunit'))
  distributedTestImplementation(sourceSets.commonTest.output)
  distributedTestImplementation('redis.clients:jedis')
  distributedTestImplementation('io.lettuce:lettuce-core')

  distributedTestCompile('javax.servlet:javax.servlet-api')
  distributedTestImplementation('org.springframework.boot:spring-boot-starter-jetty')
  distributedTestImplementation('org.springframework.boot:spring-boot-starter-web') {
    exclude module: 'spring-boot-starter-tomcat'
  }
  distributedTestImplementation('org.springframework.boot:spring-boot-starter')
  distributedTestImplementation('org.springframework.boot:spring-boot-starter-data-redis')
  distributedTestImplementation('org.springframework.session:spring-session-data-redis')
}

configurations{
  all {
    exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
  }
}

acceptanceTest {
  environment 'GEODE_HOME', "$buildDir/../../geode-assembly/build/install/apache-geode"
}

tasks.register("redisAPITest") {
  dependsOn ':geode-assembly:installDist'
  doLast {
    exec {
      executable "../ci/scripts/execute_redis_tests.sh"
    }
  }
}
