github.com/likebike/go--@v0.0.0-20190911215757-0bd925d16e96/go/src/runtime/race/testdata/io_test.go (about)

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