@@ -119,7 +119,7 @@ class PcServiceConnectionControllerTest {
119119 }
120120
121121 @Test
122- fun connectToAuthFailureOpeningLiveSessionClearsToken () = runTest(dispatcher) {
122+ fun connectToAuthFailureOpeningLiveSessionKeepsToken () = runTest(dispatcher) {
123123 val tokens = FakeTokenStore (mutableMapOf (" desktop-1" to " token" ))
124124 val connector = FakeConnector (
125125 pingResult = PcPingResult .Connected (" AA:BB:CC:DD:EE:FF" ),
@@ -130,7 +130,7 @@ class PcServiceConnectionControllerTest {
130130 val result = controller.connectTo(pc)
131131
132132 assertTrue(result is PcServiceConnectResult .Failed )
133- assertNull( tokens.getToken(" desktop-1" ))
133+ assertEquals( " token " , tokens.getToken(" desktop-1" ))
134134 assertTrue(PcConnectionStateHolder .connectionState.value is PcConnectionState .Disconnected )
135135 }
136136
@@ -171,6 +171,23 @@ class PcServiceConnectionControllerTest {
171171 assertTrue(result is PcCommandResult .Failed )
172172 }
173173
174+ @Test
175+ fun commandAuthFailureKeepsToken () = runTest(dispatcher) {
176+ val tokens = FakeTokenStore (mutableMapOf (" desktop-1" to " token" ))
177+ val connector = FakeConnector (
178+ pingResult = PcPingResult .Connected (" AA:BB:CC:DD:EE:FF" ),
179+ commandResult = PcCommandResult .AuthFailed ()
180+ )
181+ val controller = controller(tokens, connector)
182+ controller.connectTo(pc)
183+
184+ val result = controller.sendControlCommand(PcControlCommand .LeftClick )
185+
186+ assertTrue(result is PcCommandResult .AuthFailed )
187+ assertEquals(" token" , tokens.getToken(" desktop-1" ))
188+ assertTrue(PcConnectionStateHolder .connectionState.value is PcConnectionState .Disconnected )
189+ }
190+
174191 @Test
175192 fun onPcUiPausedShutsDownAfterGrace () = runTest(dispatcher) {
176193 val tokens = FakeTokenStore (mutableMapOf (" desktop-1" to " token" ))
@@ -230,6 +247,48 @@ class PcServiceConnectionControllerTest {
230247 controller.disconnect()
231248 }
232249
250+ @Test
251+ fun heartbeatAuthFailureKeepsToken () = runTest(dispatcher) {
252+ val tokens = FakeTokenStore (mutableMapOf (" desktop-1" to " token" ))
253+ val connector = FakeConnector (
254+ pingResult = PcPingResult .Connected (" AA:BB:CC:DD:EE:FF" ),
255+ healthResults = listOf (PcCommandResult .AuthFailed ())
256+ )
257+ val controller = controller(tokens, connector)
258+ controller.connectTo(pc)
259+ controller.onPcUiResumed()
260+
261+ advanceTimeBy(5_001 )
262+ runCurrent()
263+
264+ assertEquals(" token" , tokens.getToken(" desktop-1" ))
265+ assertTrue(PcConnectionStateHolder .connectionState.value is PcConnectionState .Disconnected )
266+ assertTrue(controller.state.value is PcServiceConnectionState .Failed )
267+ }
268+
269+ @Test
270+ fun reconnectAuthFailureKeepsToken () = runTest(dispatcher) {
271+ val tokens = FakeTokenStore (mutableMapOf (" desktop-1" to " token" ))
272+ val connector = FakeConnector (
273+ pingResult = PcPingResult .Connected (" AA:BB:CC:DD:EE:FF" ),
274+ liveResults = listOf (
275+ PcLiveControlResult .Connected (FakeLiveConnection ()),
276+ PcLiveControlResult .AuthFailed ()
277+ )
278+ )
279+ val controller = controller(tokens, connector)
280+ controller.connectTo(pc)
281+ controller.onPcUiResumed()
282+ runCurrent()
283+
284+ connector.liveConnections.single().eventsFlow.tryEmit(PcControlConnectionEvent .Disconnected )
285+ runCurrent()
286+
287+ assertEquals(" token" , tokens.getToken(" desktop-1" ))
288+ assertTrue(PcConnectionStateHolder .connectionState.value is PcConnectionState .Disconnected )
289+ assertTrue(controller.state.value is PcServiceConnectionState .Failed )
290+ }
291+
233292 @Test
234293 fun bluetoothSavedTokenReconnectUsesBluetoothSession () = runTest(dispatcher) {
235294 val tokens = FakeTokenStore (mutableMapOf (" desktop-1" to " token" ))
@@ -268,7 +327,7 @@ class PcServiceConnectionControllerTest {
268327 }
269328
270329 @Test
271- fun invalidSavedTokenClearsTokenAndDisconnects () = runTest(dispatcher) {
330+ fun invalidSavedTokenKeepsTokenAndDisconnects () = runTest(dispatcher) {
272331 val tokens = FakeTokenStore (mutableMapOf (" desktop-1" to " token" ))
273332 val connector = FakeConnector (PcPingResult .AuthFailed ())
274333 val controller = controller(tokens, connector)
@@ -278,7 +337,7 @@ class PcServiceConnectionControllerTest {
278337 assertTrue(result is PcServiceConnectResult .Failed )
279338 assertEquals(PcErrorReason .AuthExpired , (result as PcServiceConnectResult .Failed ).reason)
280339 assertEquals(PC_AUTH_RETRY_ATTEMPTS , connector.pingCalls)
281- assertNull( tokens.getToken(" desktop-1" ))
340+ assertEquals( " token " , tokens.getToken(" desktop-1" ))
282341 assertTrue(PcConnectionStateHolder .connectionState.value is PcConnectionState .Disconnected )
283342 }
284343
@@ -502,6 +561,7 @@ class PcServiceConnectionControllerTest {
502561 private val pairingResultsByDesktop : Map <String , PcPairingResult > = emptyMap(),
503562 private val healthResults : List <PcCommandResult > = emptyList(),
504563 private val liveResults : List <PcLiveControlResult > = emptyList(),
564+ private val commandResult : PcCommandResult = PcCommandResult .Ack ,
505565 pingResults : List <PcPingResult > = emptyList()
506566 ) : PcConnector {
507567 private val queuedPingResults = ArrayDeque (pingResults)
@@ -529,9 +589,15 @@ class PcServiceConnectionControllerTest {
529589
530590 override suspend fun openControlSession (session : PcAuthenticatedSession ): PcLiveControlResult {
531591 openControlSessionCalls++
532- queuedLiveResults.removeFirstOrNull()?.let { return it }
592+ queuedLiveResults.removeFirstOrNull()?.let {
593+ if (it is PcLiveControlResult .Connected && it.connection is FakeLiveConnection ) {
594+ liveConnections + = it.connection
595+ }
596+ return it
597+ }
533598 val connection = FakeLiveConnection (
534- onHealth = { queuedHealthResults.removeFirstOrNull() ? : PcCommandResult .Ack }
599+ onHealth = { queuedHealthResults.removeFirstOrNull() ? : PcCommandResult .Ack },
600+ onCommand = { commandResult }
535601 )
536602 liveConnections + = connection
537603 return PcLiveControlResult .Connected (connection)
@@ -548,7 +614,8 @@ class PcServiceConnectionControllerTest {
548614 }
549615
550616 private class FakeLiveConnection (
551- private val onHealth : suspend () -> PcCommandResult = { PcCommandResult .Ack }
617+ private val onHealth : suspend () -> PcCommandResult = { PcCommandResult .Ack },
618+ private val onCommand : suspend () -> PcCommandResult = { PcCommandResult .Ack }
552619 ) : PcControlConnection {
553620 override val pointerProfile: PcPointerMovementProfile ? = null
554621 val eventsFlow = MutableSharedFlow <PcControlConnectionEvent >(extraBufferCapacity = 8 )
@@ -563,7 +630,7 @@ class PcServiceConnectionControllerTest {
563630
564631 override suspend fun sendCommand (command : PcControlCommand ): PcCommandResult {
565632 commands + = command
566- return PcCommandResult . Ack
633+ return onCommand()
567634 }
568635
569636 override fun close (reason : PcControlCloseReason ) {
0 commit comments