/*
 * 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.
 */
plugins {
    id 'java'
}

dependencies {
    implementation project(':bookkeeper-common')
    implementation project(':bookkeeper-common-allocator')
    implementation project(':bookkeeper-http:http-server')
    implementation project(':bookkeeper-proto')
    implementation project(':bookkeeper-stats')
    implementation project(':circe-checksum')
    implementation project(':cpu-affinity')
    implementation project(':tools:framework')

    compileOnly depLibs.lombok
    compileOnly depLibs.spotbugsAnnotations
    implementation depLibs.bcFips
    implementation depLibs.commonsCli
    implementation depLibs.commonsCodec
    implementation depLibs.commonsCollections4
    implementation depLibs.commonsConfiguration
    implementation depLibs.commonsIO
    implementation depLibs.commonsLang3
    implementation depLibs.guava
    implementation depLibs.httpclient
    implementation depLibs.jacksonAnnotations
    implementation depLibs.jcommander
    implementation depLibs.jctools
    implementation depLibs.jna
    implementation depLibs.nettyHandler
    implementation depLibs.nettyTcnativeBoringSsl
    implementation depLibs.nettyTransportNativeEpoll
    implementation depLibs.protobuf
    implementation depLibs.rocksDb
    implementation depLibs.zookeeper

    testImplementation project(':bookkeeper-stats-providers:prometheus-metrics-provider')
    testImplementation project(':bookkeeper-http:vertx-http-server')
    testImplementation project(path: ':bookkeeper-common', configuration: 'testArtifacts')

    testCompileOnly depLibs.lombok
    testImplementation depLibs.hamcrest
    testImplementation depLibs.jacksonDatabind
    testImplementation depLibs.junit
    testImplementation depLibs.junitFoundation
    testImplementation depLibs.kerbySimpleKdc
    testImplementation depLibs.metricsCore
    testImplementation depLibs.mockito
    testImplementation depLibs.powermockJunit
    testImplementation depLibs.powermockMockito
    testImplementation depLibs.snappy
    testImplementation depLibs.zookeeperTest
    annotationProcessor depLibs.lombok
    testAnnotationProcessor depLibs.lombok
    testImplementation depLibs.slf4jLog4j
}

test {
    maxHeapSize = '2G'
    forkEvery = 1
}

test.doFirst {
    def junitFoundation = configurations.testCompileClasspath.resolvedConfiguration
        .resolvedArtifacts.find { it.name == 'junit-foundation' }
    jvmArgs("-Djunit.timeout.test=600000", "-Djunit.max.retry=3",
            "-Djava.net.preferIPv4Stack=true", "-Dio.netty.leakDetection.level=paranoid")
}
