]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: avoid passing testing.T to isCaseSensitive and goVersion
authorBryan C. Mills <bcmills@google.com>
Tue, 19 Jul 2022 19:55:01 +0000 (15:55 -0400)
committerGopher Robot <gobot@golang.org>
Thu, 18 Aug 2022 14:53:01 +0000 (14:53 +0000)
The previous implementation of isCaseSensitive called t.Fatalf in the
wrong place, causing tests after the first to proceed past an error
determining case-sensitivity. That could lead to confusing errors.

(Moreover, I would like to try to disentangle the script engine from
testing.T so that I can also use it to generate serving contents in
the replacement for vcs-test.golang.org.)

The implementation of goVersion called ts.fatalf, which is probably
fine but prevents the script environment from being computed outside
of a test, as we might want to do for debugging and other scripting.

For #27494.

Change-Id: Ibfee0704523fdcd6174b544ff84267216435025b
Reviewed-on: https://go-review.googlesource.com/c/go/+/419874
Run-TryBot: Bryan Mills <bcmills@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Russ Cox <rsc@golang.org>
Auto-Submit: Bryan Mills <bcmills@google.com>

src/cmd/go/script_test.go

index e37a7b192ba81586ef07cea438eecf5355c39f70..d49772433151b33d3acc597df5b8f4a744207a2f 100644 (file)
@@ -101,7 +101,7 @@ func TestScript(t *testing.T) {
 
 // A testScript holds execution state for a single test script.
 type testScript struct {
-       t           *testing.T
+       t           testing.TB
        ctx         context.Context
        cancel      context.CancelFunc
        gracePeriod time.Duration
@@ -161,6 +161,10 @@ func (ts *testScript) setup() {
        ts.check(os.MkdirAll(filepath.Join(ts.workdir, "tmp"), 0777))
        ts.check(os.MkdirAll(filepath.Join(ts.workdir, "gopath/src"), 0777))
        ts.cd = filepath.Join(ts.workdir, "gopath/src")
+       version, err := goVersion()
+       if err != nil {
+               ts.t.Fatal(err)
+       }
        ts.env = []string{
                "WORK=" + ts.workdir, // must be first for ts.abbrev
                pathEnvName() + "=" + testBin + string(filepath.ListSeparator) + os.Getenv(pathEnvName()),
@@ -188,7 +192,7 @@ func (ts *testScript) setup() {
                "PWD=" + ts.cd,
                tempEnvName() + "=" + filepath.Join(ts.workdir, "tmp"),
                "devnull=" + os.DevNull,
-               "goversion=" + goVersion(ts),
+               "goversion=" + version,
                "CMDGO_TEST_RUN_MAIN=true",
        }
        if testenv.Builder() != "" || os.Getenv("GIT_TRACE_CURL") == "1" {
@@ -231,13 +235,13 @@ func (ts *testScript) setup() {
 }
 
 // goVersion returns the current Go version.
-func goVersion(ts *testScript) string {
+func goVersion() (string, error) {
        tags := build.Default.ReleaseTags
        version := tags[len(tags)-1]
        if !regexp.MustCompile(`^go([1-9][0-9]*)\.(0|[1-9][0-9]*)$`).MatchString(version) {
-               ts.fatalf("invalid go version %q", version)
+               return "", fmt.Errorf("invalid go version %q", version)
        }
-       return version[2:]
+       return version[2:], nil
 }
 
 var execCache par.Cache
@@ -393,7 +397,10 @@ Script:
                        case "symlink":
                                ok = testenv.HasSymlink()
                        case "case-sensitive":
-                               ok = isCaseSensitive(ts.t)
+                               ok, err = isCaseSensitive()
+                               if err != nil {
+                                       ts.fatalf("%v", err)
+                               }
                        case "trimpath":
                                if info, _ := debug.ReadBuildInfo(); info == nil {
                                        ts.fatalf("missing build info")
@@ -476,19 +483,22 @@ Script:
 var (
        onceCaseSensitive sync.Once
        caseSensitive     bool
+       caseSensitiveErr  error
 )
 
-func isCaseSensitive(t *testing.T) bool {
+func isCaseSensitive() (bool, error) {
        onceCaseSensitive.Do(func() {
                tmpdir, err := os.MkdirTemp("", "case-sensitive")
                if err != nil {
-                       t.Fatal("failed to create directory to determine case-sensitivity:", err)
+                       caseSensitiveErr = fmt.Errorf("failed to create directory to determine case-sensitivity: %w", err)
+                       return
                }
                defer os.RemoveAll(tmpdir)
 
                fcap := filepath.Join(tmpdir, "FILE")
                if err := os.WriteFile(fcap, []byte{}, 0644); err != nil {
-                       t.Fatal("error writing file to determine case-sensitivity:", err)
+                       caseSensitiveErr = fmt.Errorf("error writing file to determine case-sensitivity: %w", err)
+                       return
                }
 
                flow := filepath.Join(tmpdir, "file")
@@ -501,11 +511,11 @@ func isCaseSensitive(t *testing.T) bool {
                        caseSensitive = true
                        return
                default:
-                       t.Fatal("unexpected error reading file when determining case-sensitivity:", err)
+                       caseSensitiveErr = fmt.Errorf("unexpected error reading file when determining case-sensitivity: %w", err)
                }
        })
 
-       return caseSensitive
+       return caseSensitive, caseSensitiveErr
 }
 
 // scriptCmds are the script command implementations.