Home | History | Annotate | Download | only in testdata
      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 }
    241 
    242 // BigKey and BigVal must be larger than 256 bytes,
    243 // so that compiler sets KindGCProg for them.
    244 type BigKey [1000]*int
    245 
    246 type BigVal struct {
    247 	x int
    248 	y [1000]*int
    249 }
    250 
    251 func TestRaceMapBigKeyAccess1(t *testing.T) {
    252 	m := make(map[BigKey]int)
    253 	var k BigKey
    254 	ch := make(chan bool, 1)
    255 	go func() {
    256 		_ = m[k]
    257 		ch <- true
    258 	}()
    259 	k[30] = new(int)
    260 	<-ch
    261 }
    262 
    263 func TestRaceMapBigKeyAccess2(t *testing.T) {
    264 	m := make(map[BigKey]int)
    265 	var k BigKey
    266 	ch := make(chan bool, 1)
    267 	go func() {
    268 		_, _ = m[k]
    269 		ch <- true
    270 	}()
    271 	k[30] = new(int)
    272 	<-ch
    273 }
    274 
    275 func TestRaceMapBigKeyInsert(t *testing.T) {
    276 	m := make(map[BigKey]int)
    277 	var k BigKey
    278 	ch := make(chan bool, 1)
    279 	go func() {
    280 		m[k] = 1
    281 		ch <- true
    282 	}()
    283 	k[30] = new(int)
    284 	<-ch
    285 }
    286 
    287 func TestRaceMapBigKeyDelete(t *testing.T) {
    288 	m := make(map[BigKey]int)
    289 	var k BigKey
    290 	ch := make(chan bool, 1)
    291 	go func() {
    292 		delete(m, k)
    293 		ch <- true
    294 	}()
    295 	k[30] = new(int)
    296 	<-ch
    297 }
    298 
    299 func TestRaceMapBigValInsert(t *testing.T) {
    300 	m := make(map[int]BigVal)
    301 	var v BigVal
    302 	ch := make(chan bool, 1)
    303 	go func() {
    304 		m[1] = v
    305 		ch <- true
    306 	}()
    307 	v.y[30] = new(int)
    308 	<-ch
    309 }
    310 
    311 func TestRaceMapBigValAccess1(t *testing.T) {
    312 	m := make(map[int]BigVal)
    313 	var v BigVal
    314 	ch := make(chan bool, 1)
    315 	go func() {
    316 		v = m[1]
    317 		ch <- true
    318 	}()
    319 	v.y[30] = new(int)
    320 	<-ch
    321 }
    322 
    323 func TestRaceMapBigValAccess2(t *testing.T) {
    324 	m := make(map[int]BigVal)
    325 	var v BigVal
    326 	ch := make(chan bool, 1)
    327 	go func() {
    328 		v, _ = m[1]
    329 		ch <- true
    330 	}()
    331 	v.y[30] = new(int)
    332 	<-ch
    333 }
    334