-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathanalysis_test.go
169 lines (158 loc) · 4.85 KB
/
analysis_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
package main
import (
"fmt"
"os"
"runtime/debug"
"strings"
"testing"
"golang.org/x/tools/go/analysis"
"golang.org/x/tools/go/analysis/checker"
"golang.org/x/tools/go/analysis/passes/appends"
"golang.org/x/tools/go/analysis/passes/asmdecl"
"golang.org/x/tools/go/analysis/passes/assign"
"golang.org/x/tools/go/analysis/passes/atomic"
"golang.org/x/tools/go/analysis/passes/atomicalign"
"golang.org/x/tools/go/analysis/passes/bools"
"golang.org/x/tools/go/analysis/passes/buildssa"
"golang.org/x/tools/go/analysis/passes/buildtag"
"golang.org/x/tools/go/analysis/passes/cgocall"
"golang.org/x/tools/go/analysis/passes/composite"
"golang.org/x/tools/go/analysis/passes/copylock"
"golang.org/x/tools/go/analysis/passes/ctrlflow"
"golang.org/x/tools/go/analysis/passes/deepequalerrors"
"golang.org/x/tools/go/analysis/passes/defers"
"golang.org/x/tools/go/analysis/passes/directive"
"golang.org/x/tools/go/analysis/passes/errorsas"
"golang.org/x/tools/go/analysis/passes/findcall"
"golang.org/x/tools/go/analysis/passes/framepointer"
"golang.org/x/tools/go/analysis/passes/httpmux"
"golang.org/x/tools/go/analysis/passes/httpresponse"
"golang.org/x/tools/go/analysis/passes/ifaceassert"
"golang.org/x/tools/go/analysis/passes/inspect"
"golang.org/x/tools/go/analysis/passes/loopclosure"
"golang.org/x/tools/go/analysis/passes/lostcancel"
"golang.org/x/tools/go/analysis/passes/nilfunc"
"golang.org/x/tools/go/analysis/passes/nilness"
"golang.org/x/tools/go/analysis/passes/pkgfact"
"golang.org/x/tools/go/analysis/passes/printf"
"golang.org/x/tools/go/analysis/passes/reflectvaluecompare"
"golang.org/x/tools/go/analysis/passes/shadow"
"golang.org/x/tools/go/analysis/passes/shift"
"golang.org/x/tools/go/analysis/passes/sigchanyzer"
"golang.org/x/tools/go/analysis/passes/slog"
"golang.org/x/tools/go/analysis/passes/sortslice"
"golang.org/x/tools/go/analysis/passes/stdmethods"
"golang.org/x/tools/go/analysis/passes/stdversion"
"golang.org/x/tools/go/analysis/passes/stringintconv"
"golang.org/x/tools/go/analysis/passes/structtag"
"golang.org/x/tools/go/analysis/passes/testinggoroutine"
"golang.org/x/tools/go/analysis/passes/tests"
"golang.org/x/tools/go/analysis/passes/timeformat"
"golang.org/x/tools/go/analysis/passes/unmarshal"
"golang.org/x/tools/go/analysis/passes/unreachable"
"golang.org/x/tools/go/analysis/passes/unsafeptr"
"golang.org/x/tools/go/analysis/passes/unusedresult"
"golang.org/x/tools/go/analysis/passes/unusedwrite"
"golang.org/x/tools/go/analysis/passes/usesgenerics"
"golang.org/x/tools/go/analysis/passes/waitgroup"
"golang.org/x/tools/go/packages"
)
func TestAnalysis(t *testing.T) {
bi, ok := debug.ReadBuildInfo()
if !ok {
t.Fatal("failed to read build info")
}
module := bi.Main.Path + "/..."
pkgs, err := packages.Load(&packages.Config{
Mode: packages.LoadAllSyntax,
Context: t.Context(),
}, module)
if err != nil {
t.Fatalf("load packages %v: %v", module, err)
}
g, err := checker.Analyze([]*analysis.Analyzer{
appends.Analyzer,
asmdecl.Analyzer,
assign.Analyzer,
atomic.Analyzer,
atomicalign.Analyzer,
bools.Analyzer,
buildssa.Analyzer,
buildtag.Analyzer,
cgocall.Analyzer,
composite.Analyzer,
copylock.Analyzer,
ctrlflow.Analyzer,
deepequalerrors.Analyzer,
defers.Analyzer,
directive.Analyzer,
errorsas.Analyzer,
// fieldalignment.Analyzer,
findcall.Analyzer,
framepointer.Analyzer,
httpmux.Analyzer,
httpresponse.Analyzer,
ifaceassert.Analyzer,
inspect.Analyzer,
loopclosure.Analyzer,
lostcancel.Analyzer,
nilfunc.Analyzer,
nilness.Analyzer,
pkgfact.Analyzer,
printf.Analyzer,
reflectvaluecompare.Analyzer,
shadow.Analyzer,
shift.Analyzer,
sigchanyzer.Analyzer,
slog.Analyzer,
sortslice.Analyzer,
stdmethods.Analyzer,
stdversion.Analyzer,
stringintconv.Analyzer,
structtag.Analyzer,
testinggoroutine.Analyzer,
tests.Analyzer,
timeformat.Analyzer,
unmarshal.Analyzer,
unreachable.Analyzer,
unsafeptr.Analyzer,
unusedresult.Analyzer,
unusedwrite.Analyzer,
usesgenerics.Analyzer,
waitgroup.Analyzer,
},
pkgs,
&checker.Options{
SanityCheck: true,
})
if err != nil {
t.Fatalf("run analyzers: %v", err)
}
for act := range g.All() {
if !strings.HasPrefix(act.Package.PkgPath, bi.Main.Path) {
continue
}
name := fmt.Sprintf("%s/%s", act.Analyzer, act.Package)
generated := make(map[string]bool)
t.Run(name, func(t *testing.T) {
if act.Err != nil {
t.Error(act.Err)
}
for _, diag := range act.Diagnostics {
pos := act.Package.Fset.Position(diag.Pos)
if _, ok := generated[pos.Filename]; !ok {
b, err := os.ReadFile(pos.Filename)
if err != nil {
t.Errorf("read file %v: %v", pos.Filename, err)
continue
}
generated[pos.Filename] = generatedRe.Match(b)
}
if generated[pos.Filename] {
continue
}
t.Errorf("[%v] %s", pos, diag.Message)
}
})
}
}