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 }