/*
 * 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.bcpkixJdk15on
    implementation depLibs.bcproveExtJdk15on
    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.slf4j
    implementation depLibs.slf4jLog4j
    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
}

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

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