summaryrefslogtreecommitdiffstats
path: root/src/testing/flag_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/testing/flag_test.go')
-rw-r--r--src/testing/flag_test.go86
1 files changed, 86 insertions, 0 deletions
diff --git a/src/testing/flag_test.go b/src/testing/flag_test.go
new file mode 100644
index 0000000..483ae65
--- /dev/null
+++ b/src/testing/flag_test.go
@@ -0,0 +1,86 @@
+// Copyright 2022 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 testing_test
+
+import (
+ "flag"
+ "internal/testenv"
+ "os"
+ "os/exec"
+ "testing"
+)
+
+var testFlagArg = flag.String("test_flag_arg", "", "TestFlag: passing -v option")
+
+const flagTestEnv = "GO_WANT_FLAG_HELPER_PROCESS"
+
+func TestFlag(t *testing.T) {
+ if os.Getenv(flagTestEnv) == "1" {
+ testFlagHelper(t)
+ return
+ }
+
+ testenv.MustHaveExec(t)
+
+ for _, flag := range []string{"", "-test.v", "-test.v=test2json"} {
+ flag := flag
+ t.Run(flag, func(t *testing.T) {
+ t.Parallel()
+ exe, err := os.Executable()
+ if err != nil {
+ exe = os.Args[0]
+ }
+ cmd := exec.Command(exe, "-test.run=TestFlag", "-test_flag_arg="+flag)
+ if flag != "" {
+ cmd.Args = append(cmd.Args, flag)
+ }
+ cmd.Env = append(cmd.Environ(), flagTestEnv+"=1")
+ b, err := cmd.CombinedOutput()
+ if len(b) > 0 {
+ t.Logf("%s", b)
+ }
+ if err != nil {
+ t.Error(err)
+ }
+ })
+ }
+}
+
+// testFlagHelper is called by the TestFlagHelper subprocess.
+func testFlagHelper(t *testing.T) {
+ f := flag.Lookup("test.v")
+ if f == nil {
+ t.Fatal(`flag.Lookup("test.v") failed`)
+ }
+
+ bf, ok := f.Value.(interface{ IsBoolFlag() bool })
+ if !ok {
+ t.Errorf("test.v flag (type %T) does not have IsBoolFlag method", f)
+ } else if !bf.IsBoolFlag() {
+ t.Error("test.v IsBoolFlag() returned false")
+ }
+
+ gf, ok := f.Value.(flag.Getter)
+ if !ok {
+ t.Fatalf("test.v flag (type %T) does not have Get method", f)
+ }
+ v := gf.Get()
+
+ var want any
+ switch *testFlagArg {
+ case "":
+ want = false
+ case "-test.v":
+ want = true
+ case "-test.v=test2json":
+ want = "test2json"
+ default:
+ t.Fatalf("unexpected test_flag_arg %q", *testFlagArg)
+ }
+
+ if v != want {
+ t.Errorf("test.v is %v want %v", v, want)
+ }
+}