Commit bcb495b3 authored by Rick Arnold's avatar Rick Arnold Committed by Russ Cox

net/smtp: remove data race from TestSendMail.

A data race was found in TestSendMail by the race detector.

Fixes #4559.

R=golang-dev, bradfitz, dave, rsc
CC=golang-dev
https://golang.org/cl/6944057
parent 57ae2e73
...@@ -69,13 +69,13 @@ func (f faker) SetReadDeadline(time.Time) error { return nil } ...@@ -69,13 +69,13 @@ func (f faker) SetReadDeadline(time.Time) error { return nil }
func (f faker) SetWriteDeadline(time.Time) error { return nil } func (f faker) SetWriteDeadline(time.Time) error { return nil }
func TestBasic(t *testing.T) { func TestBasic(t *testing.T) {
basicServer = strings.Join(strings.Split(basicServer, "\n"), "\r\n") server := strings.Join(strings.Split(basicServer, "\n"), "\r\n")
basicClient = strings.Join(strings.Split(basicClient, "\n"), "\r\n") client := strings.Join(strings.Split(basicClient, "\n"), "\r\n")
var cmdbuf bytes.Buffer var cmdbuf bytes.Buffer
bcmdbuf := bufio.NewWriter(&cmdbuf) bcmdbuf := bufio.NewWriter(&cmdbuf)
var fake faker var fake faker
fake.ReadWriter = bufio.NewReadWriter(bufio.NewReader(strings.NewReader(basicServer)), bcmdbuf) fake.ReadWriter = bufio.NewReadWriter(bufio.NewReader(strings.NewReader(server)), bcmdbuf)
c := &Client{Text: textproto.NewConn(fake), localName: "localhost"} c := &Client{Text: textproto.NewConn(fake), localName: "localhost"}
if err := c.helo(); err != nil { if err := c.helo(); err != nil {
...@@ -144,8 +144,8 @@ Goodbye.` ...@@ -144,8 +144,8 @@ Goodbye.`
bcmdbuf.Flush() bcmdbuf.Flush()
actualcmds := cmdbuf.String() actualcmds := cmdbuf.String()
if basicClient != actualcmds { if client != actualcmds {
t.Fatalf("Got:\n%s\nExpected:\n%s", actualcmds, basicClient) t.Fatalf("Got:\n%s\nExpected:\n%s", actualcmds, client)
} }
} }
...@@ -188,8 +188,8 @@ QUIT ...@@ -188,8 +188,8 @@ QUIT
` `
func TestNewClient(t *testing.T) { func TestNewClient(t *testing.T) {
newClientServer = strings.Join(strings.Split(newClientServer, "\n"), "\r\n") server := strings.Join(strings.Split(newClientServer, "\n"), "\r\n")
newClientClient = strings.Join(strings.Split(newClientClient, "\n"), "\r\n") client := strings.Join(strings.Split(newClientClient, "\n"), "\r\n")
var cmdbuf bytes.Buffer var cmdbuf bytes.Buffer
bcmdbuf := bufio.NewWriter(&cmdbuf) bcmdbuf := bufio.NewWriter(&cmdbuf)
...@@ -198,7 +198,7 @@ func TestNewClient(t *testing.T) { ...@@ -198,7 +198,7 @@ func TestNewClient(t *testing.T) {
return cmdbuf.String() return cmdbuf.String()
} }
var fake faker var fake faker
fake.ReadWriter = bufio.NewReadWriter(bufio.NewReader(strings.NewReader(newClientServer)), bcmdbuf) fake.ReadWriter = bufio.NewReadWriter(bufio.NewReader(strings.NewReader(server)), bcmdbuf)
c, err := NewClient(fake, "fake.host") c, err := NewClient(fake, "fake.host")
if err != nil { if err != nil {
t.Fatalf("NewClient: %v\n(after %v)", err, out()) t.Fatalf("NewClient: %v\n(after %v)", err, out())
...@@ -214,8 +214,8 @@ func TestNewClient(t *testing.T) { ...@@ -214,8 +214,8 @@ func TestNewClient(t *testing.T) {
} }
actualcmds := out() actualcmds := out()
if newClientClient != actualcmds { if client != actualcmds {
t.Fatalf("Got:\n%s\nExpected:\n%s", actualcmds, newClientClient) t.Fatalf("Got:\n%s\nExpected:\n%s", actualcmds, client)
} }
} }
...@@ -232,13 +232,13 @@ QUIT ...@@ -232,13 +232,13 @@ QUIT
` `
func TestNewClient2(t *testing.T) { func TestNewClient2(t *testing.T) {
newClient2Server = strings.Join(strings.Split(newClient2Server, "\n"), "\r\n") server := strings.Join(strings.Split(newClient2Server, "\n"), "\r\n")
newClient2Client = strings.Join(strings.Split(newClient2Client, "\n"), "\r\n") client := strings.Join(strings.Split(newClient2Client, "\n"), "\r\n")
var cmdbuf bytes.Buffer var cmdbuf bytes.Buffer
bcmdbuf := bufio.NewWriter(&cmdbuf) bcmdbuf := bufio.NewWriter(&cmdbuf)
var fake faker var fake faker
fake.ReadWriter = bufio.NewReadWriter(bufio.NewReader(strings.NewReader(newClient2Server)), bcmdbuf) fake.ReadWriter = bufio.NewReadWriter(bufio.NewReader(strings.NewReader(server)), bcmdbuf)
c, err := NewClient(fake, "fake.host") c, err := NewClient(fake, "fake.host")
if err != nil { if err != nil {
t.Fatalf("NewClient: %v", err) t.Fatalf("NewClient: %v", err)
...@@ -252,8 +252,8 @@ func TestNewClient2(t *testing.T) { ...@@ -252,8 +252,8 @@ func TestNewClient2(t *testing.T) {
bcmdbuf.Flush() bcmdbuf.Flush()
actualcmds := cmdbuf.String() actualcmds := cmdbuf.String()
if newClient2Client != actualcmds { if client != actualcmds {
t.Fatalf("Got:\n%s\nExpected:\n%s", actualcmds, newClient2Client) t.Fatalf("Got:\n%s\nExpected:\n%s", actualcmds, client)
} }
} }
...@@ -385,38 +385,44 @@ func TestSendMail(t *testing.T) { ...@@ -385,38 +385,44 @@ func TestSendMail(t *testing.T) {
} }
defer l.Close() defer l.Close()
go func(l net.Listener, data []string, w *bufio.Writer) { // prevent data race on bcmdbuf
i := 0 var done = make(chan struct{})
go func(data []string) {
defer close(done)
conn, err := l.Accept() conn, err := l.Accept()
if err != nil { if err != nil {
t.Log("Accept error: %v", err) t.Errorf("Accept error: %v", err)
return return
} }
defer conn.Close() defer conn.Close()
tc := textproto.NewConn(conn) tc := textproto.NewConn(conn)
for i < len(data) && data[i] != "" { for i := 0; i < len(data) && data[i] != ""; i++ {
tc.PrintfLine(data[i]) tc.PrintfLine(data[i])
for len(data[i]) >= 4 && data[i][3] == '-' { for len(data[i]) >= 4 && data[i][3] == '-' {
i++ i++
tc.PrintfLine(data[i]) tc.PrintfLine(data[i])
} }
if data[i] == "221 Goodbye" {
return
}
read := false read := false
for !read || data[i] == "354 Go ahead" { for !read || data[i] == "354 Go ahead" {
msg, err := tc.ReadLine() msg, err := tc.ReadLine()
w.Write([]byte(msg + "\r\n")) bcmdbuf.Write([]byte(msg + "\r\n"))
read = true read = true
if err != nil { if err != nil {
t.Log("Read error: %v", err) t.Errorf("Read error: %v", err)
return return
} }
if data[i] == "354 Go ahead" && msg == "." { if data[i] == "354 Go ahead" && msg == "." {
break break
} }
} }
i++
} }
}(l, strings.Split(server, "\r\n"), bcmdbuf) }(strings.Split(server, "\r\n"))
err = SendMail(l.Addr().String(), nil, "test@example.com", []string{"other@example.com"}, []byte(strings.Replace(`From: test@example.com err = SendMail(l.Addr().String(), nil, "test@example.com", []string{"other@example.com"}, []byte(strings.Replace(`From: test@example.com
To: other@example.com To: other@example.com
...@@ -429,6 +435,7 @@ SendMail is working for me. ...@@ -429,6 +435,7 @@ SendMail is working for me.
t.Errorf("%v", err) t.Errorf("%v", err)
} }
<-done
bcmdbuf.Flush() bcmdbuf.Flush()
actualcmds := cmdbuf.String() actualcmds := cmdbuf.String()
if client != actualcmds { if client != actualcmds {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment