blob: 4fe284fecb5d7c114a420324172e371ace7c637b [file] [log] [blame]
import org.gradle.api.tasks.PathSensitivity.RELATIVE
import org.gradle.jvm.toolchain.internal.NoToolchainAvailableException
plugins {
`java-library-conventions`
`testing-conventions`
}
javaLibrary {
mainJavaVersion = JavaVersion.VERSION_11
}
val thirdPartyJars by configurations.creating
val antJars by configurations.creating
val mavenDistribution by configurations.creating
dependencies {
implementation(libs.bartholdy) {
because("manage external tool installations")
}
implementation(libs.commons.io) {
because("moving/deleting directory trees")
}
testImplementation(libs.archunit) {
because("checking the architecture of JUnit 5")
}
testImplementation(libs.apiguardian) {
because("we validate that public classes are annotated")
}
testImplementation(libs.groovy4) {
because("it provides convenience methods to handle process output")
}
testImplementation(libs.bnd) {
because("parsing OSGi metadata")
}
testRuntimeOnly(libs.slf4j.julBinding) {
because("provide appropriate SLF4J binding")
}
testImplementation(libs.ant) {
because("we reference Ant's main class")
}
thirdPartyJars(libs.junit4)
thirdPartyJars(libs.assertj)
thirdPartyJars(libs.apiguardian)
thirdPartyJars(libs.hamcrest)
thirdPartyJars(libs.opentest4j)
antJars(platform(projects.junitBom))
antJars(libs.bundles.ant)
antJars(projects.junitPlatformConsoleStandalone)
mavenDistribution(libs.maven) {
artifact {
classifier = "bin"
type = "zip"
isTransitive = false
}
}
}
val unzipMavenDistribution by tasks.registering(Copy::class) {
from(zipTree(mavenDistribution.elements.map { it.single() }))
into(layout.buildDirectory.dir("maven-distribution"))
}
tasks.test {
// Opt-in via system property: '-Dplatform.tooling.support.tests.enabled=true'
enabled = System.getProperty("platform.tooling.support.tests.enabled")?.toBoolean() ?: false
// The following if-block is necessary since Gradle will otherwise
// always publish all mavenizedProjects even if this "test" task
// is not executed.
if (enabled) {
// All maven-aware projects must be installed, i.e. published to the local repository
val mavenizedProjects: List<Project> by rootProject
val tempRepoName: String by rootProject
(mavenizedProjects + projects.junitBom.dependencyProject)
.map { project -> project.tasks.named("publishAllPublicationsTo${tempRepoName.capitalize()}Repository") }
.forEach { dependsOn(it) }
}
val tempRepoDir: File by rootProject
jvmArgumentProviders += MavenRepo(tempRepoDir)
jvmArgumentProviders += JarPath(thirdPartyJars)
jvmArgumentProviders += JarPath(antJars)
jvmArgumentProviders += MavenDistribution(project, unzipMavenDistribution)
(options as JUnitPlatformOptions).apply {
includeEngines("archunit")
}
inputs.apply {
dir("projects").withPathSensitivity(RELATIVE)
file("${rootDir}/gradle.properties")
file("${rootDir}/settings.gradle.kts")
file("${rootDir}/gradlew")
file("${rootDir}/gradlew.bat")
dir("${rootDir}/gradle/wrapper").withPathSensitivity(RELATIVE)
dir("${rootDir}/documentation/src/main").withPathSensitivity(RELATIVE)
dir("${rootDir}/documentation/src/test").withPathSensitivity(RELATIVE)
}
distribution {
requirements.add("jdk=8")
}
jvmArgumentProviders += JavaHomeDir(project, 8)
maxParallelForks = 1 // Bartholdy.install is not parallel safe, see https://github.com/sormuras/bartholdy/issues/4
}
class MavenRepo(@get:InputDirectory @get:PathSensitive(RELATIVE) val repoDir: File) : CommandLineArgumentProvider {
override fun asArguments() = listOf("-Dmaven.repo=$repoDir")
}
class JavaHomeDir(project: Project, @Input val version: Int) : CommandLineArgumentProvider {
@Internal
val passToolchain = project.providers.gradleProperty("enableTestDistribution").map(String::toBoolean).orElse(false).map { !it }
@Internal
val javaLauncher: Property<JavaLauncher> = project.objects.property<JavaLauncher>()
.value(project.provider {
try {
project.the<JavaToolchainService>().launcherFor {
languageVersion.set(JavaLanguageVersion.of(version))
}.get()
} catch (e: NoToolchainAvailableException) {
null
}
})
override fun asArguments(): List<String> {
if (passToolchain.get()) {
val metadata = javaLauncher.map { it.metadata }
val javaHome = metadata.map { it.installationPath.asFile.absolutePath }.orNull
return javaHome?.let { listOf("-Djava.home.$version=$it") } ?: emptyList()
}
return emptyList()
}
}
class JarPath(@Classpath val configuration: Configuration, @Input val key: String = configuration.name) : CommandLineArgumentProvider {
override fun asArguments() = listOf("-D${key}=${configuration.asPath}")
}
class MavenDistribution(project: Project, sourceTask: TaskProvider<*>) : CommandLineArgumentProvider {
@InputDirectory
@PathSensitive(RELATIVE)
val mavenDistribution: DirectoryProperty = project.objects.directoryProperty()
.value(project.layout.dir(sourceTask.map { it.outputs.files.singleFile.listFiles()!!.single() }))
override fun asArguments() = listOf("-DmavenDistribution=${mavenDistribution.get().asFile.absolutePath}")
}