/*
 * 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 'org.apache.beam.module' }
applyJavaNature(
        automaticModuleName: 'org.apache.beam.sdk.io.requestresponse'
)
provideIntegrationTestingDependencies()
enableJavaPerformanceTesting()

description = "Apache Beam :: SDKS :: Java :: IO :: RequestResponseIO (RRIO)"
ext.summary = "Support to read from and write to Web APIs"

var jedisVersion = "5.0.0"
var grpcVersion = "1.59.0"
var protobufVersion = "3.21.5"

dependencies {
    implementation project(path: ":sdks:java:core", configuration: "shadow")
    implementation library.java.joda_time
    implementation library.java.vendored_guava_32_1_2_jre
    implementation "redis.clients:jedis:$jedisVersion"

    testImplementation project(path: ":sdks:java:core", configuration: "shadowTest")
    testImplementation project(path: ":sdks:java:io:common", configuration: "testRuntimeMigration")
    testImplementation project(path: ":beam-test-infra-mock-apis")
    // Vendored grpc library not fully compatible with proto autogenerated code
    testImplementation "io.grpc:grpc-netty-shaded:${grpcVersion}"
    testImplementation "io.grpc:grpc-protobuf:${grpcVersion}"
    testImplementation "io.grpc:grpc-stub:${grpcVersion}"
    testImplementation "com.google.protobuf:protobuf-java-util:${protobufVersion}"

    testImplementation platform(library.java.google_cloud_platform_libraries_bom)
    testImplementation library.java.google_http_client
    testImplementation library.java.junit
    testImplementation library.java.hamcrest
    testImplementation library.java.testcontainers_base

    testRuntimeOnly project(path: ":runners:direct-java", configuration: "shadow")
    testRuntimeOnly library.java.slf4j_jdk14
}
