Merge pull request #11292 from Kilo-Org/mark/stabilize-jetbrains-session-timeout-tests

test(jetbrains): make session timeout tests deterministic
This commit is contained in:
Mark IJbema
2026-06-16 11:54:30 +02:00
committed by GitHub
@@ -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<String, SessionActivityKind>(), 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<String, SessionActivityKind>(), 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<JPanel, Timer>
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(