github.com/fenixara/go@v0.0.0-20170127160404-96ea0918e670/src/cmd/go/test.go (about)

     1  // Copyright 2011 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package main
     6  
     7  import (
     8  	"bytes"
     9  	"errors"
    10  	"fmt"
    11  	"go/ast"
    12  	"go/build"
    13  	"go/doc"
    14  	"go/parser"
    15  	"go/token"
    16  	"os"
    17  	"os/exec"
    18  	"path"
    19  	"path/filepath"
    20  	"regexp"
    21  	"runtime"
    22  	"sort"
    23  	"strings"
    24  	"text/template"
    25  	"time"
    26  	"unicode"
    27  	"unicode/utf8"
    28  )
    29  
    30  // Break init loop.
    31  func init() {
    32  	cmdTest.Run = runTest
    33  }
    34  
    35  const testUsage = "test [build/test flags] [packages] [build/test flags & test binary flags]"
    36  
    37  var cmdTest = &Command{
    38  	CustomFlags: true,
    39  	UsageLine:   testUsage,
    40  	Short:       "test packages",
    41  	Long: `
    42  'Go test' automates testing the packages named by the import paths.
    43  It prints a summary of the test results in the format:
    44  
    45  	ok   archive/tar   0.011s
    46  	FAIL archive/zip   0.022s
    47  	ok   compress/gzip 0.033s
    48  	...
    49  
    50  followed by detailed output for each failed package.
    51  
    52  'Go test' recompiles each package along with any files with names matching
    53  the file pattern "*_test.go".
    54  Files whose names begin with "_" (including "_test.go") or "." are ignored.
    55  These additional files can contain test functions, benchmark functions, and
    56  example functions.  See 'go help testfunc' for more.
    57  Each listed package causes the execution of a separate test binary.
    58  
    59  Test files that declare a package with the suffix "_test" will be compiled as a
    60  separate package, and then linked and run with the main test binary.
    61  
    62  The go tool will ignore a directory named "testdata", making it available
    63  to hold ancillary data needed by the tests.
    64  
    65  By default, go test needs no arguments.  It compiles and tests the package
    66  with source in the current directory, including tests, and runs the tests.
    67  
    68  The package is built in a temporary directory so it does not interfere with the
    69  non-test installation.
    70  
    71  ` + strings.TrimSpace(testFlag1) + ` See 'go help testflag' for details.
    72  
    73  For more about build flags, see 'go help build'.
    74  For more about specifying packages, see 'go help packages'.
    75  
    76  See also: go build, go vet.
    77  `,
    78  }
    79  
    80  const testFlag1 = `
    81  In addition to the build flags, the flags handled by 'go test' itself are:
    82  
    83  	-args
    84  	    Pass the remainder of the command line (everything after -args)
    85  	    to the test binary, uninterpreted and unchanged.
    86  	    Because this flag consumes the remainder of the command line,
    87  	    the package list (if present) must appear before this flag.
    88  
    89  	-c
    90  	    Compile the test binary to pkg.test but do not run it
    91  	    (where pkg is the last element of the package's import path).
    92  	    The file name can be changed with the -o flag.
    93  
    94  	-exec xprog
    95  	    Run the test binary using xprog. The behavior is the same as
    96  	    in 'go run'. See 'go help run' for details.
    97  
    98  	-i
    99  	    Install packages that are dependencies of the test.
   100  	    Do not run the test.
   101  
   102  	-o file
   103  	    Compile the test binary to the named file.
   104  	    The test still runs (unless -c or -i is specified).
   105  
   106  The test binary also accepts flags that control execution of the test; these
   107  flags are also accessible by 'go test'.
   108  `
   109  
   110  var helpTestflag = &Command{
   111  	UsageLine: "testflag",
   112  	Short:     "description of testing flags",
   113  	Long: `
   114  The 'go test' command takes both flags that apply to 'go test' itself
   115  and flags that apply to the resulting test binary.
   116  
   117  Several of the flags control profiling and write an execution profile
   118  suitable for "go tool pprof"; run "go tool pprof -h" for more
   119  information.  The --alloc_space, --alloc_objects, and --show_bytes
   120  options of pprof control how the information is presented.
   121  
   122  The following flags are recognized by the 'go test' command and
   123  control the execution of any test:
   124  
   125  	` + strings.TrimSpace(testFlag2) + `
   126  `,
   127  }
   128  
   129  const testFlag2 = `
   130  	-bench regexp
   131  	    Run (sub)benchmarks matching a regular expression.
   132  	    The given regular expression is split into smaller ones by
   133  	    top-level '/', where each must match the corresponding part of a
   134  	    benchmark's identifier.
   135  	    By default, no benchmarks run. To run all benchmarks,
   136  	    use '-bench .' or '-bench=.'.
   137  
   138  	-benchtime t
   139  	    Run enough iterations of each benchmark to take t, specified
   140  	    as a time.Duration (for example, -benchtime 1h30s).
   141  	    The default is 1 second (1s).
   142  
   143  	-count n
   144  	    Run each test and benchmark n times (default 1).
   145  	    If -cpu is set, run n times for each GOMAXPROCS value.
   146  	    Examples are always run once.
   147  
   148  	-cover
   149  	    Enable coverage analysis.
   150  
   151  	-covermode set,count,atomic
   152  	    Set the mode for coverage analysis for the package[s]
   153  	    being tested. The default is "set" unless -race is enabled,
   154  	    in which case it is "atomic".
   155  	    The values:
   156  		set: bool: does this statement run?
   157  		count: int: how many times does this statement run?
   158  		atomic: int: count, but correct in multithreaded tests;
   159  			significantly more expensive.
   160  	    Sets -cover.
   161  
   162  	-coverpkg pkg1,pkg2,pkg3
   163  	    Apply coverage analysis in each test to the given list of packages.
   164  	    The default is for each test to analyze only the package being tested.
   165  	    Packages are specified as import paths.
   166  	    Sets -cover.
   167  
   168  	-cpu 1,2,4
   169  	    Specify a list of GOMAXPROCS values for which the tests or
   170  	    benchmarks should be executed.  The default is the current value
   171  	    of GOMAXPROCS.
   172  
   173  	-parallel n
   174  	    Allow parallel execution of test functions that call t.Parallel.
   175  	    The value of this flag is the maximum number of tests to run
   176  	    simultaneously; by default, it is set to the value of GOMAXPROCS.
   177  	    Note that -parallel only applies within a single test binary.
   178  	    The 'go test' command may run tests for different packages
   179  	    in parallel as well, according to the setting of the -p flag
   180  	    (see 'go help build').
   181  
   182  	-run regexp
   183  	    Run only those tests and examples matching the regular expression.
   184  	    For tests the regular expression is split into smaller ones by
   185  	    top-level '/', where each must match the corresponding part of a
   186  	    test's identifier.
   187  
   188  	-short
   189  	    Tell long-running tests to shorten their run time.
   190  	    It is off by default but set during all.bash so that installing
   191  	    the Go tree can run a sanity check but not spend time running
   192  	    exhaustive tests.
   193  
   194  	-timeout t
   195  	    If a test runs longer than t, panic.
   196  	    The default is 10 minutes (10m).
   197  
   198  	-v
   199  	    Verbose output: log all tests as they are run. Also print all
   200  	    text from Log and Logf calls even if the test succeeds.
   201  
   202  The following flags are also recognized by 'go test' and can be used to
   203  profile the tests during execution:
   204  
   205  	-benchmem
   206  	    Print memory allocation statistics for benchmarks.
   207  
   208  	-blockprofile block.out
   209  	    Write a goroutine blocking profile to the specified file
   210  	    when all tests are complete.
   211  	    Writes test binary as -c would.
   212  
   213  	-blockprofilerate n
   214  	    Control the detail provided in goroutine blocking profiles by
   215  	    calling runtime.SetBlockProfileRate with n.
   216  	    See 'go doc runtime.SetBlockProfileRate'.
   217  	    The profiler aims to sample, on average, one blocking event every
   218  	    n nanoseconds the program spends blocked.  By default,
   219  	    if -test.blockprofile is set without this flag, all blocking events
   220  	    are recorded, equivalent to -test.blockprofilerate=1.
   221  
   222  	-coverprofile cover.out
   223  	    Write a coverage profile to the file after all tests have passed.
   224  	    Sets -cover.
   225  
   226  	-cpuprofile cpu.out
   227  	    Write a CPU profile to the specified file before exiting.
   228  	    Writes test binary as -c would.
   229  
   230  	-memprofile mem.out
   231  	    Write a memory profile to the file after all tests have passed.
   232  	    Writes test binary as -c would.
   233  
   234  	-memprofilerate n
   235  	    Enable more precise (and expensive) memory profiles by setting
   236  	    runtime.MemProfileRate.  See 'go doc runtime.MemProfileRate'.
   237  	    To profile all memory allocations, use -test.memprofilerate=1
   238  	    and pass --alloc_space flag to the pprof tool.
   239  
   240  	-mutexprofile mutex.out
   241  	    Write a mutex contention profile to the specified file
   242  	    when all tests are complete.
   243  	    Writes test binary as -c would.
   244  
   245  	-mutexprofilefraction n
   246  	    Sample 1 in n stack traces of goroutines holding a
   247  	    contended mutex.
   248  
   249  	-outputdir directory
   250  	    Place output files from profiling in the specified directory,
   251  	    by default the directory in which "go test" is running.
   252  
   253  	-trace trace.out
   254  	    Write an execution trace to the specified file before exiting.
   255  
   256  Each of these flags is also recognized with an optional 'test.' prefix,
   257  as in -test.v. When invoking the generated test binary (the result of
   258  'go test -c') directly, however, the prefix is mandatory.
   259  
   260  The 'go test' command rewrites or removes recognized flags,
   261  as appropriate, both before and after the optional package list,
   262  before invoking the test binary.
   263  
   264  For instance, the command
   265  
   266  	go test -v -myflag testdata -cpuprofile=prof.out -x
   267  
   268  will compile the test binary and then run it as
   269  
   270  	pkg.test -test.v -myflag testdata -test.cpuprofile=prof.out
   271  
   272  (The -x flag is removed because it applies only to the go command's
   273  execution, not to the test itself.)
   274  
   275  The test flags that generate profiles (other than for coverage) also
   276  leave the test binary in pkg.test for use when analyzing the profiles.
   277  
   278  When 'go test' runs a test binary, it does so from within the
   279  corresponding package's source code directory. Depending on the test,
   280  it may be necessary to do the same when invoking a generated test
   281  binary directly.
   282  
   283  The command-line package list, if present, must appear before any
   284  flag not known to the go test command. Continuing the example above,
   285  the package list would have to appear before -myflag, but could appear
   286  on either side of -v.
   287  
   288  To keep an argument for a test binary from being interpreted as a
   289  known flag or a package name, use -args (see 'go help test') which
   290  passes the remainder of the command line through to the test binary
   291  uninterpreted and unaltered.
   292  
   293  For instance, the command
   294  
   295  	go test -v -args -x -v
   296  
   297  will compile the test binary and then run it as
   298  
   299  	pkg.test -test.v -x -v
   300  
   301  Similarly,
   302  
   303  	go test -args math
   304  
   305  will compile the test binary and then run it as
   306  
   307  	pkg.test math
   308  
   309  In the first example, the -x and the second -v are passed through to the
   310  test binary unchanged and with no effect on the go command itself.
   311  In the second example, the argument math is passed through to the test
   312  binary, instead of being interpreted as the package list.
   313  `
   314  
   315  var helpTestfunc = &Command{
   316  	UsageLine: "testfunc",
   317  	Short:     "description of testing functions",
   318  	Long: `
   319  The 'go test' command expects to find test, benchmark, and example functions
   320  in the "*_test.go" files corresponding to the package under test.
   321  
   322  A test function is one named TestXXX (where XXX is any alphanumeric string
   323  not starting with a lower case letter) and should have the signature,
   324  
   325  	func TestXXX(t *testing.T) { ... }
   326  
   327  A benchmark function is one named BenchmarkXXX and should have the signature,
   328  
   329  	func BenchmarkXXX(b *testing.B) { ... }
   330  
   331  An example function is similar to a test function but, instead of using
   332  *testing.T to report success or failure, prints output to os.Stdout.
   333  If the last comment in the function starts with "Output:" then the output
   334  is compared exactly against the comment (see examples below). If the last
   335  comment begins with "Unordered output:" then the output is compared to the
   336  comment, however the order of the lines is ignored. An example with no such
   337  comment is compiled but not executed. An example with no text after
   338  "Output:" is compiled, executed, and expected to produce no output.
   339  
   340  Godoc displays the body of ExampleXXX to demonstrate the use
   341  of the function, constant, or variable XXX.  An example of a method M with
   342  receiver type T or *T is named ExampleT_M.  There may be multiple examples
   343  for a given function, constant, or variable, distinguished by a trailing _xxx,
   344  where xxx is a suffix not beginning with an upper case letter.
   345  
   346  Here is an example of an example:
   347  
   348  	func ExamplePrintln() {
   349  		Println("The output of\nthis example.")
   350  		// Output: The output of
   351  		// this example.
   352  	}
   353  
   354  Here is another example where the ordering of the output is ignored:
   355  
   356  	func ExamplePerm() {
   357  		for _, value := range Perm(4) {
   358  			fmt.Println(value)
   359  		}
   360  
   361  		// Unordered output: 4
   362  		// 2
   363  		// 1
   364  		// 3
   365  		// 0
   366  	}
   367  
   368  The entire test file is presented as the example when it contains a single
   369  example function, at least one other function, type, variable, or constant
   370  declaration, and no test or benchmark functions.
   371  
   372  See the documentation of the testing package for more information.
   373  `,
   374  }
   375  
   376  var (
   377  	testC            bool       // -c flag
   378  	testCover        bool       // -cover flag
   379  	testCoverMode    string     // -covermode flag
   380  	testCoverPaths   []string   // -coverpkg flag
   381  	testCoverPkgs    []*Package // -coverpkg flag
   382  	testO            string     // -o flag
   383  	testProfile      bool       // some profiling flag
   384  	testNeedBinary   bool       // profile needs to keep binary around
   385  	testV            bool       // -v flag
   386  	testTimeout      string     // -timeout flag
   387  	testArgs         []string
   388  	testBench        bool
   389  	testStreamOutput bool // show output as it is generated
   390  	testShowPass     bool // show passing output
   391  
   392  	testKillTimeout = 10 * time.Minute
   393  )
   394  
   395  var testMainDeps = map[string]bool{
   396  	// Dependencies for testmain.
   397  	"testing":                   true,
   398  	"testing/internal/testdeps": true,
   399  	"os": true,
   400  }
   401  
   402  func runTest(cmd *Command, args []string) {
   403  	var pkgArgs []string
   404  	pkgArgs, testArgs = testFlags(args)
   405  
   406  	findExecCmd() // initialize cached result
   407  
   408  	instrumentInit()
   409  	buildModeInit()
   410  	pkgs := packagesForBuild(pkgArgs)
   411  	if len(pkgs) == 0 {
   412  		fatalf("no packages to test")
   413  	}
   414  
   415  	if testC && len(pkgs) != 1 {
   416  		fatalf("cannot use -c flag with multiple packages")
   417  	}
   418  	if testO != "" && len(pkgs) != 1 {
   419  		fatalf("cannot use -o flag with multiple packages")
   420  	}
   421  	if testProfile && len(pkgs) != 1 {
   422  		fatalf("cannot use test profile flag with multiple packages")
   423  	}
   424  
   425  	// If a test timeout was given and is parseable, set our kill timeout
   426  	// to that timeout plus one minute. This is a backup alarm in case
   427  	// the test wedges with a goroutine spinning and its background
   428  	// timer does not get a chance to fire.
   429  	if dt, err := time.ParseDuration(testTimeout); err == nil && dt > 0 {
   430  		testKillTimeout = dt + 1*time.Minute
   431  	}
   432  
   433  	// show passing test output (after buffering) with -v flag.
   434  	// must buffer because tests are running in parallel, and
   435  	// otherwise the output will get mixed.
   436  	testShowPass = testV
   437  
   438  	// stream test output (no buffering) when no package has
   439  	// been given on the command line (implicit current directory)
   440  	// or when benchmarking.
   441  	// Also stream if we're showing output anyway with a
   442  	// single package under test or if parallelism is set to 1.
   443  	// In these cases, streaming the output produces the same result
   444  	// as not streaming, just more immediately.
   445  	testStreamOutput = len(pkgArgs) == 0 || testBench ||
   446  		(testShowPass && (len(pkgs) == 1 || buildP == 1))
   447  
   448  	// For 'go test -i -o x.test', we want to build x.test. Imply -c to make the logic easier.
   449  	if buildI && testO != "" {
   450  		testC = true
   451  	}
   452  
   453  	var b builder
   454  	b.init()
   455  
   456  	if buildI {
   457  		buildV = testV
   458  
   459  		deps := make(map[string]bool)
   460  		for dep := range testMainDeps {
   461  			deps[dep] = true
   462  		}
   463  
   464  		for _, p := range pkgs {
   465  			// Dependencies for each test.
   466  			for _, path := range p.Imports {
   467  				deps[path] = true
   468  			}
   469  			for _, path := range p.vendored(p.TestImports) {
   470  				deps[path] = true
   471  			}
   472  			for _, path := range p.vendored(p.XTestImports) {
   473  				deps[path] = true
   474  			}
   475  		}
   476  
   477  		// translate C to runtime/cgo
   478  		if deps["C"] {
   479  			delete(deps, "C")
   480  			deps["runtime/cgo"] = true
   481  			if goos == runtime.GOOS && goarch == runtime.GOARCH && !buildRace && !buildMSan {
   482  				deps["cmd/cgo"] = true
   483  			}
   484  		}
   485  		// Ignore pseudo-packages.
   486  		delete(deps, "unsafe")
   487  
   488  		all := []string{}
   489  		for path := range deps {
   490  			if !build.IsLocalImport(path) {
   491  				all = append(all, path)
   492  			}
   493  		}
   494  		sort.Strings(all)
   495  
   496  		a := &action{}
   497  		for _, p := range packagesForBuild(all) {
   498  			a.deps = append(a.deps, b.action(modeInstall, modeInstall, p))
   499  		}
   500  		b.do(a)
   501  		if !testC || a.failed {
   502  			return
   503  		}
   504  		b.init()
   505  	}
   506  
   507  	var builds, runs, prints []*action
   508  
   509  	if testCoverPaths != nil {
   510  		// Load packages that were asked about for coverage.
   511  		// packagesForBuild exits if the packages cannot be loaded.
   512  		testCoverPkgs = packagesForBuild(testCoverPaths)
   513  
   514  		// Warn about -coverpkg arguments that are not actually used.
   515  		used := make(map[string]bool)
   516  		for _, p := range pkgs {
   517  			used[p.ImportPath] = true
   518  			for _, dep := range p.Deps {
   519  				used[dep] = true
   520  			}
   521  		}
   522  		for _, p := range testCoverPkgs {
   523  			if !used[p.ImportPath] {
   524  				fmt.Fprintf(os.Stderr, "warning: no packages being tested depend on %s\n", p.ImportPath)
   525  			}
   526  		}
   527  
   528  		// Mark all the coverage packages for rebuilding with coverage.
   529  		for _, p := range testCoverPkgs {
   530  			// There is nothing to cover in package unsafe; it comes from the compiler.
   531  			if p.ImportPath == "unsafe" {
   532  				continue
   533  			}
   534  			p.Stale = true // rebuild
   535  			p.StaleReason = "rebuild for coverage"
   536  			p.fake = true // do not warn about rebuild
   537  			p.coverMode = testCoverMode
   538  			var coverFiles []string
   539  			coverFiles = append(coverFiles, p.GoFiles...)
   540  			coverFiles = append(coverFiles, p.CgoFiles...)
   541  			coverFiles = append(coverFiles, p.TestGoFiles...)
   542  			p.coverVars = declareCoverVars(p.ImportPath, coverFiles...)
   543  		}
   544  	}
   545  
   546  	// Prepare build + run + print actions for all packages being tested.
   547  	for _, p := range pkgs {
   548  		buildTest, runTest, printTest, err := b.test(p)
   549  		if err != nil {
   550  			str := err.Error()
   551  			if strings.HasPrefix(str, "\n") {
   552  				str = str[1:]
   553  			}
   554  			failed := fmt.Sprintf("FAIL\t%s [setup failed]\n", p.ImportPath)
   555  
   556  			if p.ImportPath != "" {
   557  				errorf("# %s\n%s\n%s", p.ImportPath, str, failed)
   558  			} else {
   559  				errorf("%s\n%s", str, failed)
   560  			}
   561  			continue
   562  		}
   563  		builds = append(builds, buildTest)
   564  		runs = append(runs, runTest)
   565  		prints = append(prints, printTest)
   566  	}
   567  
   568  	// Ultimately the goal is to print the output.
   569  	root := &action{deps: prints}
   570  
   571  	// Force the printing of results to happen in order,
   572  	// one at a time.
   573  	for i, a := range prints {
   574  		if i > 0 {
   575  			a.deps = append(a.deps, prints[i-1])
   576  		}
   577  	}
   578  
   579  	// Force benchmarks to run in serial.
   580  	if !testC && testBench {
   581  		// The first run must wait for all builds.
   582  		// Later runs must wait for the previous run's print.
   583  		for i, run := range runs {
   584  			if i == 0 {
   585  				run.deps = append(run.deps, builds...)
   586  			} else {
   587  				run.deps = append(run.deps, prints[i-1])
   588  			}
   589  		}
   590  	}
   591  
   592  	// If we are building any out-of-date packages other
   593  	// than those under test, warn.
   594  	okBuild := map[*Package]bool{}
   595  	for _, p := range pkgs {
   596  		okBuild[p] = true
   597  	}
   598  	warned := false
   599  	for _, a := range actionList(root) {
   600  		if a.p == nil || okBuild[a.p] {
   601  			continue
   602  		}
   603  		okBuild[a.p] = true // warn at most once
   604  
   605  		// Don't warn about packages being rebuilt because of
   606  		// things like coverage analysis.
   607  		for _, p1 := range a.p.imports {
   608  			if p1.fake {
   609  				a.p.fake = true
   610  			}
   611  		}
   612  
   613  		if a.f != nil && !okBuild[a.p] && !a.p.fake && !a.p.local {
   614  			if !warned {
   615  				fmt.Fprintf(os.Stderr, "warning: building out-of-date packages:\n")
   616  				warned = true
   617  			}
   618  			fmt.Fprintf(os.Stderr, "\t%s\n", a.p.ImportPath)
   619  		}
   620  	}
   621  	if warned {
   622  		args := strings.Join(pkgArgs, " ")
   623  		if args != "" {
   624  			args = " " + args
   625  		}
   626  		extraOpts := ""
   627  		if buildRace {
   628  			extraOpts = "-race "
   629  		}
   630  		if buildMSan {
   631  			extraOpts = "-msan "
   632  		}
   633  		fmt.Fprintf(os.Stderr, "installing these packages with 'go test %s-i%s' will speed future tests.\n\n", extraOpts, args)
   634  	}
   635  
   636  	b.do(root)
   637  }
   638  
   639  func contains(x []string, s string) bool {
   640  	for _, t := range x {
   641  		if t == s {
   642  			return true
   643  		}
   644  	}
   645  	return false
   646  }
   647  
   648  var windowsBadWords = []string{
   649  	"install",
   650  	"patch",
   651  	"setup",
   652  	"update",
   653  }
   654  
   655  func (b *builder) test(p *Package) (buildAction, runAction, printAction *action, err error) {
   656  	if len(p.TestGoFiles)+len(p.XTestGoFiles) == 0 {
   657  		build := b.action(modeBuild, modeBuild, p)
   658  		run := &action{p: p, deps: []*action{build}}
   659  		print := &action{f: (*builder).notest, p: p, deps: []*action{run}}
   660  		return build, run, print, nil
   661  	}
   662  
   663  	// Build Package structs describing:
   664  	//	ptest - package + test files
   665  	//	pxtest - package of external test files
   666  	//	pmain - pkg.test binary
   667  	var ptest, pxtest, pmain *Package
   668  
   669  	var imports, ximports []*Package
   670  	var stk importStack
   671  	stk.push(p.ImportPath + " (test)")
   672  	for i, path := range p.TestImports {
   673  		p1 := loadImport(path, p.Dir, p, &stk, p.build.TestImportPos[path], useVendor)
   674  		if p1.Error != nil {
   675  			return nil, nil, nil, p1.Error
   676  		}
   677  		if len(p1.DepsErrors) > 0 {
   678  			err := p1.DepsErrors[0]
   679  			err.Pos = "" // show full import stack
   680  			return nil, nil, nil, err
   681  		}
   682  		if contains(p1.Deps, p.ImportPath) || p1.ImportPath == p.ImportPath {
   683  			// Same error that loadPackage returns (via reusePackage) in pkg.go.
   684  			// Can't change that code, because that code is only for loading the
   685  			// non-test copy of a package.
   686  			err := &PackageError{
   687  				ImportStack:   testImportStack(stk[0], p1, p.ImportPath),
   688  				Err:           "import cycle not allowed in test",
   689  				isImportCycle: true,
   690  			}
   691  			return nil, nil, nil, err
   692  		}
   693  		p.TestImports[i] = p1.ImportPath
   694  		imports = append(imports, p1)
   695  	}
   696  	stk.pop()
   697  	stk.push(p.ImportPath + "_test")
   698  	pxtestNeedsPtest := false
   699  	for i, path := range p.XTestImports {
   700  		p1 := loadImport(path, p.Dir, p, &stk, p.build.XTestImportPos[path], useVendor)
   701  		if p1.Error != nil {
   702  			return nil, nil, nil, p1.Error
   703  		}
   704  		if len(p1.DepsErrors) > 0 {
   705  			err := p1.DepsErrors[0]
   706  			err.Pos = "" // show full import stack
   707  			return nil, nil, nil, err
   708  		}
   709  		if p1.ImportPath == p.ImportPath {
   710  			pxtestNeedsPtest = true
   711  		} else {
   712  			ximports = append(ximports, p1)
   713  		}
   714  		p.XTestImports[i] = p1.ImportPath
   715  	}
   716  	stk.pop()
   717  
   718  	// Use last element of import path, not package name.
   719  	// They differ when package name is "main".
   720  	// But if the import path is "command-line-arguments",
   721  	// like it is during 'go run', use the package name.
   722  	var elem string
   723  	if p.ImportPath == "command-line-arguments" {
   724  		elem = p.Name
   725  	} else {
   726  		_, elem = path.Split(p.ImportPath)
   727  	}
   728  	testBinary := elem + ".test"
   729  
   730  	// The ptest package needs to be importable under the
   731  	// same import path that p has, but we cannot put it in
   732  	// the usual place in the temporary tree, because then
   733  	// other tests will see it as the real package.
   734  	// Instead we make a _test directory under the import path
   735  	// and then repeat the import path there. We tell the
   736  	// compiler and linker to look in that _test directory first.
   737  	//
   738  	// That is, if the package under test is unicode/utf8,
   739  	// then the normal place to write the package archive is
   740  	// $WORK/unicode/utf8.a, but we write the test package archive to
   741  	// $WORK/unicode/utf8/_test/unicode/utf8.a.
   742  	// We write the external test package archive to
   743  	// $WORK/unicode/utf8/_test/unicode/utf8_test.a.
   744  	testDir := filepath.Join(b.work, filepath.FromSlash(p.ImportPath+"/_test"))
   745  	ptestObj := buildToolchain.pkgpath(testDir, p)
   746  
   747  	// Create the directory for the .a files.
   748  	ptestDir, _ := filepath.Split(ptestObj)
   749  	if err := b.mkdir(ptestDir); err != nil {
   750  		return nil, nil, nil, err
   751  	}
   752  
   753  	// Should we apply coverage analysis locally,
   754  	// only for this package and only for this test?
   755  	// Yes, if -cover is on but -coverpkg has not specified
   756  	// a list of packages for global coverage.
   757  	localCover := testCover && testCoverPaths == nil
   758  
   759  	// Test package.
   760  	if len(p.TestGoFiles) > 0 || localCover || p.Name == "main" {
   761  		ptest = new(Package)
   762  		*ptest = *p
   763  		ptest.GoFiles = nil
   764  		ptest.GoFiles = append(ptest.GoFiles, p.GoFiles...)
   765  		ptest.GoFiles = append(ptest.GoFiles, p.TestGoFiles...)
   766  		ptest.target = ""
   767  		ptest.Imports = stringList(p.Imports, p.TestImports)
   768  		ptest.imports = append(append([]*Package{}, p.imports...), imports...)
   769  		ptest.pkgdir = testDir
   770  		ptest.fake = true
   771  		ptest.forceLibrary = true
   772  		ptest.Stale = true
   773  		ptest.StaleReason = "rebuild for test"
   774  		ptest.build = new(build.Package)
   775  		*ptest.build = *p.build
   776  		m := map[string][]token.Position{}
   777  		for k, v := range p.build.ImportPos {
   778  			m[k] = append(m[k], v...)
   779  		}
   780  		for k, v := range p.build.TestImportPos {
   781  			m[k] = append(m[k], v...)
   782  		}
   783  		ptest.build.ImportPos = m
   784  
   785  		if localCover {
   786  			ptest.coverMode = testCoverMode
   787  			var coverFiles []string
   788  			coverFiles = append(coverFiles, ptest.GoFiles...)
   789  			coverFiles = append(coverFiles, ptest.CgoFiles...)
   790  			ptest.coverVars = declareCoverVars(ptest.ImportPath, coverFiles...)
   791  		}
   792  	} else {
   793  		ptest = p
   794  	}
   795  
   796  	// External test package.
   797  	if len(p.XTestGoFiles) > 0 {
   798  		pxtest = &Package{
   799  			Name:        p.Name + "_test",
   800  			ImportPath:  p.ImportPath + "_test",
   801  			localPrefix: p.localPrefix,
   802  			Root:        p.Root,
   803  			Dir:         p.Dir,
   804  			GoFiles:     p.XTestGoFiles,
   805  			Imports:     p.XTestImports,
   806  			build: &build.Package{
   807  				ImportPos: p.build.XTestImportPos,
   808  			},
   809  			imports:  ximports,
   810  			pkgdir:   testDir,
   811  			fake:     true,
   812  			external: true,
   813  			Stale:    true,
   814  		}
   815  		if pxtestNeedsPtest {
   816  			pxtest.imports = append(pxtest.imports, ptest)
   817  		}
   818  	}
   819  
   820  	// Action for building pkg.test.
   821  	pmain = &Package{
   822  		Name:       "main",
   823  		Dir:        testDir,
   824  		GoFiles:    []string{"_testmain.go"},
   825  		ImportPath: "testmain",
   826  		Root:       p.Root,
   827  		build:      &build.Package{Name: "main"},
   828  		pkgdir:     testDir,
   829  		fake:       true,
   830  		Stale:      true,
   831  		omitDWARF:  !testC && !testNeedBinary,
   832  	}
   833  
   834  	// The generated main also imports testing, regexp, and os.
   835  	stk.push("testmain")
   836  	for dep := range testMainDeps {
   837  		if dep == ptest.ImportPath {
   838  			pmain.imports = append(pmain.imports, ptest)
   839  		} else {
   840  			p1 := loadImport(dep, "", nil, &stk, nil, 0)
   841  			if p1.Error != nil {
   842  				return nil, nil, nil, p1.Error
   843  			}
   844  			pmain.imports = append(pmain.imports, p1)
   845  		}
   846  	}
   847  
   848  	if testCoverPkgs != nil {
   849  		// Add imports, but avoid duplicates.
   850  		seen := map[*Package]bool{p: true, ptest: true}
   851  		for _, p1 := range pmain.imports {
   852  			seen[p1] = true
   853  		}
   854  		for _, p1 := range testCoverPkgs {
   855  			if !seen[p1] {
   856  				seen[p1] = true
   857  				pmain.imports = append(pmain.imports, p1)
   858  			}
   859  		}
   860  	}
   861  
   862  	// Do initial scan for metadata needed for writing _testmain.go
   863  	// Use that metadata to update the list of imports for package main.
   864  	// The list of imports is used by recompileForTest and by the loop
   865  	// afterward that gathers t.Cover information.
   866  	t, err := loadTestFuncs(ptest)
   867  	if err != nil {
   868  		return nil, nil, nil, err
   869  	}
   870  	if len(ptest.GoFiles)+len(ptest.CgoFiles) > 0 {
   871  		pmain.imports = append(pmain.imports, ptest)
   872  		t.ImportTest = true
   873  	}
   874  	if pxtest != nil {
   875  		pmain.imports = append(pmain.imports, pxtest)
   876  		t.ImportXtest = true
   877  	}
   878  
   879  	if ptest != p && localCover {
   880  		// We have made modifications to the package p being tested
   881  		// and are rebuilding p (as ptest), writing it to the testDir tree.
   882  		// Arrange to rebuild, writing to that same tree, all packages q
   883  		// such that the test depends on q, and q depends on p.
   884  		// This makes sure that q sees the modifications to p.
   885  		// Strictly speaking, the rebuild is only necessary if the
   886  		// modifications to p change its export metadata, but
   887  		// determining that is a bit tricky, so we rebuild always.
   888  		//
   889  		// This will cause extra compilation, so for now we only do it
   890  		// when testCover is set. The conditions are more general, though,
   891  		// and we may find that we need to do it always in the future.
   892  		recompileForTest(pmain, p, ptest, testDir)
   893  	}
   894  
   895  	if buildContext.GOOS == "darwin" {
   896  		if buildContext.GOARCH == "arm" || buildContext.GOARCH == "arm64" {
   897  			t.IsIOS = true
   898  			t.NeedOS = true
   899  		}
   900  	}
   901  	if t.TestMain == nil {
   902  		t.NeedOS = true
   903  	}
   904  
   905  	for _, cp := range pmain.imports {
   906  		if len(cp.coverVars) > 0 {
   907  			t.Cover = append(t.Cover, coverInfo{cp, cp.coverVars})
   908  		}
   909  	}
   910  
   911  	if !buildN {
   912  		// writeTestmain writes _testmain.go. This must happen after recompileForTest,
   913  		// because recompileForTest modifies XXX.
   914  		if err := writeTestmain(filepath.Join(testDir, "_testmain.go"), t); err != nil {
   915  			return nil, nil, nil, err
   916  		}
   917  	}
   918  
   919  	computeStale(pmain)
   920  
   921  	if ptest != p {
   922  		a := b.action(modeBuild, modeBuild, ptest)
   923  		a.objdir = testDir + string(filepath.Separator) + "_obj_test" + string(filepath.Separator)
   924  		a.objpkg = ptestObj
   925  		a.target = ptestObj
   926  		a.link = false
   927  	}
   928  
   929  	if pxtest != nil {
   930  		a := b.action(modeBuild, modeBuild, pxtest)
   931  		a.objdir = testDir + string(filepath.Separator) + "_obj_xtest" + string(filepath.Separator)
   932  		a.objpkg = buildToolchain.pkgpath(testDir, pxtest)
   933  		a.target = a.objpkg
   934  	}
   935  
   936  	a := b.action(modeBuild, modeBuild, pmain)
   937  	a.objdir = testDir + string(filepath.Separator)
   938  	a.objpkg = filepath.Join(testDir, "main.a")
   939  	a.target = filepath.Join(testDir, testBinary) + exeSuffix
   940  	if goos == "windows" {
   941  		// There are many reserved words on Windows that,
   942  		// if used in the name of an executable, cause Windows
   943  		// to try to ask for extra permissions.
   944  		// The word list includes setup, install, update, and patch,
   945  		// but it does not appear to be defined anywhere.
   946  		// We have run into this trying to run the
   947  		// go.codereview/patch tests.
   948  		// For package names containing those words, use test.test.exe
   949  		// instead of pkgname.test.exe.
   950  		// Note that this file name is only used in the Go command's
   951  		// temporary directory. If the -c or other flags are
   952  		// given, the code below will still use pkgname.test.exe.
   953  		// There are two user-visible effects of this change.
   954  		// First, you can actually run 'go test' in directories that
   955  		// have names that Windows thinks are installer-like,
   956  		// without getting a dialog box asking for more permissions.
   957  		// Second, in the Windows process listing during go test,
   958  		// the test shows up as test.test.exe, not pkgname.test.exe.
   959  		// That second one is a drawback, but it seems a small
   960  		// price to pay for the test running at all.
   961  		// If maintaining the list of bad words is too onerous,
   962  		// we could just do this always on Windows.
   963  		for _, bad := range windowsBadWords {
   964  			if strings.Contains(testBinary, bad) {
   965  				a.target = filepath.Join(testDir, "test.test") + exeSuffix
   966  				break
   967  			}
   968  		}
   969  	}
   970  	buildAction = a
   971  
   972  	if testC || testNeedBinary {
   973  		// -c or profiling flag: create action to copy binary to ./test.out.
   974  		target := filepath.Join(cwd, testBinary+exeSuffix)
   975  		if testO != "" {
   976  			target = testO
   977  			if !filepath.IsAbs(target) {
   978  				target = filepath.Join(cwd, target)
   979  			}
   980  		}
   981  		buildAction = &action{
   982  			f:      (*builder).install,
   983  			deps:   []*action{buildAction},
   984  			p:      pmain,
   985  			target: target,
   986  		}
   987  		runAction = buildAction // make sure runAction != nil even if not running test
   988  	}
   989  	if testC {
   990  		printAction = &action{p: p, deps: []*action{runAction}} // nop
   991  	} else {
   992  		// run test
   993  		runAction = &action{
   994  			f:          (*builder).runTest,
   995  			deps:       []*action{buildAction},
   996  			p:          p,
   997  			ignoreFail: true,
   998  		}
   999  		cleanAction := &action{
  1000  			f:    (*builder).cleanTest,
  1001  			deps: []*action{runAction},
  1002  			p:    p,
  1003  		}
  1004  		printAction = &action{
  1005  			f:    (*builder).printTest,
  1006  			deps: []*action{cleanAction},
  1007  			p:    p,
  1008  		}
  1009  	}
  1010  
  1011  	return buildAction, runAction, printAction, nil
  1012  }
  1013  
  1014  func testImportStack(top string, p *Package, target string) []string {
  1015  	stk := []string{top, p.ImportPath}
  1016  Search:
  1017  	for p.ImportPath != target {
  1018  		for _, p1 := range p.imports {
  1019  			if p1.ImportPath == target || contains(p1.Deps, target) {
  1020  				stk = append(stk, p1.ImportPath)
  1021  				p = p1
  1022  				continue Search
  1023  			}
  1024  		}
  1025  		// Can't happen, but in case it does...
  1026  		stk = append(stk, "<lost path to cycle>")
  1027  		break
  1028  	}
  1029  	return stk
  1030  }
  1031  
  1032  func recompileForTest(pmain, preal, ptest *Package, testDir string) {
  1033  	// The "test copy" of preal is ptest.
  1034  	// For each package that depends on preal, make a "test copy"
  1035  	// that depends on ptest. And so on, up the dependency tree.
  1036  	testCopy := map[*Package]*Package{preal: ptest}
  1037  	for _, p := range packageList([]*Package{pmain}) {
  1038  		// Copy on write.
  1039  		didSplit := false
  1040  		split := func() {
  1041  			if didSplit {
  1042  				return
  1043  			}
  1044  			didSplit = true
  1045  			if p.pkgdir != testDir {
  1046  				p1 := new(Package)
  1047  				testCopy[p] = p1
  1048  				*p1 = *p
  1049  				p1.imports = make([]*Package, len(p.imports))
  1050  				copy(p1.imports, p.imports)
  1051  				p = p1
  1052  				p.pkgdir = testDir
  1053  				p.target = ""
  1054  				p.fake = true
  1055  				p.Stale = true
  1056  				p.StaleReason = "depends on package being tested"
  1057  			}
  1058  		}
  1059  
  1060  		// Update p.deps and p.imports to use at test copies.
  1061  		for i, dep := range p.deps {
  1062  			if p1 := testCopy[dep]; p1 != nil && p1 != dep {
  1063  				split()
  1064  				p.deps[i] = p1
  1065  			}
  1066  		}
  1067  		for i, imp := range p.imports {
  1068  			if p1 := testCopy[imp]; p1 != nil && p1 != imp {
  1069  				split()
  1070  				p.imports[i] = p1
  1071  			}
  1072  		}
  1073  	}
  1074  }
  1075  
  1076  var coverIndex = 0
  1077  
  1078  // isTestFile reports whether the source file is a set of tests and should therefore
  1079  // be excluded from coverage analysis.
  1080  func isTestFile(file string) bool {
  1081  	// We don't cover tests, only the code they test.
  1082  	return strings.HasSuffix(file, "_test.go")
  1083  }
  1084  
  1085  // declareCoverVars attaches the required cover variables names
  1086  // to the files, to be used when annotating the files.
  1087  func declareCoverVars(importPath string, files ...string) map[string]*CoverVar {
  1088  	coverVars := make(map[string]*CoverVar)
  1089  	for _, file := range files {
  1090  		if isTestFile(file) {
  1091  			continue
  1092  		}
  1093  		coverVars[file] = &CoverVar{
  1094  			File: filepath.Join(importPath, file),
  1095  			Var:  fmt.Sprintf("GoCover_%d", coverIndex),
  1096  		}
  1097  		coverIndex++
  1098  	}
  1099  	return coverVars
  1100  }
  1101  
  1102  var noTestsToRun = []byte("\ntesting: warning: no tests to run\n")
  1103  
  1104  // runTest is the action for running a test binary.
  1105  func (b *builder) runTest(a *action) error {
  1106  	args := stringList(findExecCmd(), a.deps[0].target, testArgs)
  1107  	a.testOutput = new(bytes.Buffer)
  1108  
  1109  	if buildN || buildX {
  1110  		b.showcmd("", "%s", strings.Join(args, " "))
  1111  		if buildN {
  1112  			return nil
  1113  		}
  1114  	}
  1115  
  1116  	if a.failed {
  1117  		// We were unable to build the binary.
  1118  		a.failed = false
  1119  		fmt.Fprintf(a.testOutput, "FAIL\t%s [build failed]\n", a.p.ImportPath)
  1120  		setExitStatus(1)
  1121  		return nil
  1122  	}
  1123  
  1124  	cmd := exec.Command(args[0], args[1:]...)
  1125  	cmd.Dir = a.p.Dir
  1126  	cmd.Env = envForDir(cmd.Dir, origEnv)
  1127  	var buf bytes.Buffer
  1128  	if testStreamOutput {
  1129  		cmd.Stdout = os.Stdout
  1130  		cmd.Stderr = os.Stderr
  1131  	} else {
  1132  		cmd.Stdout = &buf
  1133  		cmd.Stderr = &buf
  1134  	}
  1135  
  1136  	// If there are any local SWIG dependencies, we want to load
  1137  	// the shared library from the build directory.
  1138  	if a.p.usesSwig() {
  1139  		env := cmd.Env
  1140  		found := false
  1141  		prefix := "LD_LIBRARY_PATH="
  1142  		for i, v := range env {
  1143  			if strings.HasPrefix(v, prefix) {
  1144  				env[i] = v + ":."
  1145  				found = true
  1146  				break
  1147  			}
  1148  		}
  1149  		if !found {
  1150  			env = append(env, "LD_LIBRARY_PATH=.")
  1151  		}
  1152  		cmd.Env = env
  1153  	}
  1154  
  1155  	t0 := time.Now()
  1156  	err := cmd.Start()
  1157  
  1158  	// This is a last-ditch deadline to detect and
  1159  	// stop wedged test binaries, to keep the builders
  1160  	// running.
  1161  	if err == nil {
  1162  		tick := time.NewTimer(testKillTimeout)
  1163  		startSigHandlers()
  1164  		done := make(chan error)
  1165  		go func() {
  1166  			done <- cmd.Wait()
  1167  		}()
  1168  	Outer:
  1169  		select {
  1170  		case err = <-done:
  1171  			// ok
  1172  		case <-tick.C:
  1173  			if signalTrace != nil {
  1174  				// Send a quit signal in the hope that the program will print
  1175  				// a stack trace and exit. Give it five seconds before resorting
  1176  				// to Kill.
  1177  				cmd.Process.Signal(signalTrace)
  1178  				select {
  1179  				case err = <-done:
  1180  					fmt.Fprintf(&buf, "*** Test killed with %v: ran too long (%v).\n", signalTrace, testKillTimeout)
  1181  					break Outer
  1182  				case <-time.After(5 * time.Second):
  1183  				}
  1184  			}
  1185  			cmd.Process.Kill()
  1186  			err = <-done
  1187  			fmt.Fprintf(&buf, "*** Test killed: ran too long (%v).\n", testKillTimeout)
  1188  		}
  1189  		tick.Stop()
  1190  	}
  1191  	out := buf.Bytes()
  1192  	t := fmt.Sprintf("%.3fs", time.Since(t0).Seconds())
  1193  	if err == nil {
  1194  		norun := ""
  1195  		if testShowPass {
  1196  			a.testOutput.Write(out)
  1197  		}
  1198  		if bytes.HasPrefix(out, noTestsToRun[1:]) || bytes.Contains(out, noTestsToRun) {
  1199  			norun = " [no tests to run]"
  1200  		}
  1201  		fmt.Fprintf(a.testOutput, "ok  \t%s\t%s%s%s\n", a.p.ImportPath, t, coveragePercentage(out), norun)
  1202  		return nil
  1203  	}
  1204  
  1205  	setExitStatus(1)
  1206  	if len(out) > 0 {
  1207  		a.testOutput.Write(out)
  1208  		// assume printing the test binary's exit status is superfluous
  1209  	} else {
  1210  		fmt.Fprintf(a.testOutput, "%s\n", err)
  1211  	}
  1212  	fmt.Fprintf(a.testOutput, "FAIL\t%s\t%s\n", a.p.ImportPath, t)
  1213  
  1214  	return nil
  1215  }
  1216  
  1217  // coveragePercentage returns the coverage results (if enabled) for the
  1218  // test. It uncovers the data by scanning the output from the test run.
  1219  func coveragePercentage(out []byte) string {
  1220  	if !testCover {
  1221  		return ""
  1222  	}
  1223  	// The string looks like
  1224  	//	test coverage for encoding/binary: 79.9% of statements
  1225  	// Extract the piece from the percentage to the end of the line.
  1226  	re := regexp.MustCompile(`coverage: (.*)\n`)
  1227  	matches := re.FindSubmatch(out)
  1228  	if matches == nil {
  1229  		// Probably running "go test -cover" not "go test -cover fmt".
  1230  		// The coverage output will appear in the output directly.
  1231  		return ""
  1232  	}
  1233  	return fmt.Sprintf("\tcoverage: %s", matches[1])
  1234  }
  1235  
  1236  // cleanTest is the action for cleaning up after a test.
  1237  func (b *builder) cleanTest(a *action) error {
  1238  	if buildWork {
  1239  		return nil
  1240  	}
  1241  	run := a.deps[0]
  1242  	testDir := filepath.Join(b.work, filepath.FromSlash(run.p.ImportPath+"/_test"))
  1243  	os.RemoveAll(testDir)
  1244  	return nil
  1245  }
  1246  
  1247  // printTest is the action for printing a test result.
  1248  func (b *builder) printTest(a *action) error {
  1249  	clean := a.deps[0]
  1250  	run := clean.deps[0]
  1251  	os.Stdout.Write(run.testOutput.Bytes())
  1252  	run.testOutput = nil
  1253  	return nil
  1254  }
  1255  
  1256  // notest is the action for testing a package with no test files.
  1257  func (b *builder) notest(a *action) error {
  1258  	fmt.Printf("?   \t%s\t[no test files]\n", a.p.ImportPath)
  1259  	return nil
  1260  }
  1261  
  1262  // isTestFunc tells whether fn has the type of a testing function. arg
  1263  // specifies the parameter type we look for: B, M or T.
  1264  func isTestFunc(fn *ast.FuncDecl, arg string) bool {
  1265  	if fn.Type.Results != nil && len(fn.Type.Results.List) > 0 ||
  1266  		fn.Type.Params.List == nil ||
  1267  		len(fn.Type.Params.List) != 1 ||
  1268  		len(fn.Type.Params.List[0].Names) > 1 {
  1269  		return false
  1270  	}
  1271  	ptr, ok := fn.Type.Params.List[0].Type.(*ast.StarExpr)
  1272  	if !ok {
  1273  		return false
  1274  	}
  1275  	// We can't easily check that the type is *testing.M
  1276  	// because we don't know how testing has been imported,
  1277  	// but at least check that it's *M or *something.M.
  1278  	// Same applies for B and T.
  1279  	if name, ok := ptr.X.(*ast.Ident); ok && name.Name == arg {
  1280  		return true
  1281  	}
  1282  	if sel, ok := ptr.X.(*ast.SelectorExpr); ok && sel.Sel.Name == arg {
  1283  		return true
  1284  	}
  1285  	return false
  1286  }
  1287  
  1288  // isTest tells whether name looks like a test (or benchmark, according to prefix).
  1289  // It is a Test (say) if there is a character after Test that is not a lower-case letter.
  1290  // We don't want TesticularCancer.
  1291  func isTest(name, prefix string) bool {
  1292  	if !strings.HasPrefix(name, prefix) {
  1293  		return false
  1294  	}
  1295  	if len(name) == len(prefix) { // "Test" is ok
  1296  		return true
  1297  	}
  1298  	rune, _ := utf8.DecodeRuneInString(name[len(prefix):])
  1299  	return !unicode.IsLower(rune)
  1300  }
  1301  
  1302  type coverInfo struct {
  1303  	Package *Package
  1304  	Vars    map[string]*CoverVar
  1305  }
  1306  
  1307  // loadTestFuncs returns the testFuncs describing the tests that will be run.
  1308  func loadTestFuncs(ptest *Package) (*testFuncs, error) {
  1309  	t := &testFuncs{
  1310  		Package: ptest,
  1311  	}
  1312  	for _, file := range ptest.TestGoFiles {
  1313  		if err := t.load(filepath.Join(ptest.Dir, file), "_test", &t.ImportTest, &t.NeedTest); err != nil {
  1314  			return nil, err
  1315  		}
  1316  	}
  1317  	for _, file := range ptest.XTestGoFiles {
  1318  		if err := t.load(filepath.Join(ptest.Dir, file), "_xtest", &t.ImportXtest, &t.NeedXtest); err != nil {
  1319  			return nil, err
  1320  		}
  1321  	}
  1322  	return t, nil
  1323  }
  1324  
  1325  // writeTestmain writes the _testmain.go file for t to the file named out.
  1326  func writeTestmain(out string, t *testFuncs) error {
  1327  	f, err := os.Create(out)
  1328  	if err != nil {
  1329  		return err
  1330  	}
  1331  	defer f.Close()
  1332  
  1333  	if err := testmainTmpl.Execute(f, t); err != nil {
  1334  		return err
  1335  	}
  1336  
  1337  	return nil
  1338  }
  1339  
  1340  type testFuncs struct {
  1341  	Tests       []testFunc
  1342  	Benchmarks  []testFunc
  1343  	Examples    []testFunc
  1344  	TestMain    *testFunc
  1345  	Package     *Package
  1346  	ImportTest  bool
  1347  	NeedTest    bool
  1348  	ImportXtest bool
  1349  	NeedXtest   bool
  1350  	NeedOS      bool
  1351  	IsIOS       bool
  1352  	Cover       []coverInfo
  1353  }
  1354  
  1355  func (t *testFuncs) CoverMode() string {
  1356  	return testCoverMode
  1357  }
  1358  
  1359  func (t *testFuncs) CoverEnabled() bool {
  1360  	return testCover
  1361  }
  1362  
  1363  // Covered returns a string describing which packages are being tested for coverage.
  1364  // If the covered package is the same as the tested package, it returns the empty string.
  1365  // Otherwise it is a comma-separated human-readable list of packages beginning with
  1366  // " in", ready for use in the coverage message.
  1367  func (t *testFuncs) Covered() string {
  1368  	if testCoverPaths == nil {
  1369  		return ""
  1370  	}
  1371  	return " in " + strings.Join(testCoverPaths, ", ")
  1372  }
  1373  
  1374  // Tested returns the name of the package being tested.
  1375  func (t *testFuncs) Tested() string {
  1376  	return t.Package.Name
  1377  }
  1378  
  1379  type testFunc struct {
  1380  	Package   string // imported package name (_test or _xtest)
  1381  	Name      string // function name
  1382  	Output    string // output, for examples
  1383  	Unordered bool   // output is allowed to be unordered.
  1384  }
  1385  
  1386  var testFileSet = token.NewFileSet()
  1387  
  1388  func (t *testFuncs) load(filename, pkg string, doImport, seen *bool) error {
  1389  	f, err := parser.ParseFile(testFileSet, filename, nil, parser.ParseComments)
  1390  	if err != nil {
  1391  		return expandScanner(err)
  1392  	}
  1393  	for _, d := range f.Decls {
  1394  		n, ok := d.(*ast.FuncDecl)
  1395  		if !ok {
  1396  			continue
  1397  		}
  1398  		if n.Recv != nil {
  1399  			continue
  1400  		}
  1401  		name := n.Name.String()
  1402  		switch {
  1403  		case name == "TestMain" && isTestFunc(n, "M"):
  1404  			if t.TestMain != nil {
  1405  				return errors.New("multiple definitions of TestMain")
  1406  			}
  1407  			t.TestMain = &testFunc{pkg, name, "", false}
  1408  			*doImport, *seen = true, true
  1409  		case isTest(name, "Test"):
  1410  			err := checkTestFunc(n, "T")
  1411  			if err != nil {
  1412  				return err
  1413  			}
  1414  			t.Tests = append(t.Tests, testFunc{pkg, name, "", false})
  1415  			*doImport, *seen = true, true
  1416  		case isTest(name, "Benchmark"):
  1417  			err := checkTestFunc(n, "B")
  1418  			if err != nil {
  1419  				return err
  1420  			}
  1421  			t.Benchmarks = append(t.Benchmarks, testFunc{pkg, name, "", false})
  1422  			*doImport, *seen = true, true
  1423  		}
  1424  	}
  1425  	ex := doc.Examples(f)
  1426  	sort.Slice(ex, func(i, j int) bool { return ex[i].Order < ex[j].Order })
  1427  	for _, e := range ex {
  1428  		*doImport = true // import test file whether executed or not
  1429  		if e.Output == "" && !e.EmptyOutput {
  1430  			// Don't run examples with no output.
  1431  			continue
  1432  		}
  1433  		t.Examples = append(t.Examples, testFunc{pkg, "Example" + e.Name, e.Output, e.Unordered})
  1434  		*seen = true
  1435  	}
  1436  	return nil
  1437  }
  1438  
  1439  func checkTestFunc(fn *ast.FuncDecl, arg string) error {
  1440  	if !isTestFunc(fn, arg) {
  1441  		name := fn.Name.String()
  1442  		pos := testFileSet.Position(fn.Pos())
  1443  		return fmt.Errorf("%s: wrong signature for %s, must be: func %s(%s *testing.%s)", pos, name, name, strings.ToLower(arg), arg)
  1444  	}
  1445  	return nil
  1446  }
  1447  
  1448  var testmainTmpl = template.Must(template.New("main").Parse(`
  1449  package main
  1450  
  1451  import (
  1452  {{if .NeedOS}}
  1453  	"os"
  1454  {{end}}
  1455  	"testing"
  1456  	"testing/internal/testdeps"
  1457  
  1458  {{if .ImportTest}}
  1459  	{{if .NeedTest}}_test{{else}}_{{end}} {{.Package.ImportPath | printf "%q"}}
  1460  {{end}}
  1461  {{if .ImportXtest}}
  1462  	{{if .NeedXtest}}_xtest{{else}}_{{end}} {{.Package.ImportPath | printf "%s_test" | printf "%q"}}
  1463  {{end}}
  1464  {{range $i, $p := .Cover}}
  1465  	_cover{{$i}} {{$p.Package.ImportPath | printf "%q"}}
  1466  {{end}}
  1467  
  1468  {{if .IsIOS}}
  1469  	"os/signal"
  1470  	_ "runtime/cgo"
  1471  	"syscall"
  1472  {{end}}
  1473  )
  1474  
  1475  var tests = []testing.InternalTest{
  1476  {{range .Tests}}
  1477  	{"{{.Name}}", {{.Package}}.{{.Name}}},
  1478  {{end}}
  1479  }
  1480  
  1481  var benchmarks = []testing.InternalBenchmark{
  1482  {{range .Benchmarks}}
  1483  	{"{{.Name}}", {{.Package}}.{{.Name}}},
  1484  {{end}}
  1485  }
  1486  
  1487  var examples = []testing.InternalExample{
  1488  {{range .Examples}}
  1489  	{"{{.Name}}", {{.Package}}.{{.Name}}, {{.Output | printf "%q"}}, {{.Unordered}}},
  1490  {{end}}
  1491  }
  1492  
  1493  {{if .CoverEnabled}}
  1494  
  1495  // Only updated by init functions, so no need for atomicity.
  1496  var (
  1497  	coverCounters = make(map[string][]uint32)
  1498  	coverBlocks = make(map[string][]testing.CoverBlock)
  1499  )
  1500  
  1501  func init() {
  1502  	{{range $i, $p := .Cover}}
  1503  	{{range $file, $cover := $p.Vars}}
  1504  	coverRegisterFile({{printf "%q" $cover.File}}, _cover{{$i}}.{{$cover.Var}}.Count[:], _cover{{$i}}.{{$cover.Var}}.Pos[:], _cover{{$i}}.{{$cover.Var}}.NumStmt[:])
  1505  	{{end}}
  1506  	{{end}}
  1507  }
  1508  
  1509  func coverRegisterFile(fileName string, counter []uint32, pos []uint32, numStmts []uint16) {
  1510  	if 3*len(counter) != len(pos) || len(counter) != len(numStmts) {
  1511  		panic("coverage: mismatched sizes")
  1512  	}
  1513  	if coverCounters[fileName] != nil {
  1514  		// Already registered.
  1515  		return
  1516  	}
  1517  	coverCounters[fileName] = counter
  1518  	block := make([]testing.CoverBlock, len(counter))
  1519  	for i := range counter {
  1520  		block[i] = testing.CoverBlock{
  1521  			Line0: pos[3*i+0],
  1522  			Col0: uint16(pos[3*i+2]),
  1523  			Line1: pos[3*i+1],
  1524  			Col1: uint16(pos[3*i+2]>>16),
  1525  			Stmts: numStmts[i],
  1526  		}
  1527  	}
  1528  	coverBlocks[fileName] = block
  1529  }
  1530  {{end}}
  1531  
  1532  func main() {
  1533  {{if .IsIOS}}
  1534  	// Send a SIGUSR2, which will be intercepted by LLDB to
  1535  	// tell the test harness that installation was successful.
  1536  	// See misc/ios/go_darwin_arm_exec.go.
  1537  	signal.Notify(make(chan os.Signal), syscall.SIGUSR2)
  1538  	syscall.Kill(0, syscall.SIGUSR2)
  1539  	signal.Reset(syscall.SIGUSR2)
  1540  
  1541  	// The first argument supplied to an iOS test is an offset
  1542  	// suffix for the current working directory.
  1543  	// Process it here, and remove it from os.Args.
  1544  	const hdr = "cwdSuffix="
  1545  	if len(os.Args) < 2 || len(os.Args[1]) <= len(hdr) || os.Args[1][:len(hdr)] != hdr {
  1546  		panic("iOS test not passed a working directory suffix")
  1547  	}
  1548  	suffix := os.Args[1][len(hdr):]
  1549  	dir, err := os.Getwd()
  1550  	if err != nil {
  1551  		panic(err)
  1552  	}
  1553  	if err := os.Chdir(dir + "/" + suffix); err != nil {
  1554  		panic(err)
  1555  	}
  1556  	os.Args = append([]string{os.Args[0]}, os.Args[2:]...)
  1557  {{end}}
  1558  
  1559  {{if .CoverEnabled}}
  1560  	testing.RegisterCover(testing.Cover{
  1561  		Mode: {{printf "%q" .CoverMode}},
  1562  		Counters: coverCounters,
  1563  		Blocks: coverBlocks,
  1564  		CoveredPackages: {{printf "%q" .Covered}},
  1565  	})
  1566  {{end}}
  1567  	m := testing.MainStart(testdeps.TestDeps{}, tests, benchmarks, examples)
  1568  {{with .TestMain}}
  1569  	{{.Package}}.{{.Name}}(m)
  1570  {{else}}
  1571  	os.Exit(m.Run())
  1572  {{end}}
  1573  }
  1574  
  1575  `))