// 日志注入测试:验证 agent 包可携带宿主项目的日志实现, // 日志统一走注入的 Logger(嵌入到 capricorn 等项目时日志不再"各写各的")。 package e2e import ( "fmt" "strings" "sync" "testing" "time" "git.zeroonesoft.cn/golib/zonat/agent" ) // captureLogger 捕获日志的假实现(模拟宿主项目的 logger) type captureLogger struct { mu sync.Mutex lines []string } func (c *captureLogger) Debugf(format string, args ...any) {} func (c *captureLogger) appendf(format string, args ...any) { c.mu.Lock() c.lines = append(c.lines, fmt.Sprintf(format, args...)) c.mu.Unlock() } func (c *captureLogger) Infof(format string, args ...any) { c.appendf(format, args...) } func (c *captureLogger) Warnf(format string, args ...any) { c.appendf(format, args...) } func (c *captureLogger) Errorf(format string, args ...any) { c.appendf(format, args...) } func (c *captureLogger) contains(sub string) bool { c.mu.Lock() defer c.mu.Unlock() for _, l := range c.lines { if strings.Contains(l, sub) { return true } } return false } func TestLoggerInjection(t *testing.T) { target := startEchoServer(t) n := startNode(t) cap := &captureLogger{} a := agent.New("agent-log") a.Logger = cap a.Backoff = 100 * time.Millisecond a.PingEvery = 0 go a.Run() t.Cleanup(a.Close) if _, err := a.RegisterTunnel(buildTunnel(t, n, a, "log-tunnel", target, 0)); err != nil { t.Fatal(err) } // 注入的 logger 必须收到 agent 内部日志 deadline := time.Now().Add(2 * time.Second) for time.Now().Before(deadline) { if cap.contains("已连接节点") { return } time.Sleep(20 * time.Millisecond) } t.Fatal("注入的 logger 未收到 agent 日志") }