From 36998d26b93d26d53889176f5af235879e159840 Mon Sep 17 00:00:00 2001 From: markijbema <624143+markijbema@users.noreply.github.com> Date: Tue, 16 Jun 2026 09:23:26 +0000 Subject: [PATCH] test(jetbrains): make session timeout tests deterministic Co-authored-by: kiloconnect[bot] <240665456+kiloconnect[bot]@users.noreply.github.com> --- .../session/SessionSidePanelManagerTest.kt | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/SessionSidePanelManagerTest.kt b/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/SessionSidePanelManagerTest.kt index 94f10955206..68c9201a484 100644 --- a/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/SessionSidePanelManagerTest.kt +++ b/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/SessionSidePanelManagerTest.kt @@ -39,9 +39,11 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.cancel import kotlinx.coroutines.flow.MutableSharedFlow +import java.awt.event.ActionEvent import javax.swing.JLabel import javax.swing.JComponent import javax.swing.JPanel +import javax.swing.Timer @Suppress("UnstableApiUsage") class SessionSidePanelManagerTest : BasePlatformTestCase() { @@ -221,7 +223,7 @@ class SessionSidePanelManagerTest : BasePlatformTestCase() { manager.openSession(session("ses_1")) val first = active(manager) manager.openSession(session("ses_2")) - settle { first !in ui } + expire(manager, first) assertFalse(ui.contains(first)) assertEquals(listOf("/test" to "ses_1", "/test" to "ses_2"), created) @@ -234,7 +236,7 @@ class SessionSidePanelManagerTest : BasePlatformTestCase() { manager.openSession(session("ses_1")) val first = active(manager) manager.openSession(session("ses_2")) - settle { first !in ui } + expire(manager, first) manager.openSession(session("ses_1")) assertNotSame(first, active(manager)) @@ -255,7 +257,7 @@ class SessionSidePanelManagerTest : BasePlatformTestCase() { flow.emit(ChatEventDto.MessageUpdated("ses_1", msg("msg_hidden", "ses_1", "assistant"))) flow.emit(ChatEventDto.PartDelta("ses_1", "msg_hidden", "txt_hidden", "text", "stale")) } - settle { first !in ui } + expire(manager, first) manager.openSession(session("ses_1")) val second = active(manager) settle() @@ -588,7 +590,7 @@ class SessionSidePanelManagerTest : BasePlatformTestCase() { first.controller().model.setState(SessionState.AwaitingPermission(permission("ses_1"))) } manager.openSession(session("ses_2")) - settle { first !in ui } + expire(manager, first) assertFalse(ui.contains(first)) assertEquals(emptyMap(), manager.activity()) @@ -603,7 +605,7 @@ class SessionSidePanelManagerTest : BasePlatformTestCase() { first.controller().model.setState(SessionState.Busy("running")) } manager.openSession(session("ses_2")) - settle { first !in ui } + expire(manager, first) assertFalse(ui.contains(first)) } @@ -614,7 +616,7 @@ class SessionSidePanelManagerTest : BasePlatformTestCase() { manager.openSession(session("ses_1")) val first = active(manager) manager.openSession(session("ses_2")) - settle { first !in ui } + expire(manager, first) assertFalse(ui.contains(first)) assertEquals(emptyMap(), manager.activity()) @@ -698,6 +700,16 @@ class SessionSidePanelManagerTest : BasePlatformTestCase() { method.invoke(manager) } + private fun expire(manager: SessionSidePanelManager, ui: JPanel) { + val field = SessionSidePanelManager::class.java.getDeclaredField("timers") + field.isAccessible = true + @Suppress("UNCHECKED_CAST") + val timers = field.get(manager) as Map + val timer = requireNotNull(timers[ui]) { "Expected an inactive session disposal timer" } + timer.stop() + timer.actionListeners.single().actionPerformed(ActionEvent(timer, ActionEvent.ACTION_PERFORMED, "expire")) + } + private fun settle() = kotlinx.coroutines.runBlocking { repeat(5) { kotlinx.coroutines.delay(100) @@ -707,16 +719,6 @@ class SessionSidePanelManagerTest : BasePlatformTestCase() { } } - private fun settle(done: () -> Boolean) = kotlinx.coroutines.runBlocking { - repeat(50) { - if (done()) return@runBlocking - kotlinx.coroutines.delay(20) - com.intellij.openapi.application.ApplicationManager.getApplication().invokeAndWait { - com.intellij.util.ui.UIUtil.dispatchAllInvocationEvents() - } - } - } - private fun session(id: String) = session(id, "/test") private fun session(id: String, dir: String, title: String = "Session $id") = SessionDto(