Skip to content

Commit 6180c4f

Browse files
author
Bryan C. Mills
committed
log/syslog: create unix sockets in unique directories
startServer was invoking os.Remove on the temporary file for a unix socket after creating it. Since the files were created in the global temp directory, that could cause two tests to arrive at colliding names. (Noticed while looking into the failure at https://storage.googleapis.com/go-build-log/af2c83b1/solaris-amd64-oraclerel_3e01fda8.log, but I would be surprised if this solves that failure.) This change uses unique temporary directories, and attempts to keep name lengths minimal to avoid accidentally running into socket-name length limitations. Updates #34611 Change-Id: I21743f245e5c14645e03f09795013e058b984471 Reviewed-on: https://go-review.googlesource.com/c/go/+/366774 Trust: Bryan Mills <[email protected]> Run-TryBot: Bryan Mills <[email protected]> TryBot-Result: Gopher Robot <[email protected]> Reviewed-by: Ian Lance Taylor <[email protected]>
1 parent d16a575 commit 6180c4f

File tree

1 file changed

+55
-39
lines changed

1 file changed

+55
-39
lines changed

src/log/syslog/syslog_test.go

Lines changed: 55 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ import (
1010
"bufio"
1111
"fmt"
1212
"io"
13-
"log"
1413
"net"
1514
"os"
15+
"path/filepath"
1616
"runtime"
1717
"sync"
1818
"testing"
@@ -81,28 +81,36 @@ func runStreamSyslog(l net.Listener, done chan<- string, wg *sync.WaitGroup) {
8181
}
8282
}
8383

84-
func startServer(n, la string, done chan<- string) (addr string, sock io.Closer, wg *sync.WaitGroup) {
84+
func startServer(t *testing.T, n, la string, done chan<- string) (addr string, sock io.Closer, wg *sync.WaitGroup) {
8585
if n == "udp" || n == "tcp" {
8686
la = "127.0.0.1:0"
8787
} else {
88-
// unix and unixgram: choose an address if none given
88+
// unix and unixgram: choose an address if none given.
8989
if la == "" {
90-
// use os.CreateTemp to get a name that is unique
91-
f, err := os.CreateTemp("", "syslogtest")
90+
// The address must be short to fit in the sun_path field of the
91+
// sockaddr_un passed to the underlying system calls, so we use
92+
// os.MkdirTemp instead of t.TempDir: t.TempDir generally includes all or
93+
// part of the test name in the directory, which can be much more verbose
94+
// and risks running up against the limit.
95+
dir, err := os.MkdirTemp("", "")
9296
if err != nil {
93-
log.Fatal("TempFile: ", err)
97+
t.Fatal(err)
9498
}
95-
f.Close()
96-
la = f.Name()
99+
t.Cleanup(func() {
100+
if err := os.RemoveAll(dir); err != nil {
101+
t.Errorf("failed to remove socket temp directory: %v", err)
102+
}
103+
})
104+
la = filepath.Join(dir, "sock")
97105
}
98-
os.Remove(la)
99106
}
100107

101108
wg = new(sync.WaitGroup)
102109
if n == "udp" || n == "unixgram" {
103110
l, e := net.ListenPacket(n, la)
104111
if e != nil {
105-
log.Fatalf("startServer failed: %v", e)
112+
t.Helper()
113+
t.Fatalf("startServer failed: %v", e)
106114
}
107115
addr = l.LocalAddr().String()
108116
sock = l
@@ -114,7 +122,8 @@ func startServer(n, la string, done chan<- string) (addr string, sock io.Closer,
114122
} else {
115123
l, e := net.Listen(n, la)
116124
if e != nil {
117-
log.Fatalf("startServer failed: %v", e)
125+
t.Helper()
126+
t.Fatalf("startServer failed: %v", e)
118127
}
119128
addr = l.Addr().String()
120129
sock = l
@@ -129,32 +138,35 @@ func startServer(n, la string, done chan<- string) (addr string, sock io.Closer,
129138

130139
func TestWithSimulated(t *testing.T) {
131140
t.Parallel()
141+
132142
msg := "Test 123"
133-
var transport []string
134-
for _, n := range []string{"unix", "unixgram", "udp", "tcp"} {
135-
if testableNetwork(n) {
136-
transport = append(transport, n)
143+
for _, tr := range []string{"unix", "unixgram", "udp", "tcp"} {
144+
if !testableNetwork(tr) {
145+
continue
137146
}
138-
}
139147

140-
for _, tr := range transport {
141-
done := make(chan string)
142-
addr, sock, srvWG := startServer(tr, "", done)
143-
defer srvWG.Wait()
144-
defer sock.Close()
145-
if tr == "unix" || tr == "unixgram" {
146-
defer os.Remove(addr)
147-
}
148-
s, err := Dial(tr, addr, LOG_INFO|LOG_USER, "syslog_test")
149-
if err != nil {
150-
t.Fatalf("Dial() failed: %v", err)
151-
}
152-
err = s.Info(msg)
153-
if err != nil {
154-
t.Fatalf("log failed: %v", err)
155-
}
156-
check(t, msg, <-done, tr)
157-
s.Close()
148+
tr := tr
149+
t.Run(tr, func(t *testing.T) {
150+
t.Parallel()
151+
152+
done := make(chan string)
153+
addr, sock, srvWG := startServer(t, tr, "", done)
154+
defer srvWG.Wait()
155+
defer sock.Close()
156+
if tr == "unix" || tr == "unixgram" {
157+
defer os.Remove(addr)
158+
}
159+
s, err := Dial(tr, addr, LOG_INFO|LOG_USER, "syslog_test")
160+
if err != nil {
161+
t.Fatalf("Dial() failed: %v", err)
162+
}
163+
err = s.Info(msg)
164+
if err != nil {
165+
t.Fatalf("log failed: %v", err)
166+
}
167+
check(t, msg, <-done, tr)
168+
s.Close()
169+
})
158170
}
159171
}
160172

@@ -165,7 +177,7 @@ func TestFlap(t *testing.T) {
165177
}
166178

167179
done := make(chan string)
168-
addr, sock, srvWG := startServer(net, "", done)
180+
addr, sock, srvWG := startServer(t, net, "", done)
169181
defer srvWG.Wait()
170182
defer os.Remove(addr)
171183
defer sock.Close()
@@ -182,7 +194,10 @@ func TestFlap(t *testing.T) {
182194
check(t, msg, <-done, net)
183195

184196
// restart the server
185-
_, sock2, srvWG2 := startServer(net, addr, done)
197+
if err := os.Remove(addr); err != nil {
198+
t.Fatal(err)
199+
}
200+
_, sock2, srvWG2 := startServer(t, net, addr, done)
186201
defer srvWG2.Wait()
187202
defer sock2.Close()
188203

@@ -282,6 +297,7 @@ func check(t *testing.T, in, out, transport string) {
282297

283298
func TestWrite(t *testing.T) {
284299
t.Parallel()
300+
285301
tests := []struct {
286302
pri Priority
287303
pre string
@@ -299,7 +315,7 @@ func TestWrite(t *testing.T) {
299315
} else {
300316
for _, test := range tests {
301317
done := make(chan string)
302-
addr, sock, srvWG := startServer("udp", "", done)
318+
addr, sock, srvWG := startServer(t, "udp", "", done)
303319
defer srvWG.Wait()
304320
defer sock.Close()
305321
l, err := Dial("udp", addr, test.pri, test.pre)
@@ -323,7 +339,7 @@ func TestWrite(t *testing.T) {
323339
}
324340

325341
func TestConcurrentWrite(t *testing.T) {
326-
addr, sock, srvWG := startServer("udp", "", make(chan string, 1))
342+
addr, sock, srvWG := startServer(t, "udp", "", make(chan string, 1))
327343
defer srvWG.Wait()
328344
defer sock.Close()
329345
w, err := Dial("udp", addr, LOG_USER|LOG_ERR, "how's it going?")
@@ -359,7 +375,7 @@ func TestConcurrentReconnect(t *testing.T) {
359375
}
360376
}
361377
done := make(chan string, N*M)
362-
addr, sock, srvWG := startServer(net, "", done)
378+
addr, sock, srvWG := startServer(t, net, "", done)
363379
if net == "unix" {
364380
defer os.Remove(addr)
365381
}

0 commit comments

Comments
 (0)