sshkeeper/internal/session/tmux_test.go

69 lines
1.7 KiB
Go

package session
import (
"fmt"
"os/exec"
"testing"
"time"
)
func TestSanitizeWindowName(t *testing.T) {
if got := sanitizeWindowName(" prod:db "); got != "prod-db" {
t.Fatalf("sanitizeWindowName = %q, want prod-db", got)
}
if got := sanitizeWindowName(" "); got != "ssh" {
t.Fatalf("empty name = %q, want ssh", got)
}
}
func TestShellQuote(t *testing.T) {
got := shellQuote("prod'one")
want := `'prod'"'"'one'`
if got != want {
t.Fatalf("shellQuote = %q, want %q", got, want)
}
}
func TestTmuxWindowLifecycle(t *testing.T) {
if !Available() {
t.Skip("tmux is not available")
}
t.Setenv("TMUX", "")
oldWorkspace := dedicatedWorkspace
dedicatedWorkspace = fmt.Sprintf("sshkeeper-test-%d", time.Now().UnixNano())
t.Cleanup(func() {
_, _ = exec.Command("tmux", "kill-session", "-t", dedicatedWorkspace).CombinedOutput()
dedicatedWorkspace = oldWorkspace
})
windowID, inside, err := openWindow("smoke-server", "sleep 30")
if err != nil {
t.Fatalf("openWindow: %v", err)
}
if inside {
t.Fatal("expected dedicated workspace outside tmux")
}
windows, err := List()
if err != nil {
t.Fatalf("List: %v", err)
}
if len(windows) != 1 || windows[0].ID != windowID || windows[0].ServerAlias != "smoke-server" {
t.Fatalf("unexpected windows: %#v", windows)
}
if err := Close(windowID); err != nil {
t.Fatalf("Close: %v", err)
}
deadline := time.Now().Add(2 * time.Second)
for time.Now().Before(deadline) {
windows, err = List()
if err != nil {
t.Fatalf("List after close: %v", err)
}
if len(windows) == 0 {
return
}
time.Sleep(20 * time.Millisecond)
}
t.Fatalf("window %s still listed after close: %#v", windowID, windows)
}