var TestMainDeps … type TestCover … // TestPackagesFor is like TestPackagesAndErrors but it returns // an error if the test packages or their dependencies have errors. // Only test packages without errors are returned. func TestPackagesFor(ctx context.Context, opts PackageOpts, p *Package, cover *TestCover) (pmain, ptest, pxtest *Package, err error) { … } // TestPackagesAndErrors returns three packages: // - pmain, the package main corresponding to the test binary (running tests in ptest and pxtest). // - ptest, the package p compiled with added "package p" test files. // - pxtest, the result of compiling any "package p_test" (external) test files. // // If the package has no "package p_test" test files, pxtest will be nil. // If the non-test compilation of package p can be reused // (for example, if there are no "package p" test files and // package p need not be instrumented for coverage or any other reason), // then the returned ptest == p. // // If done is non-nil, TestPackagesAndErrors will finish filling out the returned // package structs in a goroutine and call done once finished. The members of the // returned packages should not be accessed until done is called. // // The caller is expected to have checked that len(p.TestGoFiles)+len(p.XTestGoFiles) > 0, // or else there's no point in any of this. func TestPackagesAndErrors(ctx context.Context, done func(), opts PackageOpts, p *Package, cover *TestCover) (pmain, ptest, pxtest *Package) { … } // recompileForTest copies and replaces certain packages in pmain's dependency // graph. This is necessary for two reasons. First, if ptest is different than // preal, packages that import the package under test should get ptest instead // of preal. This is particularly important if pxtest depends on functionality // exposed in test sources in ptest. Second, if there is a main package // (other than pmain) anywhere, we need to set p.Internal.ForceLibrary and // clear p.Internal.BuildInfo in the test copy to prevent link conflicts. // This may happen if both -coverpkg and the command line patterns include // multiple main packages. func recompileForTest(pmain, preal, ptest, pxtest *Package) *PackageError { … } // isTestFunc tells whether fn has the type of a testing function. arg // specifies the parameter type we look for: B, F, M or T. func isTestFunc(fn *ast.FuncDecl, arg string) bool { … } // isTest tells whether name looks like a test (or benchmark, according to prefix). // It is a Test (say) if there is a character after Test that is not a lower-case letter. // We don't want TesticularCancer. func isTest(name, prefix string) bool { … } type coverInfo … // loadTestFuncs returns the testFuncs describing the tests that will be run. // The returned testFuncs is always non-nil, even if an error occurred while // processing test files. func loadTestFuncs(ptest *Package) (*testFuncs, error) { … } // formatTestmain returns the content of the _testmain.go file for t. func formatTestmain(t *testFuncs) ([]byte, error) { … } type testFuncs … // ImportPath returns the import path of the package being tested, if it is within GOPATH. // This is printed by the testing package when running benchmarks. func (t *testFuncs) ImportPath() string { … } // Covered returns a string describing which packages are being tested for coverage. // If the covered package is the same as the tested package, it returns the empty string. // Otherwise it is a comma-separated human-readable list of packages beginning with // " in", ready for use in the coverage message. func (t *testFuncs) Covered() string { … } func (t *testFuncs) CoverSelectedPackages() string { … } // Tested returns the name of the package being tested. func (t *testFuncs) Tested() string { … } type testFunc … var testFileSet … func (t *testFuncs) load(filename, pkg string, doImport, seen *bool) error { … } func checkTestFunc(fn *ast.FuncDecl, arg string) error { … } var testmainTmpl … var testmainTmplNewCoverage …