/*
 * 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.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(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.mockito
    testImplementation depLibs.powermockJunit
    testImplementation depLibs.powermockMockito
    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")
}
