From c8040e5938dc1107385d884fb21e92c1db2a3737 Mon Sep 17 00:00:00 2001 From: GitHub Copilot Date: Sat, 14 Feb 2026 18:26:43 +0000 Subject: [PATCH] go: harden session cleanup path Ensure SessionManager.CloseAll fully removes session and route mappings by reusing CloseSession for each tracked session ID. Tighten coverage test assertions to verify CloseAll removes both sessions and route-key mappings, guarding against stale state regressions. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- go/webterm/coverage_boost_test.go | 10 ++++++++-- go/webterm/session_manager.go | 11 +++++------ 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/go/webterm/coverage_boost_test.go b/go/webterm/coverage_boost_test.go index f66636c..552e2c0 100644 --- a/go/webterm/coverage_boost_test.go +++ b/go/webterm/coverage_boost_test.go @@ -141,8 +141,14 @@ func TestSessionManagerAPIsAndClosePaths(t *testing.T) { _, _ = manager.NewSession("shell", "sid-2", "route-2", 80, 24) _, _ = manager.NewSession("shell", "sid-3", "route-3", 80, 24) manager.CloseAll() - if s := manager.GetSession("sid-2"); s != nil && s.IsRunning() { - t.Fatalf("CloseAll should stop session sid-2") + if s := manager.GetSession("sid-2"); s != nil { + t.Fatalf("CloseAll should remove session sid-2") + } + if s := manager.GetSession("sid-3"); s != nil { + t.Fatalf("CloseAll should remove session sid-3") + } + if manager.GetSessionByRouteKey("route-2") != nil || manager.GetSessionByRouteKey("route-3") != nil { + t.Fatalf("CloseAll should remove route mappings") } } diff --git a/go/webterm/session_manager.go b/go/webterm/session_manager.go index b6f6381..cbd34fb 100644 --- a/go/webterm/session_manager.go +++ b/go/webterm/session_manager.go @@ -175,14 +175,13 @@ func (m *SessionManager) OnSessionEnd(sessionID string) { func (m *SessionManager) CloseAll() { m.mu.RLock() - sessions := make([]Session, 0, len(m.sessions)) - for _, session := range m.sessions { - sessions = append(sessions, session) + sessionIDs := make([]string, 0, len(m.sessions)) + for sessionID := range m.sessions { + sessionIDs = append(sessionIDs, sessionID) } m.mu.RUnlock() - for _, session := range sessions { - _ = session.Close() - _ = session.Wait() + for _, sessionID := range sessionIDs { + m.CloseSession(sessionID) } }