// Copyright 2018 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package analysisflags_test import ( "fmt" "os" "os/exec" "runtime" "strings" "testing" "golang.org/x/tools/go/analysis" "golang.org/x/tools/go/analysis/internal/analysisflags" ) func main() { fmt.Println(analysisflags.Parse([]*analysis.Analyzer{ {Name: "a1", Doc: "a1"}, {Name: "a2", Doc: "a2"}, {Name: "a3", Doc: "a3"}, }, true)) os.Exit(0) } // This test fork/execs the main function above. func TestExec(t *testing.T) { if runtime.GOOS != "linux" { t.Skipf("skipping fork/exec test on this platform") } progname := os.Args[0] if os.Getenv("ANALYSISFLAGS_CHILD") == "1" { // child process os.Args = strings.Fields(progname + " " + os.Getenv("FLAGS")) main() panic("unreachable") } for _, test := range []struct { flags string want string }{ {"", "[a1 a2 a3]"}, {"-a1=0", "[a2 a3]"}, {"-a1=1", "[a1]"}, {"-a1", "[a1]"}, {"-a1=1 -a3=1", "[a1 a3]"}, {"-a1=1 -a3=0", "[a1]"}, } { cmd := exec.Command(progname, "-test.run=TestExec") cmd.Env = append(os.Environ(), "ANALYSISFLAGS_CHILD=1", "FLAGS="+test.flags) output, err := cmd.CombinedOutput() if err != nil { t.Fatalf("exec failed: %v; output=<<%s>>", err, output) } got := strings.TrimSpace(string(output)) if got != test.want { t.Errorf("got %s, want %s", got, test.want) } } }