github.com/ader1990/go@v0.0.0-20140630135419-8c24447fa791/src/pkg/runtime/race/testdata/map_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  	"testing"
     9  )
    10  
    11  func TestRaceMapRW(t *testing.T) {
    12  	m := make(map[int]int)
    13  	ch := make(chan bool, 1)
    14  	go func() {
    15  		_ = m[1]
    16  		ch <- true
    17  	}()
    18  	m[1] = 1
    19  	<-ch
    20  }
    21  
    22  func TestRaceMapRW2(t *testing.T) {
    23  	m := make(map[int]int)
    24  	ch := make(chan bool, 1)
    25  	go func() {
    26  		_, _ = m[1]
    27  		ch <- true
    28  	}()
    29  	m[1] = 1
    30  	<-ch
    31  }
    32  
    33  func TestRaceMapRWArray(t *testing.T) {
    34  	// Check instrumentation of unaddressable arrays (issue 4578).
    35  	m := make(map[int][2]int)
    36  	ch := make(chan bool, 1)
    37  	go func() {
    38  		_ = m[1][1]
    39  		ch <- true
    40  	}()
    41  	m[2] = [2]int{1, 2}
    42  	<-ch
    43  }
    44  
    45  func TestNoRaceMapRR(t *testing.T) {
    46  	m := make(map[int]int)
    47  	ch := make(chan bool, 1)
    48  	go func() {
    49  		_, _ = m[1]
    50  		ch <- true
    51  	}()
    52  	_ = m[1]
    53  	<-ch
    54  }
    55  
    56  func TestRaceMapRange(t *testing.T) {
    57  	m := make(map[int]int)
    58  	ch := make(chan bool, 1)
    59  	go func() {
    60  		for _ = range m {
    61  		}
    62  		ch <- true
    63  	}()
    64  	m[1] = 1
    65  	<-ch
    66  }
    67  
    68  func TestRaceMapRange2(t *testing.T) {
    69  	m := make(map[int]int)
    70  	ch := make(chan bool, 1)
    71  	go func() {
    72  		for _ = range m {
    73  		}
    74  		ch <- true
    75  	}()
    76  	m[1] = 1
    77  	<-ch
    78  }
    79  
    80  func TestNoRaceMapRangeRange(t *testing.T) {
    81  	m := make(map[int]int)
    82  	// now the map is not empty and range triggers an event
    83  	// should work without this (as in other tests)
    84  	// so it is suspicious if this test passes and others don't
    85  	m[0] = 0
    86  	ch := make(chan bool, 1)
    87  	go func() {
    88  		for _ = range m {
    89  		}
    90  		ch <- true
    91  	}()
    92  	for _ = range m {
    93  	}
    94  	<-ch
    95  }
    96  
    97  func TestRaceMapLen(t *testing.T) {
    98  	m := make(map[string]bool)
    99  	ch := make(chan bool, 1)
   100  	go func() {
   101  		_ = len(m)
   102  		ch <- true
   103  	}()
   104  	m[""] = true
   105  	<-ch
   106  }
   107  
   108  func TestRaceMapDelete(t *testing.T) {
   109  	m := make(map[string]bool)
   110  	ch := make(chan bool, 1)
   111  	go func() {
   112  		delete(m, "")
   113  		ch <- true
   114  	}()
   115  	m[""] = true
   116  	<-ch
   117  }
   118  
   119  func TestRaceMapLenDelete(t *testing.T) {
   120  	m := make(map[string]bool)
   121  	ch := make(chan bool, 1)
   122  	go func() {
   123  		delete(m, "a")
   124  		ch <- true
   125  	}()
   126  	_ = len(m)
   127  	<-ch
   128  }
   129  
   130  func TestRaceMapVariable(t *testing.T) {
   131  	ch := make(chan bool, 1)
   132  	m := make(map[int]int)
   133  	go func() {
   134  		m = make(map[int]int)
   135  		ch <- true
   136  	}()
   137  	m = make(map[int]int)
   138  	<-ch
   139  }
   140  
   141  func TestRaceMapVariable2(t *testing.T) {
   142  	ch := make(chan bool, 1)
   143  	m := make(map[int]int)
   144  	go func() {
   145  		m[1] = 1
   146  		ch <- true
   147  	}()
   148  	m = make(map[int]int)
   149  	<-ch
   150  }
   151  
   152  func TestRaceMapVariable3(t *testing.T) {
   153  	ch := make(chan bool, 1)
   154  	m := make(map[int]int)
   155  	go func() {
   156  		_ = m[1]
   157  		ch <- true
   158  	}()
   159  	m = make(map[int]int)
   160  	<-ch
   161  }
   162  
   163  type Big struct {
   164  	x [17]int32
   165  }
   166  
   167  func TestRaceMapLookupPartKey(t *testing.T) {
   168  	k := &Big{}
   169  	m := make(map[Big]bool)
   170  	ch := make(chan bool, 1)
   171  	go func() {
   172  		k.x[8] = 1
   173  		ch <- true
   174  	}()
   175  	_ = m[*k]
   176  	<-ch
   177  }
   178  
   179  func TestRaceMapLookupPartKey2(t *testing.T) {
   180  	k := &Big{}
   181  	m := make(map[Big]bool)
   182  	ch := make(chan bool, 1)
   183  	go func() {
   184  		k.x[8] = 1
   185  		ch <- true
   186  	}()
   187  	_, _ = m[*k]
   188  	<-ch
   189  }
   190  func TestRaceMapDeletePartKey(t *testing.T) {
   191  	k := &Big{}
   192  	m := make(map[Big]bool)
   193  	ch := make(chan bool, 1)
   194  	go func() {
   195  		k.x[8] = 1
   196  		ch <- true
   197  	}()
   198  	delete(m, *k)
   199  	<-ch
   200  }
   201  
   202  func TestRaceMapInsertPartKey(t *testing.T) {
   203  	k := &Big{}
   204  	m := make(map[Big]bool)
   205  	ch := make(chan bool, 1)
   206  	go func() {
   207  		k.x[8] = 1
   208  		ch <- true
   209  	}()
   210  	m[*k] = true
   211  	<-ch
   212  }
   213  
   214  func TestRaceMapInsertPartVal(t *testing.T) {
   215  	v := &Big{}
   216  	m := make(map[int]Big)
   217  	ch := make(chan bool, 1)
   218  	go func() {
   219  		v.x[8] = 1
   220  		ch <- true
   221  	}()
   222  	m[1] = *v
   223  	<-ch
   224  }
   225  
   226  // Test for issue 7561.
   227  func TestRaceMapAssignMultipleReturn(t *testing.T) {
   228  	connect := func() (int, error) { return 42, nil }
   229  	conns := make(map[int][]int)
   230  	conns[1] = []int{0}
   231  	ch := make(chan bool, 1)
   232  	var err error
   233  	go func() {
   234  		conns[1][0], err = connect()
   235  		ch <- true
   236  	}()
   237  	x := conns[1][0]
   238  	_ = x
   239  	<-ch
   240  }