diff --git a/okio/build.gradle.kts b/okio/build.gradle.kts index 30fcee87eb..d67d97fbac 100644 --- a/okio/build.gradle.kts +++ b/okio/build.gradle.kts @@ -6,6 +6,7 @@ import kotlinx.validation.ApiValidationExtension import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTargetWithTests import org.jetbrains.kotlin.gradle.plugin.mpp.NativeBuildType import org.jetbrains.kotlin.gradle.plugin.mpp.TestExecutable +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { kotlin("multiplatform") @@ -14,6 +15,7 @@ plugins { id("com.vanniktech.maven.publish.base") id("build-support") id("binary-compatibility-validator") + `jvm-test-suite` } /* @@ -211,17 +213,55 @@ kotlin { } } } + + jvm { + withJava() + } +} + +val java9 by sourceSets.registering + +configurations.named("java9CompileClasspath") { + extendsFrom(configurations["jvmCompileClasspath"]) +} + +testing { + suites { + register("integrationTest") { + useKotlinTest(libs.versions.kotlin) + dependencies { + implementation(project()) + } + targets.configureEach { + testTask.configure { + onlyIf { + !javaLauncher.get().metadata.javaRuntimeVersion.startsWith("1.8") + } + } + } + } + } } tasks { - val jvmJar by getting(Jar::class) { - // BundleTaskExtension() crashes unless there's a 'main' source set. - sourceSets.create(SourceSet.MAIN_SOURCE_SET_NAME) + val compileJava9Java = named("compileJava9Java") { + dependsOn("compileKotlinJvm") + // https://kotlinlang.org/docs/gradle-configure-project.html#configure-with-java-modules-jpms-enabled + options.compilerArgumentProviders.add(CommandLineArgumentProvider { + listOf("--patch-module", "okio=${sourceSets["main"].output.asPath}") + }) + options.release = 9 + } + + named("jvmJar") { + from(compileJava9Java.flatMap { it.destinationDirectory }) { + into("META-INF/versions/9") + } val bndExtension = BundleTaskExtension(this) bndExtension.setBnd( """ Export-Package: okio - Automatic-Module-Name: okio + Multi-Release: true Bundle-SymbolicName: com.squareup.okio """, ) @@ -231,6 +271,20 @@ tasks { .execute(this) } } + + named("compileIntegrationTestJava") { + options.release = 9 + } + + val integrationTest = named("integrationTest") { + jvmArgumentProviders.add(CommandLineArgumentProvider { + listOf("--patch-module", "okio.test.integration=${sourceSets["integrationTest"].output.asPath}") + }) + } + + check { + dependsOn(integrationTest) + } } configure { diff --git a/okio/src/jvmIntegrationTest/java/module-info.java b/okio/src/jvmIntegrationTest/java/module-info.java new file mode 100644 index 0000000000..821c429bc7 --- /dev/null +++ b/okio/src/jvmIntegrationTest/java/module-info.java @@ -0,0 +1,6 @@ +open module okio.test.integration { + requires kotlin.stdlib; + requires kotlin.test; + requires okio; + requires org.junit.jupiter.api; +} diff --git a/okio/src/jvmIntegrationTest/kotlin/okio/test/integration/ModuleTest.kt b/okio/src/jvmIntegrationTest/kotlin/okio/test/integration/ModuleTest.kt new file mode 100644 index 0000000000..11b972d76c --- /dev/null +++ b/okio/src/jvmIntegrationTest/kotlin/okio/test/integration/ModuleTest.kt @@ -0,0 +1,16 @@ +package okio.test.integration + +import kotlin.test.Test +import kotlin.test.assertFalse +import kotlin.test.assertTrue + +class ModuleTest { + @Test + fun testModule() { + // assert okio is modular + val okioModule = ModuleLayer.boot().modules().single { it.name == "okio" } + assertFalse(okioModule.descriptor.isAutomatic) + assertTrue(okioModule.isExported("okio")) + assertFalse(okioModule.isExported("okio.internal")) + } +} diff --git a/okio/src/jvmJava9/java/module-info.java b/okio/src/jvmJava9/java/module-info.java new file mode 100644 index 0000000000..51817ab2e2 --- /dev/null +++ b/okio/src/jvmJava9/java/module-info.java @@ -0,0 +1,5 @@ +module okio { + requires kotlin.stdlib; + + exports okio; +}