From 5f7762d9f119fc85f8e5b335cc6c81b079c891d7 Mon Sep 17 00:00:00 2001 From: Yuri Schimke Date: Mon, 2 Jan 2023 16:08:53 +1000 Subject: [PATCH] Add CI tests for Loom (#7613) --- .github/workflows/build.yml | 27 +++++++ build.gradle.kts | 7 ++ .../kotlin/okhttp3/testing/PlatformRule.kt | 11 +++ okhttp/src/jvmTest/java/okhttp3/LoomTest.kt | 72 +++++++++++++++++++ 4 files changed, 117 insertions(+) create mode 100644 okhttp/src/jvmTest/java/okhttp3/LoomTest.kt diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 56c26e6cc..175a463e2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -413,6 +413,33 @@ jobs: env: API_LEVEL: ${{ matrix.api-level }} + testloom: + runs-on: ubuntu-latest + if: github.ref == 'refs/heads/master' || contains(github.event.pull_request.labels.*.name, 'loom') + + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Configure JDK + uses: actions/setup-java@v3 + with: + distribution: 'zulu' + java-version: 19 + + - name: Configure JDK + uses: actions/setup-java@v3 + with: + distribution: 'zulu' + java-version: 11 + + - name: Run Checks + uses: gradle/gradle-build-action@v2 + with: + arguments: jvmTest -Dokhttp.platform=loom -Dtest.java.version=19 + testandroidregression: runs-on: macos-latest diff --git a/build.gradle.kts b/build.gradle.kts index 65f6fafba..177a11db6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -140,6 +140,13 @@ subprojects { "-XX:+HeapDumpOnOutOfMemoryError" ) + if (platform == "loom") { + jvmArgs = jvmArgs!! + listOf( + "-Djdk.tracePinnedThread=full", + "--enable-preview" + ) + } + val javaToolchains = project.extensions.getByType() javaLauncher.set(javaToolchains.launcherFor { languageVersion.set(JavaLanguageVersion.of(testJavaVersion)) diff --git a/okhttp-testing-support/src/main/kotlin/okhttp3/testing/PlatformRule.kt b/okhttp-testing-support/src/main/kotlin/okhttp3/testing/PlatformRule.kt index 5b93521eb..c7bc8df2e 100644 --- a/okhttp-testing-support/src/main/kotlin/okhttp3/testing/PlatformRule.kt +++ b/okhttp-testing-support/src/main/kotlin/okhttp3/testing/PlatformRule.kt @@ -214,6 +214,8 @@ open class PlatformRule @JvmOverloads constructor( fun isOpenJsse() = getPlatformSystemProperty() == OPENJSSE_PROPERTY + fun isLoom() = getPlatformSystemProperty() == LOOM_PROPERTY + fun isGraalVMImage() = TestUtil.isGraalVmImage fun hasHttp2Support() = !isJdk8() @@ -250,6 +252,10 @@ open class PlatformRule @JvmOverloads constructor( assumeTrue(getPlatformSystemProperty() == OPENJSSE_PROPERTY) } + fun assumeLoom() { + assumeTrue(getPlatformSystemProperty() == LOOM_PROPERTY) + } + fun assumeHttp2Support() { assumeTrue(getPlatformSystemProperty() != JDK8_PROPERTY) } @@ -282,6 +288,10 @@ open class PlatformRule @JvmOverloads constructor( assumeTrue(getPlatformSystemProperty() != OPENJSSE_PROPERTY) } + fun assumeNotLoom() { + assumeTrue(getPlatformSystemProperty() != LOOM_PROPERTY) + } + fun assumeNotCorretto() { assumeTrue(getPlatformSystemProperty() != CORRETTO_PROPERTY) } @@ -346,6 +356,7 @@ open class PlatformRule @JvmOverloads constructor( const val JDK8_PROPERTY = "jdk8" const val OPENJSSE_PROPERTY = "openjsse" const val BOUNCYCASTLE_PROPERTY = "bouncycastle" + const val LOOM_PROPERTY = "loom" /** * For whatever reason our BouncyCastle provider doesn't work with ECDSA keys. Just configure it diff --git a/okhttp/src/jvmTest/java/okhttp3/LoomTest.kt b/okhttp/src/jvmTest/java/okhttp3/LoomTest.kt new file mode 100644 index 000000000..ccf0af277 --- /dev/null +++ b/okhttp/src/jvmTest/java/okhttp3/LoomTest.kt @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2018 Square, Inc. + * + * Licensed 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. + */ +package okhttp3 + +import java.util.concurrent.ExecutorService +import java.util.concurrent.Executors +import mockwebserver3.MockResponse +import mockwebserver3.MockWebServer +import okhttp3.testing.PlatformRule +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.RegisterExtension + +class LoomTest { + @JvmField + @RegisterExtension + val platform = PlatformRule() + @JvmField + @RegisterExtension + val clientTestRule = OkHttpClientTestRule() + + private lateinit var server: MockWebServer + + private lateinit var client: OkHttpClient + + @BeforeEach + fun setUp( + server: MockWebServer, + ) { + platform.assumeLoom() + + this.server = server + + client = clientTestRule.newClientBuilder() + .dispatcher(Dispatcher(newVirtualThreadPerTaskExecutor())) + .build() + } + + private fun newVirtualThreadPerTaskExecutor(): ExecutorService { + return Executors::class.java.getMethod("newVirtualThreadPerTaskExecutor").invoke(null) as ExecutorService + } + + @Test + fun testRequest() { + server.enqueue(MockResponse()) + + val request = Request(server.url("/")) + + client.newCall(request).execute().use { + assertThat(it.code).isEqualTo(200) + } + } + + @Test + fun testIfSupported() { + assertThat(platform.isLoom()).isTrue() + } +}