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.
}
}
-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")
--- /dev/null
+[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"