blob: ac8b46ad0c8668cc7b12cae3d8351b4854f101e7 [file] [log] [blame]
// Copyright 2021 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package main
import (
func goTest(tcs []*toolchain) error {
for _, tc := range tcs {
log.Printf("Running Go test benchmarks for %s", tc.Name)
fmt.Printf("toolchain: %s\n", tc.Name)
err := tc.Do("", "test", "-v", "-run=none", "-short", "-bench=.", "-count=5", "")
if err != nil {
return fmt.Errorf("error running gotest with toolchain %s: %w", tc.Name, err)
return nil
// goTestSubrepo runs subrepo tests for the subrepo x/<subRepo>, where the
// baseline commit is checked out in baselineDir, and the experiment commit is
// checked out in experimentDir.
// To run subrepo tests locally, use this incantation:
// ./bench -wait=false \
// -repository=tools \
// -subrepo=/path/to/experiment \
// -subrepo-baseline=/path/to/baseline \
// -goroot-baseline=$(go env GOROOT)
func goTestSubrepo(tc *toolchain, subRepo, baselineDir, experimentDir string) error {
// Note: tests must write "toolchain: baseline|experiment" to stdout before
// running benchmarks for the corresponding commit, as this is parsed as a
// benchmark tag.
switch subRepo {
case "tools":
log.Printf("Running sub-repo benchmarks for %s", subRepo)
// Gopls tests run benchmarks defined in the experimentDir (i.e. the latest
// versions of the benchmarks themselves).
// Benchmarks all communicate with a separate gopls process, which can be
// configured via the -gopls_path flag.
// By convention, gopls uses -short to define tests that should be run by
// x/benchmarks.
benchmarkDir := filepath.Join(experimentDir, "gopls", "internal", "test", "integration", "bench")
tests := []struct {
name string // toolchain name
goplsDir string // dir where gopls should be built
{"baseline", filepath.Join(baselineDir, "gopls")},
{"experiment", filepath.Join(experimentDir, "gopls")},
for _, test := range tests {
err := tc.Do(test.goplsDir, "build")
if err != nil {
return fmt.Errorf("error building sub-repo %s with toolchain %s in dir %s: %w", subRepo, tc.Name, test.goplsDir, err)
fmt.Printf("toolchain: %s\n", // set the toolchain tag
goplsPath := filepath.Join(test.goplsDir, "gopls")
err = tc.Do(benchmarkDir, "test", "-short", "-bench=.", fmt.Sprintf(`-gopls_path=%s`, goplsPath), "-count=5", "-timeout=180m")
if err != nil {
return fmt.Errorf("error running sub-repo %s benchmark %q with toolchain %s in dir %s: %w", subRepo,, tc.Name, benchmarkDir, err)
return fmt.Errorf("unsupported subrepo %s", subRepo)
return nil