diff --git a/tstest/log.go b/tstest/log.go index 8443aade1..9f59e7b69 100644 --- a/tstest/log.go +++ b/tstest/log.go @@ -12,6 +12,7 @@ import ( "sync" "testing" + "go4.org/mem" "tailscale.com/types/logger" ) @@ -118,7 +119,30 @@ func (lt *LogLineTracker) Reset() { // Close closes lt. After calling Close, calls to Logf become no-ops. func (lt *LogLineTracker) Close() { + lt.mu.Lock() defer lt.mu.Unlock() lt.closed = true } + +// MemLogger is a bytes.Buffer with a Logf method for tests that want +// to log to a buffer. +type MemLogger struct { + sync.Mutex + bytes.Buffer +} + +func (ml *MemLogger) Logf(format string, args ...interface{}) { + ml.Lock() + defer ml.Unlock() + fmt.Fprintf(&ml.Buffer, format, args...) + if !mem.HasSuffix(mem.B(ml.Buffer.Bytes()), mem.S("\n")) { + ml.Buffer.WriteByte('\n') + } +} + +func (ml *MemLogger) String() string { + ml.Lock() + defer ml.Unlock() + return ml.Buffer.String() +}