golang.org/x/tools@v0.21.0/go/analysis/unitchecker/vet_std_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  package unitchecker_test
     6  
     7  import (
     8  	"os"
     9  	"os/exec"
    10  	"runtime"
    11  	"strings"
    12  	"testing"
    13  
    14  	"golang.org/x/tools/go/analysis/passes/appends"
    15  	"golang.org/x/tools/go/analysis/passes/asmdecl"
    16  	"golang.org/x/tools/go/analysis/passes/assign"
    17  	"golang.org/x/tools/go/analysis/passes/atomic"
    18  	"golang.org/x/tools/go/analysis/passes/bools"
    19  	"golang.org/x/tools/go/analysis/passes/buildtag"
    20  	"golang.org/x/tools/go/analysis/passes/cgocall"
    21  	"golang.org/x/tools/go/analysis/passes/composite"
    22  	"golang.org/x/tools/go/analysis/passes/copylock"
    23  	"golang.org/x/tools/go/analysis/passes/defers"
    24  	"golang.org/x/tools/go/analysis/passes/directive"
    25  	"golang.org/x/tools/go/analysis/passes/errorsas"
    26  	"golang.org/x/tools/go/analysis/passes/framepointer"
    27  	"golang.org/x/tools/go/analysis/passes/httpresponse"
    28  	"golang.org/x/tools/go/analysis/passes/ifaceassert"
    29  	"golang.org/x/tools/go/analysis/passes/loopclosure"
    30  	"golang.org/x/tools/go/analysis/passes/lostcancel"
    31  	"golang.org/x/tools/go/analysis/passes/nilfunc"
    32  	"golang.org/x/tools/go/analysis/passes/printf"
    33  	"golang.org/x/tools/go/analysis/passes/shift"
    34  	"golang.org/x/tools/go/analysis/passes/sigchanyzer"
    35  	"golang.org/x/tools/go/analysis/passes/stdmethods"
    36  	"golang.org/x/tools/go/analysis/passes/stdversion"
    37  	"golang.org/x/tools/go/analysis/passes/stringintconv"
    38  	"golang.org/x/tools/go/analysis/passes/structtag"
    39  	"golang.org/x/tools/go/analysis/passes/testinggoroutine"
    40  	"golang.org/x/tools/go/analysis/passes/tests"
    41  	"golang.org/x/tools/go/analysis/passes/timeformat"
    42  	"golang.org/x/tools/go/analysis/passes/unmarshal"
    43  	"golang.org/x/tools/go/analysis/passes/unreachable"
    44  	"golang.org/x/tools/go/analysis/passes/unusedresult"
    45  	"golang.org/x/tools/go/analysis/unitchecker"
    46  )
    47  
    48  // vet is the entrypoint of this executable when ENTRYPOINT=vet.
    49  // Keep consistent with the actual vet in GOROOT/src/cmd/vet/main.go.
    50  func vet() {
    51  	unitchecker.Main(
    52  		appends.Analyzer,
    53  		asmdecl.Analyzer,
    54  		assign.Analyzer,
    55  		atomic.Analyzer,
    56  		bools.Analyzer,
    57  		buildtag.Analyzer,
    58  		cgocall.Analyzer,
    59  		composite.Analyzer,
    60  		copylock.Analyzer,
    61  		defers.Analyzer,
    62  		directive.Analyzer,
    63  		errorsas.Analyzer,
    64  		framepointer.Analyzer,
    65  		httpresponse.Analyzer,
    66  		ifaceassert.Analyzer,
    67  		loopclosure.Analyzer,
    68  		lostcancel.Analyzer,
    69  		nilfunc.Analyzer,
    70  		printf.Analyzer,
    71  		shift.Analyzer,
    72  		sigchanyzer.Analyzer,
    73  		stdmethods.Analyzer,
    74  		stdversion.Analyzer,
    75  		stringintconv.Analyzer,
    76  		structtag.Analyzer,
    77  		testinggoroutine.Analyzer,
    78  		tests.Analyzer,
    79  		timeformat.Analyzer,
    80  		unmarshal.Analyzer,
    81  		unreachable.Analyzer,
    82  		// unsafeptr.Analyzer, // currently reports findings in runtime
    83  		unusedresult.Analyzer,
    84  	)
    85  }
    86  
    87  // TestVetStdlib runs the same analyzers as the actual vet over the
    88  // standard library, using go vet and unitchecker, to ensure that
    89  // there are no findings.
    90  func TestVetStdlib(t *testing.T) {
    91  	if testing.Short() {
    92  		t.Skip("skipping in -short mode")
    93  	}
    94  	if version := runtime.Version(); !strings.HasPrefix(version, "devel") {
    95  		t.Skipf("This test is only wanted on development branches where code can be easily fixed. Skipping because runtime.Version=%q.", version)
    96  	}
    97  
    98  	cmd := exec.Command("go", "vet", "-vettool="+os.Args[0], "std")
    99  	cmd.Env = append(os.Environ(), "ENTRYPOINT=vet")
   100  	if out, err := cmd.CombinedOutput(); err != nil {
   101  		t.Errorf("go vet std failed (%v):\n%s", err, out)
   102  	}
   103  }