aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/cmd/dist/test.go195
1 files changed, 92 insertions, 103 deletions
diff --git a/src/cmd/dist/test.go b/src/cmd/dist/test.go
index 31265d6eca..b6d2948588 100644
--- a/src/cmd/dist/test.go
+++ b/src/cmd/dist/test.go
@@ -70,7 +70,8 @@ type tester struct {
cgoEnabled bool
partial bool
- tests []distTest
+ tests []distTest // use addTest to extend
+ testNames map[string]bool
timeoutScale int
worklist []*work
@@ -193,7 +194,7 @@ func (t *tester) run() {
}
for _, name := range t.runNames {
- if !t.isRegisteredTestName(name) {
+ if !t.testNames[name] {
fatalf("unknown test %q", name)
}
}
@@ -471,31 +472,27 @@ func (t *tester) registerStdTest(pkg string) {
stdMatches = append(stdMatches, pkg)
}
- t.tests = append(t.tests, distTest{
- name: testName,
- heading: heading,
- fn: func(dt *distTest) error {
- if ranGoTest {
- return nil
- }
- t.runPending(dt)
- timelog("start", dt.name)
- defer timelog("end", dt.name)
- ranGoTest = true
+ t.addTest(testName, heading, func(dt *distTest) error {
+ if ranGoTest {
+ return nil
+ }
+ t.runPending(dt)
+ timelog("start", dt.name)
+ defer timelog("end", dt.name)
+ ranGoTest = true
- timeoutSec := 180 * time.Second
- for _, pkg := range stdMatches {
- if pkg == "cmd/go" {
- timeoutSec *= 3
- break
- }
+ timeoutSec := 180 * time.Second
+ for _, pkg := range stdMatches {
+ if pkg == "cmd/go" {
+ timeoutSec *= 3
+ break
}
- return (&goTest{
- timeout: timeoutSec,
- gcflags: gcflags,
- pkgs: stdMatches,
- }).run(t)
- },
+ }
+ return (&goTest{
+ timeout: timeoutSec,
+ gcflags: gcflags,
+ pkgs: stdMatches,
+ }).run(t)
})
}
@@ -504,25 +501,21 @@ func (t *tester) registerRaceBenchTest(pkg string) {
if t.runRx == nil || t.runRx.MatchString(testName) == t.runRxWant {
benchMatches = append(benchMatches, pkg)
}
- t.tests = append(t.tests, distTest{
- name: testName,
- heading: "Running benchmarks briefly.",
- fn: func(dt *distTest) error {
- if ranGoBench {
- return nil
- }
- t.runPending(dt)
- timelog("start", dt.name)
- defer timelog("end", dt.name)
- ranGoBench = true
- return (&goTest{
- timeout: 1200 * time.Second, // longer timeout for race with benchmarks
- race: true,
- bench: true,
- cpu: "4",
- pkgs: benchMatches,
- }).run(t)
- },
+ t.addTest(testName, "Running benchmarks briefly.", func(dt *distTest) error {
+ if ranGoBench {
+ return nil
+ }
+ t.runPending(dt)
+ timelog("start", dt.name)
+ defer timelog("end", dt.name)
+ ranGoBench = true
+ return (&goTest{
+ timeout: 1200 * time.Second, // longer timeout for race with benchmarks
+ race: true,
+ bench: true,
+ cpu: "4",
+ pkgs: benchMatches,
+ }).run(t)
})
}
@@ -688,43 +681,39 @@ func (t *tester) registerTests() {
// Fails on Android, js/wasm and wasip1/wasm with an exec format error.
// Fails on plan9 with "cannot find GOROOT" (issue #21016).
if os.Getenv("GO_BUILDER_NAME") != "" && goos != "android" && !t.iOS() && goos != "plan9" && goos != "js" && goos != "wasip1" {
- t.tests = append(t.tests, distTest{
- name: "moved_goroot",
- heading: "moved GOROOT",
- fn: func(dt *distTest) error {
- t.runPending(dt)
- timelog("start", dt.name)
- defer timelog("end", dt.name)
- moved := goroot + "-moved"
- if err := os.Rename(goroot, moved); err != nil {
- if goos == "windows" {
- // Fails on Windows (with "Access is denied") if a process
- // or binary is in this directory. For instance, using all.bat
- // when run from c:\workdir\go\src fails here
- // if GO_BUILDER_NAME is set. Our builders invoke tests
- // a different way which happens to work when sharding
- // tests, but we should be tolerant of the non-sharded
- // all.bat case.
- log.Printf("skipping test on Windows")
- return nil
- }
- return err
- }
-
- // Run `go test fmt` in the moved GOROOT, without explicitly setting
- // GOROOT in the environment. The 'go' command should find itself.
- cmd := (&goTest{
- goroot: moved,
- pkg: "fmt",
- }).command(t)
- unsetEnv(cmd, "GOROOT")
- err := cmd.Run()
-
- if rerr := os.Rename(moved, goroot); rerr != nil {
- fatalf("failed to restore GOROOT: %v", rerr)
+ t.addTest("moved_goroot", "moved GOROOT", func(dt *distTest) error {
+ t.runPending(dt)
+ timelog("start", dt.name)
+ defer timelog("end", dt.name)
+ moved := goroot + "-moved"
+ if err := os.Rename(goroot, moved); err != nil {
+ if goos == "windows" {
+ // Fails on Windows (with "Access is denied") if a process
+ // or binary is in this directory. For instance, using all.bat
+ // when run from c:\workdir\go\src fails here
+ // if GO_BUILDER_NAME is set. Our builders invoke tests
+ // a different way which happens to work when sharding
+ // tests, but we should be tolerant of the non-sharded
+ // all.bat case.
+ log.Printf("skipping test on Windows")
+ return nil
}
return err
- },
+ }
+
+ // Run `go test fmt` in the moved GOROOT, without explicitly setting
+ // GOROOT in the environment. The 'go' command should find itself.
+ cmd := (&goTest{
+ goroot: moved,
+ pkg: "fmt",
+ }).command(t)
+ unsetEnv(cmd, "GOROOT")
+ err := cmd.Run()
+
+ if rerr := os.Rename(moved, goroot); rerr != nil {
+ fatalf("failed to restore GOROOT: %v", rerr)
+ }
+ return err
})
}
@@ -868,15 +857,22 @@ func (t *tester) registerTests() {
}
}
-// isRegisteredTestName reports whether a test named testName has already
-// been registered.
-func (t *tester) isRegisteredTestName(testName string) bool {
- for _, tt := range t.tests {
- if tt.name == testName {
- return true
- }
+// addTest adds an arbitrary test callback to the test list.
+//
+// name must uniquely identify the test.
+func (t *tester) addTest(name, heading string, fn func(*distTest) error) {
+ if t.testNames[name] {
+ panic("duplicate registered test name " + name)
}
- return false
+ if t.testNames == nil {
+ t.testNames = make(map[string]bool)
+ }
+ t.testNames[name] = true
+ t.tests = append(t.tests, distTest{
+ name: name,
+ heading: heading,
+ fn: fn,
+ })
}
type registerTestOpt interface {
@@ -902,29 +898,22 @@ func (t *tester) registerTest(name, heading string, test *goTest, opts ...regist
preFunc = opt.pre
}
}
- if t.isRegisteredTestName(name) {
- panic("duplicate registered test name " + name)
- }
if heading == "" {
if test.pkg == "" {
panic("either heading or test.pkg must be set")
}
heading = test.pkg
}
- t.tests = append(t.tests, distTest{
- name: name,
- heading: heading,
- fn: func(dt *distTest) error {
- if preFunc != nil && !preFunc(dt) {
- return nil
- }
- w := &work{
- dt: dt,
- cmd: test.bgCommand(t),
- }
- t.worklist = append(t.worklist, w)
+ t.addTest(name, heading, func(dt *distTest) error {
+ if preFunc != nil && !preFunc(dt) {
return nil
- },
+ }
+ w := &work{
+ dt: dt,
+ cmd: test.bgCommand(t),
+ }
+ t.worklist = append(t.worklist, w)
+ return nil
})
}