1
0
mirror of https://github.com/golang/go synced 2024-11-26 14:08:37 -07:00

debug/buildinfo: add regression tests for different buildmodes

Updates #48187

Change-Id: I2364f248520e77c2e3a4832b9769b52e7aa62f73
Reviewed-on: https://go-review.googlesource.com/c/go/+/357569
Reviewed-by: Bryan Mills <bcmills@google.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Than McIntosh <thanm@google.com>
Reviewed-by: Than McIntosh <thanm@google.com>
This commit is contained in:
qmuntal 2021-10-21 16:57:53 +02:00 committed by Than McIntosh
parent 9a9aad449f
commit 761db3e7f0

View File

@ -8,6 +8,7 @@ import (
"bytes"
"debug/buildinfo"
"flag"
"fmt"
"internal/testenv"
"os"
"os/exec"
@ -53,7 +54,17 @@ func TestReadFile(t *testing.T) {
platforms = append(platforms, runtimePlatform)
}
buildWithModules := func(t *testing.T, goos, goarch string) string {
buildModes := []string{"pie", "exe"}
if testenv.HasCGO() {
buildModes = append(buildModes, "c-shared")
}
// Keep in sync with src/cmd/go/internal/work/init.go:buildModeInit.
badmode := func(goos, goarch, buildmode string) string {
return fmt.Sprintf("-buildmode=%s not supported on %s/%s", buildmode, goos, goarch)
}
buildWithModules := func(t *testing.T, goos, goarch, buildmode string) string {
dir := t.TempDir()
gomodPath := filepath.Join(dir, "go.mod")
gomodData := []byte("module example.com/m\ngo 1.18\n")
@ -66,18 +77,21 @@ func TestReadFile(t *testing.T) {
t.Fatal(err)
}
outPath := filepath.Join(dir, path.Base(t.Name()))
cmd := exec.Command(testenv.GoToolPath(t), "build", "-o="+outPath)
cmd := exec.Command(testenv.GoToolPath(t), "build", "-o="+outPath, "-buildmode="+buildmode)
cmd.Dir = dir
cmd.Env = append(os.Environ(), "GO111MODULE=on", "GOOS="+goos, "GOARCH="+goarch)
stderr := &bytes.Buffer{}
cmd.Stderr = stderr
if err := cmd.Run(); err != nil {
if badmodeMsg := badmode(goos, goarch, buildmode); strings.Contains(stderr.String(), badmodeMsg) {
t.Skip(badmodeMsg)
}
t.Fatalf("failed building test file: %v\n%s", err, stderr.Bytes())
}
return outPath
}
buildWithGOPATH := func(t *testing.T, goos, goarch string) string {
buildWithGOPATH := func(t *testing.T, goos, goarch, buildmode string) string {
gopathDir := t.TempDir()
pkgDir := filepath.Join(gopathDir, "src/example.com/m")
if err := os.MkdirAll(pkgDir, 0777); err != nil {
@ -89,12 +103,15 @@ func TestReadFile(t *testing.T) {
t.Fatal(err)
}
outPath := filepath.Join(gopathDir, path.Base(t.Name()))
cmd := exec.Command(testenv.GoToolPath(t), "build", "-o="+outPath)
cmd := exec.Command(testenv.GoToolPath(t), "build", "-o="+outPath, "-buildmode="+buildmode)
cmd.Dir = pkgDir
cmd.Env = append(os.Environ(), "GO111MODULE=off", "GOPATH="+gopathDir, "GOOS="+goos, "GOARCH="+goarch)
stderr := &bytes.Buffer{}
cmd.Stderr = stderr
if err := cmd.Run(); err != nil {
if badmodeMsg := badmode(goos, goarch, buildmode); strings.Contains(stderr.String(), badmodeMsg) {
t.Skip(badmodeMsg)
}
t.Fatalf("failed building test file: %v\n%s", err, stderr.Bytes())
}
return outPath
@ -134,20 +151,20 @@ func TestReadFile(t *testing.T) {
cases := []struct {
name string
build func(t *testing.T, goos, goarch string) string
build func(t *testing.T, goos, goarch, buildmode string) string
want string
wantErr string
}{
{
name: "doesnotexist",
build: func(t *testing.T, goos, goarch string) string {
build: func(t *testing.T, goos, goarch, buildmode string) string {
return "doesnotexist.txt"
},
wantErr: "doesnotexist",
},
{
name: "empty",
build: func(t *testing.T, _, _ string) string {
build: func(t *testing.T, _, _, _ string) string {
dir := t.TempDir()
name := filepath.Join(dir, "empty")
if err := os.WriteFile(name, nil, 0666); err != nil {
@ -167,8 +184,8 @@ func TestReadFile(t *testing.T) {
},
{
name: "invalid_modules",
build: func(t *testing.T, goos, goarch string) string {
name := buildWithModules(t, goos, goarch)
build: func(t *testing.T, goos, goarch, buildmode string) string {
name := buildWithModules(t, goos, goarch, buildmode)
damageBuildInfo(t, name)
return name
},
@ -183,8 +200,8 @@ func TestReadFile(t *testing.T) {
},
{
name: "invalid_gopath",
build: func(t *testing.T, goos, goarch string) string {
name := buildWithGOPATH(t, goos, goarch)
build: func(t *testing.T, goos, goarch, buildmode string) string {
name := buildWithGOPATH(t, goos, goarch, buildmode)
damageBuildInfo(t, name)
return name
},
@ -198,25 +215,30 @@ func TestReadFile(t *testing.T) {
if p != runtimePlatform && !*flagAll {
t.Skipf("skipping platforms other than %s_%s because -all was not set", runtimePlatform.goos, runtimePlatform.goarch)
}
for _, tc := range cases {
tc := tc
t.Run(tc.name, func(t *testing.T) {
t.Parallel()
name := tc.build(t, p.goos, p.goarch)
if info, err := buildinfo.ReadFile(name); err != nil {
if tc.wantErr == "" {
t.Fatalf("unexpected error: %v", err)
} else if errMsg := err.Error(); !strings.Contains(errMsg, tc.wantErr) {
t.Fatalf("got error %q; want error containing %q", errMsg, tc.wantErr)
}
} else {
if tc.wantErr != "" {
t.Fatalf("unexpected success; want error containing %q", tc.wantErr)
}
got := info.String()
if clean := cleanOutputForComparison(string(got)); got != tc.want && clean != tc.want {
t.Fatalf("got:\n%s\nwant:\n%s", got, tc.want)
}
for _, mode := range buildModes {
mode := mode
t.Run(mode, func(t *testing.T) {
for _, tc := range cases {
tc := tc
t.Run(tc.name, func(t *testing.T) {
t.Parallel()
name := tc.build(t, p.goos, p.goarch, mode)
if info, err := buildinfo.ReadFile(name); err != nil {
if tc.wantErr == "" {
t.Fatalf("unexpected error: %v", err)
} else if errMsg := err.Error(); !strings.Contains(errMsg, tc.wantErr) {
t.Fatalf("got error %q; want error containing %q", errMsg, tc.wantErr)
}
} else {
if tc.wantErr != "" {
t.Fatalf("unexpected success; want error containing %q", tc.wantErr)
}
got := info.String()
if clean := cleanOutputForComparison(string(got)); got != tc.want && clean != tc.want {
t.Fatalf("got:\n%s\nwant:\n%s", got, tc.want)
}
}
})
}
})
}