Alex Brainman | afe0e97 | 2012-05-30 15:10:54 +1000 | [diff] [blame] | 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 | // +build cgo |
| 6 | |
| 7 | package runtime_test |
| 8 | |
| 9 | import ( |
Ian Lance Taylor | 84e8080 | 2016-04-29 15:20:27 -0700 | [diff] [blame] | 10 | "bytes" |
Ian Lance Taylor | 8d94b9b | 2016-02-25 21:16:45 -0800 | [diff] [blame] | 11 | "fmt" |
Ian Lance Taylor | c8e7b34 | 2016-02-18 11:04:05 -0800 | [diff] [blame] | 12 | "internal/testenv" |
Mohit Agarwal | 4d6788e | 2016-05-05 00:04:54 +0530 | [diff] [blame] | 13 | "os" |
Shenghou Ma | 865e5e9 | 2015-01-03 00:12:34 -0500 | [diff] [blame] | 14 | "os/exec" |
Dmitriy Vyukov | 1590abe | 2013-08-08 00:04:28 +0400 | [diff] [blame] | 15 | "runtime" |
Russ Cox | c4efaac | 2014-10-28 21:53:09 -0400 | [diff] [blame] | 16 | "strings" |
Alex Brainman | afe0e97 | 2012-05-30 15:10:54 +1000 | [diff] [blame] | 17 | "testing" |
Ian Lance Taylor | c8e7b34 | 2016-02-18 11:04:05 -0800 | [diff] [blame] | 18 | "time" |
Alex Brainman | afe0e97 | 2012-05-30 15:10:54 +1000 | [diff] [blame] | 19 | ) |
| 20 | |
| 21 | func TestCgoCrashHandler(t *testing.T) { |
Brad Fitzpatrick | 2341631 | 2016-11-04 05:28:01 +0000 | [diff] [blame] | 22 | t.Parallel() |
Dmitriy Vyukov | 06a488f | 2013-02-20 12:15:02 +0400 | [diff] [blame] | 23 | testCrashHandler(t, true) |
Alex Brainman | afe0e97 | 2012-05-30 15:10:54 +1000 | [diff] [blame] | 24 | } |
Shenghou Ma | 6ecb39f | 2013-02-28 16:07:26 +0800 | [diff] [blame] | 25 | |
| 26 | func TestCgoSignalDeadlock(t *testing.T) { |
Ian Lance Taylor | 7e17250 | 2017-07-12 20:51:15 -0700 | [diff] [blame^] | 27 | // Don't call t.Parallel, since too much work going on at the |
| 28 | // same time can cause the testprogcgo code to overrun its |
| 29 | // timeouts (issue #18598). |
| 30 | |
Dmitriy Vyukov | 1590abe | 2013-08-08 00:04:28 +0400 | [diff] [blame] | 31 | if testing.Short() && runtime.GOOS == "windows" { |
| 32 | t.Skip("Skipping in short mode") // takes up to 64 seconds |
| 33 | } |
Russ Cox | 8d5ff2e | 2015-12-21 10:29:21 -0500 | [diff] [blame] | 34 | got := runTestProg(t, "testprogcgo", "CgoSignalDeadlock") |
Shenghou Ma | 6ecb39f | 2013-02-28 16:07:26 +0800 | [diff] [blame] | 35 | want := "OK\n" |
| 36 | if got != want { |
Russ Cox | 8d5ff2e | 2015-12-21 10:29:21 -0500 | [diff] [blame] | 37 | t.Fatalf("expected %q, but got:\n%s", want, got) |
Shenghou Ma | 6ecb39f | 2013-02-28 16:07:26 +0800 | [diff] [blame] | 38 | } |
| 39 | } |
| 40 | |
Dmitriy Vyukov | 326ae8d | 2013-08-08 00:31:52 +0400 | [diff] [blame] | 41 | func TestCgoTraceback(t *testing.T) { |
Brad Fitzpatrick | 2341631 | 2016-11-04 05:28:01 +0000 | [diff] [blame] | 42 | t.Parallel() |
Russ Cox | 8d5ff2e | 2015-12-21 10:29:21 -0500 | [diff] [blame] | 43 | got := runTestProg(t, "testprogcgo", "CgoTraceback") |
Dmitriy Vyukov | 326ae8d | 2013-08-08 00:31:52 +0400 | [diff] [blame] | 44 | want := "OK\n" |
| 45 | if got != want { |
Russ Cox | 8d5ff2e | 2015-12-21 10:29:21 -0500 | [diff] [blame] | 46 | t.Fatalf("expected %q, but got:\n%s", want, got) |
Dmitriy Vyukov | 326ae8d | 2013-08-08 00:31:52 +0400 | [diff] [blame] | 47 | } |
| 48 | } |
| 49 | |
Russ Cox | fde3926 | 2015-07-29 16:16:13 -0400 | [diff] [blame] | 50 | func TestCgoCallbackGC(t *testing.T) { |
Brad Fitzpatrick | 2341631 | 2016-11-04 05:28:01 +0000 | [diff] [blame] | 51 | t.Parallel() |
Josh Bleecher Snyder | 604efe1 | 2016-08-17 16:22:24 -0700 | [diff] [blame] | 52 | switch runtime.GOOS { |
| 53 | case "plan9", "windows": |
Russ Cox | fde3926 | 2015-07-29 16:16:13 -0400 | [diff] [blame] | 54 | t.Skipf("no pthreads on %s", runtime.GOOS) |
| 55 | } |
Dave Cheney | 9840042 | 2015-09-11 10:15:17 +1000 | [diff] [blame] | 56 | if testing.Short() { |
| 57 | switch { |
| 58 | case runtime.GOOS == "dragonfly": |
| 59 | t.Skip("see golang.org/issue/11990") |
| 60 | case runtime.GOOS == "linux" && runtime.GOARCH == "arm": |
| 61 | t.Skip("too slow for arm builders") |
Cherry Zhang | bcd4b84 | 2016-05-04 22:07:50 -0700 | [diff] [blame] | 62 | case runtime.GOOS == "linux" && (runtime.GOARCH == "mips64" || runtime.GOARCH == "mips64le"): |
| 63 | t.Skip("too slow for mips64x builders") |
Dave Cheney | 9840042 | 2015-09-11 10:15:17 +1000 | [diff] [blame] | 64 | } |
Mikio Hara | 5e15e28 | 2015-08-03 12:43:25 +0900 | [diff] [blame] | 65 | } |
Russ Cox | 8d5ff2e | 2015-12-21 10:29:21 -0500 | [diff] [blame] | 66 | got := runTestProg(t, "testprogcgo", "CgoCallbackGC") |
Russ Cox | fde3926 | 2015-07-29 16:16:13 -0400 | [diff] [blame] | 67 | want := "OK\n" |
| 68 | if got != want { |
Russ Cox | 8d5ff2e | 2015-12-21 10:29:21 -0500 | [diff] [blame] | 69 | t.Fatalf("expected %q, but got:\n%s", want, got) |
Russ Cox | fde3926 | 2015-07-29 16:16:13 -0400 | [diff] [blame] | 70 | } |
| 71 | } |
| 72 | |
Russ Cox | c4efaac | 2014-10-28 21:53:09 -0400 | [diff] [blame] | 73 | func TestCgoExternalThreadPanic(t *testing.T) { |
Brad Fitzpatrick | 2341631 | 2016-11-04 05:28:01 +0000 | [diff] [blame] | 74 | t.Parallel() |
Alex Brainman | f9c4c16 | 2014-10-30 10:24:37 +1100 | [diff] [blame] | 75 | if runtime.GOOS == "plan9" { |
Russ Cox | 3ce6a4f | 2014-10-29 00:02:29 -0400 | [diff] [blame] | 76 | t.Skipf("no pthreads on %s", runtime.GOOS) |
| 77 | } |
Russ Cox | 8d5ff2e | 2015-12-21 10:29:21 -0500 | [diff] [blame] | 78 | got := runTestProg(t, "testprogcgo", "CgoExternalThreadPanic") |
Russ Cox | c4efaac | 2014-10-28 21:53:09 -0400 | [diff] [blame] | 79 | want := "panic: BOOM" |
| 80 | if !strings.Contains(got, want) { |
| 81 | t.Fatalf("want failure containing %q. output:\n%s\n", want, got) |
| 82 | } |
| 83 | } |
| 84 | |
Shenghou Ma | 5da9c8c | 2014-12-27 19:15:38 -0500 | [diff] [blame] | 85 | func TestCgoExternalThreadSIGPROF(t *testing.T) { |
Brad Fitzpatrick | 2341631 | 2016-11-04 05:28:01 +0000 | [diff] [blame] | 86 | t.Parallel() |
Shenghou Ma | 5da9c8c | 2014-12-27 19:15:38 -0500 | [diff] [blame] | 87 | // issue 9456. |
Shenghou Ma | 2cbe27a | 2015-01-01 01:10:39 -0500 | [diff] [blame] | 88 | switch runtime.GOOS { |
| 89 | case "plan9", "windows": |
Shenghou Ma | 5da9c8c | 2014-12-27 19:15:38 -0500 | [diff] [blame] | 90 | t.Skipf("no pthreads on %s", runtime.GOOS) |
Shenghou Ma | 2cbe27a | 2015-01-01 01:10:39 -0500 | [diff] [blame] | 91 | case "darwin": |
David Crawshaw | d6d423b | 2015-04-11 19:00:53 -0400 | [diff] [blame] | 92 | if runtime.GOARCH != "arm" && runtime.GOARCH != "arm64" { |
David Crawshaw | 95bf77b | 2015-02-26 18:05:47 -0500 | [diff] [blame] | 93 | // static constructor needs external linking, but we don't support |
| 94 | // external linking on OS X 10.6. |
| 95 | out, err := exec.Command("uname", "-r").Output() |
| 96 | if err != nil { |
| 97 | t.Fatalf("uname -r failed: %v", err) |
| 98 | } |
| 99 | // OS X 10.6 == Darwin 10.x |
| 100 | if strings.HasPrefix(string(out), "10.") { |
| 101 | t.Skipf("no external linking on OS X 10.6") |
| 102 | } |
Shenghou Ma | 2cbe27a | 2015-01-01 01:10:39 -0500 | [diff] [blame] | 103 | } |
Shenghou Ma | 5da9c8c | 2014-12-27 19:15:38 -0500 | [diff] [blame] | 104 | } |
Michael Hudson-Doyle | 58db5fc | 2015-11-12 13:05:49 +1300 | [diff] [blame] | 105 | if runtime.GOARCH == "ppc64" { |
Austin Clements | af7ca8d | 2014-12-16 18:34:55 -0500 | [diff] [blame] | 106 | // TODO(austin) External linking not implemented on |
| 107 | // ppc64 (issue #8912) |
| 108 | t.Skipf("no external linking on ppc64") |
| 109 | } |
Ian Lance Taylor | e5421e2 | 2016-10-05 07:31:11 -0700 | [diff] [blame] | 110 | |
| 111 | exe, err := buildTestProg(t, "testprogcgo", "-tags=threadprof") |
| 112 | if err != nil { |
| 113 | t.Fatal(err) |
| 114 | } |
| 115 | |
| 116 | got, err := testEnv(exec.Command(exe, "CgoExternalThreadSIGPROF")).CombinedOutput() |
| 117 | if err != nil { |
| 118 | t.Fatalf("exit status: %v\n%s", err, got) |
| 119 | } |
| 120 | |
| 121 | if want := "OK\n"; string(got) != want { |
Russ Cox | 8d5ff2e | 2015-12-21 10:29:21 -0500 | [diff] [blame] | 122 | t.Fatalf("expected %q, but got:\n%s", want, got) |
Shenghou Ma | 5da9c8c | 2014-12-27 19:15:38 -0500 | [diff] [blame] | 123 | } |
| 124 | } |
| 125 | |
Ian Lance Taylor | 872b168 | 2015-07-21 22:34:48 -0700 | [diff] [blame] | 126 | func TestCgoExternalThreadSignal(t *testing.T) { |
Brad Fitzpatrick | 2341631 | 2016-11-04 05:28:01 +0000 | [diff] [blame] | 127 | t.Parallel() |
Ian Lance Taylor | 872b168 | 2015-07-21 22:34:48 -0700 | [diff] [blame] | 128 | // issue 10139 |
| 129 | switch runtime.GOOS { |
| 130 | case "plan9", "windows": |
| 131 | t.Skipf("no pthreads on %s", runtime.GOOS) |
| 132 | } |
Ian Lance Taylor | e5421e2 | 2016-10-05 07:31:11 -0700 | [diff] [blame] | 133 | |
| 134 | exe, err := buildTestProg(t, "testprogcgo", "-tags=threadprof") |
| 135 | if err != nil { |
| 136 | t.Fatal(err) |
| 137 | } |
| 138 | |
| 139 | got, err := testEnv(exec.Command(exe, "CgoExternalThreadSIGPROF")).CombinedOutput() |
| 140 | if err != nil { |
| 141 | t.Fatalf("exit status: %v\n%s", err, got) |
| 142 | } |
| 143 | |
| 144 | want := []byte("OK\n") |
| 145 | if !bytes.Equal(got, want) { |
Russ Cox | 8d5ff2e | 2015-12-21 10:29:21 -0500 | [diff] [blame] | 146 | t.Fatalf("expected %q, but got:\n%s", want, got) |
Ian Lance Taylor | 872b168 | 2015-07-21 22:34:48 -0700 | [diff] [blame] | 147 | } |
| 148 | } |
| 149 | |
Alex Brainman | 9b69196 | 2015-03-16 15:46:22 +1100 | [diff] [blame] | 150 | func TestCgoDLLImports(t *testing.T) { |
| 151 | // test issue 9356 |
| 152 | if runtime.GOOS != "windows" { |
| 153 | t.Skip("skipping windows specific test") |
| 154 | } |
Russ Cox | 8d5ff2e | 2015-12-21 10:29:21 -0500 | [diff] [blame] | 155 | got := runTestProg(t, "testprogcgo", "CgoDLLImportsMain") |
Alex Brainman | 9b69196 | 2015-03-16 15:46:22 +1100 | [diff] [blame] | 156 | want := "OK\n" |
| 157 | if got != want { |
| 158 | t.Fatalf("expected %q, but got %v", want, got) |
| 159 | } |
| 160 | } |
Ian Lance Taylor | 70c9a81 | 2015-12-19 10:17:10 -0800 | [diff] [blame] | 161 | |
| 162 | func TestCgoExecSignalMask(t *testing.T) { |
Brad Fitzpatrick | 2341631 | 2016-11-04 05:28:01 +0000 | [diff] [blame] | 163 | t.Parallel() |
Ian Lance Taylor | 70c9a81 | 2015-12-19 10:17:10 -0800 | [diff] [blame] | 164 | // Test issue 13164. |
| 165 | switch runtime.GOOS { |
| 166 | case "windows", "plan9": |
| 167 | t.Skipf("skipping signal mask test on %s", runtime.GOOS) |
| 168 | } |
| 169 | got := runTestProg(t, "testprogcgo", "CgoExecSignalMask") |
| 170 | want := "OK\n" |
| 171 | if got != want { |
| 172 | t.Errorf("expected %q, got %v", want, got) |
| 173 | } |
| 174 | } |
Ian Lance Taylor | c02aa46 | 2016-01-08 16:56:02 -0800 | [diff] [blame] | 175 | |
| 176 | func TestEnsureDropM(t *testing.T) { |
Brad Fitzpatrick | 2341631 | 2016-11-04 05:28:01 +0000 | [diff] [blame] | 177 | t.Parallel() |
Ian Lance Taylor | c02aa46 | 2016-01-08 16:56:02 -0800 | [diff] [blame] | 178 | // Test for issue 13881. |
Ian Lance Taylor | 9270973 | 2016-01-18 09:01:48 -0800 | [diff] [blame] | 179 | switch runtime.GOOS { |
| 180 | case "windows", "plan9": |
| 181 | t.Skipf("skipping dropm test on %s", runtime.GOOS) |
| 182 | } |
Ian Lance Taylor | c02aa46 | 2016-01-08 16:56:02 -0800 | [diff] [blame] | 183 | got := runTestProg(t, "testprogcgo", "EnsureDropM") |
| 184 | want := "OK\n" |
| 185 | if got != want { |
| 186 | t.Errorf("expected %q, got %v", want, got) |
| 187 | } |
| 188 | } |
Ian Lance Taylor | c8e7b34 | 2016-02-18 11:04:05 -0800 | [diff] [blame] | 189 | |
| 190 | // Test for issue 14387. |
| 191 | // Test that the program that doesn't need any cgo pointer checking |
| 192 | // takes about the same amount of time with it as without it. |
| 193 | func TestCgoCheckBytes(t *testing.T) { |
Brad Fitzpatrick | 2341631 | 2016-11-04 05:28:01 +0000 | [diff] [blame] | 194 | t.Parallel() |
Ian Lance Taylor | c8e7b34 | 2016-02-18 11:04:05 -0800 | [diff] [blame] | 195 | // Make sure we don't count the build time as part of the run time. |
| 196 | testenv.MustHaveGoBuild(t) |
| 197 | exe, err := buildTestProg(t, "testprogcgo") |
| 198 | if err != nil { |
| 199 | t.Fatal(err) |
| 200 | } |
| 201 | |
Ian Lance Taylor | 8d94b9b | 2016-02-25 21:16:45 -0800 | [diff] [blame] | 202 | // Try it 10 times to avoid flakiness. |
| 203 | const tries = 10 |
| 204 | var tot1, tot2 time.Duration |
| 205 | for i := 0; i < tries; i++ { |
| 206 | cmd := testEnv(exec.Command(exe, "CgoCheckBytes")) |
| 207 | cmd.Env = append(cmd.Env, "GODEBUG=cgocheck=0", fmt.Sprintf("GO_CGOCHECKBYTES_TRY=%d", i)) |
Ian Lance Taylor | c8e7b34 | 2016-02-18 11:04:05 -0800 | [diff] [blame] | 208 | |
Ian Lance Taylor | 8d94b9b | 2016-02-25 21:16:45 -0800 | [diff] [blame] | 209 | start := time.Now() |
| 210 | cmd.Run() |
| 211 | d1 := time.Since(start) |
Ian Lance Taylor | c8e7b34 | 2016-02-18 11:04:05 -0800 | [diff] [blame] | 212 | |
Ian Lance Taylor | 8d94b9b | 2016-02-25 21:16:45 -0800 | [diff] [blame] | 213 | cmd = testEnv(exec.Command(exe, "CgoCheckBytes")) |
| 214 | cmd.Env = append(cmd.Env, fmt.Sprintf("GO_CGOCHECKBYTES_TRY=%d", i)) |
Ian Lance Taylor | c8e7b34 | 2016-02-18 11:04:05 -0800 | [diff] [blame] | 215 | |
Ian Lance Taylor | 8d94b9b | 2016-02-25 21:16:45 -0800 | [diff] [blame] | 216 | start = time.Now() |
| 217 | cmd.Run() |
| 218 | d2 := time.Since(start) |
Ian Lance Taylor | c8e7b34 | 2016-02-18 11:04:05 -0800 | [diff] [blame] | 219 | |
Ian Lance Taylor | 8d94b9b | 2016-02-25 21:16:45 -0800 | [diff] [blame] | 220 | if d1*20 > d2 { |
| 221 | // The slow version (d2) was less than 20 times |
| 222 | // slower than the fast version (d1), so OK. |
| 223 | return |
| 224 | } |
| 225 | |
| 226 | tot1 += d1 |
| 227 | tot2 += d2 |
Ian Lance Taylor | c8e7b34 | 2016-02-18 11:04:05 -0800 | [diff] [blame] | 228 | } |
Ian Lance Taylor | 8d94b9b | 2016-02-25 21:16:45 -0800 | [diff] [blame] | 229 | |
| 230 | t.Errorf("cgo check too slow: got %v, expected at most %v", tot2/tries, (tot1/tries)*20) |
Ian Lance Taylor | c8e7b34 | 2016-02-18 11:04:05 -0800 | [diff] [blame] | 231 | } |
Shenghou Ma | e960302 | 2016-02-21 13:56:08 -0500 | [diff] [blame] | 232 | |
| 233 | func TestCgoPanicDeadlock(t *testing.T) { |
Brad Fitzpatrick | 2341631 | 2016-11-04 05:28:01 +0000 | [diff] [blame] | 234 | t.Parallel() |
Shenghou Ma | e960302 | 2016-02-21 13:56:08 -0500 | [diff] [blame] | 235 | // test issue 14432 |
| 236 | got := runTestProg(t, "testprogcgo", "CgoPanicDeadlock") |
| 237 | want := "panic: cgo error\n\n" |
| 238 | if !strings.HasPrefix(got, want) { |
| 239 | t.Fatalf("output does not start with %q:\n%s", want, got) |
| 240 | } |
| 241 | } |
Ian Lance Taylor | 1716162 | 2016-03-04 11:29:55 -0800 | [diff] [blame] | 242 | |
| 243 | func TestCgoCCodeSIGPROF(t *testing.T) { |
Brad Fitzpatrick | 2341631 | 2016-11-04 05:28:01 +0000 | [diff] [blame] | 244 | t.Parallel() |
Ian Lance Taylor | 1716162 | 2016-03-04 11:29:55 -0800 | [diff] [blame] | 245 | got := runTestProg(t, "testprogcgo", "CgoCCodeSIGPROF") |
| 246 | want := "OK\n" |
| 247 | if got != want { |
| 248 | t.Errorf("expected %q got %v", want, got) |
| 249 | } |
| 250 | } |
Ian Lance Taylor | ea306ae | 2015-12-11 17:16:48 -0800 | [diff] [blame] | 251 | |
| 252 | func TestCgoCrashTraceback(t *testing.T) { |
Brad Fitzpatrick | 2341631 | 2016-11-04 05:28:01 +0000 | [diff] [blame] | 253 | t.Parallel() |
Ian Lance Taylor | ea306ae | 2015-12-11 17:16:48 -0800 | [diff] [blame] | 254 | if runtime.GOOS != "linux" || runtime.GOARCH != "amd64" { |
| 255 | t.Skipf("not yet supported on %s/%s", runtime.GOOS, runtime.GOARCH) |
| 256 | } |
| 257 | got := runTestProg(t, "testprogcgo", "CrashTraceback") |
| 258 | for i := 1; i <= 3; i++ { |
| 259 | if !strings.Contains(got, fmt.Sprintf("cgo symbolizer:%d", i)) { |
| 260 | t.Errorf("missing cgo symbolizer:%d", i) |
| 261 | } |
| 262 | } |
| 263 | } |
Ian Lance Taylor | 5f9a870 | 2016-04-27 14:18:29 -0700 | [diff] [blame] | 264 | |
| 265 | func TestCgoTracebackContext(t *testing.T) { |
Brad Fitzpatrick | 2341631 | 2016-11-04 05:28:01 +0000 | [diff] [blame] | 266 | t.Parallel() |
Ian Lance Taylor | 5f9a870 | 2016-04-27 14:18:29 -0700 | [diff] [blame] | 267 | got := runTestProg(t, "testprogcgo", "TracebackContext") |
| 268 | want := "OK\n" |
| 269 | if got != want { |
| 270 | t.Errorf("expected %q got %v", want, got) |
| 271 | } |
| 272 | } |
Ian Lance Taylor | 84e8080 | 2016-04-29 15:20:27 -0700 | [diff] [blame] | 273 | |
Ian Lance Taylor | 84d8aff | 2016-06-07 21:46:25 -0700 | [diff] [blame] | 274 | func testCgoPprof(t *testing.T, buildArg, runArg string) { |
Brad Fitzpatrick | 2341631 | 2016-11-04 05:28:01 +0000 | [diff] [blame] | 275 | t.Parallel() |
Ian Lance Taylor | 84e8080 | 2016-04-29 15:20:27 -0700 | [diff] [blame] | 276 | if runtime.GOOS != "linux" || runtime.GOARCH != "amd64" { |
| 277 | t.Skipf("not yet supported on %s/%s", runtime.GOOS, runtime.GOARCH) |
| 278 | } |
| 279 | testenv.MustHaveGoRun(t) |
| 280 | |
Ian Lance Taylor | 84d8aff | 2016-06-07 21:46:25 -0700 | [diff] [blame] | 281 | exe, err := buildTestProg(t, "testprogcgo", buildArg) |
Ian Lance Taylor | 84e8080 | 2016-04-29 15:20:27 -0700 | [diff] [blame] | 282 | if err != nil { |
| 283 | t.Fatal(err) |
| 284 | } |
| 285 | |
Ian Lance Taylor | 84d8aff | 2016-06-07 21:46:25 -0700 | [diff] [blame] | 286 | got, err := testEnv(exec.Command(exe, runArg)).CombinedOutput() |
Ian Lance Taylor | 84e8080 | 2016-04-29 15:20:27 -0700 | [diff] [blame] | 287 | if err != nil { |
Brad Fitzpatrick | 34ee8ec | 2017-04-25 04:59:14 +0000 | [diff] [blame] | 288 | if testenv.Builder() == "linux-amd64-alpine" { |
Brad Fitzpatrick | 16271b8 | 2017-04-25 02:46:06 +0000 | [diff] [blame] | 289 | // See Issue 18243 and Issue 19938. |
| 290 | t.Skipf("Skipping failing test on Alpine (golang.org/issue/18243). Ignoring error: %v", err) |
| 291 | } |
Ian Lance Taylor | 84e8080 | 2016-04-29 15:20:27 -0700 | [diff] [blame] | 292 | t.Fatal(err) |
| 293 | } |
| 294 | fn := strings.TrimSpace(string(got)) |
Mohit Agarwal | 4d6788e | 2016-05-05 00:04:54 +0530 | [diff] [blame] | 295 | defer os.Remove(fn) |
Ian Lance Taylor | 84e8080 | 2016-04-29 15:20:27 -0700 | [diff] [blame] | 296 | |
Russ Cox | 8c24e52 | 2017-02-17 15:27:12 -0500 | [diff] [blame] | 297 | for try := 0; try < 2; try++ { |
| 298 | cmd := testEnv(exec.Command(testenv.GoToolPath(t), "tool", "pprof", "-top", "-nodecount=1")) |
| 299 | // Check that pprof works both with and without explicit executable on command line. |
| 300 | if try == 0 { |
| 301 | cmd.Args = append(cmd.Args, exe, fn) |
| 302 | } else { |
| 303 | cmd.Args = append(cmd.Args, fn) |
Ian Lance Taylor | 659b9a1 | 2016-06-20 09:16:17 -0700 | [diff] [blame] | 304 | } |
Ian Lance Taylor | 659b9a1 | 2016-06-20 09:16:17 -0700 | [diff] [blame] | 305 | |
Russ Cox | 8c24e52 | 2017-02-17 15:27:12 -0500 | [diff] [blame] | 306 | found := false |
| 307 | for i, e := range cmd.Env { |
| 308 | if strings.HasPrefix(e, "PPROF_TMPDIR=") { |
| 309 | cmd.Env[i] = "PPROF_TMPDIR=" + os.TempDir() |
| 310 | found = true |
| 311 | break |
| 312 | } |
| 313 | } |
| 314 | if !found { |
| 315 | cmd.Env = append(cmd.Env, "PPROF_TMPDIR="+os.TempDir()) |
| 316 | } |
Ian Lance Taylor | 84e8080 | 2016-04-29 15:20:27 -0700 | [diff] [blame] | 317 | |
Russ Cox | 8c24e52 | 2017-02-17 15:27:12 -0500 | [diff] [blame] | 318 | top, err := cmd.CombinedOutput() |
| 319 | t.Logf("%s:\n%s", cmd.Args, top) |
| 320 | if err != nil { |
| 321 | t.Error(err) |
| 322 | } else if !bytes.Contains(top, []byte("cpuHog")) { |
| 323 | t.Error("missing cpuHog in pprof output") |
| 324 | } |
Ian Lance Taylor | 84e8080 | 2016-04-29 15:20:27 -0700 | [diff] [blame] | 325 | } |
| 326 | } |
Ian Lance Taylor | 4223294 | 2016-05-27 16:03:44 -0700 | [diff] [blame] | 327 | |
Ian Lance Taylor | 84d8aff | 2016-06-07 21:46:25 -0700 | [diff] [blame] | 328 | func TestCgoPprof(t *testing.T) { |
| 329 | testCgoPprof(t, "", "CgoPprof") |
| 330 | } |
| 331 | |
Ian Lance Taylor | 4223294 | 2016-05-27 16:03:44 -0700 | [diff] [blame] | 332 | func TestCgoPprofPIE(t *testing.T) { |
Ian Lance Taylor | 84d8aff | 2016-06-07 21:46:25 -0700 | [diff] [blame] | 333 | testCgoPprof(t, "-ldflags=-extldflags=-pie", "CgoPprof") |
| 334 | } |
Ian Lance Taylor | 4223294 | 2016-05-27 16:03:44 -0700 | [diff] [blame] | 335 | |
Ian Lance Taylor | 84d8aff | 2016-06-07 21:46:25 -0700 | [diff] [blame] | 336 | func TestCgoPprofThread(t *testing.T) { |
| 337 | testCgoPprof(t, "", "CgoPprofThread") |
Ian Lance Taylor | 4223294 | 2016-05-27 16:03:44 -0700 | [diff] [blame] | 338 | } |
Ian Lance Taylor | 9d8522f | 2016-09-21 09:44:40 -0700 | [diff] [blame] | 339 | |
Ian Lance Taylor | d03e8b2 | 2016-10-04 07:11:55 -0700 | [diff] [blame] | 340 | func TestCgoPprofThreadNoTraceback(t *testing.T) { |
| 341 | testCgoPprof(t, "", "CgoPprofThreadNoTraceback") |
| 342 | } |
| 343 | |
Ian Lance Taylor | 9d8522f | 2016-09-21 09:44:40 -0700 | [diff] [blame] | 344 | func TestRaceProf(t *testing.T) { |
| 345 | if runtime.GOOS != "linux" || runtime.GOARCH != "amd64" { |
| 346 | t.Skipf("not yet supported on %s/%s", runtime.GOOS, runtime.GOARCH) |
| 347 | } |
| 348 | |
| 349 | testenv.MustHaveGoRun(t) |
| 350 | |
| 351 | // This test requires building various packages with -race, so |
| 352 | // it's somewhat slow. |
| 353 | if testing.Short() { |
| 354 | t.Skip("skipping test in -short mode") |
| 355 | } |
| 356 | |
| 357 | exe, err := buildTestProg(t, "testprogcgo", "-race") |
| 358 | if err != nil { |
| 359 | t.Fatal(err) |
| 360 | } |
| 361 | |
| 362 | got, err := testEnv(exec.Command(exe, "CgoRaceprof")).CombinedOutput() |
| 363 | if err != nil { |
| 364 | t.Fatal(err) |
| 365 | } |
| 366 | want := "OK\n" |
| 367 | if string(got) != want { |
| 368 | t.Errorf("expected %q got %s", want, got) |
| 369 | } |
| 370 | } |
Ian Lance Taylor | 6c13a1d | 2016-10-03 16:58:34 -0700 | [diff] [blame] | 371 | |
| 372 | func TestRaceSignal(t *testing.T) { |
Brad Fitzpatrick | 2341631 | 2016-11-04 05:28:01 +0000 | [diff] [blame] | 373 | t.Parallel() |
Ian Lance Taylor | 6c13a1d | 2016-10-03 16:58:34 -0700 | [diff] [blame] | 374 | if runtime.GOOS != "linux" || runtime.GOARCH != "amd64" { |
| 375 | t.Skipf("not yet supported on %s/%s", runtime.GOOS, runtime.GOARCH) |
| 376 | } |
| 377 | |
| 378 | testenv.MustHaveGoRun(t) |
| 379 | |
| 380 | // This test requires building various packages with -race, so |
| 381 | // it's somewhat slow. |
| 382 | if testing.Short() { |
| 383 | t.Skip("skipping test in -short mode") |
| 384 | } |
| 385 | |
| 386 | exe, err := buildTestProg(t, "testprogcgo", "-race") |
| 387 | if err != nil { |
| 388 | t.Fatal(err) |
| 389 | } |
| 390 | |
| 391 | got, err := testEnv(exec.Command(exe, "CgoRaceSignal")).CombinedOutput() |
| 392 | if err != nil { |
| 393 | t.Logf("%s\n", got) |
| 394 | t.Fatal(err) |
| 395 | } |
| 396 | want := "OK\n" |
| 397 | if string(got) != want { |
| 398 | t.Errorf("expected %q got %s", want, got) |
| 399 | } |
| 400 | } |
Austin Clements | 4e7067c | 2017-06-06 18:37:59 -0400 | [diff] [blame] | 401 | |
| 402 | func TestCgoNumGoroutine(t *testing.T) { |
Ian Lance Taylor | 03a4a5c | 2017-06-14 10:17:29 -0700 | [diff] [blame] | 403 | switch runtime.GOOS { |
| 404 | case "windows", "plan9": |
| 405 | t.Skipf("skipping numgoroutine test on %s", runtime.GOOS) |
| 406 | } |
Austin Clements | 4e7067c | 2017-06-06 18:37:59 -0400 | [diff] [blame] | 407 | t.Parallel() |
| 408 | got := runTestProg(t, "testprogcgo", "NumGoroutine") |
| 409 | want := "OK\n" |
| 410 | if got != want { |
| 411 | t.Errorf("expected %q got %v", want, got) |
| 412 | } |
| 413 | } |