1
2
3
4
5 package stack_test
6
7 import (
8 "bytes"
9 "strings"
10 "testing"
11
12 "golang.org/x/tools/internal/stack"
13 )
14
15 func TestProcess(t *testing.T) {
16 for _, test := range []struct{ name, input, expect string }{{
17 name: `empty`,
18 input: ``,
19 expect: ``,
20 }, {
21 name: `no_frame`,
22 input: `goroutine 1 [running]:`,
23 expect: `
24 [running]: $1
25
26 1 goroutines, 1 unique
27 `,
28 }, {
29 name: `one_frame`,
30 input: `
31 goroutine 1 [running]:
32 package.function(args)
33 file.go:10
34 `,
35 expect: `
36 [running]: $1
37 file.go:10: function
38
39 1 goroutines, 1 unique
40 `,
41 }, {
42 name: `one_call`,
43 input: `
44 goroutine 1 [running]:
45 package1.functionA(args)
46 file1.go:10
47 package2.functionB(args)
48 file2.go:20
49 package3.functionC(args)
50 file3.go:30
51 `,
52 expect: `
53 [running]: $1
54 file1.go:10: functionA
55 file2.go:20: functionB
56 file3.go:30: functionC
57
58 1 goroutines, 1 unique
59 `,
60 }, {
61 name: `two_call`,
62 input: `
63 goroutine 1 [running]:
64 package1.functionA(args)
65 file1.go:10
66 goroutine 2 [running]:
67 package2.functionB(args)
68 file2.go:20
69 `,
70 expect: `
71 [running]: $1
72 file1.go:10: functionA
73
74 [running]: $2
75 file2.go:20: functionB
76
77 2 goroutines, 2 unique
78 `,
79 }, {
80 name: `merge_call`,
81 input: `
82 goroutine 1 [running]:
83 package1.functionA(args)
84 file1.go:10
85 goroutine 2 [running]:
86 package1.functionA(args)
87 file1.go:10
88 `,
89 expect: `
90 [running]: $1, $2
91 file1.go:10: functionA
92
93 2 goroutines, 1 unique
94 `,
95 }, {
96 name: `alternating_call`,
97 input: `
98 goroutine 1 [running]:
99 package1.functionA(args)
100 file1.go:10
101 goroutine 2 [running]:
102 package2.functionB(args)
103 file2.go:20
104 goroutine 3 [running]:
105 package1.functionA(args)
106 file1.go:10
107 goroutine 4 [running]:
108 package2.functionB(args)
109 file2.go:20
110 goroutine 5 [running]:
111 package1.functionA(args)
112 file1.go:10
113 goroutine 6 [running]:
114 package2.functionB(args)
115 file2.go:20
116 `,
117 expect: `
118 [running]: $1, $3, $5
119 file1.go:10: functionA
120
121 [running]: $2, $4, $6
122 file2.go:20: functionB
123
124 6 goroutines, 2 unique
125 `,
126 }, {
127 name: `sort_calls`,
128 input: `
129 goroutine 1 [running]:
130 package3.functionC(args)
131 file3.go:30
132 goroutine 2 [running]:
133 package2.functionB(args)
134 file2.go:20
135 goroutine 3 [running]:
136 package1.functionA(args)
137 file1.go:10
138 `,
139 expect: `
140 [running]: $3
141 file1.go:10: functionA
142
143 [running]: $2
144 file2.go:20: functionB
145
146 [running]: $1
147 file3.go:30: functionC
148
149 3 goroutines, 3 unique
150 `,
151 }, {
152 name: `real_single`,
153 input: `
154 panic: oops
155
156 goroutine 53 [running]:
157 golang.org/x/tools/internal/jsonrpc2_test.testHandler.func1(0x1240c20, 0xc000013350, 0xc0000133b0, 0x1240ca0, 0xc00002ab00, 0x3, 0x3)
158 /work/tools/internal/jsonrpc2/jsonrpc2_test.go:160 +0x74c
159 golang.org/x/tools/internal/jsonrpc2.(*Conn).Run(0xc000204330, 0x1240c20, 0xc000204270, 0x1209570, 0xc000212120, 0x1242700)
160 /work/tools/internal/jsonrpc2/jsonrpc2.go:187 +0x777
161 golang.org/x/tools/internal/jsonrpc2_test.run.func1(0x123ebe0, 0xc000206018, 0x123ec20, 0xc000206010, 0xc0002080a0, 0xc000204330, 0x1240c20, 0xc000204270, 0xc000212120)
162 /work/tools/internal/jsonrpc2/jsonrpc2_test.go:131 +0xe2
163 created by golang.org/x/tools/internal/jsonrpc2_test.run
164 /work/tools/internal/jsonrpc2/jsonrpc2_test.go:121 +0x263
165 FAIL golang.org/x/tools/internal/jsonrpc2 0.252s
166 FAIL
167 `,
168 expect: `
169 panic: oops
170
171 [running]: $53
172 /work/tools/internal/jsonrpc2/jsonrpc2_test.go:160: testHandler.func1
173 /work/tools/internal/jsonrpc2/jsonrpc2.go:187: (*Conn).Run
174 /work/tools/internal/jsonrpc2/jsonrpc2_test.go:131: run.func1
175 /work/tools/internal/jsonrpc2/jsonrpc2_test.go:121: run
176
177 1 goroutines, 1 unique
178
179 FAIL golang.org/x/tools/internal/jsonrpc2 0.252s
180 FAIL
181 `,
182 }} {
183 t.Run(test.name, func(t *testing.T) {
184 buf := &bytes.Buffer{}
185 stack.Process(buf, strings.NewReader(test.input))
186 expect := strings.TrimSpace(test.expect)
187 got := strings.TrimSpace(buf.String())
188 if got != expect {
189 t.Errorf("got:\n%s\nexpect:\n%s", got, expect)
190 }
191 })
192 }
193 }
194
View as plain text