...

Source file src/golang.org/x/tools/go/analysis/internal/versiontest/version_test.go

Documentation: golang.org/x/tools/go/analysis/internal/versiontest

     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  }
   110  

View as plain text