| // Copyright 2020 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package stack_test |
| |
| import ( |
| "bytes" |
| "strings" |
| "testing" |
| |
| "golang.org/x/exp/internal/stack" |
| ) |
| |
| func TestProcess(t *testing.T) { |
| for _, test := range []struct{ name, input, expect string }{{ |
| name: `empty`, |
| input: ``, |
| expect: ``, |
| }, { |
| name: `no_frame`, |
| input: `goroutine 1 [running]:`, |
| expect: ` |
| [running]: $1 |
| |
| 1 goroutines, 1 unique |
| `, |
| }, { |
| name: `one_frame`, |
| input: ` |
| goroutine 1 [running]: |
| package.function(args) |
| file.go:10 |
| `, |
| expect: ` |
| [running]: $1 |
| file.go:10: function |
| |
| 1 goroutines, 1 unique |
| `, |
| }, { |
| name: `one_call`, |
| input: ` |
| goroutine 1 [running]: |
| package1.functionA(args) |
| file1.go:10 |
| package2.functionB(args) |
| file2.go:20 |
| package3.functionC(args) |
| file3.go:30 |
| `, |
| expect: ` |
| [running]: $1 |
| file1.go:10: functionA |
| file2.go:20: functionB |
| file3.go:30: functionC |
| |
| 1 goroutines, 1 unique |
| `, |
| }, { |
| name: `two_call`, |
| input: ` |
| goroutine 1 [running]: |
| package1.functionA(args) |
| file1.go:10 |
| goroutine 2 [running]: |
| package2.functionB(args) |
| file2.go:20 |
| `, |
| expect: ` |
| [running]: $1 |
| file1.go:10: functionA |
| |
| [running]: $2 |
| file2.go:20: functionB |
| |
| 2 goroutines, 2 unique |
| `, |
| }, { |
| name: `merge_call`, |
| input: ` |
| goroutine 1 [running]: |
| package1.functionA(args) |
| file1.go:10 |
| goroutine 2 [running]: |
| package1.functionA(args) |
| file1.go:10 |
| `, |
| expect: ` |
| [running]: $1, $2 |
| file1.go:10: functionA |
| |
| 2 goroutines, 1 unique |
| `, |
| }, { |
| name: `alternating_call`, |
| input: ` |
| goroutine 1 [running]: |
| package1.functionA(args) |
| file1.go:10 |
| goroutine 2 [running]: |
| package2.functionB(args) |
| file2.go:20 |
| goroutine 3 [running]: |
| package1.functionA(args) |
| file1.go:10 |
| goroutine 4 [running]: |
| package2.functionB(args) |
| file2.go:20 |
| goroutine 5 [running]: |
| package1.functionA(args) |
| file1.go:10 |
| goroutine 6 [running]: |
| package2.functionB(args) |
| file2.go:20 |
| `, |
| expect: ` |
| [running]: $1, $3, $5 |
| file1.go:10: functionA |
| |
| [running]: $2, $4, $6 |
| file2.go:20: functionB |
| |
| 6 goroutines, 2 unique |
| `, |
| }, { |
| name: `sort_calls`, |
| input: ` |
| goroutine 1 [running]: |
| package3.functionC(args) |
| file3.go:30 |
| goroutine 2 [running]: |
| package2.functionB(args) |
| file2.go:20 |
| goroutine 3 [running]: |
| package1.functionA(args) |
| file1.go:10 |
| `, |
| expect: ` |
| [running]: $3 |
| file1.go:10: functionA |
| |
| [running]: $2 |
| file2.go:20: functionB |
| |
| [running]: $1 |
| file3.go:30: functionC |
| |
| 3 goroutines, 3 unique |
| `, |
| }, { |
| name: `real_single`, |
| input: ` |
| panic: oops |
| |
| goroutine 53 [running]: |
| golang.org/x/tools/internal/jsonrpc2_test.testHandler.func1(0x1240c20, 0xc000013350, 0xc0000133b0, 0x1240ca0, 0xc00002ab00, 0x3, 0x3) |
| /work/tools/internal/jsonrpc2/jsonrpc2_test.go:160 +0x74c |
| golang.org/x/tools/internal/jsonrpc2.(*Conn).Run(0xc000204330, 0x1240c20, 0xc000204270, 0x1209570, 0xc000212120, 0x1242700) |
| /work/tools/internal/jsonrpc2/jsonrpc2.go:187 +0x777 |
| golang.org/x/tools/internal/jsonrpc2_test.run.func1(0x123ebe0, 0xc000206018, 0x123ec20, 0xc000206010, 0xc0002080a0, 0xc000204330, 0x1240c20, 0xc000204270, 0xc000212120) |
| /work/tools/internal/jsonrpc2/jsonrpc2_test.go:131 +0xe2 |
| created by golang.org/x/tools/internal/jsonrpc2_test.run |
| /work/tools/internal/jsonrpc2/jsonrpc2_test.go:121 +0x263 |
| FAIL golang.org/x/tools/internal/jsonrpc2 0.252s |
| FAIL |
| `, |
| expect: ` |
| panic: oops |
| |
| [running]: $53 |
| /work/tools/internal/jsonrpc2/jsonrpc2_test.go:160: testHandler.func1 |
| /work/tools/internal/jsonrpc2/jsonrpc2.go:187: (*Conn).Run |
| /work/tools/internal/jsonrpc2/jsonrpc2_test.go:131: run.func1 |
| /work/tools/internal/jsonrpc2/jsonrpc2_test.go:121: run |
| |
| 1 goroutines, 1 unique |
| |
| FAIL golang.org/x/tools/internal/jsonrpc2 0.252s |
| FAIL |
| `, |
| }} { |
| t.Run(test.name, func(t *testing.T) { |
| buf := &bytes.Buffer{} |
| stack.Process(buf, strings.NewReader(test.input)) |
| expect := strings.TrimSpace(test.expect) |
| got := strings.TrimSpace(buf.String()) |
| if got != expect { |
| t.Errorf("got:\n%s\nexpect:\n%s", got, expect) |
| } |
| }) |
| } |
| } |