1
2
3
4
5 package sanitizers_test
6
7 import (
8 "strings"
9 "testing"
10 )
11
12 func TestTSAN(t *testing.T) {
13 t.Parallel()
14 requireOvercommit(t)
15 config := configure("thread")
16 config.skipIfCSanitizerBroken(t)
17
18 mustRun(t, config.goCmd("build", "std"))
19
20 cases := []struct {
21 src string
22 needsRuntime bool
23 }{
24 {src: "tsan.go"},
25 {src: "tsan2.go"},
26 {src: "tsan3.go"},
27 {src: "tsan4.go"},
28 {src: "tsan5.go", needsRuntime: true},
29 {src: "tsan6.go", needsRuntime: true},
30 {src: "tsan7.go", needsRuntime: true},
31 {src: "tsan8.go"},
32 {src: "tsan9.go"},
33 {src: "tsan10.go", needsRuntime: true},
34 {src: "tsan11.go", needsRuntime: true},
35 {src: "tsan12.go", needsRuntime: true},
36 }
37 for _, tc := range cases {
38 tc := tc
39 name := strings.TrimSuffix(tc.src, ".go")
40 t.Run(name, func(t *testing.T) {
41 t.Parallel()
42
43 dir := newTempDir(t)
44 defer dir.RemoveAll(t)
45
46 outPath := dir.Join(name)
47 mustRun(t, config.goCmd("build", "-o", outPath, srcPath(tc.src)))
48
49 cmd := hangProneCmd(outPath)
50 if tc.needsRuntime {
51 config.skipIfRuntimeIncompatible(t)
52 }
53 mustRun(t, cmd)
54 })
55 }
56 }
57
View as plain text