Home | History | Annotate | Download | only in race
      1 // Copyright 2015 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 // +build race
      6 
      7 package race_test
      8 
      9 import (
     10 	"bytes"
     11 	"fmt"
     12 	"reflect"
     13 	"runtime"
     14 	"testing"
     15 )
     16 
     17 func TestRandomScheduling(t *testing.T) {
     18 	// Scheduler is most consistent with GOMAXPROCS=1.
     19 	// Use that to make the test most likely to fail.
     20 	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(1))
     21 	const N = 10
     22 	out := make([][]int, N)
     23 	for i := 0; i < N; i++ {
     24 		c := make(chan int, N)
     25 		for j := 0; j < N; j++ {
     26 			go func(j int) {
     27 				c <- j
     28 			}(j)
     29 		}
     30 		row := make([]int, N)
     31 		for j := 0; j < N; j++ {
     32 			row[j] = <-c
     33 		}
     34 		out[i] = row
     35 	}
     36 
     37 	for i := 0; i < N; i++ {
     38 		if !reflect.DeepEqual(out[0], out[i]) {
     39 			return // found a different order
     40 		}
     41 	}
     42 
     43 	var buf bytes.Buffer
     44 	for i := 0; i < N; i++ {
     45 		fmt.Fprintf(&buf, "%v\n", out[i])
     46 	}
     47 	t.Fatalf("consistent goroutine execution order:\n%v", buf.String())
     48 }
     49