@@ -5,6 +5,7 @@ import io.agentclientprotocol.client.ClientSideConnection
55import io.agentclientprotocol.mock.MockClient
66import io.agentclientprotocol.mock.TestTransport
77import io.agentclientprotocol.model.*
8+ import io.agentclientprotocol.rpc.ACPJson
89import kotlinx.coroutines.async
910import kotlinx.coroutines.delay
1011import kotlinx.coroutines.test.runTest
@@ -17,12 +18,12 @@ class ClientSideConnectionTest {
1718 private lateinit var clientConnection: ClientSideConnection
1819
1920 @BeforeTest
20- fun setup () {
21+ fun setup () = runTest {
2122 mockClient = MockClient ()
2223 val (transport1, transport2) = TestTransport .createPair()
2324 clientTransport = transport1
2425 agentTransport = transport2
25- clientConnection = ClientSideConnection (mockClient)
26+ clientConnection = ClientSideConnection (this , clientTransport, mockClient)
2627 }
2728
2829 @AfterTest
@@ -36,7 +37,7 @@ class ClientSideConnectionTest {
3637 @Test
3738 fun `test connection establishment` () = runTest {
3839 // When
39- clientConnection.start(clientTransport )
40+ clientConnection.start()
4041
4142 // Then
4243 assertTrue(clientTransport.isConnected)
@@ -48,7 +49,7 @@ class ClientSideConnectionTest {
4849 @Test
4950 fun `test initialize method sends correct request and handles response` () = runTest {
5051 // Given
51- clientConnection.start(clientTransport )
52+ clientConnection.start()
5253 clientTransport.start()
5354 agentTransport.start()
5455
@@ -82,7 +83,7 @@ class ClientSideConnectionTest {
8283 @Test
8384 fun `test authenticate method sends correct request` () = runTest {
8485 // Given
85- clientConnection.start(clientTransport )
86+ clientConnection.start()
8687 clientTransport.start()
8788 agentTransport.start()
8889
@@ -105,7 +106,7 @@ class ClientSideConnectionTest {
105106 @Test
106107 fun `test newSession method sends correct request and handles response` () = runTest {
107108 // Given
108- clientConnection.start(clientTransport )
109+ clientConnection.start()
109110 clientTransport.start()
110111 agentTransport.start()
111112
@@ -118,7 +119,7 @@ class ClientSideConnectionTest {
118119
119120 // When
120121 val resultDeferred = async {
121- clientConnection.newSession (request)
122+ clientConnection.sessionNew (request)
122123 }
123124
124125 // Simulate agent responding
@@ -134,7 +135,7 @@ class ClientSideConnectionTest {
134135 @Test
135136 fun `test loadSession method sends correct request` () = runTest {
136137 // Given
137- clientConnection.start(clientTransport )
138+ clientConnection.start()
138139 clientTransport.start()
139140 agentTransport.start()
140141
@@ -146,7 +147,7 @@ class ClientSideConnectionTest {
146147
147148 // When
148149 val resultDeferred = async {
149- clientConnection.loadSession (request)
150+ clientConnection.sessionLoad (request)
150151 }
151152
152153 // Simulate agent responding with success
@@ -161,7 +162,7 @@ class ClientSideConnectionTest {
161162 @Test
162163 fun `test prompt method sends correct request and handles response` () = runTest {
163164 // Given
164- clientConnection.start(clientTransport )
165+ clientConnection.start()
165166 clientTransport.start()
166167 agentTransport.start()
167168
@@ -174,7 +175,7 @@ class ClientSideConnectionTest {
174175
175176 // When
176177 val resultDeferred = async {
177- clientConnection.prompt (request)
178+ clientConnection.sessionPrompt (request)
178179 }
179180
180181 // Simulate agent responding
@@ -189,14 +190,14 @@ class ClientSideConnectionTest {
189190 @Test
190191 fun `test cancel method sends notification` () = runTest {
191192 // Given
192- clientConnection.start(clientTransport )
193+ clientConnection.start()
193194 clientTransport.start()
194195 agentTransport.start()
195196
196197 val notification = CancelNotification (SessionId (" test-session" ))
197198
198199 // When
199- clientConnection.cancel (notification)
200+ clientConnection.sessionCancel (notification)
200201
201202 // Then - notification should be sent without waiting for response
202203 // This is a fire-and-forget operation
@@ -207,7 +208,7 @@ class ClientSideConnectionTest {
207208 @Test
208209 fun `test readTextFile handler calls client and returns response` () = runTest {
209210 // Given
210- clientConnection.start(clientTransport )
211+ clientConnection.start()
211212 clientTransport.start()
212213 agentTransport.start()
213214
@@ -219,7 +220,7 @@ class ClientSideConnectionTest {
219220 path = " /test/file.txt"
220221 )
221222
222- // When - simulate agent sending readTextFile request
223+ // When - simulate agent sending fsReadTextFile request
223224 val requestJson = """ {"jsonrpc":"2.0","id":42,"method":"fs/read_text_file","params":${
224225 ACPJson .encodeToString(
225226 ReadTextFileRequest .serializer(), request)} }"""
@@ -237,7 +238,7 @@ class ClientSideConnectionTest {
237238 @Test
238239 fun `test writeTextFile handler calls client` () = runTest {
239240 // Given
240- clientConnection.start(clientTransport )
241+ clientConnection.start()
241242 clientTransport.start()
242243 agentTransport.start()
243244
@@ -247,7 +248,7 @@ class ClientSideConnectionTest {
247248 content = " new content"
248249 )
249250
250- // When - simulate agent sending writeTextFile request
251+ // When - simulate agent sending fsWriteTextFile request
251252 val requestJson = """ {"jsonrpc":"2.0","id":43,"method":"fs/write_text_file","params":${
252253 ACPJson .encodeToString(
253254 WriteTextFileRequest .serializer(), request)} }"""
@@ -265,7 +266,7 @@ class ClientSideConnectionTest {
265266 @Test
266267 fun `test requestPermission handler calls client and returns response` () = runTest {
267268 // Given
268- clientConnection.start(clientTransport )
269+ clientConnection.start()
269270 clientTransport.start()
270271 agentTransport.start()
271272
@@ -291,7 +292,7 @@ class ClientSideConnectionTest {
291292 val expectedOutcome = RequestPermissionOutcome .Selected (PermissionOptionId (" allow" ))
292293 mockClient.requestPermissionResult = RequestPermissionResponse (expectedOutcome)
293294
294- // When - simulate agent sending requestPermission request
295+ // When - simulate agent sending sessionRequestPermission request
295296 val requestJson = """ {"jsonrpc":"2.0","id":44,"method":"session/request_permission","params":${
296297 ACPJson .encodeToString(
297298 RequestPermissionRequest .serializer(), request)} }"""
@@ -309,7 +310,7 @@ class ClientSideConnectionTest {
309310 @Test
310311 fun `test sessionUpdate handler calls client` () = runTest {
311312 // Given
312- clientConnection.start(clientTransport )
313+ clientConnection.start()
313314 clientTransport.start()
314315 agentTransport.start()
315316
@@ -343,7 +344,7 @@ class ClientSideConnectionTest {
343344 @Test
344345 fun `test initialize method handles JSON-RPC error response` () = runTest {
345346 // Given
346- clientConnection.start(clientTransport )
347+ clientConnection.start()
347348 clientTransport.start()
348349 agentTransport.start()
349350
@@ -367,31 +368,48 @@ class ClientSideConnectionTest {
367368 @Test
368369 fun `test client method exception propagates to agent` () = runTest {
369370 // Given
370- clientConnection.start(clientTransport )
371+ clientConnection.start()
371372 clientTransport.start()
372373 agentTransport.start()
373374
374375 // Configure mock to throw exception
375376 val testClient = object : Client {
376- override suspend fun readTextFile (request : ReadTextFileRequest ): ReadTextFileResponse {
377+ override suspend fun fsReadTextFile (request : ReadTextFileRequest ): ReadTextFileResponse {
377378 throw RuntimeException (" File not found" )
378379 }
379- override suspend fun writeTextFile (request : WriteTextFileRequest ) {}
380- override suspend fun requestPermission (request : RequestPermissionRequest ): RequestPermissionResponse {
380+ override suspend fun fsWriteTextFile (request : WriteTextFileRequest ): WriteTextFileResponse {
381+ throw RuntimeException (" Write failed" )
382+ }
383+ override suspend fun sessionRequestPermission (request : RequestPermissionRequest ): RequestPermissionResponse {
381384 return RequestPermissionResponse (RequestPermissionOutcome .Cancelled )
382385 }
383386 override suspend fun sessionUpdate (notification : SessionNotification ) {}
387+ override suspend fun terminalCreate (request : CreateTerminalRequest ): CreateTerminalResponse {
388+ throw RuntimeException (" Terminal not supported" )
389+ }
390+ override suspend fun terminalOutput (request : TerminalOutputRequest ): TerminalOutputResponse {
391+ throw RuntimeException (" Terminal not supported" )
392+ }
393+ override suspend fun terminalRelease (request : ReleaseTerminalRequest ): ReleaseTerminalResponse {
394+ throw RuntimeException (" Terminal not supported" )
395+ }
396+ override suspend fun terminalWaitForExit (request : WaitForTerminalExitRequest ): WaitForTerminalExitResponse {
397+ throw RuntimeException (" Terminal not supported" )
398+ }
399+ override suspend fun terminalKill (request : KillTerminalCommandRequest ): KillTerminalCommandResponse {
400+ throw RuntimeException (" Terminal not supported" )
401+ }
384402 }
385403
386- val connectionWithFailingClient = ClientSideConnection (testClient)
387- connectionWithFailingClient.start(agentTransport )
404+ val connectionWithFailingClient = ClientSideConnection (this , agentTransport, testClient)
405+ connectionWithFailingClient.start()
388406
389407 val request = ReadTextFileRequest (
390408 sessionId = SessionId (" test-session" ),
391409 path = " /nonexistent/file.txt"
392410 )
393411
394- // When - simulate agent sending readTextFile request
412+ // When - simulate agent sending fsReadTextFile request
395413 val requestJson = """ {"jsonrpc":"2.0","id":42,"method":"fs/read_text_file","params":${
396414 ACPJson .encodeToString(
397415 ReadTextFileRequest .serializer(), request)} }"""
@@ -408,7 +426,7 @@ class ClientSideConnectionTest {
408426 @Test
409427 fun `test transport disconnection during operation` () = runTest {
410428 // Given
411- clientConnection.start(clientTransport )
429+ clientConnection.start()
412430 clientTransport.start()
413431 agentTransport.start()
414432
@@ -434,7 +452,7 @@ class ClientSideConnectionTest {
434452 @Test
435453 fun `test full request-response cycle with real JSON serialization` () = runTest {
436454 // Given
437- clientConnection.start(clientTransport )
455+ clientConnection.start()
438456 clientTransport.start()
439457 agentTransport.start()
440458
@@ -472,7 +490,7 @@ class ClientSideConnectionTest {
472490 val expectedSessionResponse = NewSessionResponse (SessionId (" new-session-123" ))
473491
474492 val sessionDeferred = async {
475- clientConnection.newSession (sessionRequest)
493+ clientConnection.sessionNew (sessionRequest)
476494 }
477495
478496 val sessionResponseJson = """ {"jsonrpc":"2.0","id":2,"result":${ACPJson .encodeToString(NewSessionResponse .serializer(), expectedSessionResponse)} }"""
@@ -488,7 +506,7 @@ class ClientSideConnectionTest {
488506 @Test
489507 fun `test concurrent requests handling` () = runTest {
490508 // Given
491- clientConnection.start(clientTransport )
509+ clientConnection.start()
492510 clientTransport.start()
493511 agentTransport.start()
494512
@@ -500,7 +518,7 @@ class ClientSideConnectionTest {
500518
501519 // When - send concurrent requests
502520 val deferred1 = async { clientConnection.initialize(request1) }
503- val deferred2 = async { clientConnection.newSession (request2) }
521+ val deferred2 = async { clientConnection.sessionNew (request2) }
504522
505523 // Respond to both requests (order shouldn't matter due to ID correlation)
506524 val response1Json = """ {"jsonrpc":"2.0","id":1,"result":${ACPJson .encodeToString(InitializeResponse .serializer(), response1)} }"""
@@ -521,7 +539,7 @@ class ClientSideConnectionTest {
521539 @Test
522540 fun `test bidirectional communication with file operations` () = runTest {
523541 // Given
524- clientConnection.start(clientTransport )
542+ clientConnection.start()
525543 clientTransport.start()
526544 agentTransport.start()
527545
@@ -545,7 +563,7 @@ class ClientSideConnectionTest {
545563 assertEquals(1 , mockClient.readTextFileCalls.size)
546564 assertEquals(" /test/hello.txt" , mockClient.readTextFileCalls[0 ].path)
547565
548- // When - client sends prompt request
566+ // When - client sends sessionPrompt request
549567 val promptRequest = PromptRequest (
550568 sessionId = SessionId (" test-session" ),
551569 prompt = listOf (ContentBlock .Text (" Process the file content" ))
@@ -554,7 +572,7 @@ class ClientSideConnectionTest {
554572 val promptResponse = PromptResponse (StopReason .END_TURN )
555573
556574 val promptDeferred = async {
557- clientConnection.prompt (promptRequest)
575+ clientConnection.sessionPrompt (promptRequest)
558576 }
559577
560578 val promptResponseJson = """ {"jsonrpc":"2.0","id":3,"result":${ACPJson .encodeToString(PromptResponse .serializer(), promptResponse)} }"""
0 commit comments