From c293be643498c0521d1959c2b2305ee9a8f06377 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Fri, 1 Oct 2021 08:50:53 -0700 Subject: [PATCH] tstest: backport MemLogger from main (it was part of things we don't want to cherry-pick) Signed-off-by: Brad Fitzpatrick --- tstest/log.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) 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() +}