in agents/agents-core/src/jvmTest/kotlin/ai/koog/agents/core/agent/context/AIAgentLLMContextConcurrencyTest.kt [40:100]
fun testConcurrentReadWrite() {
runBlocking {
val context = createTestLLMContext()
val readResults = CopyOnWriteArrayList<String>()
val writeResults = CopyOnWriteArrayList<String>()
val counter = AtomicInteger(0)
// coroutines for read operations
val readJobs = (1..5).map {
async(Dispatchers.Default) {
val index = counter.getAndIncrement()
val result = context.readSession {
delay(1)
"result-$index"
}
readResults.add(result)
}
}
// coroutines for write tools operations
val writeToolsJobs = (1..3).map {
async(Dispatchers.Default) {
val index = counter.getAndIncrement()
val result = context.writeSession {
delay(1)
this.tools = listOf(
ToolDescriptor(
name = "tool-$index",
description = "Tool $index",
requiredParameters = emptyList()
)
)
"write-tool-result-$index"
}
writeResults.add(result)
}
}
// coroutines for write prompt operations
val writePromptJobs = (1..3).map {
async(Dispatchers.Default) {
val index = counter.getAndIncrement()
val result = context.writeSession {
delay(1)
this.prompt = prompt("prompt-$index") {}
"write-prompt-result-$index"
}
writeResults.add(result)
}
}
(readJobs + writeToolsJobs + writePromptJobs).awaitAll()
val promptId = context.readSession { prompt.id }
val toolName = context.readSession { tools.firstOrNull()?.name }
// verify state
assertTrue(promptId.isNotEmpty(), "Prompt ID should not be empty")
assertNotNull(toolName, "Tool name should not be null")
}
}