/*
 * 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/buildscripts/java-core.gradle"
apply from: "$rootDir/buildscripts/publishing.gradle"
apply from: "$rootDir/buildscripts/java-junit5.gradle"
apply from: "$rootDir/buildscripts/java-test-fixtures.gradle"
apply from: "$rootDir/buildscripts/java-integration-test.gradle"

description = 'ignite-raft'

pmdMain {
    excludes = [
            'org/apache/ignite/raft/jraft/**'
    ]
}

pmdTest {
    excludes = [
            'org/apache/ignite/raft/jraft/**'
    ]
}


dependencies {
    implementation project(':ignite-core')
    implementation project(':ignite-configuration-api')
    implementation project(':ignite-raft-api')
    implementation project(':ignite-network')
    implementation project(':ignite-rocksdb-common')
    implementation libs.jetbrains.annotations
    implementation libs.fastutil.core
    implementation libs.disruptor
    implementation libs.rocksdb.jni
    implementation libs.dropwizard.metrics
    implementation libs.jctools.core
    implementation libs.auto.service.annotations
    implementation libs.jna

    annotationProcessor project(":ignite-network-annotation-processor")
    annotationProcessor libs.auto.service

    testAnnotationProcessor project(":ignite-network-annotation-processor")
    testAnnotationProcessor libs.jmh.annotation.processor
    testImplementation(testFixtures(project(':ignite-core')))
    testImplementation(testFixtures(project(':ignite-network')))
    testImplementation(testFixtures(project(':ignite-configuration')))
    testImplementation project(':ignite-configuration')
    testImplementation project(':ignite-core')
    testImplementation project(':ignite-network')
    testImplementation libs.mockito.junit
    testImplementation libs.mockito.core
    testImplementation libs.netty.common
    testImplementation libs.hamcrest.core
    testImplementation libs.jmh.core

    testFixturesAnnotationProcessor project(":ignite-network-annotation-processor")
    testFixturesImplementation project(':ignite-core')
    testFixturesImplementation project(':ignite-network')
    testFixturesImplementation project(':ignite-raft-api')
    testFixturesImplementation(testFixtures(project(':ignite-configuration')))
    testFixturesImplementation(testFixtures(project(':ignite-core')))
    testFixturesImplementation(testFixtures(project(':ignite-network')))
    testFixturesImplementation libs.hamcrest.core
    testFixturesImplementation libs.mockito.core
    testFixturesImplementation libs.junit5.api
    testFixturesImplementation libs.junit5.params
    testFixturesImplementation libs.jetbrains.annotations

    integrationTestAnnotationProcessor project(":ignite-network-annotation-processor")
    integrationTestAnnotationProcessor project(":ignite-configuration-annotation-processor")
    integrationTestImplementation(testFixtures(project))
    integrationTestImplementation(testFixtures(project(':ignite-core')))
    integrationTestImplementation(testFixtures(project(':ignite-configuration')))
    integrationTestImplementation(testFixtures(project(':ignite-network')))
    integrationTestImplementation testFixtures(project(':ignite-workers'))
    integrationTestImplementation project(':ignite-raft-api')
    integrationTestImplementation project(':ignite-failure-handler')
    integrationTestImplementation libs.jetbrains.annotations
    integrationTestImplementation libs.dropwizard.metrics
}
