Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,13 +1,23 @@
package com.openai

import java.lang.RuntimeException
import java.lang.reflect.Method
import java.net.URL
import java.nio.channels.FileChannel
import java.nio.file.Paths
import java.nio.file.StandardOpenOption.CREATE
import java.nio.file.StandardOpenOption.WRITE
import java.util.UUID
import java.util.concurrent.locks.ReentrantLock
import kotlin.concurrent.withLock
import org.junit.jupiter.api.extension.BeforeAllCallback
import org.junit.jupiter.api.extension.ConditionEvaluationResult
import org.junit.jupiter.api.extension.ExecutionCondition
import org.junit.jupiter.api.extension.ExtensionContext
import org.junit.jupiter.api.extension.InvocationInterceptor
import org.junit.jupiter.api.extension.ReflectiveInvocationContext

class TestServerExtension : BeforeAllCallback, ExecutionCondition {
class TestServerExtension : BeforeAllCallback, ExecutionCondition, InvocationInterceptor {

override fun beforeAll(context: ExtensionContext?) {
try {
Expand Down Expand Up @@ -40,10 +50,31 @@ class TestServerExtension : BeforeAllCallback, ExecutionCondition {
}
}

override fun interceptTestMethod(
invocation: InvocationInterceptor.Invocation<Void>,
invocationContext: ReflectiveInvocationContext<Method>,
extensionContext: ExtensionContext,
) {
PROCESS_LOCK.withLock {
FileChannel.open(LOCK_FILE, CREATE, WRITE).use { channel ->
channel.lock().use { invocation.proceed() }
}
}
}

companion object {

val BASE_URL = System.getenv("TEST_API_BASE_URL") ?: "http://localhost:4010"

const val SKIP_TESTS_ENV: String = "SKIP_MOCK_TESTS"

// JUnit resource locks do not coordinate separate Gradle test-worker JVMs. Use both a
// process-local lock and an OS file lock so tests sharing one mock server cannot race.
private val PROCESS_LOCK = ReentrantLock(true)
private val LOCK_FILE =
Paths.get(
System.getProperty("java.io.tmpdir"),
"openai-java-test-server-${UUID.nameUUIDFromBytes(BASE_URL.toByteArray())}.lock",
)
}
}
Loading