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