golang.org/x/tools@v0.21.0/go/analysis/internal/versiontest/version_test.go (about) 1 // Copyright 2023 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 //go:build go1.21 6 7 // Check that GoVersion propagates through to checkers. 8 // Depends on Go 1.21 go/types. 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 // There are many ways to run analyzers. Test all the ones here in x/tools. 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 }