Skip to content

Commit

Permalink
cmd/go,cmd/link: do not check for staleness in most tests
Browse files Browse the repository at this point in the history
Instead, check that stale packages in the standard library
are not rebuilt when already present in the build cache,
and are not installed implicitly when rebuilt.

We retain the staleness checks for the runtime package in tests
involving '-i', because those are guaranteed to fail anyway if the
package is stale and the "stale" failure message is arguably clearer.
They can be removed if/when we remove the '-i' flag, but the runtime
package is less likely to become stale because it does not have cgo
dependencies.

Fixes #46347
Updates #33598
Updates #35459
Updates #41696

Change-Id: I7b0a808addd930f9f4911ff53ded62272af75a40
Reviewed-on: https://go-review.googlesource.com/c/go/+/322629
Trust: Bryan C. Mills <[email protected]>
Run-TryBot: Bryan C. Mills <[email protected]>
TryBot-Result: Go Bot <[email protected]>
Reviewed-by: Cherry Mui <[email protected]>
Reviewed-by: Jay Conrod <[email protected]>
  • Loading branch information
Bryan C. Mills committed May 27, 2021
1 parent 6ff0ae2 commit 9bc5268
Show file tree
Hide file tree
Showing 7 changed files with 112 additions and 63 deletions.

This file was deleted.

39 changes: 39 additions & 0 deletions src/cmd/go/testdata/script/cgo_stale.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# golang.org/issue/46347: a stale runtime/cgo should only force a single rebuild

[!cgo] skip
[short] skip


# If we set a unique CGO_CFLAGS, the installed copy of runtime/cgo
# should be reported as stale.

env CGO_CFLAGS=-DTestScript_cgo_stale=true
stale runtime/cgo


# If we then build a package that uses cgo, runtime/cgo should be rebuilt and
# cached with the new flag, but not installed to GOROOT (and thus still stale).

env GOCACHE=$WORK/cache # Use a fresh cache to avoid interference between runs.

go build -x .
stderr '[/\\]cgo'$GOEXE'["]? .* -importpath runtime/cgo'
stale runtime/cgo


# After runtime/cgo has been rebuilt and cached, it should not be rebuilt again
# even though it is still reported as stale.

go build -x .
! stderr '[/\\]cgo'$GOEXE'["]? .* -importpath runtime/cgo'
stale runtime/cgo


-- go.mod --
module example.com/m

go 1.17
-- m.go --
package m

import "C"
31 changes: 0 additions & 31 deletions src/cmd/go/testdata/script/list_std_stale.txt

This file was deleted.

32 changes: 32 additions & 0 deletions src/cmd/go/testdata/script/list_std_vendor.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# https://golang.org/issue/44725: packages in std should have the same
# dependencies regardless of whether they are listed from within or outside
# GOROOT/src.

# Control case: net, viewed from outside the 'std' module,
# should depend on vendor/golang.org/… instead of golang.org/….

go list -deps net
stdout '^vendor/golang.org/x/net'
! stdout '^golang.org/x/net'
cp stdout $WORK/net-deps.txt


# It should still report the same package dependencies when viewed from
# within GOROOT/src.

cd $GOROOT/src

go list -deps net
stdout '^vendor/golang.org/x/net'
! stdout '^golang.org/x/net'
cmp stdout $WORK/net-deps.txt


# However, 'go mod' and 'go get' subcommands should report the original module
# dependencies, not the vendored packages.

[!net] stop

env GOPROXY=
go mod why -m golang.org/x/net
stdout '^# golang.org/x/net\nnet\ngolang.org/x/net'
2 changes: 0 additions & 2 deletions src/cmd/go/testdata/script/test_race_install_cgo.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@

[!race] skip

[!darwin] ! stale cmd/cgo # The darwin builders are spuriously stale; see #33598.

env GOBIN=$WORK/bin
go install m/mtime m/sametime

Expand Down
6 changes: 6 additions & 0 deletions src/cmd/go/testdata/script/toolexec.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,12 @@
# Build our simple toolexec program.
go build ./cmd/mytool

