Skip to content

Commit f99db89

Browse files
tests: serialize shared mock server access (#815)
1 parent a3a50ec commit f99db89

1 file changed

Lines changed: 32 additions & 1 deletion

File tree

‎openai-java-core/src/test/kotlin/com/openai/TestServerExtension.kt‎

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,23 @@
11
package com.openai
22

33
import java.lang.RuntimeException
4+
import java.lang.reflect.Method
45
import java.net.URL
6+
import java.nio.channels.FileChannel
7+
import java.nio.file.Paths
8+
import java.nio.file.StandardOpenOption.CREATE
9+
import java.nio.file.StandardOpenOption.WRITE
10+
import java.util.UUID
11+
import java.util.concurrent.locks.ReentrantLock
12+
import kotlin.concurrent.withLock
513
import org.junit.jupiter.api.extension.BeforeAllCallback
614
import org.junit.jupiter.api.extension.ConditionEvaluationResult
715
import org.junit.jupiter.api.extension.ExecutionCondition
816
import org.junit.jupiter.api.extension.ExtensionContext
17+
import org.junit.jupiter.api.extension.InvocationInterceptor
18+
import org.junit.jupiter.api.extension.ReflectiveInvocationContext
919

10-
class TestServerExtension : BeforeAllCallback, ExecutionCondition {
20+
class TestServerExtension : BeforeAllCallback, ExecutionCondition, InvocationInterceptor {
1121

1222
override fun beforeAll(context: ExtensionContext?) {
1323
try {
@@ -40,10 +50,31 @@ class TestServerExtension : BeforeAllCallback, ExecutionCondition {
4050
}
4151
}
4252

53+
override fun interceptTestMethod(
54+
invocation: InvocationInterceptor.Invocation<Void>,
55+
invocationContext: ReflectiveInvocationContext<Method>,
56+
extensionContext: ExtensionContext,
57+
) {
58+
PROCESS_LOCK.withLock {
59+
FileChannel.open(LOCK_FILE, CREATE, WRITE).use { channel ->
60+
channel.lock().use { invocation.proceed() }
61+
}
62+
}
63+
}
64+
4365
companion object {
4466

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

4769
const val SKIP_TESTS_ENV: String = "SKIP_MOCK_TESTS"
70+
71+
// JUnit resource locks do not coordinate separate Gradle test-worker JVMs. Use both a
72+
// process-local lock and an OS file lock so tests sharing one mock server cannot race.
73+
private val PROCESS_LOCK = ReentrantLock(true)
74+
private val LOCK_FILE =
75+
Paths.get(
76+
System.getProperty("java.io.tmpdir"),
77+
"openai-java-test-server-${UUID.nameUUIDFromBytes(BASE_URL.toByteArray())}.lock",
78+
)
4879
}
4980
}

0 commit comments

Comments
 (0)