github.com/hbdrawn/golang@v0.0.0-20141214014649-6b835209aba2/src/runtime/race/testdata/slice_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 TestRaceSliceRW(t *testing.T) {
    12  	ch := make(chan bool, 1)
    13  	a := make([]int, 2)
    14  	go func() {
    15  		a[1] = 1
    16  		ch <- true
    17  	}()
    18  	_ = a[1]
    19  	<-ch
    20  }
    21  
    22  func TestNoRaceSliceRW(t *testing.T) {
    23  	ch := make(chan bool, 1)
    24  	a := make([]int, 2)
    25  	go func() {
    26  		a[0] = 1
    27  		ch <- true
    28  	}()
    29  	_ = a[1]
    30  	<-ch
    31  }
    32  
    33  func TestRaceSliceWW(t *testing.T) {
    34  	a := make([]int, 10)
    35  	ch := make(chan bool, 1)
    36  	go func() {
    37  		a[1] = 1
    38  		ch <- true
    39  	}()
    40  	a[1] = 2
    41  	<-ch
    42  }
    43  
    44  func TestNoRaceArrayWW(t *testing.T) {
    45  	var a [5]int
    46  	ch := make(chan bool, 1)
    47  	go func() {
    48  		a[0] = 1
    49  		ch <- true
    50  	}()
    51  	a[1] = 2
    52  	<-ch
    53  }
    54  
    55  func TestRaceArrayWW(t *testing.T) {
    56  	var a [5]int
    57  	ch := make(chan bool, 1)
    58  	go func() {
    59  		a[1] = 1
    60  		ch <- true
    61  	}()
    62  	a[1] = 2
    63  	<-ch
    64  }
    65  
    66  func TestNoRaceSliceWriteLen(t *testing.T) {
    67  	ch := make(chan bool, 1)
    68  	a := make([]bool, 1)
    69  	go func() {
    70  		a[0] = true
    71  		ch <- true
    72  	}()
    73  	_ = len(a)
    74  	<-ch
    75  }
    76  
    77  func TestNoRaceSliceWriteCap(t *testing.T) {
    78  	ch := make(chan bool, 1)
    79  	a := make([]uint64, 100)
    80  	go func() {
    81  		a[50] = 123
    82  		ch <- true
    83  	}()
    84  	_ = cap(a)
    85  	<-ch
    86  }
    87  
    88  func TestRaceSliceCopyRead(t *testing.T) {
    89  	ch := make(chan bool, 1)
    90  	a := make([]int, 10)
    91  	b := make([]int, 10)
    92  	go func() {
    93  		_ = a[5]
    94  		ch <- true
    95  	}()
    96  	copy(a, b)
    97  	<-ch
    98  }
    99  
   100  func TestNoRaceSliceWriteCopy(t *testing.T) {
   101  	ch := make(chan bool, 1)
   102  	a := make([]int, 10)
   103  	b := make([]int, 10)
   104  	go func() {
   105  		a[5] = 1
   106  		ch <- true
   107  	}()
   108  	copy(a[:5], b[:5])
   109  	<-ch
   110  }
   111  
   112  func TestRaceSliceCopyWrite2(t *testing.T) {
   113  	ch := make(chan bool, 1)
   114  	a := make([]int, 10)
   115  	b := make([]int, 10)
   116  	go func() {
   117  		b[5] = 1
   118  		ch <- true
   119  	}()
   120  	copy(a, b)
   121  	<-ch
   122  }
   123  
   124  func TestRaceSliceCopyWrite3(t *testing.T) {
   125  	ch := make(chan bool, 1)
   126  	a := make([]byte, 10)
   127  	go func() {
   128  		a[7] = 1
   129  		ch <- true
   130  	}()
   131  	copy(a, "qwertyqwerty")
   132  	<-ch
   133  }
   134  
   135  func TestNoRaceSliceCopyRead(t *testing.T) {
   136  	ch := make(chan bool, 1)
   137  	a := make([]int, 10)
   138  	b := make([]int, 10)
   139  	go func() {
   140  		_ = b[5]
   141  		ch <- true
   142  	}()
   143  	copy(a, b)
   144  	<-ch
   145  }
   146  
   147  func TestNoRaceSliceWriteSlice2(t *testing.T) {
   148  	ch := make(chan bool, 1)
   149  	a := make([]float64, 10)
   150  	go func() {
   151  		a[2] = 1.0
   152  		ch <- true
   153  	}()
   154  	_ = a[0:5]
   155  	<-ch
   156  }
   157  
   158  func TestRaceSliceWriteSlice(t *testing.T) {
   159  	ch := make(chan bool, 1)
   160  	a := make([]float64, 10)
   161  	go func() {
   162  		a[2] = 1.0
   163  		ch <- true
   164  	}()
   165  	a = a[5:10]
   166  	<-ch
   167  }
   168  
   169  func TestNoRaceSliceWriteSlice(t *testing.T) {
   170  	ch := make(chan bool, 1)
   171  	a := make([]float64, 10)
   172  	go func() {
   173  		a[2] = 1.0
   174  		ch <- true
   175  	}()
   176  	_ = a[5:10]
   177  	<-ch
   178  }
   179  
   180  func TestNoRaceSliceLenCap(t *testing.T) {
   181  	ch := make(chan bool, 1)
   182  	a := make([]struct{}, 10)
   183  	go func() {
   184  		_ = len(a)
   185  		ch <- true
   186  	}()
   187  	_ = cap(a)
   188  	<-ch
   189  }
   190  
   191  func TestNoRaceStructSlicesRangeWrite(t *testing.T) {
   192  	type Str struct {
   193  		a []int
   194  		b []int
   195  	}
   196  	ch := make(chan bool, 1)
   197  	var s Str
   198  	s.a = make([]int, 10)
   199  	s.b = make([]int, 10)
   200  	go func() {
   201  		for range s.a {
   202  		}
   203  		ch <- true
   204  	}()
   205  	s.b[5] = 5
   206  	<-ch
   207  }
   208  
   209  func TestRaceSliceDifferent(t *testing.T) {
   210  	c := make(chan bool, 1)
   211  	s := make([]int, 10)
   212  	s2 := s
   213  	go func() {
   214  		s[3] = 3
   215  		c <- true
   216  	}()
   217  	// false negative because s2 is PAUTO w/o PHEAP
   218  	// so we do not instrument it
   219  	s2[3] = 3
   220  	<-c
   221  }
   222  
   223  func TestRaceSliceRangeWrite(t *testing.T) {
   224  	c := make(chan bool, 1)
   225  	s := make([]int, 10)
   226  	go func() {
   227  		s[3] = 3
   228  		c <- true
   229  	}()
   230  	for _, v := range s {
   231  		_ = v
   232  	}
   233  	<-c
   234  }
   235  
   236  func TestNoRaceSliceRangeWrite(t *testing.T) {
   237  	c := make(chan bool, 1)
   238  	s := make([]int, 10)
   239  	go func() {
   240  		s[3] = 3
   241  		c <- true
   242  	}()
   243  	for range s {
   244  	}
   245  	<-c
   246  }
   247  
   248  func TestRaceSliceRangeAppend(t *testing.T) {
   249  	c := make(chan bool, 1)
   250  	s := make([]int, 10)
   251  	go func() {
   252  		s = append(s, 3)
   253  		c <- true
   254  	}()
   255  	for range s {
   256  	}
   257  	<-c
   258  }
   259  
   260  func TestNoRaceSliceRangeAppend(t *testing.T) {
   261  	c := make(chan bool, 1)
   262  	s := make([]int, 10)
   263  	go func() {
   264  		_ = append(s, 3)
   265  		c <- true
   266  	}()
   267  	for range s {
   268  	}
   269  	<-c
   270  }
   271  
   272  func TestRaceSliceVarWrite(t *testing.T) {
   273  	c := make(chan bool, 1)
   274  	s := make([]int, 10)
   275  	go func() {
   276  		s[3] = 3
   277  		c <- true
   278  	}()
   279  	s = make([]int, 20)
   280  	<-c
   281  }
   282  
   283  func TestRaceSliceVarRead(t *testing.T) {
   284  	c := make(chan bool, 1)
   285  	s := make([]int, 10)
   286  	go func() {
   287  		_ = s[3]
   288  		c <- true
   289  	}()
   290  	s = make([]int, 20)
   291  	<-c
   292  }
   293  
   294  func TestRaceSliceVarRange(t *testing.T) {
   295  	c := make(chan bool, 1)
   296  	s := make([]int, 10)
   297  	go func() {
   298  		for range s {
   299  		}
   300  		c <- true
   301  	}()
   302  	s = make([]int, 20)
   303  	<-c
   304  }
   305  
   306  func TestRaceSliceVarAppend(t *testing.T) {
   307  	c := make(chan bool, 1)
   308  	s := make([]int, 10)
   309  	go func() {
   310  		_ = append(s, 10)
   311  		c <- true
   312  	}()
   313  	s = make([]int, 20)
   314  	<-c
   315  }
   316  
   317  func TestRaceSliceVarCopy(t *testing.T) {
   318  	c := make(chan bool, 1)
   319  	s := make([]int, 10)
   320  	go func() {
   321  		s2 := make([]int, 10)
   322  		copy(s, s2)
   323  		c <- true
   324  	}()
   325  	s = make([]int, 20)
   326  	<-c
   327  }
   328  
   329  func TestRaceSliceVarCopy2(t *testing.T) {
   330  	c := make(chan bool, 1)
   331  	s := make([]int, 10)
   332  	go func() {
   333  		s2 := make([]int, 10)
   334  		copy(s2, s)
   335  		c <- true
   336  	}()
   337  	s = make([]int, 20)
   338  	<-c
   339  }
   340  
   341  func TestRaceSliceAppend(t *testing.T) {
   342  	c := make(chan bool, 1)
   343  	s := make([]int, 10, 20)
   344  	go func() {
   345  		_ = append(s, 1)
   346  		c <- true
   347  	}()
   348  	_ = append(s, 2)
   349  	<-c
   350  }
   351  
   352  func TestRaceSliceAppendWrite(t *testing.T) {
   353  	c := make(chan bool, 1)
   354  	s := make([]int, 10)
   355  	go func() {
   356  		_ = append(s, 1)
   357  		c <- true
   358  	}()
   359  	s[0] = 42
   360  	<-c
   361  }
   362  
   363  func TestRaceSliceAppendSlice(t *testing.T) {
   364  	c := make(chan bool, 1)
   365  	s := make([]int, 10)
   366  	go func() {
   367  		s2 := make([]int, 10)
   368  		_ = append(s, s2...)
   369  		c <- true
   370  	}()
   371  	s[0] = 42
   372  	<-c
   373  }
   374  
   375  func TestRaceSliceAppendSlice2(t *testing.T) {
   376  	c := make(chan bool, 1)
   377  	s := make([]int, 10)
   378  	s2foobar := make([]int, 10)
   379  	go func() {
   380  		_ = append(s, s2foobar...)
   381  		c <- true
   382  	}()
   383  	s2foobar[5] = 42
   384  	<-c
   385  }
   386  
   387  func TestRaceSliceAppendString(t *testing.T) {
   388  	c := make(chan bool, 1)
   389  	s := make([]byte, 10)
   390  	go func() {
   391  		_ = append(s, "qwerty"...)
   392  		c <- true
   393  	}()
   394  	s[0] = 42
   395  	<-c
   396  }
   397  
   398  func TestNoRaceSliceIndexAccess(t *testing.T) {
   399  	c := make(chan bool, 1)
   400  	s := make([]int, 10)
   401  	v := 0
   402  	go func() {
   403  		_ = v
   404  		c <- true
   405  	}()
   406  	s[v] = 1
   407  	<-c
   408  }
   409  
   410  func TestNoRaceSliceIndexAccess2(t *testing.T) {
   411  	c := make(chan bool, 1)
   412  	s := make([]int, 10)
   413  	v := 0
   414  	go func() {
   415  		_ = v
   416  		c <- true
   417  	}()
   418  	_ = s[v]
   419  	<-c
   420  }
   421  
   422  func TestRaceSliceIndexAccess(t *testing.T) {
   423  	c := make(chan bool, 1)
   424  	s := make([]int, 10)
   425  	v := 0
   426  	go func() {
   427  		v = 1
   428  		c <- true
   429  	}()
   430  	s[v] = 1
   431  	<-c
   432  }
   433  
   434  func TestRaceSliceIndexAccess2(t *testing.T) {
   435  	c := make(chan bool, 1)
   436  	s := make([]int, 10)
   437  	v := 0
   438  	go func() {
   439  		v = 1
   440  		c <- true
   441  	}()
   442  	_ = s[v]
   443  	<-c
   444  }
   445  
   446  func TestRaceSliceByteToString(t *testing.T) {
   447  	c := make(chan string)
   448  	s := make([]byte, 10)
   449  	go func() {
   450  		c <- string(s)
   451  	}()
   452  	s[0] = 42
   453  	<-c
   454  }
   455  
   456  func TestRaceSliceRuneToString(t *testing.T) {
   457  	c := make(chan string)
   458  	s := make([]rune, 10)
   459  	go func() {
   460  		c <- string(s)
   461  	}()
   462  	s[9] = 42
   463  	<-c
   464  }
   465  
   466  func TestRaceConcatString(t *testing.T) {
   467  	s := "hello"
   468  	c := make(chan string, 1)
   469  	go func() {
   470  		c <- s + " world"
   471  	}()
   472  	s = "world"
   473  	<-c
   474  }
   475  
   476  func TestRaceCompareString(t *testing.T) {
   477  	s1 := "hello"
   478  	s2 := "world"
   479  	c := make(chan bool, 1)
   480  	go func() {
   481  		c <- s1 == s2
   482  	}()
   483  	s1 = s2
   484  	<-c
   485  }