...

Source file src/testing/testing.go

Documentation: testing

		 1  // Copyright 2009 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 testing provides support for automated testing of Go packages.
		 6  // It is intended to be used in concert with the "go test" command, which automates
		 7  // execution of any function of the form
		 8  //		 func TestXxx(*testing.T)
		 9  // where Xxx does not start with a lowercase letter. The function name
		10  // serves to identify the test routine.
		11  //
		12  // Within these functions, use the Error, Fail or related methods to signal failure.
		13  //
		14  // To write a new test suite, create a file whose name ends _test.go that
		15  // contains the TestXxx functions as described here. Put the file in the same
		16  // package as the one being tested. The file will be excluded from regular
		17  // package builds but will be included when the "go test" command is run.
		18  // For more detail, run "go help test" and "go help testflag".
		19  //
		20  // A simple test function looks like this:
		21  //
		22  //		 func TestAbs(t *testing.T) {
		23  //				 got := Abs(-1)
		24  //				 if got != 1 {
		25  //						 t.Errorf("Abs(-1) = %d; want 1", got)
		26  //				 }
		27  //		 }
		28  //
		29  // Benchmarks
		30  //
		31  // Functions of the form
		32  //		 func BenchmarkXxx(*testing.B)
		33  // are considered benchmarks, and are executed by the "go test" command when
		34  // its -bench flag is provided. Benchmarks are run sequentially.
		35  //
		36  // For a description of the testing flags, see
		37  // https://golang.org/cmd/go/#hdr-Testing_flags
		38  //
		39  // A sample benchmark function looks like this:
		40  //		 func BenchmarkRandInt(b *testing.B) {
		41  //				 for i := 0; i < b.N; i++ {
		42  //						 rand.Int()
		43  //				 }
		44  //		 }
		45  //
		46  // The benchmark function must run the target code b.N times.
		47  // During benchmark execution, b.N is adjusted until the benchmark function lasts
		48  // long enough to be timed reliably. The output
		49  //		 BenchmarkRandInt-8	 	68453040					17.8 ns/op
		50  // means that the loop ran 68453040 times at a speed of 17.8 ns per loop.
		51  //
		52  // If a benchmark needs some expensive setup before running, the timer
		53  // may be reset:
		54  //
		55  //		 func BenchmarkBigLen(b *testing.B) {
		56  //				 big := NewBig()
		57  //				 b.ResetTimer()
		58  //				 for i := 0; i < b.N; i++ {
		59  //						 big.Len()
		60  //				 }
		61  //		 }
		62  //
		63  // If a benchmark needs to test performance in a parallel setting, it may use
		64  // the RunParallel helper function; such benchmarks are intended to be used with
		65  // the go test -cpu flag:
		66  //
		67  //		 func BenchmarkTemplateParallel(b *testing.B) {
		68  //				 templ := template.Must(template.New("test").Parse("Hello, {{.}}!"))
		69  //				 b.RunParallel(func(pb *testing.PB) {
		70  //						 var buf bytes.Buffer
		71  //						 for pb.Next() {
		72  //								 buf.Reset()
		73  //								 templ.Execute(&buf, "World")
		74  //						 }
		75  //				 })
		76  //		 }
		77  //
		78  // Examples
		79  //
		80  // The package also runs and verifies example code. Example functions may
		81  // include a concluding line comment that begins with "Output:" and is compared with
		82  // the standard output of the function when the tests are run. (The comparison
		83  // ignores leading and trailing space.) These are examples of an example:
		84  //
		85  //		 func ExampleHello() {
		86  //				 fmt.Println("hello")
		87  //				 // Output: hello
		88  //		 }
		89  //
		90  //		 func ExampleSalutations() {
		91  //				 fmt.Println("hello, and")
		92  //				 fmt.Println("goodbye")
		93  //				 // Output:
		94  //				 // hello, and
		95  //				 // goodbye
		96  //		 }
		97  //
		98  // The comment prefix "Unordered output:" is like "Output:", but matches any
		99  // line order:
	 100  //
	 101  //		 func ExamplePerm() {
	 102  //				 for _, value := range Perm(5) {
	 103  //						 fmt.Println(value)
	 104  //				 }
	 105  //				 // Unordered output: 4
	 106  //				 // 2
	 107  //				 // 1
	 108  //				 // 3
	 109  //				 // 0
	 110  //		 }
	 111  //
	 112  // Example functions without output comments are compiled but not executed.
	 113  //
	 114  // The naming convention to declare examples for the package, a function F, a type T and
	 115  // method M on type T are:
	 116  //
	 117  //		 func Example() { ... }
	 118  //		 func ExampleF() { ... }
	 119  //		 func ExampleT() { ... }
	 120  //		 func ExampleT_M() { ... }
	 121  //
	 122  // Multiple example functions for a package/type/function/method may be provided by
	 123  // appending a distinct suffix to the name. The suffix must start with a
	 124  // lower-case letter.
	 125  //
	 126  //		 func Example_suffix() { ... }
	 127  //		 func ExampleF_suffix() { ... }
	 128  //		 func ExampleT_suffix() { ... }
	 129  //		 func ExampleT_M_suffix() { ... }
	 130  //
	 131  // The entire test file is presented as the example when it contains a single
	 132  // example function, at least one other function, type, variable, or constant
	 133  // declaration, and no test or benchmark functions.
	 134  //
	 135  // Skipping
	 136  //
	 137  // Tests or benchmarks may be skipped at run time with a call to
	 138  // the Skip method of *T or *B:
	 139  //
	 140  //		 func TestTimeConsuming(t *testing.T) {
	 141  //				 if testing.Short() {
	 142  //						 t.Skip("skipping test in short mode.")
	 143  //				 }
	 144  //				 ...
	 145  //		 }
	 146  //
	 147  // Subtests and Sub-benchmarks
	 148  //
	 149  // The Run methods of T and B allow defining subtests and sub-benchmarks,
	 150  // without having to define separate functions for each. This enables uses
	 151  // like table-driven benchmarks and creating hierarchical tests.
	 152  // It also provides a way to share common setup and tear-down code:
	 153  //
	 154  //		 func TestFoo(t *testing.T) {
	 155  //				 // <setup code>
	 156  //				 t.Run("A=1", func(t *testing.T) { ... })
	 157  //				 t.Run("A=2", func(t *testing.T) { ... })
	 158  //				 t.Run("B=1", func(t *testing.T) { ... })
	 159  //				 // <tear-down code>
	 160  //		 }
	 161  //
	 162  // Each subtest and sub-benchmark has a unique name: the combination of the name
	 163  // of the top-level test and the sequence of names passed to Run, separated by
	 164  // slashes, with an optional trailing sequence number for disambiguation.
	 165  //
	 166  // The argument to the -run and -bench command-line flags is an unanchored regular
	 167  // expression that matches the test's name. For tests with multiple slash-separated
	 168  // elements, such as subtests, the argument is itself slash-separated, with
	 169  // expressions matching each name element in turn. Because it is unanchored, an
	 170  // empty expression matches any string.
	 171  // For example, using "matching" to mean "whose name contains":
	 172  //
	 173  //		 go test -run ''			# Run all tests.
	 174  //		 go test -run Foo		 # Run top-level tests matching "Foo", such as "TestFooBar".
	 175  //		 go test -run Foo/A=	# For top-level tests matching "Foo", run subtests matching "A=".
	 176  //		 go test -run /A=1		# For all top-level tests, run subtests matching "A=1".
	 177  //
	 178  // Subtests can also be used to control parallelism. A parent test will only
	 179  // complete once all of its subtests complete. In this example, all tests are
	 180  // run in parallel with each other, and only with each other, regardless of
	 181  // other top-level tests that may be defined:
	 182  //
	 183  //		 func TestGroupedParallel(t *testing.T) {
	 184  //				 for _, tc := range tests {
	 185  //						 tc := tc // capture range variable
	 186  //						 t.Run(tc.Name, func(t *testing.T) {
	 187  //								 t.Parallel()
	 188  //								 ...
	 189  //						 })
	 190  //				 }
	 191  //		 }
	 192  //
	 193  // The race detector kills the program if it exceeds 8128 concurrent goroutines,
	 194  // so use care when running parallel tests with the -race flag set.
	 195  //
	 196  // Run does not return until parallel subtests have completed, providing a way
	 197  // to clean up after a group of parallel tests:
	 198  //
	 199  //		 func TestTeardownParallel(t *testing.T) {
	 200  //				 // This Run will not return until the parallel tests finish.
	 201  //				 t.Run("group", func(t *testing.T) {
	 202  //						 t.Run("Test1", parallelTest1)
	 203  //						 t.Run("Test2", parallelTest2)
	 204  //						 t.Run("Test3", parallelTest3)
	 205  //				 })
	 206  //				 // <tear-down code>
	 207  //		 }
	 208  //
	 209  // Main
	 210  //
	 211  // It is sometimes necessary for a test or benchmark program to do extra setup or teardown
	 212  // before or after it executes. It is also sometimes necessary to control
	 213  // which code runs on the main thread. To support these and other cases,
	 214  // if a test file contains a function:
	 215  //
	 216  //	func TestMain(m *testing.M)
	 217  //
	 218  // then the generated test will call TestMain(m) instead of running the tests or benchmarks
	 219  // directly. TestMain runs in the main goroutine and can do whatever setup
	 220  // and teardown is necessary around a call to m.Run. m.Run will return an exit
	 221  // code that may be passed to os.Exit. If TestMain returns, the test wrapper
	 222  // will pass the result of m.Run to os.Exit itself.
	 223  //
	 224  // When TestMain is called, flag.Parse has not been run. If TestMain depends on
	 225  // command-line flags, including those of the testing package, it should call
	 226  // flag.Parse explicitly. Command line flags are always parsed by the time test
	 227  // or benchmark functions run.
	 228  //
	 229  // A simple implementation of TestMain is:
	 230  //
	 231  //	func TestMain(m *testing.M) {
	 232  //		// call flag.Parse() here if TestMain uses flags
	 233  //		os.Exit(m.Run())
	 234  //	}
	 235  //
	 236  // TestMain is a low-level primitive and should not be necessary for casual
	 237  // testing needs, where ordinary test functions suffice.
	 238  package testing
	 239  
	 240  import (
	 241  	"bytes"
	 242  	"errors"
	 243  	"flag"
	 244  	"fmt"
	 245  	"internal/race"
	 246  	"io"
	 247  	"math/rand"
	 248  	"os"
	 249  	"runtime"
	 250  	"runtime/debug"
	 251  	"runtime/trace"
	 252  	"strconv"
	 253  	"strings"
	 254  	"sync"
	 255  	"sync/atomic"
	 256  	"time"
	 257  	"unicode"
	 258  	"unicode/utf8"
	 259  )
	 260  
	 261  var initRan bool
	 262  
	 263  // Init registers testing flags. These flags are automatically registered by
	 264  // the "go test" command before running test functions, so Init is only needed
	 265  // when calling functions such as Benchmark without using "go test".
	 266  //
	 267  // Init has no effect if it was already called.
	 268  func Init() {
	 269  	if initRan {
	 270  		return
	 271  	}
	 272  	initRan = true
	 273  	// The short flag requests that tests run more quickly, but its functionality
	 274  	// is provided by test writers themselves. The testing package is just its
	 275  	// home. The all.bash installation script sets it to make installation more
	 276  	// efficient, but by default the flag is off so a plain "go test" will do a
	 277  	// full test of the package.
	 278  	short = flag.Bool("test.short", false, "run smaller test suite to save time")
	 279  
	 280  	// The failfast flag requests that test execution stop after the first test failure.
	 281  	failFast = flag.Bool("test.failfast", false, "do not start new tests after the first test failure")
	 282  
	 283  	// The directory in which to create profile files and the like. When run from
	 284  	// "go test", the binary always runs in the source directory for the package;
	 285  	// this flag lets "go test" tell the binary to write the files in the directory where
	 286  	// the "go test" command is run.
	 287  	outputDir = flag.String("test.outputdir", "", "write profiles to `dir`")
	 288  	// Report as tests are run; default is silent for success.
	 289  	chatty = flag.Bool("test.v", false, "verbose: print additional output")
	 290  	count = flag.Uint("test.count", 1, "run tests and benchmarks `n` times")
	 291  	coverProfile = flag.String("test.coverprofile", "", "write a coverage profile to `file`")
	 292  	matchList = flag.String("test.list", "", "list tests, examples, and benchmarks matching `regexp` then exit")
	 293  	match = flag.String("test.run", "", "run only tests and examples matching `regexp`")
	 294  	memProfile = flag.String("test.memprofile", "", "write an allocation profile to `file`")
	 295  	memProfileRate = flag.Int("test.memprofilerate", 0, "set memory allocation profiling `rate` (see runtime.MemProfileRate)")
	 296  	cpuProfile = flag.String("test.cpuprofile", "", "write a cpu profile to `file`")
	 297  	blockProfile = flag.String("test.blockprofile", "", "write a goroutine blocking profile to `file`")
	 298  	blockProfileRate = flag.Int("test.blockprofilerate", 1, "set blocking profile `rate` (see runtime.SetBlockProfileRate)")
	 299  	mutexProfile = flag.String("test.mutexprofile", "", "write a mutex contention profile to the named file after execution")
	 300  	mutexProfileFraction = flag.Int("test.mutexprofilefraction", 1, "if >= 0, calls runtime.SetMutexProfileFraction()")
	 301  	panicOnExit0 = flag.Bool("test.paniconexit0", false, "panic on call to os.Exit(0)")
	 302  	traceFile = flag.String("test.trace", "", "write an execution trace to `file`")
	 303  	timeout = flag.Duration("test.timeout", 0, "panic test binary after duration `d` (default 0, timeout disabled)")
	 304  	cpuListStr = flag.String("test.cpu", "", "comma-separated `list` of cpu counts to run each test with")
	 305  	parallel = flag.Int("test.parallel", runtime.GOMAXPROCS(0), "run at most `n` tests in parallel")
	 306  	testlog = flag.String("test.testlogfile", "", "write test action log to `file` (for use only by cmd/go)")
	 307  	shuffle = flag.String("test.shuffle", "off", "randomize the execution order of tests and benchmarks")
	 308  
	 309  	initBenchmarkFlags()
	 310  }
	 311  
	 312  var (
	 313  	// Flags, registered during Init.
	 314  	short								*bool
	 315  	failFast						 *bool
	 316  	outputDir						*string
	 317  	chatty							 *bool
	 318  	count								*uint
	 319  	coverProfile				 *string
	 320  	matchList						*string
	 321  	match								*string
	 322  	memProfile					 *string
	 323  	memProfileRate			 *int
	 324  	cpuProfile					 *string
	 325  	blockProfile				 *string
	 326  	blockProfileRate		 *int
	 327  	mutexProfile				 *string
	 328  	mutexProfileFraction *int
	 329  	panicOnExit0				 *bool
	 330  	traceFile						*string
	 331  	timeout							*time.Duration
	 332  	cpuListStr					 *string
	 333  	parallel						 *int
	 334  	shuffle							*string
	 335  	testlog							*string
	 336  
	 337  	haveExamples bool // are there examples?
	 338  
	 339  	cpuList		 []int
	 340  	testlogFile *os.File
	 341  
	 342  	numFailed uint32 // number of test failures
	 343  )
	 344  
	 345  type chattyPrinter struct {
	 346  	w					io.Writer
	 347  	lastNameMu sync.Mutex // guards lastName
	 348  	lastName	 string		 // last printed test name in chatty mode
	 349  }
	 350  
	 351  func newChattyPrinter(w io.Writer) *chattyPrinter {
	 352  	return &chattyPrinter{w: w}
	 353  }
	 354  
	 355  // Updatef prints a message about the status of the named test to w.
	 356  //
	 357  // The formatted message must include the test name itself.
	 358  func (p *chattyPrinter) Updatef(testName, format string, args ...interface{}) {
	 359  	p.lastNameMu.Lock()
	 360  	defer p.lastNameMu.Unlock()
	 361  
	 362  	// Since the message already implies an association with a specific new test,
	 363  	// we don't need to check what the old test name was or log an extra CONT line
	 364  	// for it. (We're updating it anyway, and the current message already includes
	 365  	// the test name.)
	 366  	p.lastName = testName
	 367  	fmt.Fprintf(p.w, format, args...)
	 368  }
	 369  
	 370  // Printf prints a message, generated by the named test, that does not
	 371  // necessarily mention that tests's name itself.
	 372  func (p *chattyPrinter) Printf(testName, format string, args ...interface{}) {
	 373  	p.lastNameMu.Lock()
	 374  	defer p.lastNameMu.Unlock()
	 375  
	 376  	if p.lastName == "" {
	 377  		p.lastName = testName
	 378  	} else if p.lastName != testName {
	 379  		fmt.Fprintf(p.w, "=== CONT	%s\n", testName)
	 380  		p.lastName = testName
	 381  	}
	 382  
	 383  	fmt.Fprintf(p.w, format, args...)
	 384  }
	 385  
	 386  // The maximum number of stack frames to go through when skipping helper functions for
	 387  // the purpose of decorating log messages.
	 388  const maxStackLen = 50
	 389  
	 390  // common holds the elements common between T and B and
	 391  // captures common methods such as Errorf.
	 392  type common struct {
	 393  	mu					sync.RWMutex				 // guards this group of fields
	 394  	output			[]byte							 // Output generated by test or benchmark.
	 395  	w					 io.Writer						// For flushToParent.
	 396  	ran				 bool								 // Test or benchmark (or one of its subtests) was executed.
	 397  	failed			bool								 // Test or benchmark has failed.
	 398  	skipped		 bool								 // Test or benchmark has been skipped.
	 399  	done				bool								 // Test is finished and all subtests have completed.
	 400  	helperPCs	 map[uintptr]struct{} // functions to be skipped when writing file/line info
	 401  	helperNames map[string]struct{}	// helperPCs converted to function names
	 402  	cleanups		[]func()						 // optional functions to be called at the end of the test
	 403  	cleanupName string							 // Name of the cleanup function.
	 404  	cleanupPc	 []uintptr						// The stack trace at the point where Cleanup was called.
	 405  	finished		bool								 // Test function has completed.
	 406  
	 407  	chatty		 *chattyPrinter // A copy of chattyPrinter, if the chatty flag is set.
	 408  	bench			bool					 // Whether the current test is a benchmark.
	 409  	hasSub		 int32					// Written atomically.
	 410  	raceErrors int						// Number of races detected during test.
	 411  	runner		 string				 // Function name of tRunner running the test.
	 412  
	 413  	parent	 *common
	 414  	level		int			 // Nesting depth of test or benchmark.
	 415  	creator	[]uintptr // If level > 0, the stack trace at the point where the parent called t.Run.
	 416  	name		 string		// Name of test or benchmark.
	 417  	start		time.Time // Time test or benchmark started
	 418  	duration time.Duration
	 419  	barrier	chan bool // To signal parallel subtests they may start.
	 420  	signal	 chan bool // To signal a test is done.
	 421  	sub			[]*T			// Queue of subtests to be run in parallel.
	 422  
	 423  	tempDirMu	sync.Mutex
	 424  	tempDir		string
	 425  	tempDirErr error
	 426  	tempDirSeq int32
	 427  }
	 428  
	 429  // Short reports whether the -test.short flag is set.
	 430  func Short() bool {
	 431  	if short == nil {
	 432  		panic("testing: Short called before Init")
	 433  	}
	 434  	// Catch code that calls this from TestMain without first calling flag.Parse.
	 435  	if !flag.Parsed() {
	 436  		panic("testing: Short called before Parse")
	 437  	}
	 438  
	 439  	return *short
	 440  }
	 441  
	 442  // CoverMode reports what the test coverage mode is set to. The
	 443  // values are "set", "count", or "atomic". The return value will be
	 444  // empty if test coverage is not enabled.
	 445  func CoverMode() string {
	 446  	return cover.Mode
	 447  }
	 448  
	 449  // Verbose reports whether the -test.v flag is set.
	 450  func Verbose() bool {
	 451  	// Same as in Short.
	 452  	if chatty == nil {
	 453  		panic("testing: Verbose called before Init")
	 454  	}
	 455  	if !flag.Parsed() {
	 456  		panic("testing: Verbose called before Parse")
	 457  	}
	 458  	return *chatty
	 459  }
	 460  
	 461  // frameSkip searches, starting after skip frames, for the first caller frame
	 462  // in a function not marked as a helper and returns that frame.
	 463  // The search stops if it finds a tRunner function that
	 464  // was the entry point into the test and the test is not a subtest.
	 465  // This function must be called with c.mu held.
	 466  func (c *common) frameSkip(skip int) runtime.Frame {
	 467  	// If the search continues into the parent test, we'll have to hold
	 468  	// its mu temporarily. If we then return, we need to unlock it.
	 469  	shouldUnlock := false
	 470  	defer func() {
	 471  		if shouldUnlock {
	 472  			c.mu.Unlock()
	 473  		}
	 474  	}()
	 475  	var pc [maxStackLen]uintptr
	 476  	// Skip two extra frames to account for this function
	 477  	// and runtime.Callers itself.
	 478  	n := runtime.Callers(skip+2, pc[:])
	 479  	if n == 0 {
	 480  		panic("testing: zero callers found")
	 481  	}
	 482  	frames := runtime.CallersFrames(pc[:n])
	 483  	var firstFrame, prevFrame, frame runtime.Frame
	 484  	for more := true; more; prevFrame = frame {
	 485  		frame, more = frames.Next()
	 486  		if frame.Function == c.cleanupName {
	 487  			frames = runtime.CallersFrames(c.cleanupPc)
	 488  			continue
	 489  		}
	 490  		if firstFrame.PC == 0 {
	 491  			firstFrame = frame
	 492  		}
	 493  		if frame.Function == c.runner {
	 494  			// We've gone up all the way to the tRunner calling
	 495  			// the test function (so the user must have
	 496  			// called tb.Helper from inside that test function).
	 497  			// If this is a top-level test, only skip up to the test function itself.
	 498  			// If we're in a subtest, continue searching in the parent test,
	 499  			// starting from the point of the call to Run which created this subtest.
	 500  			if c.level > 1 {
	 501  				frames = runtime.CallersFrames(c.creator)
	 502  				parent := c.parent
	 503  				// We're no longer looking at the current c after this point,
	 504  				// so we should unlock its mu, unless it's the original receiver,
	 505  				// in which case our caller doesn't expect us to do that.
	 506  				if shouldUnlock {
	 507  					c.mu.Unlock()
	 508  				}
	 509  				c = parent
	 510  				// Remember to unlock c.mu when we no longer need it, either
	 511  				// because we went up another nesting level, or because we
	 512  				// returned.
	 513  				shouldUnlock = true
	 514  				c.mu.Lock()
	 515  				continue
	 516  			}
	 517  			return prevFrame
	 518  		}
	 519  		// If more helper PCs have been added since we last did the conversion
	 520  		if c.helperNames == nil {
	 521  			c.helperNames = make(map[string]struct{})
	 522  			for pc := range c.helperPCs {
	 523  				c.helperNames[pcToName(pc)] = struct{}{}
	 524  			}
	 525  		}
	 526  		if _, ok := c.helperNames[frame.Function]; !ok {
	 527  			// Found a frame that wasn't inside a helper function.
	 528  			return frame
	 529  		}
	 530  	}
	 531  	return firstFrame
	 532  }
	 533  
	 534  // decorate prefixes the string with the file and line of the call site
	 535  // and inserts the final newline if needed and indentation spaces for formatting.
	 536  // This function must be called with c.mu held.
	 537  func (c *common) decorate(s string, skip int) string {
	 538  	frame := c.frameSkip(skip)
	 539  	file := frame.File
	 540  	line := frame.Line
	 541  	if file != "" {
	 542  		// Truncate file name at last file name separator.
	 543  		if index := strings.LastIndex(file, "/"); index >= 0 {
	 544  			file = file[index+1:]
	 545  		} else if index = strings.LastIndex(file, "\\"); index >= 0 {
	 546  			file = file[index+1:]
	 547  		}
	 548  	} else {
	 549  		file = "???"
	 550  	}
	 551  	if line == 0 {
	 552  		line = 1
	 553  	}
	 554  	buf := new(strings.Builder)
	 555  	// Every line is indented at least 4 spaces.
	 556  	buf.WriteString("		")
	 557  	fmt.Fprintf(buf, "%s:%d: ", file, line)
	 558  	lines := strings.Split(s, "\n")
	 559  	if l := len(lines); l > 1 && lines[l-1] == "" {
	 560  		lines = lines[:l-1]
	 561  	}
	 562  	for i, line := range lines {
	 563  		if i > 0 {
	 564  			// Second and subsequent lines are indented an additional 4 spaces.
	 565  			buf.WriteString("\n				")
	 566  		}
	 567  		buf.WriteString(line)
	 568  	}
	 569  	buf.WriteByte('\n')
	 570  	return buf.String()
	 571  }
	 572  
	 573  // flushToParent writes c.output to the parent after first writing the header
	 574  // with the given format and arguments.
	 575  func (c *common) flushToParent(testName, format string, args ...interface{}) {
	 576  	p := c.parent
	 577  	p.mu.Lock()
	 578  	defer p.mu.Unlock()
	 579  
	 580  	c.mu.Lock()
	 581  	defer c.mu.Unlock()
	 582  
	 583  	if len(c.output) > 0 {
	 584  		format += "%s"
	 585  		args = append(args[:len(args):len(args)], c.output)
	 586  		c.output = c.output[:0] // but why?
	 587  	}
	 588  
	 589  	if c.chatty != nil && p.w == c.chatty.w {
	 590  		// We're flushing to the actual output, so track that this output is
	 591  		// associated with a specific test (and, specifically, that the next output
	 592  		// is *not* associated with that test).
	 593  		//
	 594  		// Moreover, if c.output is non-empty it is important that this write be
	 595  		// atomic with respect to the output of other tests, so that we don't end up
	 596  		// with confusing '=== CONT' lines in the middle of our '--- PASS' block.
	 597  		// Neither humans nor cmd/test2json can parse those easily.
	 598  		// (See https://golang.org/issue/40771.)
	 599  		c.chatty.Updatef(testName, format, args...)
	 600  	} else {
	 601  		// We're flushing to the output buffer of the parent test, which will
	 602  		// itself follow a test-name header when it is finally flushed to stdout.
	 603  		fmt.Fprintf(p.w, format, args...)
	 604  	}
	 605  }
	 606  
	 607  type indenter struct {
	 608  	c *common
	 609  }
	 610  
	 611  func (w indenter) Write(b []byte) (n int, err error) {
	 612  	n = len(b)
	 613  	for len(b) > 0 {
	 614  		end := bytes.IndexByte(b, '\n')
	 615  		if end == -1 {
	 616  			end = len(b)
	 617  		} else {
	 618  			end++
	 619  		}
	 620  		// An indent of 4 spaces will neatly align the dashes with the status
	 621  		// indicator of the parent.
	 622  		const indent = "		"
	 623  		w.c.output = append(w.c.output, indent...)
	 624  		w.c.output = append(w.c.output, b[:end]...)
	 625  		b = b[end:]
	 626  	}
	 627  	return
	 628  }
	 629  
	 630  // fmtDuration returns a string representing d in the form "87.00s".
	 631  func fmtDuration(d time.Duration) string {
	 632  	return fmt.Sprintf("%.2fs", d.Seconds())
	 633  }
	 634  
	 635  // TB is the interface common to T and B.
	 636  type TB interface {
	 637  	Cleanup(func())
	 638  	Error(args ...interface{})
	 639  	Errorf(format string, args ...interface{})
	 640  	Fail()
	 641  	FailNow()
	 642  	Failed() bool
	 643  	Fatal(args ...interface{})
	 644  	Fatalf(format string, args ...interface{})
	 645  	Helper()
	 646  	Log(args ...interface{})
	 647  	Logf(format string, args ...interface{})
	 648  	Name() string
	 649  	Setenv(key, value string)
	 650  	Skip(args ...interface{})
	 651  	SkipNow()
	 652  	Skipf(format string, args ...interface{})
	 653  	Skipped() bool
	 654  	TempDir() string
	 655  
	 656  	// A private method to prevent users implementing the
	 657  	// interface and so future additions to it will not
	 658  	// violate Go 1 compatibility.
	 659  	private()
	 660  }
	 661  
	 662  var _ TB = (*T)(nil)
	 663  var _ TB = (*B)(nil)
	 664  
	 665  // T is a type passed to Test functions to manage test state and support formatted test logs.
	 666  //
	 667  // A test ends when its Test function returns or calls any of the methods
	 668  // FailNow, Fatal, Fatalf, SkipNow, Skip, or Skipf. Those methods, as well as
	 669  // the Parallel method, must be called only from the goroutine running the
	 670  // Test function.
	 671  //
	 672  // The other reporting methods, such as the variations of Log and Error,
	 673  // may be called simultaneously from multiple goroutines.
	 674  type T struct {
	 675  	common
	 676  	isParallel bool
	 677  	isEnvSet	 bool
	 678  	context		*testContext // For running tests and subtests.
	 679  }
	 680  
	 681  func (c *common) private() {}
	 682  
	 683  // Name returns the name of the running (sub-) test or benchmark.
	 684  //
	 685  // The name will include the name of the test along with the names of
	 686  // any nested sub-tests. If two sibling sub-tests have the same name,
	 687  // Name will append a suffix to guarantee the returned name is unique.
	 688  func (c *common) Name() string {
	 689  	return c.name
	 690  }
	 691  
	 692  func (c *common) setRan() {
	 693  	if c.parent != nil {
	 694  		c.parent.setRan()
	 695  	}
	 696  	c.mu.Lock()
	 697  	defer c.mu.Unlock()
	 698  	c.ran = true
	 699  }
	 700  
	 701  // Fail marks the function as having failed but continues execution.
	 702  func (c *common) Fail() {
	 703  	if c.parent != nil {
	 704  		c.parent.Fail()
	 705  	}
	 706  	c.mu.Lock()
	 707  	defer c.mu.Unlock()
	 708  	// c.done needs to be locked to synchronize checks to c.done in parent tests.
	 709  	if c.done {
	 710  		panic("Fail in goroutine after " + c.name + " has completed")
	 711  	}
	 712  	c.failed = true
	 713  }
	 714  
	 715  // Failed reports whether the function has failed.
	 716  func (c *common) Failed() bool {
	 717  	c.mu.RLock()
	 718  	failed := c.failed
	 719  	c.mu.RUnlock()
	 720  	return failed || c.raceErrors+race.Errors() > 0
	 721  }
	 722  
	 723  // FailNow marks the function as having failed and stops its execution
	 724  // by calling runtime.Goexit (which then runs all deferred calls in the
	 725  // current goroutine).
	 726  // Execution will continue at the next test or benchmark.
	 727  // FailNow must be called from the goroutine running the
	 728  // test or benchmark function, not from other goroutines
	 729  // created during the test. Calling FailNow does not stop
	 730  // those other goroutines.
	 731  func (c *common) FailNow() {
	 732  	c.Fail()
	 733  
	 734  	// Calling runtime.Goexit will exit the goroutine, which
	 735  	// will run the deferred functions in this goroutine,
	 736  	// which will eventually run the deferred lines in tRunner,
	 737  	// which will signal to the test loop that this test is done.
	 738  	//
	 739  	// A previous version of this code said:
	 740  	//
	 741  	//	c.duration = ...
	 742  	//	c.signal <- c.self
	 743  	//	runtime.Goexit()
	 744  	//
	 745  	// This previous version duplicated code (those lines are in
	 746  	// tRunner no matter what), but worse the goroutine teardown
	 747  	// implicit in runtime.Goexit was not guaranteed to complete
	 748  	// before the test exited. If a test deferred an important cleanup
	 749  	// function (like removing temporary files), there was no guarantee
	 750  	// it would run on a test failure. Because we send on c.signal during
	 751  	// a top-of-stack deferred function now, we know that the send
	 752  	// only happens after any other stacked defers have completed.
	 753  	c.mu.Lock()
	 754  	c.finished = true
	 755  	c.mu.Unlock()
	 756  	runtime.Goexit()
	 757  }
	 758  
	 759  // log generates the output. It's always at the same stack depth.
	 760  func (c *common) log(s string) {
	 761  	c.logDepth(s, 3) // logDepth + log + public function
	 762  }
	 763  
	 764  // logDepth generates the output at an arbitrary stack depth.
	 765  func (c *common) logDepth(s string, depth int) {
	 766  	c.mu.Lock()
	 767  	defer c.mu.Unlock()
	 768  	if c.done {
	 769  		// This test has already finished. Try and log this message
	 770  		// with our parent. If we don't have a parent, panic.
	 771  		for parent := c.parent; parent != nil; parent = parent.parent {
	 772  			parent.mu.Lock()
	 773  			defer parent.mu.Unlock()
	 774  			if !parent.done {
	 775  				parent.output = append(parent.output, parent.decorate(s, depth+1)...)
	 776  				return
	 777  			}
	 778  		}
	 779  		panic("Log in goroutine after " + c.name + " has completed: " + s)
	 780  	} else {
	 781  		if c.chatty != nil {
	 782  			if c.bench {
	 783  				// Benchmarks don't print === CONT, so we should skip the test
	 784  				// printer and just print straight to stdout.
	 785  				fmt.Print(c.decorate(s, depth+1))
	 786  			} else {
	 787  				c.chatty.Printf(c.name, "%s", c.decorate(s, depth+1))
	 788  			}
	 789  
	 790  			return
	 791  		}
	 792  		c.output = append(c.output, c.decorate(s, depth+1)...)
	 793  	}
	 794  }
	 795  
	 796  // Log formats its arguments using default formatting, analogous to Println,
	 797  // and records the text in the error log. For tests, the text will be printed only if
	 798  // the test fails or the -test.v flag is set. For benchmarks, the text is always
	 799  // printed to avoid having performance depend on the value of the -test.v flag.
	 800  func (c *common) Log(args ...interface{}) { c.log(fmt.Sprintln(args...)) }
	 801  
	 802  // Logf formats its arguments according to the format, analogous to Printf, and
	 803  // records the text in the error log. A final newline is added if not provided. For
	 804  // tests, the text will be printed only if the test fails or the -test.v flag is
	 805  // set. For benchmarks, the text is always printed to avoid having performance
	 806  // depend on the value of the -test.v flag.
	 807  func (c *common) Logf(format string, args ...interface{}) { c.log(fmt.Sprintf(format, args...)) }
	 808  
	 809  // Error is equivalent to Log followed by Fail.
	 810  func (c *common) Error(args ...interface{}) {
	 811  	c.log(fmt.Sprintln(args...))
	 812  	c.Fail()
	 813  }
	 814  
	 815  // Errorf is equivalent to Logf followed by Fail.
	 816  func (c *common) Errorf(format string, args ...interface{}) {
	 817  	c.log(fmt.Sprintf(format, args...))
	 818  	c.Fail()
	 819  }
	 820  
	 821  // Fatal is equivalent to Log followed by FailNow.
	 822  func (c *common) Fatal(args ...interface{}) {
	 823  	c.log(fmt.Sprintln(args...))
	 824  	c.FailNow()
	 825  }
	 826  
	 827  // Fatalf is equivalent to Logf followed by FailNow.
	 828  func (c *common) Fatalf(format string, args ...interface{}) {
	 829  	c.log(fmt.Sprintf(format, args...))
	 830  	c.FailNow()
	 831  }
	 832  
	 833  // Skip is equivalent to Log followed by SkipNow.
	 834  func (c *common) Skip(args ...interface{}) {
	 835  	c.log(fmt.Sprintln(args...))
	 836  	c.SkipNow()
	 837  }
	 838  
	 839  // Skipf is equivalent to Logf followed by SkipNow.
	 840  func (c *common) Skipf(format string, args ...interface{}) {
	 841  	c.log(fmt.Sprintf(format, args...))
	 842  	c.SkipNow()
	 843  }
	 844  
	 845  // SkipNow marks the test as having been skipped and stops its execution
	 846  // by calling runtime.Goexit.
	 847  // If a test fails (see Error, Errorf, Fail) and is then skipped,
	 848  // it is still considered to have failed.
	 849  // Execution will continue at the next test or benchmark. See also FailNow.
	 850  // SkipNow must be called from the goroutine running the test, not from
	 851  // other goroutines created during the test. Calling SkipNow does not stop
	 852  // those other goroutines.
	 853  func (c *common) SkipNow() {
	 854  	c.mu.Lock()
	 855  	c.skipped = true
	 856  	c.finished = true
	 857  	c.mu.Unlock()
	 858  	runtime.Goexit()
	 859  }
	 860  
	 861  // Skipped reports whether the test was skipped.
	 862  func (c *common) Skipped() bool {
	 863  	c.mu.RLock()
	 864  	defer c.mu.RUnlock()
	 865  	return c.skipped
	 866  }
	 867  
	 868  // Helper marks the calling function as a test helper function.
	 869  // When printing file and line information, that function will be skipped.
	 870  // Helper may be called simultaneously from multiple goroutines.
	 871  func (c *common) Helper() {
	 872  	c.mu.Lock()
	 873  	defer c.mu.Unlock()
	 874  	if c.helperPCs == nil {
	 875  		c.helperPCs = make(map[uintptr]struct{})
	 876  	}
	 877  	// repeating code from callerName here to save walking a stack frame
	 878  	var pc [1]uintptr
	 879  	n := runtime.Callers(2, pc[:]) // skip runtime.Callers + Helper
	 880  	if n == 0 {
	 881  		panic("testing: zero callers found")
	 882  	}
	 883  	if _, found := c.helperPCs[pc[0]]; !found {
	 884  		c.helperPCs[pc[0]] = struct{}{}
	 885  		c.helperNames = nil // map will be recreated next time it is needed
	 886  	}
	 887  }
	 888  
	 889  // Cleanup registers a function to be called when the test (or subtest) and all its
	 890  // subtests complete. Cleanup functions will be called in last added,
	 891  // first called order.
	 892  func (c *common) Cleanup(f func()) {
	 893  	var pc [maxStackLen]uintptr
	 894  	// Skip two extra frames to account for this function and runtime.Callers itself.
	 895  	n := runtime.Callers(2, pc[:])
	 896  	cleanupPc := pc[:n]
	 897  
	 898  	fn := func() {
	 899  		defer func() {
	 900  			c.mu.Lock()
	 901  			defer c.mu.Unlock()
	 902  			c.cleanupName = ""
	 903  			c.cleanupPc = nil
	 904  		}()
	 905  
	 906  		name := callerName(0)
	 907  		c.mu.Lock()
	 908  		c.cleanupName = name
	 909  		c.cleanupPc = cleanupPc
	 910  		c.mu.Unlock()
	 911  
	 912  		f()
	 913  	}
	 914  
	 915  	c.mu.Lock()
	 916  	defer c.mu.Unlock()
	 917  	c.cleanups = append(c.cleanups, fn)
	 918  }
	 919  
	 920  // TempDir returns a temporary directory for the test to use.
	 921  // The directory is automatically removed by Cleanup when the test and
	 922  // all its subtests complete.
	 923  // Each subsequent call to t.TempDir returns a unique directory;
	 924  // if the directory creation fails, TempDir terminates the test by calling Fatal.
	 925  func (c *common) TempDir() string {
	 926  	// Use a single parent directory for all the temporary directories
	 927  	// created by a test, each numbered sequentially.
	 928  	c.tempDirMu.Lock()
	 929  	var nonExistent bool
	 930  	if c.tempDir == "" { // Usually the case with js/wasm
	 931  		nonExistent = true
	 932  	} else {
	 933  		_, err := os.Stat(c.tempDir)
	 934  		nonExistent = os.IsNotExist(err)
	 935  		if err != nil && !nonExistent {
	 936  			c.Fatalf("TempDir: %v", err)
	 937  		}
	 938  	}
	 939  
	 940  	if nonExistent {
	 941  		c.Helper()
	 942  
	 943  		// Drop unusual characters (such as path separators or
	 944  		// characters interacting with globs) from the directory name to
	 945  		// avoid surprising os.MkdirTemp behavior.
	 946  		mapper := func(r rune) rune {
	 947  			if r < utf8.RuneSelf {
	 948  				const allowed = "!#$%&()+,-.=@^_{}~ "
	 949  				if '0' <= r && r <= '9' ||
	 950  					'a' <= r && r <= 'z' ||
	 951  					'A' <= r && r <= 'Z' {
	 952  					return r
	 953  				}
	 954  				if strings.ContainsRune(allowed, r) {
	 955  					return r
	 956  				}
	 957  			} else if unicode.IsLetter(r) || unicode.IsNumber(r) {
	 958  				return r
	 959  			}
	 960  			return -1
	 961  		}
	 962  		pattern := strings.Map(mapper, c.Name())
	 963  		c.tempDir, c.tempDirErr = os.MkdirTemp("", pattern)
	 964  		if c.tempDirErr == nil {
	 965  			c.Cleanup(func() {
	 966  				if err := os.RemoveAll(c.tempDir); err != nil {
	 967  					c.Errorf("TempDir RemoveAll cleanup: %v", err)
	 968  				}
	 969  			})
	 970  		}
	 971  	}
	 972  	c.tempDirMu.Unlock()
	 973  
	 974  	if c.tempDirErr != nil {
	 975  		c.Fatalf("TempDir: %v", c.tempDirErr)
	 976  	}
	 977  	seq := atomic.AddInt32(&c.tempDirSeq, 1)
	 978  	dir := fmt.Sprintf("%s%c%03d", c.tempDir, os.PathSeparator, seq)
	 979  	if err := os.Mkdir(dir, 0777); err != nil {
	 980  		c.Fatalf("TempDir: %v", err)
	 981  	}
	 982  	return dir
	 983  }
	 984  
	 985  // Setenv calls os.Setenv(key, value) and uses Cleanup to
	 986  // restore the environment variable to its original value
	 987  // after the test.
	 988  //
	 989  // This cannot be used in parallel tests.
	 990  func (c *common) Setenv(key, value string) {
	 991  	prevValue, ok := os.LookupEnv(key)
	 992  
	 993  	if err := os.Setenv(key, value); err != nil {
	 994  		c.Fatalf("cannot set environment variable: %v", err)
	 995  	}
	 996  
	 997  	if ok {
	 998  		c.Cleanup(func() {
	 999  			os.Setenv(key, prevValue)
	1000  		})
	1001  	} else {
	1002  		c.Cleanup(func() {
	1003  			os.Unsetenv(key)
	1004  		})
	1005  	}
	1006  }
	1007  
	1008  // panicHanding is an argument to runCleanup.
	1009  type panicHandling int
	1010  
	1011  const (
	1012  	normalPanic panicHandling = iota
	1013  	recoverAndReturnPanic
	1014  )
	1015  
	1016  // runCleanup is called at the end of the test.
	1017  // If catchPanic is true, this will catch panics, and return the recovered
	1018  // value if any.
	1019  func (c *common) runCleanup(ph panicHandling) (panicVal interface{}) {
	1020  	if ph == recoverAndReturnPanic {
	1021  		defer func() {
	1022  			panicVal = recover()
	1023  		}()
	1024  	}
	1025  
	1026  	// Make sure that if a cleanup function panics,
	1027  	// we still run the remaining cleanup functions.
	1028  	defer func() {
	1029  		c.mu.Lock()
	1030  		recur := len(c.cleanups) > 0
	1031  		c.mu.Unlock()
	1032  		if recur {
	1033  			c.runCleanup(normalPanic)
	1034  		}
	1035  	}()
	1036  
	1037  	for {
	1038  		var cleanup func()
	1039  		c.mu.Lock()
	1040  		if len(c.cleanups) > 0 {
	1041  			last := len(c.cleanups) - 1
	1042  			cleanup = c.cleanups[last]
	1043  			c.cleanups = c.cleanups[:last]
	1044  		}
	1045  		c.mu.Unlock()
	1046  		if cleanup == nil {
	1047  			return nil
	1048  		}
	1049  		cleanup()
	1050  	}
	1051  }
	1052  
	1053  // callerName gives the function name (qualified with a package path)
	1054  // for the caller after skip frames (where 0 means the current function).
	1055  func callerName(skip int) string {
	1056  	var pc [1]uintptr
	1057  	n := runtime.Callers(skip+2, pc[:]) // skip + runtime.Callers + callerName
	1058  	if n == 0 {
	1059  		panic("testing: zero callers found")
	1060  	}
	1061  	return pcToName(pc[0])
	1062  }
	1063  
	1064  func pcToName(pc uintptr) string {
	1065  	pcs := []uintptr{pc}
	1066  	frames := runtime.CallersFrames(pcs)
	1067  	frame, _ := frames.Next()
	1068  	return frame.Function
	1069  }
	1070  
	1071  // Parallel signals that this test is to be run in parallel with (and only with)
	1072  // other parallel tests. When a test is run multiple times due to use of
	1073  // -test.count or -test.cpu, multiple instances of a single test never run in
	1074  // parallel with each other.
	1075  func (t *T) Parallel() {
	1076  	if t.isParallel {
	1077  		panic("testing: t.Parallel called multiple times")
	1078  	}
	1079  	if t.isEnvSet {
	1080  		panic("testing: t.Parallel called after t.Setenv; cannot set environment variables in parallel tests")
	1081  	}
	1082  	t.isParallel = true
	1083  
	1084  	// We don't want to include the time we spend waiting for serial tests
	1085  	// in the test duration. Record the elapsed time thus far and reset the
	1086  	// timer afterwards.
	1087  	t.duration += time.Since(t.start)
	1088  
	1089  	// Add to the list of tests to be released by the parent.
	1090  	t.parent.sub = append(t.parent.sub, t)
	1091  	t.raceErrors += race.Errors()
	1092  
	1093  	if t.chatty != nil {
	1094  		// Unfortunately, even though PAUSE indicates that the named test is *no
	1095  		// longer* running, cmd/test2json interprets it as changing the active test
	1096  		// for the purpose of log parsing. We could fix cmd/test2json, but that
	1097  		// won't fix existing deployments of third-party tools that already shell
	1098  		// out to older builds of cmd/test2json — so merely fixing cmd/test2json
	1099  		// isn't enough for now.
	1100  		t.chatty.Updatef(t.name, "=== PAUSE %s\n", t.name)
	1101  	}
	1102  
	1103  	t.signal <- true	 // Release calling test.
	1104  	<-t.parent.barrier // Wait for the parent test to complete.
	1105  	t.context.waitParallel()
	1106  
	1107  	if t.chatty != nil {
	1108  		t.chatty.Updatef(t.name, "=== CONT	%s\n", t.name)
	1109  	}
	1110  
	1111  	t.start = time.Now()
	1112  	t.raceErrors += -race.Errors()
	1113  }
	1114  
	1115  // Setenv calls os.Setenv(key, value) and uses Cleanup to
	1116  // restore the environment variable to its original value
	1117  // after the test.
	1118  //
	1119  // This cannot be used in parallel tests.
	1120  func (t *T) Setenv(key, value string) {
	1121  	if t.isParallel {
	1122  		panic("testing: t.Setenv called after t.Parallel; cannot set environment variables in parallel tests")
	1123  	}
	1124  
	1125  	t.isEnvSet = true
	1126  
	1127  	t.common.Setenv(key, value)
	1128  }
	1129  
	1130  // InternalTest is an internal type but exported because it is cross-package;
	1131  // it is part of the implementation of the "go test" command.
	1132  type InternalTest struct {
	1133  	Name string
	1134  	F		func(*T)
	1135  }
	1136  
	1137  var errNilPanicOrGoexit = errors.New("test executed panic(nil) or runtime.Goexit")
	1138  
	1139  func tRunner(t *T, fn func(t *T)) {
	1140  	t.runner = callerName(0)
	1141  
	1142  	// When this goroutine is done, either because fn(t)
	1143  	// returned normally or because a test failure triggered
	1144  	// a call to runtime.Goexit, record the duration and send
	1145  	// a signal saying that the test is done.
	1146  	defer func() {
	1147  		if t.Failed() {
	1148  			atomic.AddUint32(&numFailed, 1)
	1149  		}
	1150  
	1151  		if t.raceErrors+race.Errors() > 0 {
	1152  			t.Errorf("race detected during execution of test")
	1153  		}
	1154  
	1155  		// If the test panicked, print any test output before dying.
	1156  		err := recover()
	1157  		signal := true
	1158  
	1159  		t.mu.RLock()
	1160  		finished := t.finished
	1161  		t.mu.RUnlock()
	1162  		if !finished && err == nil {
	1163  			err = errNilPanicOrGoexit
	1164  			for p := t.parent; p != nil; p = p.parent {
	1165  				p.mu.RLock()
	1166  				finished = p.finished
	1167  				p.mu.RUnlock()
	1168  				if finished {
	1169  					t.Errorf("%v: subtest may have called FailNow on a parent test", err)
	1170  					err = nil
	1171  					signal = false
	1172  					break
	1173  				}
	1174  			}
	1175  		}
	1176  		// Use a deferred call to ensure that we report that the test is
	1177  		// complete even if a cleanup function calls t.FailNow. See issue 41355.
	1178  		didPanic := false
	1179  		defer func() {
	1180  			if didPanic {
	1181  				return
	1182  			}
	1183  			if err != nil {
	1184  				panic(err)
	1185  			}
	1186  			// Only report that the test is complete if it doesn't panic,
	1187  			// as otherwise the test binary can exit before the panic is
	1188  			// reported to the user. See issue 41479.
	1189  			t.signal <- signal
	1190  		}()
	1191  
	1192  		doPanic := func(err interface{}) {
	1193  			t.Fail()
	1194  			if r := t.runCleanup(recoverAndReturnPanic); r != nil {
	1195  				t.Logf("cleanup panicked with %v", r)
	1196  			}
	1197  			// Flush the output log up to the root before dying.
	1198  			for root := &t.common; root.parent != nil; root = root.parent {
	1199  				root.mu.Lock()
	1200  				root.duration += time.Since(root.start)
	1201  				d := root.duration
	1202  				root.mu.Unlock()
	1203  				root.flushToParent(root.name, "--- FAIL: %s (%s)\n", root.name, fmtDuration(d))
	1204  				if r := root.parent.runCleanup(recoverAndReturnPanic); r != nil {
	1205  					fmt.Fprintf(root.parent.w, "cleanup panicked with %v", r)
	1206  				}
	1207  			}
	1208  			didPanic = true
	1209  			panic(err)
	1210  		}
	1211  		if err != nil {
	1212  			doPanic(err)
	1213  		}
	1214  
	1215  		t.duration += time.Since(t.start)
	1216  
	1217  		if len(t.sub) > 0 {
	1218  			// Run parallel subtests.
	1219  			// Decrease the running count for this test.
	1220  			t.context.release()
	1221  			// Release the parallel subtests.
	1222  			close(t.barrier)
	1223  			// Wait for subtests to complete.
	1224  			for _, sub := range t.sub {
	1225  				<-sub.signal
	1226  			}
	1227  			cleanupStart := time.Now()
	1228  			err := t.runCleanup(recoverAndReturnPanic)
	1229  			t.duration += time.Since(cleanupStart)
	1230  			if err != nil {
	1231  				doPanic(err)
	1232  			}
	1233  			if !t.isParallel {
	1234  				// Reacquire the count for sequential tests. See comment in Run.
	1235  				t.context.waitParallel()
	1236  			}
	1237  		} else if t.isParallel {
	1238  			// Only release the count for this test if it was run as a parallel
	1239  			// test. See comment in Run method.
	1240  			t.context.release()
	1241  		}
	1242  		t.report() // Report after all subtests have finished.
	1243  
	1244  		// Do not lock t.done to allow race detector to detect race in case
	1245  		// the user does not appropriately synchronizes a goroutine.
	1246  		t.done = true
	1247  		if t.parent != nil && atomic.LoadInt32(&t.hasSub) == 0 {
	1248  			t.setRan()
	1249  		}
	1250  	}()
	1251  	defer func() {
	1252  		if len(t.sub) == 0 {
	1253  			t.runCleanup(normalPanic)
	1254  		}
	1255  	}()
	1256  
	1257  	t.start = time.Now()
	1258  	t.raceErrors = -race.Errors()
	1259  	fn(t)
	1260  
	1261  	// code beyond here will not be executed when FailNow is invoked
	1262  	t.mu.Lock()
	1263  	t.finished = true
	1264  	t.mu.Unlock()
	1265  }
	1266  
	1267  // Run runs f as a subtest of t called name. It runs f in a separate goroutine
	1268  // and blocks until f returns or calls t.Parallel to become a parallel test.
	1269  // Run reports whether f succeeded (or at least did not fail before calling t.Parallel).
	1270  //
	1271  // Run may be called simultaneously from multiple goroutines, but all such calls
	1272  // must return before the outer test function for t returns.
	1273  func (t *T) Run(name string, f func(t *T)) bool {
	1274  	atomic.StoreInt32(&t.hasSub, 1)
	1275  	testName, ok, _ := t.context.match.fullName(&t.common, name)
	1276  	if !ok || shouldFailFast() {
	1277  		return true
	1278  	}
	1279  	// Record the stack trace at the point of this call so that if the subtest
	1280  	// function - which runs in a separate stack - is marked as a helper, we can
	1281  	// continue walking the stack into the parent test.
	1282  	var pc [maxStackLen]uintptr
	1283  	n := runtime.Callers(2, pc[:])
	1284  	t = &T{
	1285  		common: common{
	1286  			barrier: make(chan bool),
	1287  			signal:	make(chan bool, 1),
	1288  			name:		testName,
	1289  			parent:	&t.common,
	1290  			level:	 t.level + 1,
	1291  			creator: pc[:n],
	1292  			chatty:	t.chatty,
	1293  		},
	1294  		context: t.context,
	1295  	}
	1296  	t.w = indenter{&t.common}
	1297  
	1298  	if t.chatty != nil {
	1299  		t.chatty.Updatef(t.name, "=== RUN	 %s\n", t.name)
	1300  	}
	1301  	// Instead of reducing the running count of this test before calling the
	1302  	// tRunner and increasing it afterwards, we rely on tRunner keeping the
	1303  	// count correct. This ensures that a sequence of sequential tests runs
	1304  	// without being preempted, even when their parent is a parallel test. This
	1305  	// may especially reduce surprises if *parallel == 1.
	1306  	go tRunner(t, f)
	1307  	if !<-t.signal {
	1308  		// At this point, it is likely that FailNow was called on one of the
	1309  		// parent tests by one of the subtests. Continue aborting up the chain.
	1310  		runtime.Goexit()
	1311  	}
	1312  	return !t.failed
	1313  }
	1314  
	1315  // Deadline reports the time at which the test binary will have
	1316  // exceeded the timeout specified by the -timeout flag.
	1317  //
	1318  // The ok result is false if the -timeout flag indicates “no timeout” (0).
	1319  func (t *T) Deadline() (deadline time.Time, ok bool) {
	1320  	deadline = t.context.deadline
	1321  	return deadline, !deadline.IsZero()
	1322  }
	1323  
	1324  // testContext holds all fields that are common to all tests. This includes
	1325  // synchronization primitives to run at most *parallel tests.
	1326  type testContext struct {
	1327  	match		*matcher
	1328  	deadline time.Time
	1329  
	1330  	mu sync.Mutex
	1331  
	1332  	// Channel used to signal tests that are ready to be run in parallel.
	1333  	startParallel chan bool
	1334  
	1335  	// running is the number of tests currently running in parallel.
	1336  	// This does not include tests that are waiting for subtests to complete.
	1337  	running int
	1338  
	1339  	// numWaiting is the number tests waiting to be run in parallel.
	1340  	numWaiting int
	1341  
	1342  	// maxParallel is a copy of the parallel flag.
	1343  	maxParallel int
	1344  }
	1345  
	1346  func newTestContext(maxParallel int, m *matcher) *testContext {
	1347  	return &testContext{
	1348  		match:				 m,
	1349  		startParallel: make(chan bool),
	1350  		maxParallel:	 maxParallel,
	1351  		running:			 1, // Set the count to 1 for the main (sequential) test.
	1352  	}
	1353  }
	1354  
	1355  func (c *testContext) waitParallel() {
	1356  	c.mu.Lock()
	1357  	if c.running < c.maxParallel {
	1358  		c.running++
	1359  		c.mu.Unlock()
	1360  		return
	1361  	}
	1362  	c.numWaiting++
	1363  	c.mu.Unlock()
	1364  	<-c.startParallel
	1365  }
	1366  
	1367  func (c *testContext) release() {
	1368  	c.mu.Lock()
	1369  	if c.numWaiting == 0 {
	1370  		c.running--
	1371  		c.mu.Unlock()
	1372  		return
	1373  	}
	1374  	c.numWaiting--
	1375  	c.mu.Unlock()
	1376  	c.startParallel <- true // Pick a waiting test to be run.
	1377  }
	1378  
	1379  // No one should be using func Main anymore.
	1380  // See the doc comment on func Main and use MainStart instead.
	1381  var errMain = errors.New("testing: unexpected use of func Main")
	1382  
	1383  type matchStringOnly func(pat, str string) (bool, error)
	1384  
	1385  func (f matchStringOnly) MatchString(pat, str string) (bool, error)	 { return f(pat, str) }
	1386  func (f matchStringOnly) StartCPUProfile(w io.Writer) error					 { return errMain }
	1387  func (f matchStringOnly) StopCPUProfile()														 {}
	1388  func (f matchStringOnly) WriteProfileTo(string, io.Writer, int) error { return errMain }
	1389  func (f matchStringOnly) ImportPath() string													{ return "" }
	1390  func (f matchStringOnly) StartTestLog(io.Writer)											{}
	1391  func (f matchStringOnly) StopTestLog() error													{ return errMain }
	1392  func (f matchStringOnly) SetPanicOnExit0(bool)												{}
	1393  
	1394  // Main is an internal function, part of the implementation of the "go test" command.
	1395  // It was exported because it is cross-package and predates "internal" packages.
	1396  // It is no longer used by "go test" but preserved, as much as possible, for other
	1397  // systems that simulate "go test" using Main, but Main sometimes cannot be updated as
	1398  // new functionality is added to the testing package.
	1399  // Systems simulating "go test" should be updated to use MainStart.
	1400  func Main(matchString func(pat, str string) (bool, error), tests []InternalTest, benchmarks []InternalBenchmark, examples []InternalExample) {
	1401  	os.Exit(MainStart(matchStringOnly(matchString), tests, benchmarks, examples).Run())
	1402  }
	1403  
	1404  // M is a type passed to a TestMain function to run the actual tests.
	1405  type M struct {
	1406  	deps			 testDeps
	1407  	tests			[]InternalTest
	1408  	benchmarks []InternalBenchmark
	1409  	examples	 []InternalExample
	1410  
	1411  	timer		 *time.Timer
	1412  	afterOnce sync.Once
	1413  
	1414  	numRun int
	1415  
	1416  	// value to pass to os.Exit, the outer test func main
	1417  	// harness calls os.Exit with this code. See #34129.
	1418  	exitCode int
	1419  }
	1420  
	1421  // testDeps is an internal interface of functionality that is
	1422  // passed into this package by a test's generated main package.
	1423  // The canonical implementation of this interface is
	1424  // testing/internal/testdeps's TestDeps.
	1425  type testDeps interface {
	1426  	ImportPath() string
	1427  	MatchString(pat, str string) (bool, error)
	1428  	SetPanicOnExit0(bool)
	1429  	StartCPUProfile(io.Writer) error
	1430  	StopCPUProfile()
	1431  	StartTestLog(io.Writer)
	1432  	StopTestLog() error
	1433  	WriteProfileTo(string, io.Writer, int) error
	1434  }
	1435  
	1436  // MainStart is meant for use by tests generated by 'go test'.
	1437  // It is not meant to be called directly and is not subject to the Go 1 compatibility document.
	1438  // It may change signature from release to release.
	1439  func MainStart(deps testDeps, tests []InternalTest, benchmarks []InternalBenchmark, examples []InternalExample) *M {
	1440  	Init()
	1441  	return &M{
	1442  		deps:			 deps,
	1443  		tests:			tests,
	1444  		benchmarks: benchmarks,
	1445  		examples:	 examples,
	1446  	}
	1447  }
	1448  
	1449  // Run runs the tests. It returns an exit code to pass to os.Exit.
	1450  func (m *M) Run() (code int) {
	1451  	defer func() {
	1452  		code = m.exitCode
	1453  	}()
	1454  
	1455  	// Count the number of calls to m.Run.
	1456  	// We only ever expected 1, but we didn't enforce that,
	1457  	// and now there are tests in the wild that call m.Run multiple times.
	1458  	// Sigh. golang.org/issue/23129.
	1459  	m.numRun++
	1460  
	1461  	// TestMain may have already called flag.Parse.
	1462  	if !flag.Parsed() {
	1463  		flag.Parse()
	1464  	}
	1465  
	1466  	if *parallel < 1 {
	1467  		fmt.Fprintln(os.Stderr, "testing: -parallel can only be given a positive integer")
	1468  		flag.Usage()
	1469  		m.exitCode = 2
	1470  		return
	1471  	}
	1472  
	1473  	if len(*matchList) != 0 {
	1474  		listTests(m.deps.MatchString, m.tests, m.benchmarks, m.examples)
	1475  		m.exitCode = 0
	1476  		return
	1477  	}
	1478  
	1479  	if *shuffle != "off" {
	1480  		var n int64
	1481  		var err error
	1482  		if *shuffle == "on" {
	1483  			n = time.Now().UnixNano()
	1484  		} else {
	1485  			n, err = strconv.ParseInt(*shuffle, 10, 64)
	1486  			if err != nil {
	1487  				fmt.Fprintln(os.Stderr, `testing: -shuffle should be "off", "on", or a valid integer:`, err)
	1488  				m.exitCode = 2
	1489  				return
	1490  			}
	1491  		}
	1492  		fmt.Println("-test.shuffle", n)
	1493  		rng := rand.New(rand.NewSource(n))
	1494  		rng.Shuffle(len(m.tests), func(i, j int) { m.tests[i], m.tests[j] = m.tests[j], m.tests[i] })
	1495  		rng.Shuffle(len(m.benchmarks), func(i, j int) { m.benchmarks[i], m.benchmarks[j] = m.benchmarks[j], m.benchmarks[i] })
	1496  	}
	1497  
	1498  	parseCpuList()
	1499  
	1500  	m.before()
	1501  	defer m.after()
	1502  	deadline := m.startAlarm()
	1503  	haveExamples = len(m.examples) > 0
	1504  	testRan, testOk := runTests(m.deps.MatchString, m.tests, deadline)
	1505  	exampleRan, exampleOk := runExamples(m.deps.MatchString, m.examples)
	1506  	m.stopAlarm()
	1507  	if !testRan && !exampleRan && *matchBenchmarks == "" {
	1508  		fmt.Fprintln(os.Stderr, "testing: warning: no tests to run")
	1509  	}
	1510  	if !testOk || !exampleOk || !runBenchmarks(m.deps.ImportPath(), m.deps.MatchString, m.benchmarks) || race.Errors() > 0 {
	1511  		fmt.Println("FAIL")
	1512  		m.exitCode = 1
	1513  		return
	1514  	}
	1515  
	1516  	fmt.Println("PASS")
	1517  	m.exitCode = 0
	1518  	return
	1519  }
	1520  
	1521  func (t *T) report() {
	1522  	if t.parent == nil {
	1523  		return
	1524  	}
	1525  	dstr := fmtDuration(t.duration)
	1526  	format := "--- %s: %s (%s)\n"
	1527  	if t.Failed() {
	1528  		t.flushToParent(t.name, format, "FAIL", t.name, dstr)
	1529  	} else if t.chatty != nil {
	1530  		if t.Skipped() {
	1531  			t.flushToParent(t.name, format, "SKIP", t.name, dstr)
	1532  		} else {
	1533  			t.flushToParent(t.name, format, "PASS", t.name, dstr)
	1534  		}
	1535  	}
	1536  }
	1537  
	1538  func listTests(matchString func(pat, str string) (bool, error), tests []InternalTest, benchmarks []InternalBenchmark, examples []InternalExample) {
	1539  	if _, err := matchString(*matchList, "non-empty"); err != nil {
	1540  		fmt.Fprintf(os.Stderr, "testing: invalid regexp in -test.list (%q): %s\n", *matchList, err)
	1541  		os.Exit(1)
	1542  	}
	1543  
	1544  	for _, test := range tests {
	1545  		if ok, _ := matchString(*matchList, test.Name); ok {
	1546  			fmt.Println(test.Name)
	1547  		}
	1548  	}
	1549  	for _, bench := range benchmarks {
	1550  		if ok, _ := matchString(*matchList, bench.Name); ok {
	1551  			fmt.Println(bench.Name)
	1552  		}
	1553  	}
	1554  	for _, example := range examples {
	1555  		if ok, _ := matchString(*matchList, example.Name); ok {
	1556  			fmt.Println(example.Name)
	1557  		}
	1558  	}
	1559  }
	1560  
	1561  // RunTests is an internal function but exported because it is cross-package;
	1562  // it is part of the implementation of the "go test" command.
	1563  func RunTests(matchString func(pat, str string) (bool, error), tests []InternalTest) (ok bool) {
	1564  	var deadline time.Time
	1565  	if *timeout > 0 {
	1566  		deadline = time.Now().Add(*timeout)
	1567  	}
	1568  	ran, ok := runTests(matchString, tests, deadline)
	1569  	if !ran && !haveExamples {
	1570  		fmt.Fprintln(os.Stderr, "testing: warning: no tests to run")
	1571  	}
	1572  	return ok
	1573  }
	1574  
	1575  func runTests(matchString func(pat, str string) (bool, error), tests []InternalTest, deadline time.Time) (ran, ok bool) {
	1576  	ok = true
	1577  	for _, procs := range cpuList {
	1578  		runtime.GOMAXPROCS(procs)
	1579  		for i := uint(0); i < *count; i++ {
	1580  			if shouldFailFast() {
	1581  				break
	1582  			}
	1583  			ctx := newTestContext(*parallel, newMatcher(matchString, *match, "-test.run"))
	1584  			ctx.deadline = deadline
	1585  			t := &T{
	1586  				common: common{
	1587  					signal:	make(chan bool, 1),
	1588  					barrier: make(chan bool),
	1589  					w:			 os.Stdout,
	1590  				},
	1591  				context: ctx,
	1592  			}
	1593  			if Verbose() {
	1594  				t.chatty = newChattyPrinter(t.w)
	1595  			}
	1596  			tRunner(t, func(t *T) {
	1597  				for _, test := range tests {
	1598  					t.Run(test.Name, test.F)
	1599  				}
	1600  			})
	1601  			select {
	1602  			case <-t.signal:
	1603  			default:
	1604  				panic("internal error: tRunner exited without sending on t.signal")
	1605  			}
	1606  			ok = ok && !t.Failed()
	1607  			ran = ran || t.ran
	1608  		}
	1609  	}
	1610  	return ran, ok
	1611  }
	1612  
	1613  // before runs before all testing.
	1614  func (m *M) before() {
	1615  	if *memProfileRate > 0 {
	1616  		runtime.MemProfileRate = *memProfileRate
	1617  	}
	1618  	if *cpuProfile != "" {
	1619  		f, err := os.Create(toOutputDir(*cpuProfile))
	1620  		if err != nil {
	1621  			fmt.Fprintf(os.Stderr, "testing: %s\n", err)
	1622  			return
	1623  		}
	1624  		if err := m.deps.StartCPUProfile(f); err != nil {
	1625  			fmt.Fprintf(os.Stderr, "testing: can't start cpu profile: %s\n", err)
	1626  			f.Close()
	1627  			return
	1628  		}
	1629  		// Could save f so after can call f.Close; not worth the effort.
	1630  	}
	1631  	if *traceFile != "" {
	1632  		f, err := os.Create(toOutputDir(*traceFile))
	1633  		if err != nil {
	1634  			fmt.Fprintf(os.Stderr, "testing: %s\n", err)
	1635  			return
	1636  		}
	1637  		if err := trace.Start(f); err != nil {
	1638  			fmt.Fprintf(os.Stderr, "testing: can't start tracing: %s\n", err)
	1639  			f.Close()
	1640  			return
	1641  		}
	1642  		// Could save f so after can call f.Close; not worth the effort.
	1643  	}
	1644  	if *blockProfile != "" && *blockProfileRate >= 0 {
	1645  		runtime.SetBlockProfileRate(*blockProfileRate)
	1646  	}
	1647  	if *mutexProfile != "" && *mutexProfileFraction >= 0 {
	1648  		runtime.SetMutexProfileFraction(*mutexProfileFraction)
	1649  	}
	1650  	if *coverProfile != "" && cover.Mode == "" {
	1651  		fmt.Fprintf(os.Stderr, "testing: cannot use -test.coverprofile because test binary was not built with coverage enabled\n")
	1652  		os.Exit(2)
	1653  	}
	1654  	if *testlog != "" {
	1655  		// Note: Not using toOutputDir.
	1656  		// This file is for use by cmd/go, not users.
	1657  		var f *os.File
	1658  		var err error
	1659  		if m.numRun == 1 {
	1660  			f, err = os.Create(*testlog)
	1661  		} else {
	1662  			f, err = os.OpenFile(*testlog, os.O_WRONLY, 0)
	1663  			if err == nil {
	1664  				f.Seek(0, io.SeekEnd)
	1665  			}
	1666  		}
	1667  		if err != nil {
	1668  			fmt.Fprintf(os.Stderr, "testing: %s\n", err)
	1669  			os.Exit(2)
	1670  		}
	1671  		m.deps.StartTestLog(f)
	1672  		testlogFile = f
	1673  	}
	1674  	if *panicOnExit0 {
	1675  		m.deps.SetPanicOnExit0(true)
	1676  	}
	1677  }
	1678  
	1679  // after runs after all testing.
	1680  func (m *M) after() {
	1681  	m.afterOnce.Do(func() {
	1682  		m.writeProfiles()
	1683  	})
	1684  
	1685  	// Restore PanicOnExit0 after every run, because we set it to true before
	1686  	// every run. Otherwise, if m.Run is called multiple times the behavior of
	1687  	// os.Exit(0) will not be restored after the second run.
	1688  	if *panicOnExit0 {
	1689  		m.deps.SetPanicOnExit0(false)
	1690  	}
	1691  }
	1692  
	1693  func (m *M) writeProfiles() {
	1694  	if *testlog != "" {
	1695  		if err := m.deps.StopTestLog(); err != nil {
	1696  			fmt.Fprintf(os.Stderr, "testing: can't write %s: %s\n", *testlog, err)
	1697  			os.Exit(2)
	1698  		}
	1699  		if err := testlogFile.Close(); err != nil {
	1700  			fmt.Fprintf(os.Stderr, "testing: can't write %s: %s\n", *testlog, err)
	1701  			os.Exit(2)
	1702  		}
	1703  	}
	1704  	if *cpuProfile != "" {
	1705  		m.deps.StopCPUProfile() // flushes profile to disk
	1706  	}
	1707  	if *traceFile != "" {
	1708  		trace.Stop() // flushes trace to disk
	1709  	}
	1710  	if *memProfile != "" {
	1711  		f, err := os.Create(toOutputDir(*memProfile))
	1712  		if err != nil {
	1713  			fmt.Fprintf(os.Stderr, "testing: %s\n", err)
	1714  			os.Exit(2)
	1715  		}
	1716  		runtime.GC() // materialize all statistics
	1717  		if err = m.deps.WriteProfileTo("allocs", f, 0); err != nil {
	1718  			fmt.Fprintf(os.Stderr, "testing: can't write %s: %s\n", *memProfile, err)
	1719  			os.Exit(2)
	1720  		}
	1721  		f.Close()
	1722  	}
	1723  	if *blockProfile != "" && *blockProfileRate >= 0 {
	1724  		f, err := os.Create(toOutputDir(*blockProfile))
	1725  		if err != nil {
	1726  			fmt.Fprintf(os.Stderr, "testing: %s\n", err)
	1727  			os.Exit(2)
	1728  		}
	1729  		if err = m.deps.WriteProfileTo("block", f, 0); err != nil {
	1730  			fmt.Fprintf(os.Stderr, "testing: can't write %s: %s\n", *blockProfile, err)
	1731  			os.Exit(2)
	1732  		}
	1733  		f.Close()
	1734  	}
	1735  	if *mutexProfile != "" && *mutexProfileFraction >= 0 {
	1736  		f, err := os.Create(toOutputDir(*mutexProfile))
	1737  		if err != nil {
	1738  			fmt.Fprintf(os.Stderr, "testing: %s\n", err)
	1739  			os.Exit(2)
	1740  		}
	1741  		if err = m.deps.WriteProfileTo("mutex", f, 0); err != nil {
	1742  			fmt.Fprintf(os.Stderr, "testing: can't write %s: %s\n", *mutexProfile, err)
	1743  			os.Exit(2)
	1744  		}
	1745  		f.Close()
	1746  	}
	1747  	if cover.Mode != "" {
	1748  		coverReport()
	1749  	}
	1750  }
	1751  
	1752  // toOutputDir returns the file name relocated, if required, to outputDir.
	1753  // Simple implementation to avoid pulling in path/filepath.
	1754  func toOutputDir(path string) string {
	1755  	if *outputDir == "" || path == "" {
	1756  		return path
	1757  	}
	1758  	// On Windows, it's clumsy, but we can be almost always correct
	1759  	// by just looking for a drive letter and a colon.
	1760  	// Absolute paths always have a drive letter (ignoring UNC).
	1761  	// Problem: if path == "C:A" and outputdir == "C:\Go" it's unclear
	1762  	// what to do, but even then path/filepath doesn't help.
	1763  	// TODO: Worth doing better? Probably not, because we're here only
	1764  	// under the management of go test.
	1765  	if runtime.GOOS == "windows" && len(path) >= 2 {
	1766  		letter, colon := path[0], path[1]
	1767  		if ('a' <= letter && letter <= 'z' || 'A' <= letter && letter <= 'Z') && colon == ':' {
	1768  			// If path starts with a drive letter we're stuck with it regardless.
	1769  			return path
	1770  		}
	1771  	}
	1772  	if os.IsPathSeparator(path[0]) {
	1773  		return path
	1774  	}
	1775  	return fmt.Sprintf("%s%c%s", *outputDir, os.PathSeparator, path)
	1776  }
	1777  
	1778  // startAlarm starts an alarm if requested.
	1779  func (m *M) startAlarm() time.Time {
	1780  	if *timeout <= 0 {
	1781  		return time.Time{}
	1782  	}
	1783  
	1784  	deadline := time.Now().Add(*timeout)
	1785  	m.timer = time.AfterFunc(*timeout, func() {
	1786  		m.after()
	1787  		debug.SetTraceback("all")
	1788  		panic(fmt.Sprintf("test timed out after %v", *timeout))
	1789  	})
	1790  	return deadline
	1791  }
	1792  
	1793  // stopAlarm turns off the alarm.
	1794  func (m *M) stopAlarm() {
	1795  	if *timeout > 0 {
	1796  		m.timer.Stop()
	1797  	}
	1798  }
	1799  
	1800  func parseCpuList() {
	1801  	for _, val := range strings.Split(*cpuListStr, ",") {
	1802  		val = strings.TrimSpace(val)
	1803  		if val == "" {
	1804  			continue
	1805  		}
	1806  		cpu, err := strconv.Atoi(val)
	1807  		if err != nil || cpu <= 0 {
	1808  			fmt.Fprintf(os.Stderr, "testing: invalid value %q for -test.cpu\n", val)
	1809  			os.Exit(1)
	1810  		}
	1811  		cpuList = append(cpuList, cpu)
	1812  	}
	1813  	if cpuList == nil {
	1814  		cpuList = append(cpuList, runtime.GOMAXPROCS(-1))
	1815  	}
	1816  }
	1817  
	1818  func shouldFailFast() bool {
	1819  	return *failFast && atomic.LoadUint32(&numFailed) > 0
	1820  }
	1821  

View as plain text