...
1# Test basic features of "go vet"/"go fix" CLI.
2#
3# The example relies on two analyzers:
4# - hostport (which is included in both the fix and vet suites), and
5# - printf (which is only in the vet suite).
6# Each reports one diagnostic with a fix.
7
8# vet default flags print diagnostics to stderr. Diagnostic => nonzero exit.
9! go vet example.com/x
10stderr 'does not work with IPv6'
11stderr 'non-constant format string in call to fmt.Sprintf'
12
13# -hostport runs only one analyzer. Diagnostic => failure.
14! go vet -hostport example.com/x
15stderr 'does not work with IPv6'
16! stderr 'non-constant format string'
17
18# -timeformat runs only one analyzer. No diagnostics => success.
19go vet -timeformat example.com/x
20! stderr .
21
22# JSON output includes diagnostics and fixes. Always success.
23go vet -json example.com/x
24! stderr .
25stdout '"example.com/x": {'
26stdout '"hostport":'
27stdout '"message": "address format .* does not work with IPv6",'
28stdout '"suggested_fixes":'
29stdout '"message": "Replace fmt.Sprintf with net.JoinHostPort",'
30
31# vet -fix -diff displays a diff.
32go vet -fix -diff example.com/x
33stdout '\-var _ = fmt.Sprintf\(s\)'
34stdout '\+var _ = fmt.Sprintf\("%s", s\)'
35stdout '\-var _, _ = net.Dial\("tcp", fmt.Sprintf\("%s:%d", s, 80\)\)'
36stdout '\+var _, _ = net.Dial\("tcp", net.JoinHostPort\(s, "80"\)\)'
37
38# vet -fix quietly applies the vet suite fixes.
39cp x.go x.go.bak
40go vet -fix example.com/x
41grep 'fmt.Sprintf\("%s", s\)' x.go
42grep 'net.JoinHostPort' x.go
43! stderr .
44cp x.go.bak x.go
45
46! go vet -diff example.com/x
47stderr 'go vet -diff flag requires -fix'
48
49# go fix applies the fix suite fixes.
50go fix example.com/x
51grep 'net.JoinHostPort' x.go
52! grep 'fmt.Sprintf\("%s", s\)' x.go
53! stderr .
54cp x.go.bak x.go
55
56# Show diff of fixes from the fix suite.
57go fix -diff example.com/x
58! stdout '\-var _ = fmt.Sprintf\(s\)'
59stdout '\-var _, _ = net.Dial\("tcp", fmt.Sprintf\("%s:%d", s, 80\)\)'
60stdout '\+var _, _ = net.Dial\("tcp", net.JoinHostPort\(s, "80"\)\)'
61
62# Show fix-suite fixes in JSON form.
63go fix -json example.com/x
64! stderr .
65stdout '"example.com/x": {'
66stdout '"hostport":'
67stdout '"message": "address format .* does not work with IPv6",'
68stdout '"suggested_fixes":'
69stdout '"message": "Replace fmt.Sprintf with net.JoinHostPort",'
70! stdout '"printf":'
71! stdout '"message": "non-constant format string.*",'
72! stdout '"message": "Insert.*%s.*format.string",'
73
74# Show vet-suite fixes in JSON form.
75go vet -fix -json example.com/x
76! stderr .
77stdout '"example.com/x": {'
78stdout '"hostport":'
79stdout '"message": "address format .* does not work with IPv6",'
80stdout '"suggested_fixes":'
81stdout '"message": "Replace fmt.Sprintf with net.JoinHostPort",'
82stdout '"printf":'
83stdout '"message": "non-constant format string.*",'
84stdout '"suggested_fixes":'
85stdout '"message": "Insert.*%s.*format.string",'
86
87# Reject -diff + -json.
88! go fix -diff -json example.com/x
89stderr '-json and -diff cannot be used together'
90
91# Legacy way of selecting fixers is a no-op.
92go fix -fix=old1,old2 example.com/x
93stderr 'go fix: the -fix=old1,old2 flag is obsolete and has no effect'
94cp x.go.bak x.go
95
96# -c=n flag shows n lines of context.
97! go vet -c=2 -printf example.com/x
98stderr 'x.go:12:21: non-constant format string in call to fmt.Sprintf'
99! stderr '9 '
100stderr '10 '
101stderr '11 // This call...'
102stderr '12 var _ = fmt.Sprintf\(s\)'
103stderr '13 '
104stderr '14 '
105! stderr '15 '
106
107-- go.mod --
108module example.com/x
109go 1.25
110
111-- x.go --
112package x
113
114
115import (
116 "fmt"
117 "net"
118)
119
120var s string
121
122// This call yields a "non-constant format string" diagnostic, with a fix (go vet only).
123var _ = fmt.Sprintf(s)
124
125// This call yields a hostport diagnostic, with a fix (go vet and go fix).
126var _, _ = net.Dial("tcp", fmt.Sprintf("%s:%d", s, 80))
View as plain text