# Use an ephemeral build cache so that our toolexec output is not cached
# for any stale standard-library dependencies.
#
# TODO(#27628): This should not be necessary.
env GOCACHE=$WORK/gocache

# Build the main package with our toolexec program. For each action, it will
# print the tool's name and the TOOLEXEC_IMPORTPATH value. We expect to compile
# each package once, and link the main package once.
Expand Down
52 changes: 35 additions & 17 deletions src/cmd/link/dwarf_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,36 @@ import (
"testing"
)

// TestMain allows this test binary to run as a -toolexec wrapper for the 'go'
// command. If LINK_TEST_TOOLEXEC is set, TestMain runs the binary as if it were
// cmd/link, and otherwise runs the requested tool as a subprocess.
//
// This allows the test to verify the behavior of the current contents of the
// cmd/link package even if the installed cmd/link binary is stale.
func TestMain(m *testing.M) {
if os.Getenv("LINK_TEST_TOOLEXEC") == "" {
// Not running as a -toolexec wrapper. Just run the tests.
os.Exit(m.Run())
}

if strings.TrimSuffix(filepath.Base(os.Args[1]), ".exe") == "link" {
// Running as a -toolexec linker, and the tool is cmd/link.
// Substitute this test binary for the linker.
os.Args = os.Args[1:]
main()
os.Exit(0)
}

cmd := exec.Command(os.Args[1], os.Args[2:]...)
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
if err := cmd.Run(); err != nil {
os.Exit(1)
}
os.Exit(0)
}

func testDWARF(t *testing.T, buildmode string, expectDWARF bool, env ...string) {
testenv.MustHaveCGO(t)
testenv.MustHaveGoBuild(t)
Expand All @@ -29,17 +59,6 @@ func testDWARF(t *testing.T, buildmode string, expectDWARF bool, env ...string)

t.Parallel()

out, err := exec.Command(testenv.GoToolPath(t), "list", "-f", "{{.Stale}}", "cmd/link").CombinedOutput()
if err != nil {
t.Fatalf("go list: %v\n%s", err, out)
}
if string(out) != "false\n" {
if strings.HasPrefix(testenv.Builder(), "darwin-") {
t.Skipf("cmd/link is spuriously stale on Darwin builders - see #33598")
}
t.Fatalf("cmd/link is stale - run go install cmd/link")
}

for _, prog := range []string{"testprog", "testprogcgo"} {
prog := prog
expectDWARF := expectDWARF
Expand All @@ -48,11 +67,11 @@ func testDWARF(t *testing.T, buildmode string, expectDWARF bool, env ...string)
if extld == "" {
extld = "gcc"
}
var err error
expectDWARF, err = cmddwarf.IsDWARFEnabledOnAIXLd(extld)
if err != nil {
t.Fatal(err)
}

}

t.Run(prog, func(t *testing.T) {
Expand All @@ -62,15 +81,14 @@ func testDWARF(t *testing.T, buildmode string, expectDWARF bool, env ...string)

exe := filepath.Join(tmpDir, prog+".exe")
dir := "../../runtime/testdata/" + prog
cmd := exec.Command(testenv.GoToolPath(t), "build", "-o", exe)
cmd := exec.Command(testenv.GoToolPath(t), "build", "-toolexec", os.Args[0], "-o", exe)
if buildmode != "" {
cmd.Args = append(cmd.Args, "-buildmode", buildmode)
}
cmd.Args = append(cmd.Args, dir)
if env != nil {
cmd.Env = append(os.Environ(), env...)
cmd.Env = append(cmd.Env, "CGO_CFLAGS=") // ensure CGO_CFLAGS does not contain any flags. Issue #35459
}
cmd.Env = append(os.Environ(), env...)
cmd.Env = append(cmd.Env, "CGO_CFLAGS=") // ensure CGO_CFLAGS does not contain any flags. Issue #35459
cmd.Env = append(cmd.Env, "LINK_TEST_TOOLEXEC=1")
out, err := cmd.CombinedOutput()
if err != nil {
t.Fatalf("go build -o %v %v: %v\n%s", exe, dir, err, out)
Expand Down

0 comments on commit 9bc5268

Please sign in to comment.