Reviewers: bradfitz, dvyukov,
Message:
Hello bradfitz, dvyukov@google.com (cc: golang-dev@googlegroups.com),
I'd like you to review this change to
https://code.google.com/p/go
Description:
os/exec: add test that fails under race detector.
This seems like legitimate code to me, and naturally occurs
if you wrap an *exec.Cmd in something that watches the output.
I don't know the correct way to solve this race, if it is indeed valid.
Please review this at http://codereview.appspot.com/6821099/
Affected files:
M src/pkg/os/exec/exec_test.go
Index: src/pkg/os/exec/exec_test.go
===================================================================
--- a/src/pkg/os/exec/exec_test.go
+++ b/src/pkg/os/exec/exec_test.go
@@ -265,6 +265,44 @@
}
}
+func TestConcurrentReadWait(t *testing.T) {
+ // Test that it is safe to concurrently read stdout and wait for a
process to finish.
+ cmd := helperCommand("echo", "foo")
+ out, err := cmd.StdoutPipe()
+ if err != nil {
+ t.Fatalf("cmd.StdoutPipe: %v", err)
+ }
+
+ rd := make(chan string)
+ go func() {
+ r := bufio.NewReader(out)
+ var s string
+ for {
+ line, _, err := r.ReadLine()
+ if err != nil {
+ if err != io.EOF {
+ t.Errorf("ReadLine: %v", err)
+ }
+ break
+ }
+ s += string(line)
+ }
+ rd <- s
+ }()
+
+ if err := cmd.Start(); err != nil {
+ t.Fatalf("cmd.Start: %v", err)
+ }
+ if err := cmd.Wait(); err != nil {
+ t.Fatalf("cmd.Wait: %v", err)
+ }
+ s := <-rd
+
+ if s != "foo" {
+ t.Errorf(`Command output was %q, want "foo"`, s)
+ }
+}
+
// TestHelperProcess isn't a real test. It's used as a helper process
// for TestParameterRun.
func TestHelperProcess(*testing.T) {