github.com/ActiveState/go@v0.0.0-20170614201249-0b81c023a722/src/testing/testing.go (about) 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 can be any alphanumeric string (but the first letter must not be in 10 // [a-z]) and 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 // Tests and benchmarks may be skipped if not applicable with a call to 21 // the Skip method of *T and *B: 22 // func TestTimeConsuming(t *testing.T) { 23 // if testing.Short() { 24 // t.Skip("skipping test in short mode.") 25 // } 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-Description_of_testing_flags. 38 // 39 // A sample benchmark function looks like this: 40 // func BenchmarkHello(b *testing.B) { 41 // for i := 0; i < b.N; i++ { 42 // fmt.Sprintf("hello") 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 // BenchmarkHello 10000000 282 ns/op 50 // means that the loop ran 10000000 times at a speed of 282 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(4) { 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 // Subtests and Sub-benchmarks 136 // 137 // The Run methods of T and B allow defining subtests and sub-benchmarks, 138 // without having to define separate functions for each. This enables uses 139 // like table-driven benchmarks and creating hierarchical tests. 140 // It also provides a way to share common setup and tear-down code: 141 // 142 // func TestFoo(t *testing.T) { 143 // // <setup code> 144 // t.Run("A=1", func(t *testing.T) { ... }) 145 // t.Run("A=2", func(t *testing.T) { ... }) 146 // t.Run("B=1", func(t *testing.T) { ... }) 147 // // <tear-down code> 148 // } 149 // 150 // Each subtest and sub-benchmark has a unique name: the combination of the name 151 // of the top-level test and the sequence of names passed to Run, separated by 152 // slashes, with an optional trailing sequence number for disambiguation. 153 // 154 // The argument to the -run and -bench command-line flags is an unanchored regular 155 // expression that matches the test's name. For tests with multiple slash-separated 156 // elements, such as subtests, the argument is itself slash-separated, with 157 // expressions matching each name element in turn. Because it is unanchored, an 158 // empty expression matches any string. 159 // For example, using "matching" to mean "whose name contains": 160 // 161 // go test -run '' # Run all tests. 162 // go test -run Foo # Run top-level tests matching "Foo", such as "TestFooBar". 163 // go test -run Foo/A= # For top-level tests matching "Foo", run subtests matching "A=". 164 // go test -run /A=1 # For all top-level tests, run subtests matching "A=1". 165 // 166 // Subtests can also be used to control parallelism. A parent test will only 167 // complete once all of its subtests complete. In this example, all tests are 168 // run in parallel with each other, and only with each other, regardless of 169 // other top-level tests that may be defined: 170 // 171 // func TestGroupedParallel(t *testing.T) { 172 // for _, tc := range tests { 173 // tc := tc // capture range variable 174 // t.Run(tc.Name, func(t *testing.T) { 175 // t.Parallel() 176 // ... 177 // }) 178 // } 179 // } 180 // 181 // Run does not return until parallel subtests have completed, providing a way 182 // to clean up after a group of parallel tests: 183 // 184 // func TestTeardownParallel(t *testing.T) { 185 // // This Run will not return until the parallel tests finish. 186 // t.Run("group", func(t *testing.T) { 187 // t.Run("Test1", parallelTest1) 188 // t.Run("Test2", parallelTest2) 189 // t.Run("Test3", parallelTest3) 190 // }) 191 // // <tear-down code> 192 // } 193 // 194 // Main 195 // 196 // It is sometimes necessary for a test program to do extra setup or teardown 197 // before or after testing. It is also sometimes necessary for a test to control 198 // which code runs on the main thread. To support these and other cases, 199 // if a test file contains a function: 200 // 201 // func TestMain(m *testing.M) 202 // 203 // then the generated test will call TestMain(m) instead of running the tests 204 // directly. TestMain runs in the main goroutine and can do whatever setup 205 // and teardown is necessary around a call to m.Run. It should then call 206 // os.Exit with the result of m.Run. When TestMain is called, flag.Parse has 207 // not been run. If TestMain depends on command-line flags, including those 208 // of the testing package, it should call flag.Parse explicitly. 209 // 210 // A simple implementation of TestMain is: 211 // 212 // func TestMain(m *testing.M) { 213 // // call flag.Parse() here if TestMain uses flags 214 // os.Exit(m.Run()) 215 // } 216 // 217 package testing 218 219 import ( 220 "bytes" 221 "errors" 222 "flag" 223 "fmt" 224 "internal/race" 225 "io" 226 "os" 227 "os/signal" 228 "runtime" 229 "runtime/debug" 230 "runtime/trace" 231 "sort" 232 "strconv" 233 "strings" 234 "sync" 235 "sync/atomic" 236 "syscall" 237 "time" 238 ) 239 240 var ( 241 // The short flag requests that tests run more quickly, but its functionality 242 // is provided by test writers themselves. The testing package is just its 243 // home. The all.bash installation script sets it to make installation more 244 // efficient, but by default the flag is off so a plain "go test" will do a 245 // full test of the package. 246 short = flag.Bool("test.short", false, "run smaller test suite to save time") 247 248 // The directory in which to create profile files and the like. When run from 249 // "go test", the binary always runs in the source directory for the package; 250 // this flag lets "go test" tell the binary to write the files in the directory where 251 // the "go test" command is run. 252 outputDir = flag.String("test.outputdir", "", "write profiles to `dir`") 253 254 // Report as tests are run; default is silent for success. 255 chatty = flag.Bool("test.v", false, "verbose: print additional output") 256 count = flag.Uint("test.count", 1, "run tests and benchmarks `n` times") 257 coverProfile = flag.String("test.coverprofile", "", "write a coverage profile to `file`") 258 matchList = flag.String("test.list", "", "list tests, examples, and benchmarch maching `regexp` then exit") 259 match = flag.String("test.run", "", "run only tests and examples matching `regexp`") 260 memProfile = flag.String("test.memprofile", "", "write a memory profile to `file`") 261 memProfileRate = flag.Int("test.memprofilerate", 0, "set memory profiling `rate` (see runtime.MemProfileRate)") 262 cpuProfile = flag.String("test.cpuprofile", "", "write a cpu profile to `file`") 263 blockProfile = flag.String("test.blockprofile", "", "write a goroutine blocking profile to `file`") 264 blockProfileRate = flag.Int("test.blockprofilerate", 1, "set blocking profile `rate` (see runtime.SetBlockProfileRate)") 265 mutexProfile = flag.String("test.mutexprofile", "", "write a mutex contention profile to the named file after execution") 266 mutexProfileFraction = flag.Int("test.mutexprofilefraction", 1, "if >= 0, calls runtime.SetMutexProfileFraction()") 267 traceFile = flag.String("test.trace", "", "write an execution trace to `file`") 268 timeout = flag.Duration("test.timeout", 0, "fail test binary execution after duration `d` (0 means unlimited)") 269 cpuListStr = flag.String("test.cpu", "", "comma-separated `list` of cpu counts to run each test with") 270 parallel = flag.Int("test.parallel", runtime.GOMAXPROCS(0), "run at most `n` tests in parallel") 271 272 haveExamples bool // are there examples? 273 274 cpuList []int 275 276 inProgressMu sync.Mutex // guards this group of fields 277 inProgressRegistry = make(map[string]int) 278 inProgressIdx int 279 ) 280 281 // common holds the elements common between T and B and 282 // captures common methods such as Errorf. 283 type common struct { 284 mu sync.RWMutex // guards this group of fields 285 output []byte // Output generated by test or benchmark. 286 w io.Writer // For flushToParent. 287 ran bool // Test or benchmark (or one of its subtests) was executed. 288 failed bool // Test or benchmark has failed. 289 skipped bool // Test of benchmark has been skipped. 290 done bool // Test is finished and all subtests have completed. 291 helpers map[string]struct{} // functions to be skipped when writing file/line info 292 293 chatty bool // A copy of the chatty flag. 294 finished bool // Test function has completed. 295 hasSub int32 // written atomically 296 raceErrors int // number of races detected during test 297 runner string // function name of tRunner running the test 298 299 parent *common 300 level int // Nesting depth of test or benchmark. 301 name string // Name of test or benchmark. 302 start time.Time // Time test or benchmark started 303 duration time.Duration 304 barrier chan bool // To signal parallel subtests they may start. 305 signal chan bool // To signal a test is done. 306 sub []*T // Queue of subtests to be run in parallel. 307 } 308 309 // Short reports whether the -test.short flag is set. 310 func Short() bool { 311 return *short 312 } 313 314 // CoverMode reports what the test coverage mode is set to. The 315 // values are "set", "count", or "atomic". The return value will be 316 // empty if test coverage is not enabled. 317 func CoverMode() string { 318 return cover.Mode 319 } 320 321 // Verbose reports whether the -test.v flag is set. 322 func Verbose() bool { 323 return *chatty 324 } 325 326 // frameSkip searches, starting after skip frames, for the first caller frame 327 // in a function not marked as a helper and returns the frames to skip 328 // to reach that site. The search stops if it finds a tRunner function that 329 // was the entry point into the test. 330 // This function must be called with c.mu held. 331 func (c *common) frameSkip(skip int) int { 332 if c.helpers == nil { 333 return skip 334 } 335 var pc [50]uintptr 336 // Skip two extra frames to account for this function 337 // and runtime.Callers itself. 338 n := runtime.Callers(skip+2, pc[:]) 339 if n == 0 { 340 panic("testing: zero callers found") 341 } 342 frames := runtime.CallersFrames(pc[:n]) 343 var frame runtime.Frame 344 more := true 345 for i := 0; more; i++ { 346 frame, more = frames.Next() 347 if frame.Function == c.runner { 348 // We've gone up all the way to the tRunner calling 349 // the test function (so the user must have 350 // called tb.Helper from inside that test function). 351 // Only skip up to the test function itself. 352 return skip + i - 1 353 } 354 if _, ok := c.helpers[frame.Function]; !ok { 355 // Found a frame that wasn't inside a helper function. 356 return skip + i 357 } 358 } 359 return skip 360 } 361 362 // decorate prefixes the string with the file and line of the call site 363 // and inserts the final newline if needed and indentation tabs for formatting. 364 // This function must be called with c.mu held. 365 func (c *common) decorate(s string) string { 366 skip := c.frameSkip(3) // decorate + log + public function. 367 _, file, line, ok := runtime.Caller(skip) 368 if ok { 369 // Truncate file name at last file name separator. 370 if index := strings.LastIndex(file, "/"); index >= 0 { 371 file = file[index+1:] 372 } else if index = strings.LastIndex(file, "\\"); index >= 0 { 373 file = file[index+1:] 374 } 375 } else { 376 file = "???" 377 line = 1 378 } 379 buf := new(bytes.Buffer) 380 // Every line is indented at least one tab. 381 buf.WriteByte('\t') 382 fmt.Fprintf(buf, "%s:%d: ", file, line) 383 lines := strings.Split(s, "\n") 384 if l := len(lines); l > 1 && lines[l-1] == "" { 385 lines = lines[:l-1] 386 } 387 for i, line := range lines { 388 if i > 0 { 389 // Second and subsequent lines are indented an extra tab. 390 buf.WriteString("\n\t\t") 391 } 392 buf.WriteString(line) 393 } 394 buf.WriteByte('\n') 395 return buf.String() 396 } 397 398 // flushToParent writes c.output to the parent after first writing the header 399 // with the given format and arguments. 400 func (c *common) flushToParent(format string, args ...interface{}) { 401 p := c.parent 402 p.mu.Lock() 403 defer p.mu.Unlock() 404 405 fmt.Fprintf(p.w, format, args...) 406 407 c.mu.Lock() 408 defer c.mu.Unlock() 409 io.Copy(p.w, bytes.NewReader(c.output)) 410 c.output = c.output[:0] 411 } 412 413 type indenter struct { 414 c *common 415 } 416 417 func (w indenter) Write(b []byte) (n int, err error) { 418 n = len(b) 419 for len(b) > 0 { 420 end := bytes.IndexByte(b, '\n') 421 if end == -1 { 422 end = len(b) 423 } else { 424 end++ 425 } 426 // An indent of 4 spaces will neatly align the dashes with the status 427 // indicator of the parent. 428 const indent = " " 429 w.c.output = append(w.c.output, indent...) 430 w.c.output = append(w.c.output, b[:end]...) 431 b = b[end:] 432 } 433 return 434 } 435 436 // fmtDuration returns a string representing d in the form "87.00s". 437 func fmtDuration(d time.Duration) string { 438 return fmt.Sprintf("%.2fs", d.Seconds()) 439 } 440 441 // TB is the interface common to T and B. 442 type TB interface { 443 Error(args ...interface{}) 444 Errorf(format string, args ...interface{}) 445 Fail() 446 FailNow() 447 Failed() bool 448 Fatal(args ...interface{}) 449 Fatalf(format string, args ...interface{}) 450 Log(args ...interface{}) 451 Logf(format string, args ...interface{}) 452 Name() string 453 Skip(args ...interface{}) 454 SkipNow() 455 Skipf(format string, args ...interface{}) 456 Skipped() bool 457 Helper() 458 459 // A private method to prevent users implementing the 460 // interface and so future additions to it will not 461 // violate Go 1 compatibility. 462 private() 463 } 464 465 var _ TB = (*T)(nil) 466 var _ TB = (*B)(nil) 467 468 // T is a type passed to Test functions to manage test state and support formatted test logs. 469 // Logs are accumulated during execution and dumped to standard output when done. 470 // 471 // A test ends when its Test function returns or calls any of the methods 472 // FailNow, Fatal, Fatalf, SkipNow, Skip, or Skipf. Those methods, as well as 473 // the Parallel method, must be called only from the goroutine running the 474 // Test function. 475 // 476 // The other reporting methods, such as the variations of Log and Error, 477 // may be called simultaneously from multiple goroutines. 478 type T struct { 479 common 480 isParallel bool 481 context *testContext // For running tests and subtests. 482 } 483 484 func (c *common) private() {} 485 486 // Name returns the name of the running test or benchmark. 487 func (c *common) Name() string { 488 return c.name 489 } 490 491 func (c *common) setRan() { 492 if c.parent != nil { 493 c.parent.setRan() 494 } 495 c.mu.Lock() 496 defer c.mu.Unlock() 497 c.ran = true 498 } 499 500 // Fail marks the function as having failed but continues execution. 501 func (c *common) Fail() { 502 if c.parent != nil { 503 c.parent.Fail() 504 } 505 c.mu.Lock() 506 defer c.mu.Unlock() 507 // c.done needs to be locked to synchronize checks to c.done in parent tests. 508 if c.done { 509 panic("Fail in goroutine after " + c.name + " has completed") 510 } 511 c.failed = true 512 } 513 514 // Failed reports whether the function has failed. 515 func (c *common) Failed() bool { 516 c.mu.RLock() 517 failed := c.failed 518 c.mu.RUnlock() 519 return failed || c.raceErrors+race.Errors() > 0 520 } 521 522 // FailNow marks the function as having failed and stops its execution. 523 // Execution will continue at the next test or benchmark. 524 // FailNow must be called from the goroutine running the 525 // test or benchmark function, not from other goroutines 526 // created during the test. Calling FailNow does not stop 527 // those other goroutines. 528 func (c *common) FailNow() { 529 c.Fail() 530 531 // Calling runtime.Goexit will exit the goroutine, which 532 // will run the deferred functions in this goroutine, 533 // which will eventually run the deferred lines in tRunner, 534 // which will signal to the test loop that this test is done. 535 // 536 // A previous version of this code said: 537 // 538 // c.duration = ... 539 // c.signal <- c.self 540 // runtime.Goexit() 541 // 542 // This previous version duplicated code (those lines are in 543 // tRunner no matter what), but worse the goroutine teardown 544 // implicit in runtime.Goexit was not guaranteed to complete 545 // before the test exited. If a test deferred an important cleanup 546 // function (like removing temporary files), there was no guarantee 547 // it would run on a test failure. Because we send on c.signal during 548 // a top-of-stack deferred function now, we know that the send 549 // only happens after any other stacked defers have completed. 550 c.finished = true 551 runtime.Goexit() 552 } 553 554 // log generates the output. It's always at the same stack depth. 555 func (c *common) log(s string) { 556 c.mu.Lock() 557 defer c.mu.Unlock() 558 c.output = append(c.output, c.decorate(s)...) 559 } 560 561 // Log formats its arguments using default formatting, analogous to Println, 562 // and records the text in the error log. For tests, the text will be printed only if 563 // the test fails or the -test.v flag is set. For benchmarks, the text is always 564 // printed to avoid having performance depend on the value of the -test.v flag. 565 func (c *common) Log(args ...interface{}) { c.log(fmt.Sprintln(args...)) } 566 567 // Logf formats its arguments according to the format, analogous to Printf, and 568 // records the text in the error log. A final newline is added if not provided. For 569 // tests, the text will be printed only if the test fails or the -test.v flag is 570 // set. For benchmarks, the text is always printed to avoid having performance 571 // depend on the value of the -test.v flag. 572 func (c *common) Logf(format string, args ...interface{}) { c.log(fmt.Sprintf(format, args...)) } 573 574 // Error is equivalent to Log followed by Fail. 575 func (c *common) Error(args ...interface{}) { 576 c.log(fmt.Sprintln(args...)) 577 c.Fail() 578 } 579 580 // Errorf is equivalent to Logf followed by Fail. 581 func (c *common) Errorf(format string, args ...interface{}) { 582 c.log(fmt.Sprintf(format, args...)) 583 c.Fail() 584 } 585 586 // Fatal is equivalent to Log followed by FailNow. 587 func (c *common) Fatal(args ...interface{}) { 588 c.log(fmt.Sprintln(args...)) 589 c.FailNow() 590 } 591 592 // Fatalf is equivalent to Logf followed by FailNow. 593 func (c *common) Fatalf(format string, args ...interface{}) { 594 c.log(fmt.Sprintf(format, args...)) 595 c.FailNow() 596 } 597 598 // Skip is equivalent to Log followed by SkipNow. 599 func (c *common) Skip(args ...interface{}) { 600 c.log(fmt.Sprintln(args...)) 601 c.SkipNow() 602 } 603 604 // Skipf is equivalent to Logf followed by SkipNow. 605 func (c *common) Skipf(format string, args ...interface{}) { 606 c.log(fmt.Sprintf(format, args...)) 607 c.SkipNow() 608 } 609 610 // SkipNow marks the test as having been skipped and stops its execution. 611 // If a test fails (see Error, Errorf, Fail) and is then skipped, 612 // it is still considered to have failed. 613 // Execution will continue at the next test or benchmark. See also FailNow. 614 // SkipNow must be called from the goroutine running the test, not from 615 // other goroutines created during the test. Calling SkipNow does not stop 616 // those other goroutines. 617 func (c *common) SkipNow() { 618 c.skip() 619 c.finished = true 620 runtime.Goexit() 621 } 622 623 func (c *common) skip() { 624 c.mu.Lock() 625 defer c.mu.Unlock() 626 c.skipped = true 627 } 628 629 // Skipped reports whether the test was skipped. 630 func (c *common) Skipped() bool { 631 c.mu.RLock() 632 defer c.mu.RUnlock() 633 return c.skipped 634 } 635 636 // Helper marks the calling function as a test helper function. 637 // When printing file and line information, that function will be skipped. 638 // Helper may be called simultaneously from multiple goroutines. 639 // Helper has no effect if it is called directly from a TestXxx/BenchmarkXxx 640 // function or a subtest/sub-benchmark function. 641 func (c *common) Helper() { 642 c.mu.Lock() 643 defer c.mu.Unlock() 644 if c.helpers == nil { 645 c.helpers = make(map[string]struct{}) 646 } 647 c.helpers[callerName(1)] = struct{}{} 648 } 649 650 // callerName gives the function name (qualified with a package path) 651 // for the caller after skip frames (where 0 means the current function). 652 func callerName(skip int) string { 653 // Make room for the skip PC. 654 var pc [2]uintptr 655 n := runtime.Callers(skip+2, pc[:]) // skip + runtime.Callers + callerName 656 if n == 0 { 657 panic("testing: zero callers found") 658 } 659 frames := runtime.CallersFrames(pc[:n]) 660 frame, _ := frames.Next() 661 return frame.Function 662 } 663 664 // Parallel signals that this test is to be run in parallel with (and only with) 665 // other parallel tests. When a test is run multiple times due to use of 666 // -test.count or -test.cpu, multiple instances of a single test never run in 667 // parallel with each other. 668 func (t *T) Parallel() { 669 if t.isParallel { 670 panic("testing: t.Parallel called multiple times") 671 } 672 t.isParallel = true 673 674 // We don't want to include the time we spend waiting for serial tests 675 // in the test duration. Record the elapsed time thus far and reset the 676 // timer afterwards. 677 t.duration += time.Since(t.start) 678 679 // Add to the list of tests to be released by the parent. 680 t.parent.sub = append(t.parent.sub, t) 681 t.raceErrors += race.Errors() 682 683 t.signal <- true // Release calling test. 684 <-t.parent.barrier // Wait for the parent test to complete. 685 t.context.waitParallel() 686 t.start = time.Now() 687 t.raceErrors += -race.Errors() 688 } 689 690 // An internal type but exported because it is cross-package; part of the implementation 691 // of the "go test" command. 692 type InternalTest struct { 693 Name string 694 F func(*T) 695 } 696 697 func tRunner(t *T, fn func(t *T)) { 698 t.runner = callerName(0) 699 700 // When this goroutine is done, either because fn(t) 701 // returned normally or because a test failure triggered 702 // a call to runtime.Goexit, record the duration and send 703 // a signal saying that the test is done. 704 defer func() { 705 t.raceErrors += race.Errors() 706 if t.raceErrors > 0 { 707 t.Errorf("race detected during execution of test") 708 } 709 710 t.duration += time.Now().Sub(t.start) 711 // If the test panicked, print any test output before dying. 712 err := recover() 713 if !t.finished && err == nil { 714 err = fmt.Errorf("test executed panic(nil) or runtime.Goexit") 715 } 716 if err != nil { 717 t.Fail() 718 t.report() 719 panic(err) 720 } 721 722 if len(t.sub) > 0 { 723 // Run parallel subtests. 724 // Decrease the running count for this test. 725 t.context.release() 726 // Release the parallel subtests. 727 close(t.barrier) 728 // Wait for subtests to complete. 729 for _, sub := range t.sub { 730 <-sub.signal 731 } 732 if !t.isParallel { 733 // Reacquire the count for sequential tests. See comment in Run. 734 t.context.waitParallel() 735 } 736 } else if t.isParallel { 737 // Only release the count for this test if it was run as a parallel 738 // test. See comment in Run method. 739 t.context.release() 740 } 741 t.report() // Report after all subtests have finished. 742 743 // Do not lock t.done to allow race detector to detect race in case 744 // the user does not appropriately synchronizes a goroutine. 745 t.done = true 746 if t.parent != nil && atomic.LoadInt32(&t.hasSub) == 0 { 747 t.setRan() 748 } 749 t.signal <- true 750 }() 751 752 t.start = time.Now() 753 t.raceErrors = -race.Errors() 754 fn(t) 755 t.finished = true 756 } 757 758 // Run runs f as a subtest of t called name. It reports whether f succeeded. Run 759 // runs f in a separate goroutine and will block until all its parallel subtests 760 // have completed. 761 // 762 // Run may be called simultaneously from multiple goroutines, but all such calls 763 // must happen before the outer test function for t returns. 764 func (t *T) Run(name string, f func(t *T)) bool { 765 atomic.StoreInt32(&t.hasSub, 1) 766 testName, ok := t.context.match.fullName(&t.common, name) 767 if !ok { 768 return true 769 } 770 t = &T{ 771 common: common{ 772 barrier: make(chan bool), 773 signal: make(chan bool), 774 name: testName, 775 parent: &t.common, 776 level: t.level + 1, 777 chatty: t.chatty, 778 }, 779 context: t.context, 780 } 781 t.w = indenter{&t.common} 782 783 if t.chatty { 784 // Print directly to root's io.Writer so there is no delay. 785 root := t.parent 786 for ; root.parent != nil; root = root.parent { 787 } 788 inProgressMu.Lock() 789 root.mu.Lock() 790 t.registerInProgress() 791 fmt.Fprintf(root.w, "=== RUN %s\n", t.name) 792 root.mu.Unlock() 793 inProgressMu.Unlock() 794 } 795 // Instead of reducing the running count of this test before calling the 796 // tRunner and increasing it afterwards, we rely on tRunner keeping the 797 // count correct. This ensures that a sequence of sequential tests runs 798 // without being preempted, even when their parent is a parallel test. This 799 // may especially reduce surprises if *parallel == 1. 800 go tRunner(t, f) 801 <-t.signal 802 return !t.failed 803 } 804 805 // testContext holds all fields that are common to all tests. This includes 806 // synchronization primitives to run at most *parallel tests. 807 type testContext struct { 808 match *matcher 809 810 mu sync.Mutex 811 812 // Channel used to signal tests that are ready to be run in parallel. 813 startParallel chan bool 814 815 // running is the number of tests currently running in parallel. 816 // This does not include tests that are waiting for subtests to complete. 817 running int 818 819 // numWaiting is the number tests waiting to be run in parallel. 820 numWaiting int 821 822 // maxParallel is a copy of the parallel flag. 823 maxParallel int 824 } 825 826 func newTestContext(maxParallel int, m *matcher) *testContext { 827 return &testContext{ 828 match: m, 829 startParallel: make(chan bool), 830 maxParallel: maxParallel, 831 running: 1, // Set the count to 1 for the main (sequential) test. 832 } 833 } 834 835 func (c *testContext) waitParallel() { 836 c.mu.Lock() 837 if c.running < c.maxParallel { 838 c.running++ 839 c.mu.Unlock() 840 return 841 } 842 c.numWaiting++ 843 c.mu.Unlock() 844 <-c.startParallel 845 } 846 847 func (c *testContext) release() { 848 c.mu.Lock() 849 if c.numWaiting == 0 { 850 c.running-- 851 c.mu.Unlock() 852 return 853 } 854 c.numWaiting-- 855 c.mu.Unlock() 856 c.startParallel <- true // Pick a waiting test to be run. 857 } 858 859 // No one should be using func Main anymore. 860 // See the doc comment on func Main and use MainStart instead. 861 var errMain = errors.New("testing: unexpected use of func Main") 862 863 type matchStringOnly func(pat, str string) (bool, error) 864 865 func (f matchStringOnly) MatchString(pat, str string) (bool, error) { return f(pat, str) } 866 func (f matchStringOnly) StartCPUProfile(w io.Writer) error { return errMain } 867 func (f matchStringOnly) StopCPUProfile() {} 868 func (f matchStringOnly) WriteHeapProfile(w io.Writer) error { return errMain } 869 func (f matchStringOnly) WriteProfileTo(string, io.Writer, int) error { return errMain } 870 func (f matchStringOnly) ImportPath() string { return "" } 871 872 // Main is an internal function, part of the implementation of the "go test" command. 873 // It was exported because it is cross-package and predates "internal" packages. 874 // It is no longer used by "go test" but preserved, as much as possible, for other 875 // systems that simulate "go test" using Main, but Main sometimes cannot be updated as 876 // new functionality is added to the testing package. 877 // Systems simulating "go test" should be updated to use MainStart. 878 func Main(matchString func(pat, str string) (bool, error), tests []InternalTest, benchmarks []InternalBenchmark, examples []InternalExample) { 879 os.Exit(MainStart(matchStringOnly(matchString), tests, benchmarks, examples).Run()) 880 } 881 882 // M is a type passed to a TestMain function to run the actual tests. 883 type M struct { 884 deps testDeps 885 tests []InternalTest 886 benchmarks []InternalBenchmark 887 examples []InternalExample 888 } 889 890 // testDeps is an internal interface of functionality that is 891 // passed into this package by a test's generated main package. 892 // The canonical implementation of this interface is 893 // testing/internal/testdeps's TestDeps. 894 type testDeps interface { 895 MatchString(pat, str string) (bool, error) 896 StartCPUProfile(io.Writer) error 897 StopCPUProfile() 898 WriteHeapProfile(io.Writer) error 899 WriteProfileTo(string, io.Writer, int) error 900 ImportPath() string 901 } 902 903 // MainStart is meant for use by tests generated by 'go test'. 904 // It is not meant to be called directly and is not subject to the Go 1 compatibility document. 905 // It may change signature from release to release. 906 func MainStart(deps testDeps, tests []InternalTest, benchmarks []InternalBenchmark, examples []InternalExample) *M { 907 return &M{ 908 deps: deps, 909 tests: tests, 910 benchmarks: benchmarks, 911 examples: examples, 912 } 913 } 914 915 // Run runs the tests. It returns an exit code to pass to os.Exit. 916 func (m *M) Run() int { 917 // TestMain may have already called flag.Parse. 918 if !flag.Parsed() { 919 flag.Parse() 920 } 921 922 if len(*matchList) != 0 { 923 listTests(m.deps.MatchString, m.tests, m.benchmarks, m.examples) 924 return 0 925 } 926 927 parseCpuList() 928 929 m.before() 930 startAlarm() 931 haveExamples = len(m.examples) > 0 932 testRan, testOk := runTests(m.deps.MatchString, m.tests) 933 exampleRan, exampleOk := runExamples(m.deps.MatchString, m.examples) 934 stopAlarm() 935 if !testRan && !exampleRan && *matchBenchmarks == "" { 936 fmt.Fprintln(os.Stderr, "testing: warning: no tests to run") 937 } 938 if !testOk || !exampleOk || !runBenchmarks(m.deps.ImportPath(), m.deps.MatchString, m.benchmarks) || race.Errors() > 0 { 939 fmt.Println("FAIL") 940 m.after() 941 return 1 942 } 943 944 fmt.Println("PASS") 945 m.after() 946 return 0 947 } 948 949 func (t *T) report() { 950 if t.parent == nil { 951 return 952 } 953 dstr := fmtDuration(t.duration) 954 format := "--- %s: %s (%s)\n" 955 956 inProgressMu.Lock() 957 defer inProgressMu.Unlock() 958 defer t.registerComplete() 959 960 if t.Failed() { 961 t.flushToParent(format, "FAIL", t.name, dstr) 962 } else if t.chatty { 963 if t.Skipped() { 964 t.flushToParent(format, "SKIP", t.name, dstr) 965 } else { 966 t.flushToParent(format, "PASS", t.name, dstr) 967 } 968 } 969 } 970 971 func (t *T) registerInProgress() { 972 if !t.chatty { 973 return 974 } 975 inProgressRegistry[t.name] = inProgressIdx 976 inProgressIdx++ 977 } 978 979 func (t *T) registerComplete() { 980 if !t.chatty { 981 return 982 } 983 delete(inProgressRegistry, t.name) 984 } 985 986 func reportTestsInProgress() { 987 if len(inProgressRegistry) == 0 { 988 return 989 } 990 idxToName := make(map[int]string) 991 var indexes []int 992 for name, idx := range inProgressRegistry { 993 idxToName[idx] = name 994 indexes = append(indexes, idx) 995 } 996 sort.Ints(indexes) 997 var namesInOrder []string 998 for _, idx := range indexes { 999 namesInOrder = append(namesInOrder, idxToName[idx]) 1000 } 1001 fmt.Printf("\ntests in progress: %s\n", strings.Join(namesInOrder, ", ")) 1002 } 1003 1004 func listTests(matchString func(pat, str string) (bool, error), tests []InternalTest, benchmarks []InternalBenchmark, examples []InternalExample) { 1005 if _, err := matchString(*matchList, "non-empty"); err != nil { 1006 fmt.Fprintf(os.Stderr, "testing: invalid regexp in -test.list (%q): %s\n", *matchList, err) 1007 os.Exit(1) 1008 } 1009 1010 for _, test := range tests { 1011 if ok, _ := matchString(*matchList, test.Name); ok { 1012 fmt.Println(test.Name) 1013 } 1014 } 1015 for _, bench := range benchmarks { 1016 if ok, _ := matchString(*matchList, bench.Name); ok { 1017 fmt.Println(bench.Name) 1018 } 1019 } 1020 for _, example := range examples { 1021 if ok, _ := matchString(*matchList, example.Name); ok && example.Output != "" { 1022 fmt.Println(example.Name) 1023 } 1024 } 1025 } 1026 1027 // An internal function but exported because it is cross-package; part of the implementation 1028 // of the "go test" command. 1029 func RunTests(matchString func(pat, str string) (bool, error), tests []InternalTest) (ok bool) { 1030 ran, ok := runTests(matchString, tests) 1031 if !ran && !haveExamples { 1032 fmt.Fprintln(os.Stderr, "testing: warning: no tests to run") 1033 } 1034 return ok 1035 } 1036 1037 func runTests(matchString func(pat, str string) (bool, error), tests []InternalTest) (ran, ok bool) { 1038 ok = true 1039 for _, procs := range cpuList { 1040 runtime.GOMAXPROCS(procs) 1041 ctx := newTestContext(*parallel, newMatcher(matchString, *match, "-test.run")) 1042 t := &T{ 1043 common: common{ 1044 signal: make(chan bool), 1045 barrier: make(chan bool), 1046 w: os.Stdout, 1047 chatty: *chatty, 1048 }, 1049 context: ctx, 1050 } 1051 tRunner(t, func(t *T) { 1052 for _, test := range tests { 1053 t.Run(test.Name, test.F) 1054 } 1055 // Run catching the signal rather than the tRunner as a separate 1056 // goroutine to avoid adding a goroutine during the sequential 1057 // phase as this pollutes the stacktrace output when aborting. 1058 go func() { <-t.signal }() 1059 }) 1060 ok = ok && !t.Failed() 1061 ran = ran || t.ran 1062 } 1063 return ran, ok 1064 } 1065 1066 // before runs before all testing. 1067 func (m *M) before() { 1068 if *memProfileRate > 0 { 1069 runtime.MemProfileRate = *memProfileRate 1070 } 1071 if *cpuProfile != "" { 1072 f, err := os.Create(toOutputDir(*cpuProfile)) 1073 if err != nil { 1074 fmt.Fprintf(os.Stderr, "testing: %s\n", err) 1075 return 1076 } 1077 if err := m.deps.StartCPUProfile(f); err != nil { 1078 fmt.Fprintf(os.Stderr, "testing: can't start cpu profile: %s\n", err) 1079 f.Close() 1080 return 1081 } 1082 // Could save f so after can call f.Close; not worth the effort. 1083 } 1084 if *traceFile != "" { 1085 f, err := os.Create(toOutputDir(*traceFile)) 1086 if err != nil { 1087 fmt.Fprintf(os.Stderr, "testing: %s\n", err) 1088 return 1089 } 1090 if err := trace.Start(f); err != nil { 1091 fmt.Fprintf(os.Stderr, "testing: can't start tracing: %s\n", err) 1092 f.Close() 1093 return 1094 } 1095 // Could save f so after can call f.Close; not worth the effort. 1096 } 1097 if *blockProfile != "" && *blockProfileRate >= 0 { 1098 runtime.SetBlockProfileRate(*blockProfileRate) 1099 } 1100 if *mutexProfile != "" && *mutexProfileFraction >= 0 { 1101 runtime.SetMutexProfileFraction(*mutexProfileFraction) 1102 } 1103 if *coverProfile != "" && cover.Mode == "" { 1104 fmt.Fprintf(os.Stderr, "testing: cannot use -test.coverprofile because test binary was not built with coverage enabled\n") 1105 os.Exit(2) 1106 } 1107 if Verbose() { 1108 sigCh := make(chan os.Signal, 1) 1109 signal.Notify(sigCh, os.Interrupt) 1110 go func() { 1111 <-sigCh 1112 signal.Stop(sigCh) 1113 inProgressMu.Lock() 1114 reportTestsInProgress() 1115 inProgressMu.Unlock() 1116 proc, err := os.FindProcess(syscall.Getpid()) 1117 if err == nil { 1118 err = proc.Signal(os.Interrupt) 1119 } 1120 if err != nil { 1121 os.Exit(2) 1122 } 1123 }() 1124 } 1125 } 1126 1127 // after runs after all testing. 1128 func (m *M) after() { 1129 if *cpuProfile != "" { 1130 m.deps.StopCPUProfile() // flushes profile to disk 1131 } 1132 if *traceFile != "" { 1133 trace.Stop() // flushes trace to disk 1134 } 1135 if *memProfile != "" { 1136 f, err := os.Create(toOutputDir(*memProfile)) 1137 if err != nil { 1138 fmt.Fprintf(os.Stderr, "testing: %s\n", err) 1139 os.Exit(2) 1140 } 1141 runtime.GC() // materialize all statistics 1142 if err = m.deps.WriteHeapProfile(f); err != nil { 1143 fmt.Fprintf(os.Stderr, "testing: can't write %s: %s\n", *memProfile, err) 1144 os.Exit(2) 1145 } 1146 f.Close() 1147 } 1148 if *blockProfile != "" && *blockProfileRate >= 0 { 1149 f, err := os.Create(toOutputDir(*blockProfile)) 1150 if err != nil { 1151 fmt.Fprintf(os.Stderr, "testing: %s\n", err) 1152 os.Exit(2) 1153 } 1154 if err = m.deps.WriteProfileTo("block", f, 0); err != nil { 1155 fmt.Fprintf(os.Stderr, "testing: can't write %s: %s\n", *blockProfile, err) 1156 os.Exit(2) 1157 } 1158 f.Close() 1159 } 1160 if *mutexProfile != "" && *mutexProfileFraction >= 0 { 1161 f, err := os.Create(toOutputDir(*mutexProfile)) 1162 if err != nil { 1163 fmt.Fprintf(os.Stderr, "testing: %s\n", err) 1164 os.Exit(2) 1165 } 1166 if err = m.deps.WriteProfileTo("mutex", f, 0); err != nil { 1167 fmt.Fprintf(os.Stderr, "testing: can't write %s: %s\n", *blockProfile, err) 1168 os.Exit(2) 1169 } 1170 f.Close() 1171 } 1172 if cover.Mode != "" { 1173 coverReport() 1174 } 1175 } 1176 1177 // toOutputDir returns the file name relocated, if required, to outputDir. 1178 // Simple implementation to avoid pulling in path/filepath. 1179 func toOutputDir(path string) string { 1180 if *outputDir == "" || path == "" { 1181 return path 1182 } 1183 if runtime.GOOS == "windows" { 1184 // On Windows, it's clumsy, but we can be almost always correct 1185 // by just looking for a drive letter and a colon. 1186 // Absolute paths always have a drive letter (ignoring UNC). 1187 // Problem: if path == "C:A" and outputdir == "C:\Go" it's unclear 1188 // what to do, but even then path/filepath doesn't help. 1189 // TODO: Worth doing better? Probably not, because we're here only 1190 // under the management of go test. 1191 if len(path) >= 2 { 1192 letter, colon := path[0], path[1] 1193 if ('a' <= letter && letter <= 'z' || 'A' <= letter && letter <= 'Z') && colon == ':' { 1194 // If path starts with a drive letter we're stuck with it regardless. 1195 return path 1196 } 1197 } 1198 } 1199 if os.IsPathSeparator(path[0]) { 1200 return path 1201 } 1202 return fmt.Sprintf("%s%c%s", *outputDir, os.PathSeparator, path) 1203 } 1204 1205 var timer *time.Timer 1206 1207 // startAlarm starts an alarm if requested. 1208 func startAlarm() { 1209 if *timeout > 0 { 1210 timer = time.AfterFunc(*timeout, func() { 1211 debug.SetTraceback("all") 1212 panic(fmt.Sprintf("test timed out after %v", *timeout)) 1213 }) 1214 } 1215 } 1216 1217 // stopAlarm turns off the alarm. 1218 func stopAlarm() { 1219 if *timeout > 0 { 1220 timer.Stop() 1221 } 1222 } 1223 1224 func parseCpuList() { 1225 for _, val := range strings.Split(*cpuListStr, ",") { 1226 val = strings.TrimSpace(val) 1227 if val == "" { 1228 continue 1229 } 1230 cpu, err := strconv.Atoi(val) 1231 if err != nil || cpu <= 0 { 1232 fmt.Fprintf(os.Stderr, "testing: invalid value %q for -test.cpu\n", val) 1233 os.Exit(1) 1234 } 1235 for i := uint(0); i < *count; i++ { 1236 cpuList = append(cpuList, cpu) 1237 } 1238 } 1239 if cpuList == nil { 1240 for i := uint(0); i < *count; i++ { 1241 cpuList = append(cpuList, runtime.GOMAXPROCS(-1)) 1242 } 1243 } 1244 }