ipn: close logger at the end of TestLocalLogLines

If any goroutine continues to use the logger in TestLocalLogLines
after the test finishes, the test panics.

The culprit for this was wireguard-go; the previous commit fixed that.
This commit adds suspenders: When the test is done, make logging calls
into no-ops.

Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>
pull/1105/head
Josh Bleecher Snyder 4 years ago committed by Josh Bleecher Snyder
parent 1e4604f60e
commit 18471a8792

@ -26,6 +26,7 @@ func TestLocalLogLines(t *testing.T) {
"[v1] peer keys: %s", "[v1] peer keys: %s",
"[v1] v%v peers: %v", "[v1] v%v peers: %v",
}) })
defer logListen.Close()
logid := func(hex byte) logtail.PublicID { logid := func(hex byte) logtail.PublicID {
var ret logtail.PublicID var ret logtail.PublicID

@ -76,12 +76,17 @@ type LogLineTracker struct {
listenFor []string listenFor []string
mu sync.Mutex mu sync.Mutex
closed bool
seen map[string]bool // format string => false (if not yet seen but wanted) or true (once seen) seen map[string]bool // format string => false (if not yet seen but wanted) or true (once seen)
} }
// Logf logs to its underlying logger and also tracks that the given format pattern has been seen. // Logf logs to its underlying logger and also tracks that the given format pattern has been seen.
func (lt *LogLineTracker) Logf(format string, args ...interface{}) { func (lt *LogLineTracker) Logf(format string, args ...interface{}) {
lt.mu.Lock() lt.mu.Lock()
if lt.closed {
lt.mu.Unlock()
return
}
if v, ok := lt.seen[format]; ok && !v { if v, ok := lt.seen[format]; ok && !v {
lt.seen[format] = true lt.seen[format] = true
} }
@ -101,3 +106,10 @@ func (lt *LogLineTracker) Check() []string {
} }
return notSeen return notSeen
} }
// 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
}

Loading…
Cancel
Save