go/packages: parallelize most tests

This reduces the overall running time on my workstation from ~44s to ~17s.

For golang/go#46764

Change-Id: I94e3c5bf160599687f7aa16513bb7b7e977f14b4
Reviewed-on: https://go-review.googlesource.com/c/tools/+/332350
Trust: Bryan C. Mills <bcmills@google.com>
Run-TryBot: Bryan C. Mills <bcmills@google.com>
gopls-CI: kokoro <noreply+kokoro@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Rebecca Stambler <rstambler@golang.org>
This commit is contained in:
Bryan C. Mills 2021-07-01 17:36:26 -04:00
parent 64bd808b73
commit e688b94517
4 changed files with 31 additions and 2 deletions

View File

@ -496,6 +496,7 @@ func testOverlayNewPackageAndTest(t *testing.T, exporter packagestest.Exporter)
}
func TestAdHocOverlays(t *testing.T) {
t.Parallel()
testenv.NeedsTool(t, "go")
// This test doesn't use packagestest because we are testing ad-hoc packages,
@ -551,6 +552,7 @@ const A = 1
// TestOverlayModFileChanges tests the behavior resulting from having files
// from multiple modules in overlays.
func TestOverlayModFileChanges(t *testing.T) {
t.Parallel()
testenv.NeedsTool(t, "go")
// Create two unrelated modules in a temporary directory.
@ -620,6 +622,8 @@ func main() {}
}
func TestOverlayGOPATHVendoring(t *testing.T) {
t.Parallel()
exported := packagestest.Export(t, packagestest.GOPATH, []packagestest.Module{{
Name: "golang.org/fake",
Files: map[string]interface{}{
@ -1042,6 +1046,8 @@ func Hi() {
// This does not use go/packagestest because it needs to write a replace
// directive with an absolute path in one of the module's go.mod files.
func TestOverlaysInReplace(t *testing.T) {
t.Parallel()
// Create module b.com in a temporary directory. Do not add any Go files
// on disk.
tmpPkgs, err := ioutil.TempDir("", "modules")

View File

@ -57,6 +57,7 @@ func TestMain(m *testing.M) {
// testAllOrModules tests f against all packagestest exporters in long mode,
// but only against the Modules exporter in short mode.
func testAllOrModules(t *testing.T, f func(*testing.T, packagestest.Exporter)) {
t.Parallel()
packagestest.TestAll(t, func(t *testing.T, exporter packagestest.Exporter) {
t.Helper()
@ -70,6 +71,7 @@ func testAllOrModules(t *testing.T, f func(*testing.T, packagestest.Exporter)) {
t.Fatalf("unexpected exporter %q", exporter.Name())
}
t.Parallel()
f(t, exporter)
})
}
@ -95,6 +97,7 @@ func testAllOrModules(t *testing.T, f func(*testing.T, packagestest.Exporter)) {
// The zero-value of Config has LoadFiles mode.
func TestLoadZeroConfig(t *testing.T) {
testenv.NeedsGoPackages(t)
t.Parallel()
initial, err := packages.Load(nil, "hash")
if err != nil {
@ -328,6 +331,8 @@ func testLoadImportsTestVariants(t *testing.T, exporter packagestest.Exporter) {
}
func TestLoadAbsolutePath(t *testing.T) {
t.Parallel()
exported := packagestest.Export(t, packagestest.GOPATH, []packagestest.Module{{
Name: "golang.org/gopatha",
Files: map[string]interface{}{
@ -356,6 +361,8 @@ func TestLoadAbsolutePath(t *testing.T) {
}
func TestVendorImports(t *testing.T) {
t.Parallel()
exported := packagestest.Export(t, packagestest.GOPATH, []packagestest.Module{{
Name: "golang.org/fake",
Files: map[string]interface{}{
@ -911,6 +918,8 @@ func testParseFileModifyAST(t *testing.T, exporter packagestest.Exporter) {
}
func TestAdHocPackagesBadImport(t *testing.T) {
t.Parallel()
// This test doesn't use packagestest because we are testing ad-hoc packages,
// which are outside of $GOPATH and outside of a module.
tmp, err := ioutil.TempDir("", "a")
@ -1399,6 +1408,8 @@ func testJSON(t *testing.T, exporter packagestest.Exporter) {
}
func TestRejectInvalidQueries(t *testing.T) {
t.Parallel()
queries := []string{"key=", "key=value"}
cfg := &packages.Config{
Mode: packages.LoadImports,
@ -1437,7 +1448,11 @@ func testPatternPassthrough(t *testing.T, exporter packagestest.Exporter) {
}
func TestConfigDefaultEnv(t *testing.T) { testAllOrModules(t, testConfigDefaultEnv) }
func TestConfigDefaultEnv(t *testing.T) {
// packagestest.TestAll instead of testAllOrModulesParallel because this test
// can't be parallelized (it modifies the environment).
packagestest.TestAll(t, testConfigDefaultEnv)
}
func testConfigDefaultEnv(t *testing.T, exporter packagestest.Exporter) {
const driverJSON = `{
"Roots": ["gopackagesdriver"],
@ -1829,6 +1844,7 @@ func TestLoadImportsC(t *testing.T) {
// See https://golang.org/issue/27100.
t.Skip(`skipping on plan9; for some reason "net [syscall.test]" is not loaded`)
}
t.Parallel()
testenv.NeedsGoPackages(t)
cfg := &packages.Config{
@ -1887,7 +1903,10 @@ func testCgoNoSyntax(t *testing.T, exporter packagestest.Exporter) {
packages.NeedName | packages.NeedImports,
}
for _, mode := range modes {
mode := mode
t.Run(fmt.Sprint(mode), func(t *testing.T) {
t.Parallel()
exported.Config.Mode = mode
pkgs, err := packages.Load(exported.Config, "golang.org/fake/c")
if err != nil {
@ -2658,6 +2677,8 @@ func main() {
}
func TestEmptyEnvironment(t *testing.T) {
t.Parallel()
cfg := &packages.Config{
Env: []string{"FOO=BAR"},
}

View File

@ -159,6 +159,7 @@ var All []Exporter
func TestAll(t *testing.T, f func(*testing.T, Exporter)) {
t.Helper()
for _, e := range All {
e := e // in case f calls t.Parallel
t.Run(e.Name(), func(t *testing.T) {
t.Helper()
f(t, e)
@ -172,6 +173,7 @@ func TestAll(t *testing.T, f func(*testing.T, Exporter)) {
func BenchmarkAll(b *testing.B, f func(*testing.B, Exporter)) {
b.Helper()
for _, e := range All {
e := e // in case f calls t.Parallel
b.Run(e.Name(), func(b *testing.B) {
b.Helper()
f(b, e)

View File

@ -21,7 +21,7 @@ import (
func TestStdlibMetadata(t *testing.T) {
// TODO(adonovan): see if we can get away without this hack.
// if runtime.GOOS == "android" {
// t.Skipf("incomplete std lib on %s", runtime.GOOS)
// t.Skipf("incomplete std lib on %s", runtime.GOOS)
// }
testenv.NeedsGoPackages(t)