1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
| // Copyright 2012 The Go Authors. All rights reserved.
| // Use of this source code is governed by a BSD-style
| // license that can be found in the LICENSE file.
|
| package race_test
|
| import (
| "fmt"
| "io/ioutil"
| "net"
| "net/http"
| "os"
| "path/filepath"
| "sync"
| "testing"
| "time"
| )
|
| func TestNoRaceIOFile(t *testing.T) {
| x := 0
| path, _ := ioutil.TempDir("", "race_test")
| fname := filepath.Join(path, "data")
| go func() {
| x = 42
| f, _ := os.Create(fname)
| f.Write([]byte("done"))
| f.Close()
| }()
| for {
| f, err := os.Open(fname)
| if err != nil {
| time.Sleep(1e6)
| continue
| }
| buf := make([]byte, 100)
| count, err := f.Read(buf)
| if count == 0 {
| time.Sleep(1e6)
| continue
| }
| break
| }
| _ = x
| }
|
| var (
| regHandler sync.Once
| handlerData int
| )
|
| func TestNoRaceIOHttp(t *testing.T) {
| regHandler.Do(func() {
| http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
| handlerData++
| fmt.Fprintf(w, "test")
| handlerData++
| })
| })
| ln, err := net.Listen("tcp", "127.0.0.1:0")
| if err != nil {
| t.Fatalf("net.Listen: %v", err)
| }
| defer ln.Close()
| go http.Serve(ln, nil)
| handlerData++
| _, err = http.Get("http://" + ln.Addr().String())
| if err != nil {
| t.Fatalf("http.Get: %v", err)
| }
| handlerData++
| _, err = http.Get("http://" + ln.Addr().String())
| if err != nil {
| t.Fatalf("http.Get: %v", err)
| }
| handlerData++
| }
|
|