From 6e4c7d9376701ec225ca92d28f3e0edff38ffb75 Mon Sep 17 00:00:00 2001 From: Robert Buessow Date: Thu, 7 Dec 2023 20:56:25 +0100 Subject: [PATCH 1/3] Increase Gradle JVM memory from 3 to 4G --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index dc962a673a..8e28702445 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,7 +17,7 @@ # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects org.gradle.parallel=true org.gradle.warning.mode=all -org.gradle.jvmargs=-Xmx3g -XX:+UseParallelGC +org.gradle.jvmargs=-Xmx4g -XX:+UseParallelGC android.enableJetifier=false android.useAndroidX=true From ec596c51df70776801f04fad4e54bb172a622ba0 Mon Sep 17 00:00:00 2001 From: Robert Buessow Date: Thu, 7 Dec 2023 22:18:47 +0100 Subject: [PATCH 2/3] 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 From 4cdf2e6969029713f22b4d6c781eed431bb94341 Mon Sep 17 00:00:00 2001 From: Robert Buessow Date: Fri, 8 Dec 2023 16:43:42 +0100 Subject: [PATCH 3/3] Fix flaky GarminSimulatorClientTest.sendMessage --- .../sync/garmin/GarminSimulatorClientTest.kt | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) 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 d2e318ee45..9243260d07 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 @@ -1,11 +1,9 @@ package app.aaps.plugins.sync.garmin import app.aaps.shared.tests.TestBase -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 @@ -20,6 +18,14 @@ class GarminSimulatorClientTest: TestBase() { private lateinit var client: GarminSimulatorClient private val receiver: GarminReceiver = mock() + private fun waitForOrFail(c: ()->T?): T { + for (i in 0 until 10) { + c()?.let { return it } + Thread.sleep(1) + } + throw AssertionError("wait timed out") + } + @BeforeEach fun setup() { client = GarminSimulatorClient(aapsLogger, receiver, 0) @@ -36,8 +42,9 @@ class GarminSimulatorClientTest: TestBase() { assertTrue(socket.isConnected) socket.getOutputStream().write(payload) socket.getOutputStream().flush() + val device = waitForOrFail { client.connectedDevices.firstOrNull() } verify(receiver, timeout(1_000)) - .onReceiveMessage(eq(client), any(), eq("SIMAPP"), eq(payload)) + .onReceiveMessage(eq(client), eq(device.id), eq("SIMAPP"), eq(payload)) } } @@ -45,15 +52,14 @@ class GarminSimulatorClientTest: TestBase() { fun sendMessage() { 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)) val device: GarminDevice val app: GarminApplication Socket(ip, port).use { socket -> assertTrue(socket.isConnected) - verify(receiver).onConnect(client) - assertEquals(1, client.connectedDevices.size) - device = client.connectedDevices.first() + device = waitForOrFail { client.connectedDevices.firstOrNull() } app = GarminApplication(device, "SIMAPP", "T") client.sendMessage(app, payload) }