fun testConcurrentReadWrite()

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")
        }
    }