From 7c5bd322d53cdcbfb59db334ba243502ae170803 Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C3=A9my=20Oudompheng?= Date: Fri, 15 Feb 2013 11:07:31 +1100 Subject: [PATCH] log/syslog: fix channel race in test. R=golang-dev, minux.ma, iant, bradfitz, dave CC=golang-dev https://golang.org/cl/7314057 --- src/pkg/log/syslog/syslog_test.go | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/pkg/log/syslog/syslog_test.go b/src/pkg/log/syslog/syslog_test.go index 6d271c121c..2808622e22 100644 --- a/src/pkg/log/syslog/syslog_test.go +++ b/src/pkg/log/syslog/syslog_test.go @@ -46,7 +46,7 @@ func runPktSyslog(c net.PacketConn, done chan<- string) { var crashy = false -func runStreamSyslog(l net.Listener, done chan<- string) { +func runStreamSyslog(l net.Listener, done chan<- string, wg *sync.WaitGroup) { for { var c net.Conn var err error @@ -54,7 +54,10 @@ func runStreamSyslog(l net.Listener, done chan<- string) { fmt.Print(err) return } + wg.Add(1) go func(c net.Conn) { + defer wg.Done() + c.SetReadDeadline(time.Now().Add(5 * time.Second)) b := bufio.NewReader(c) for ct := 1; !crashy || ct&7 != 0; ct++ { s, err := b.ReadString('\n') @@ -68,7 +71,7 @@ func runStreamSyslog(l net.Listener, done chan<- string) { } } -func startServer(n, la string, done chan<- string) (addr string) { +func startServer(n, la string, done chan<- string) (addr string, wg *sync.WaitGroup) { if n == "udp" || n == "tcp" { la = "127.0.0.1:0" } else { @@ -85,20 +88,25 @@ func startServer(n, la string, done chan<- string) (addr string) { os.Remove(la) } + wg = new(sync.WaitGroup) if n == "udp" || n == "unixgram" { l, e := net.ListenPacket(n, la) if e != nil { log.Fatalf("startServer failed: %v", e) } addr = l.LocalAddr().String() - go runPktSyslog(l, done) + wg.Add(1) + go func() { + defer wg.Done() + runPktSyslog(l, done) + }() } else { l, e := net.Listen(n, la) if e != nil { log.Fatalf("startServer failed: %v", e) } addr = l.Addr().String() - go runStreamSyslog(l, done) + go runStreamSyslog(l, done, wg) } return } @@ -109,7 +117,7 @@ func TestWithSimulated(t *testing.T) { for _, tr := range transport { done := make(chan string) - addr := startServer(tr, "", done) + addr, _ := startServer(tr, "", done) if tr == "unix" || tr == "unixgram" { defer os.Remove(addr) } @@ -129,7 +137,7 @@ func TestWithSimulated(t *testing.T) { func TestFlap(t *testing.T) { net := "unix" done := make(chan string) - addr := startServer(net, "", done) + addr, _ := startServer(net, "", done) defer os.Remove(addr) s, err := Dial(net, addr, LOG_INFO|LOG_USER, "syslog_test") @@ -234,7 +242,7 @@ func TestWrite(t *testing.T) { } else { for _, test := range tests { done := make(chan string) - addr := startServer("udp", "", done) + addr, _ := startServer("udp", "", done) l, err := Dial("udp", addr, test.pri, test.pre) if err != nil { t.Fatalf("syslog.Dial() failed: %v", err) @@ -255,7 +263,7 @@ func TestWrite(t *testing.T) { } func TestConcurrentWrite(t *testing.T) { - addr := startServer("udp", "", make(chan string)) + addr, _ := startServer("udp", "", make(chan string)) w, err := Dial("udp", addr, LOG_USER|LOG_ERR, "how's it going?") if err != nil { t.Fatalf("syslog.Dial() failed: %v", err) @@ -281,7 +289,7 @@ func TestConcurrentReconnect(t *testing.T) { net := "unix" done := make(chan string) - addr := startServer(net, "", done) + addr, srvWG := startServer(net, "", done) defer os.Remove(addr) // count all the messages arriving @@ -319,6 +327,7 @@ func TestConcurrentReconnect(t *testing.T) { }() } wg.Wait() + srvWG.Wait() close(done) select { -- 2.48.1