...
1
2
3
4
5
6
7
8
9
10 package versiontest
11
12 import (
13 "os"
14 "os/exec"
15 "path/filepath"
16 "strings"
17 "testing"
18
19 "golang.org/x/tools/go/analysis"
20 "golang.org/x/tools/go/analysis/analysistest"
21 "golang.org/x/tools/go/analysis/multichecker"
22 "golang.org/x/tools/go/analysis/singlechecker"
23 "golang.org/x/tools/internal/testenv"
24 )
25
26 var analyzer = &analysis.Analyzer{
27 Name: "versiontest",
28 Doc: "off",
29 Run: func(pass *analysis.Pass) (interface{}, error) {
30 pass.Reportf(pass.Files[0].Package, "goversion=%s", pass.Pkg.GoVersion())
31 return nil, nil
32 },
33 }
34
35 func init() {
36 if os.Getenv("VERSIONTEST_MULTICHECKER") == "1" {
37 multichecker.Main(analyzer)
38 os.Exit(0)
39 }
40 if os.Getenv("VERSIONTEST_SINGLECHECKER") == "1" {
41 singlechecker.Main(analyzer)
42 os.Exit(0)
43 }
44 }
45
46 func testDir(t *testing.T) (dir string) {
47 dir = t.TempDir()
48 if err := os.WriteFile(filepath.Join(dir, "go.mod"), []byte("go 1.20\nmodule m\n"), 0666); err != nil {
49 t.Fatal(err)
50 }
51 if err := os.WriteFile(filepath.Join(dir, "x.go"), []byte("package main // want \"goversion=go1.20\"\n"), 0666); err != nil {
52 t.Fatal(err)
53 }
54 return dir
55 }
56
57
58
59 func TestAnalysistest(t *testing.T) {
60 analysistest.Run(t, testDir(t), analyzer)
61 }
62
63 func TestMultichecker(t *testing.T) {
64 testenv.NeedsGoPackages(t)
65
66 exe, err := os.Executable()
67 if err != nil {
68 t.Fatal(err)
69 }
70 cmd := exec.Command(exe, ".")
71 cmd.Dir = testDir(t)
72 cmd.Env = append(os.Environ(), "VERSIONTEST_MULTICHECKER=1")
73 out, err := cmd.CombinedOutput()
74 if err == nil || !strings.Contains(string(out), "x.go:1:1: goversion=go1.20\n") {
75 t.Fatalf("multichecker: %v\n%s", err, out)
76 }
77 }
78
79 func TestSinglechecker(t *testing.T) {
80 testenv.NeedsGoPackages(t)
81
82 exe, err := os.Executable()
83 if err != nil {
84 t.Fatal(err)
85 }
86 cmd := exec.Command(exe, ".")
87 cmd.Dir = testDir(t)
88 cmd.Env = append(os.Environ(), "VERSIONTEST_SINGLECHECKER=1")
89 out, err := cmd.CombinedOutput()
90 if err == nil || !strings.Contains(string(out), "x.go:1:1: goversion=go1.20\n") {
91 t.Fatalf("multichecker: %v\n%s", err, out)
92 }
93 }
94
95 func TestVettool(t *testing.T) {
96 testenv.NeedsGoPackages(t)
97
98 exe, err := os.Executable()
99 if err != nil {
100 t.Fatal(err)
101 }
102 cmd := exec.Command("go", "vet", "-vettool="+exe, ".")
103 cmd.Dir = testDir(t)
104 cmd.Env = append(os.Environ(), "VERSIONTEST_MULTICHECKER=1")
105 out, err := cmd.CombinedOutput()
106 if err == nil || !strings.Contains(string(out), "x.go:1:1: goversion=go1.20\n") {
107 t.Fatalf("vettool: %v\n%s", err, out)
108 }
109 }
110
View as plain text