package gui import ( "os" "strings" "testing" "huya-go/internal/logger" ) // TestAppLogsReachMemoryAndFile 验证 GUI 的日志入口同时进入内存缓冲与实例日志文件, // 且账号维度日志带上账号标签。 func TestAppLogsReachMemoryAndFile(t *testing.T) { dir := t.TempDir() store := logger.NewStore(50) closeLog, err := logger.Init(store, dir, "测试实例", "test", dir) if err != nil { t.Fatalf("logger.Init() error = %v", err) } path := logger.FilePath() if path == "" { t.Fatal("日志文件路径为空") } app := &App{logStore: store} app.addLog("info", "日志文件已就绪") app.logAccount("监控", "success", "12345", "兑换成功 pid=%d", 9) // 关闭日志(同时把异步队列刷盘)后再读文件。 closeLog() data, err := os.ReadFile(path) if err != nil { t.Fatalf("读取日志文件失败: %v", err) } text := string(data) for _, want := range []string{"实例: 测试实例", "日志文件已就绪", "[账号:12345]", "兑换成功 pid=9"} { if !strings.Contains(text, want) { t.Fatalf("日志文件缺少 %q:\n%s", want, text) } } if !strings.Contains(text, "[info]") || !strings.Contains(text, "[success]") { t.Fatalf("日志级别未写入: %s", text) } entries := store.Since(0) if len(entries) < 3 { t.Fatalf("内存日志条数 = %d, want >= 3", len(entries)) } if entries[len(entries)-1].Account != "12345" { t.Fatalf("最后一条日志账号标签 = %q, want 12345", entries[len(entries)-1].Account) } } // TestGetLogsReturnsIncrementally 验证界面按自增 ID 增量拉取日志。 func TestGetLogsReturnsIncrementally(t *testing.T) { dir := t.TempDir() store := logger.NewStore(50) closeLog, err := logger.Init(store, dir, "测试实例", "test", dir) if err != nil { t.Fatalf("logger.Init() error = %v", err) } defer closeLog() app := &App{logStore: store} app.addLog("info", "第一条") first := app.GetLogs(0) if len(first) == 0 { t.Fatal("首次拉取不应为空") } lastID := first[len(first)-1].ID app.addLog("warn", "第二条") // 只有写入后新增的日志应当返回,避免界面重复渲染历史日志。 incremental := app.GetLogs(lastID) if len(incremental) != 1 { t.Fatalf("增量拉取条数 = %d, want 1", len(incremental)) } if incremental[0].Message != "第二条" || incremental[0].Level != "warn" { t.Fatalf("增量日志 = %+v", incremental[0]) } stats := app.GetLogStats() if stats.Level == "" || stats.FilePath == "" || stats.Count < 2 { t.Fatalf("日志统计异常: %+v", stats) } }