Номера строк консоли живут в памяти менеджера и после его перезапуска начинаются заново, а открытая вкладка отбрасывает всё, чей номер не больше последнего увиденного. После обновления панели консоль оставалась пустой при живом сервере — до перезагрузки страницы. У буфера появилась метка запуска: поток отдаёт её отдельным событием, и по её смене вкладка сбрасывает счётчик, чистит экран и забирает историю нового запуска заново. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
60 lines
2.7 KiB
Go
60 lines
2.7 KiB
Go
package pzserver
|
|
|
|
import "testing"
|
|
|
|
// TestStripANSI берёт строки ровно в том виде, в каком их печатает SteamCMD:
|
|
// в браузере коды раскраски превращались в мусор вроде "[0mOK".
|
|
func TestStripANSI(t *testing.T) {
|
|
cases := map[string]string{
|
|
"\x1b[0mConnecting anonymously to Steam Public...\x1b[0mOK": "Connecting anonymously to Steam Public...OK",
|
|
"\x1b[0m Update state (0x3) reconfiguring, progress: 0.00": " Update state (0x3) reconfiguring, progress: 0.00",
|
|
"\x1b[1;32mSuccess!\x1b[0m": "Success!",
|
|
// Перемещение курсора и очистка строки — тоже CSI.
|
|
"\x1b[2K\x1b[1GЗагрузка": "Загрузка",
|
|
// Обычные строки не должны меняться.
|
|
"[----] Installing update...": "[----] Installing update...",
|
|
"Steam Console Client (c) Valve": "Steam Console Client (c) Valve",
|
|
"Мир сохранён, игроков онлайн: 3": "Мир сохранён, игроков онлайн: 3",
|
|
"": "",
|
|
}
|
|
|
|
for input, want := range cases {
|
|
if got := stripANSI(input); got != want {
|
|
t.Errorf("stripANSI(%q) = %q, ожидалось %q", input, got, want)
|
|
}
|
|
}
|
|
}
|
|
|
|
// TestAppendStripsANSI проверяет, что чистка стоит на общем пути: через буфер
|
|
// идёт и вывод сервера, и SteamCMD, и сообщения самой панели.
|
|
func TestAppendStripsANSI(t *testing.T) {
|
|
buf := newLogBuffer(10)
|
|
buf.append(LogLine{Stream: "task", Text: "\x1b[0mWaiting for user info...\x1b[0mOK"})
|
|
|
|
lines := buf.since(0)
|
|
if len(lines) != 1 {
|
|
t.Fatalf("строк в буфере: %d", len(lines))
|
|
}
|
|
if lines[0].Text != "Waiting for user info...OK" {
|
|
t.Errorf("в буфер попала строка с кодами: %q", lines[0].Text)
|
|
}
|
|
}
|
|
|
|
// Номера строк живут в памяти менеджера: после перезапуска они начинаются
|
|
// заново. Метка запуска должна это показывать, иначе открытая вкладка примет
|
|
// новые строки за уже показанные.
|
|
func TestLogBufferEpochDiffers(t *testing.T) {
|
|
first, second := newLogBuffer(8), newLogBuffer(8)
|
|
if first.epoch == "" {
|
|
t.Fatal("метка запуска пустая")
|
|
}
|
|
if first.epoch == second.epoch {
|
|
t.Fatalf("метки совпали: %q", first.epoch)
|
|
}
|
|
first.append(LogLine{Stream: "manager", Text: "первый запуск"})
|
|
second.append(LogLine{Stream: "manager", Text: "второй запуск"})
|
|
if got := second.since(0); len(got) != 1 || got[0].Seq != 1 {
|
|
t.Fatalf("нумерация нового буфера: %+v", got)
|
|
}
|
|
}
|