mirror of
https://github.com/golang/go.git
synced 2025-05-24 17:01:26 +00:00
testing: report the failing test in a late log panic
Updates #29388 Change-Id: Icb0e6048d05fde7a5486b923ff62147edb5c8dac Reviewed-on: https://go-review.googlesource.com/c/157617 Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Damien Neil <dneil@google.com>
This commit is contained in:
parent
0456036e28
commit
006a5e7d00
@ -706,6 +706,55 @@ func TestRacyOutput(t *T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The late log message did not include the test name. Issue 29388.
|
||||||
|
func TestLogAfterComplete(t *T) {
|
||||||
|
ctx := newTestContext(1, newMatcher(regexp.MatchString, "", ""))
|
||||||
|
var buf bytes.Buffer
|
||||||
|
t1 := &T{
|
||||||
|
common: common{
|
||||||
|
// Use a buffered channel so that tRunner can write
|
||||||
|
// to it although nothing is reading from it.
|
||||||
|
signal: make(chan bool, 1),
|
||||||
|
w: &buf,
|
||||||
|
},
|
||||||
|
context: ctx,
|
||||||
|
}
|
||||||
|
|
||||||
|
c1 := make(chan bool)
|
||||||
|
c2 := make(chan string)
|
||||||
|
tRunner(t1, func(t *T) {
|
||||||
|
t.Run("TestLateLog", func(t *T) {
|
||||||
|
go func() {
|
||||||
|
defer close(c2)
|
||||||
|
defer func() {
|
||||||
|
p := recover()
|
||||||
|
if p == nil {
|
||||||
|
c2 <- "subtest did not panic"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
s, ok := p.(string)
|
||||||
|
if !ok {
|
||||||
|
c2 <- fmt.Sprintf("subtest panic with unexpected value %v", p)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const want = "Log in goroutine after TestLateLog has completed"
|
||||||
|
if !strings.Contains(s, want) {
|
||||||
|
c2 <- fmt.Sprintf("subtest panic %q does not contain %q", s, want)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
<-c1
|
||||||
|
t.Log("log after test")
|
||||||
|
}()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
close(c1)
|
||||||
|
|
||||||
|
if s := <-c2; s != "" {
|
||||||
|
t.Error(s)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestBenchmark(t *T) {
|
func TestBenchmark(t *T) {
|
||||||
res := Benchmark(func(b *B) {
|
res := Benchmark(func(b *B) {
|
||||||
for i := 0; i < 5; i++ {
|
for i := 0; i < 5; i++ {
|
||||||
|
@ -618,17 +618,20 @@ func (c *common) log(s string) {
|
|||||||
func (c *common) logDepth(s string, depth int) {
|
func (c *common) logDepth(s string, depth int) {
|
||||||
c.mu.Lock()
|
c.mu.Lock()
|
||||||
defer c.mu.Unlock()
|
defer c.mu.Unlock()
|
||||||
// If this test has already finished try and log this message with our parent
|
if !c.done {
|
||||||
// with this test name tagged so we know where it came from.
|
|
||||||
// If we don't have a parent panic.
|
|
||||||
if c.done {
|
|
||||||
if c.parent != nil {
|
|
||||||
c.parent.logDepth(s, depth+1)
|
|
||||||
} else {
|
|
||||||
panic("Log in goroutine after " + c.name + " has completed")
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
c.output = append(c.output, c.decorate(s, depth+1)...)
|
c.output = append(c.output, c.decorate(s, depth+1)...)
|
||||||
|
} else {
|
||||||
|
// This test has already finished. Try and log this message
|
||||||
|
// with our parent. If we don't have a parent, panic.
|
||||||
|
for parent := c.parent; parent != nil; parent = parent.parent {
|
||||||
|
parent.mu.Lock()
|
||||||
|
defer parent.mu.Unlock()
|
||||||
|
if !parent.done {
|
||||||
|
parent.output = append(parent.output, parent.decorate(s, depth+1)...)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
panic("Log in goroutine after " + c.name + " has completed")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user