Skip to content

Commit

Permalink
cmd/go: convert testCDAndGOPATHAreDifferent to the script framework
Browse files Browse the repository at this point in the history
This is a bit complex. There's a driver program to run go with modifications
to the GOPATH used to test Windows.

Also remove the cd method on testgoData, because this was the last function
that used it.

Part of converting all tests to script framework to improve
test parallelism.

Updates #36320
Updates #17751

Change-Id: I3e8e27f37fd3701bd36b6365b128dd73b69181c0
Reviewed-on: https://go-review.googlesource.com/c/go/+/214578
Reviewed-by: Jay Conrod <[email protected]>
  • Loading branch information
matloob committed Feb 27, 2020
1 parent e674972 commit 6ef25c2
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 52 deletions.
52 changes: 0 additions & 52 deletions src/cmd/go/go_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -388,24 +388,6 @@ func (tg *testgoData) pwd() string {
return wd
}

// cd changes the current directory to the named directory. Note that
// using this means that the test must not be run in parallel with any
// other tests.
func (tg *testgoData) cd(dir string) {
tg.t.Helper()
if tg.inParallel {
tg.t.Fatal("internal testsuite error: changing directory when running in parallel")
}
if tg.wd == "" {
tg.wd = tg.pwd()
}
abs, err := filepath.Abs(dir)
tg.must(os.Chdir(dir))
if err == nil {
tg.setenv("PWD", abs)
}
}

// sleep sleeps for one tick, where a tick is a conservative estimate
// of how long it takes for a file modification to get a different
// mtime.
Expand Down Expand Up @@ -2872,40 +2854,6 @@ func TestLinkerTmpDirIsDeleted(t *testing.T) {
}
}

func testCDAndGOPATHAreDifferent(tg *testgoData, cd, gopath string) {
skipIfGccgo(tg.t, "gccgo does not support -ldflags -X")
tg.setenv("GOPATH", gopath)

tg.tempDir("dir")
exe := tg.path("dir/a.exe")

tg.cd(cd)

tg.run("build", "-o", exe, "-ldflags", "-X=my.pkg.Text=linkXworked")
out, err := exec.Command(exe).CombinedOutput()
if err != nil {
tg.t.Fatal(err)
}
if string(out) != "linkXworked\n" {
tg.t.Errorf(`incorrect output with GOPATH=%q and CD=%q: expected "linkXworked\n", but have %q`, gopath, cd, string(out))
}
}

func TestCDAndGOPATHAreDifferent(t *testing.T) {
tg := testgo(t)
defer tg.cleanup()

gopath := filepath.Join(tg.pwd(), "testdata")
cd := filepath.Join(gopath, "src/my.pkg/main")

testCDAndGOPATHAreDifferent(tg, cd, gopath)
if runtime.GOOS == "windows" {
testCDAndGOPATHAreDifferent(tg, cd, strings.ReplaceAll(gopath, `\`, `/`))
testCDAndGOPATHAreDifferent(tg, cd, strings.ToUpper(gopath))
testCDAndGOPATHAreDifferent(tg, cd, strings.ToLower(gopath))
}
}

// Issue 25093.
func TestCoverpkgTestOnly(t *testing.T) {
skipIfGccgo(t, "gccgo has no cover tool")
Expand Down
72 changes: 72 additions & 0 deletions src/cmd/go/testdata/script/build_cd_gopath_different.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
[gccgo] skip 'gccgo does not support -ldflags -X'
go build run_go.go

# Apply identity function to GOPATH
exec ./run_go$GOEXE $GOPATH/src/my.pkg/main $GOPATH IDENTITY build -o $WORK/tmp/a.exe -ldflags -X=my.pkg.Text=linkXworked
exec $WORK/tmp/a.exe
stderr 'linkXworked'
rm $WORK/tmp/a.exe

[!windows] stop 'rest of the tests only apply to Windows'

# Replace '\' with '/' in GOPATH
exec ./run_go$GOEXE $GOPATH/src/my.pkg/main $GOPATH REPLACE_SLASH build -o $WORK/tmp/a.exe -ldflags -X=my.pkg.Text=linkXworked
exec $WORK/tmp/a.exe
stderr 'linkXworked'
rm $WORK/tmp/a.exe

# Apply identity function to GOPATH
exec ./run_go$GOEXE $GOPATH/src/my.pkg/main $GOPATH UPPER build -o $WORK/tmp/a.exe -ldflags -X=my.pkg.Text=linkXworked
exec $WORK/tmp/a.exe
stderr 'linkXworked'
rm $WORK/tmp/a.exe

# Apply identity function to GOPATH
exec ./run_go$GOEXE $GOPATH/src/my.pkg/main $GOPATH LOWER build -o $WORK/tmp/a.exe -ldflags -X=my.pkg.Text=linkXworked
exec $WORK/tmp/a.exe
stderr 'linkXworked'
rm $WORK/tmp/a.exe

-- run_go.go --
package main

import (
"fmt"
"os"
"os/exec"
"strings"
)

func main() {
dir := os.Args[1]
gopath := os.Args[2]
switch os.Args[3] {
case "IDENTITY":
case "REPLACE_SLASH": gopath = strings.ReplaceAll(gopath, `\`, `/`)
case "UPPER": gopath = strings.ToUpper(gopath)
case "LOWER": gopath = strings.ToLower(gopath)
default: fmt.Fprintln(os.Stderr, "bad op"); os.Exit(1)
}
cmd := exec.Command("go", os.Args[4:]...)
cmd.Dir = dir
cmd.Env = append(os.Environ(), "GOPATH="+gopath)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
if err := cmd.Run(); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
}

-- my.pkg/main/main.go --
package main

import "my.pkg"

func main() {
println(pkg.Text)
}
-- my.pkg/pkg.go --
package pkg

var Text = "unset"

0 comments on commit 6ef25c2

Please sign in to comment.