From ec596c51df70776801f04fad4e54bb172a622ba0 Mon Sep 17 00:00:00 2001 From: Robert Buessow Date: Thu, 7 Dec 2023 22:18:47 +0100 Subject: [PATCH] Fix flaky GarminSimulatorClientTest.receiveMessage --- .../aaps/plugins/sync/garmin/GarminSimulatorClient.kt | 7 ++++--- .../plugins/sync/garmin/GarminSimulatorClientTest.kt | 9 ++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/garmin/GarminSimulatorClient.kt b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/garmin/GarminSimulatorClient.kt index 75f8d8e436..01712a8da6 100644 --- a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/garmin/GarminSimulatorClient.kt +++ b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/garmin/GarminSimulatorClient.kt @@ -13,6 +13,7 @@ import java.net.ServerSocket import java.net.Socket import java.net.SocketException import java.time.Duration +import java.time.Instant import java.util.Collections import java.util.concurrent.ExecutorService import java.util.concurrent.Executors @@ -142,10 +143,10 @@ class GarminSimulatorClient( /** Wait for the server to start listing to requests. */ fun awaitReady(wait: Duration): Boolean { - var waitNanos = wait.toNanos() + val waitUntil = Instant.now() + wait readyLock.withLock { - while (!serverSocket.isBound && waitNanos > 0L) { - waitNanos = readyCond.awaitNanos(waitNanos) + while (!serverSocket.isBound && Instant.now() < waitUntil) { + readyCond.await(20, TimeUnit.MILLISECONDS) } } return serverSocket.isBound diff --git a/plugins/sync/src/test/kotlin/app/aaps/plugins/sync/garmin/GarminSimulatorClientTest.kt b/plugins/sync/src/test/kotlin/app/aaps/plugins/sync/garmin/GarminSimulatorClientTest.kt index 997213304a..d2e318ee45 100644 --- a/plugins/sync/src/test/kotlin/app/aaps/plugins/sync/garmin/GarminSimulatorClientTest.kt +++ b/plugins/sync/src/test/kotlin/app/aaps/plugins/sync/garmin/GarminSimulatorClientTest.kt @@ -5,6 +5,7 @@ import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Assertions.assertTrue import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test +import org.mockito.kotlin.any import org.mockito.kotlin.eq import org.mockito.kotlin.isNull import org.mockito.kotlin.mock @@ -28,18 +29,16 @@ class GarminSimulatorClientTest: TestBase() { fun receiveMessage() { val payload = "foo".toByteArray() assertTrue(client.awaitReady(Duration.ofSeconds(10))) + verify(receiver, timeout(100)).onConnect(client) val port = client.port val ip = Inet4Address.getByAddress(byteArrayOf(127, 0, 0, 1)) Socket(ip, port).use { socket -> assertTrue(socket.isConnected) socket.getOutputStream().write(payload) socket.getOutputStream().flush() - verify(receiver).onConnect(client) + verify(receiver, timeout(1_000)) + .onReceiveMessage(eq(client), any(), eq("SIMAPP"), eq(payload)) } - assertEquals(1, client.connectedDevices.size) - val device: GarminDevice = client.connectedDevices.first() - verify(receiver, timeout(1_000)) - .onReceiveMessage(eq(client), eq(device.id), eq("SIMAPP"), eq(payload)) } @Test