/*
 * 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-library'
  id 'standard-subproject-configuration'
  id 'geode-publish-java'
  id 'warnings'
}

dependencies {
  implementation(platform(project(':boms:geode-all-bom')))

  testImplementation('org.junit.jupiter:junit-jupiter-api')
  testImplementation(project(':geode-junit')) {
    exclude module: 'junit-vintage-engine'
    exclude module: 'JUnitParams'
    exclude module: 'junit'
  }
  testImplementation('org.assertj:assertj-core')
  testImplementation('org.mockito:mockito-core')
  testImplementation('org.awaitility:awaitility')
}

tasks.withType(AbstractCompile) {
  options.with {
    fork = true
    forkOptions.javaHome = file(System.getProperty('java.home'))
    compilerArgs << '-XDignore.symbol.file'
  }
}

ext.moduleName = group + '.unsafe'

jar {
  inputs.property("moduleName", moduleName)
  manifest {
    attributes('Automatic-Module-Name': moduleName)
  }
}
