|
|
|
@ -1,6 +1,7 @@ |
|
|
|
|
package http2interop |
|
|
|
|
|
|
|
|
|
import ( |
|
|
|
|
"path" |
|
|
|
|
"runtime" |
|
|
|
|
"strings" |
|
|
|
|
"sync" |
|
|
|
@ -9,29 +10,40 @@ import ( |
|
|
|
|
|
|
|
|
|
// When a test is skipped or fails, runtime.Goexit() is called which destroys the callstack.
|
|
|
|
|
// This means the name of the test case is lost, so we need to grab a copy of pc before.
|
|
|
|
|
func Report(t testing.TB) func() { |
|
|
|
|
pc, _, _, ok := runtime.Caller(1) |
|
|
|
|
if !ok { |
|
|
|
|
t.Fatal("Can't get caller info") |
|
|
|
|
} |
|
|
|
|
return func() { |
|
|
|
|
func Report(t testing.TB) { |
|
|
|
|
// If the goroutine panics, Fatal()s, or Skip()s, the function name is at the 3rd callstack
|
|
|
|
|
// layer. On success, its at 1st. Since it's hard to check which happened, just try both.
|
|
|
|
|
pcs := make([]uintptr, 10) |
|
|
|
|
total := runtime.Callers(1, pcs) |
|
|
|
|
var name string |
|
|
|
|
for _, pc := range pcs[:total] { |
|
|
|
|
fn := runtime.FuncForPC(pc) |
|
|
|
|
fullName := fn.Name() |
|
|
|
|
name := strings.Split(fullName, ".")[1] |
|
|
|
|
allCaseInfos.lock.Lock() |
|
|
|
|
defer allCaseInfos.lock.Unlock() |
|
|
|
|
allCaseInfos.Cases = append(allCaseInfos.Cases, &caseInfo{ |
|
|
|
|
Name: name, |
|
|
|
|
Passed: !t.Failed(), |
|
|
|
|
Skipped: t.Skipped(), |
|
|
|
|
}) |
|
|
|
|
if strings.HasPrefix(path.Ext(fullName), ".Test") { |
|
|
|
|
// Skip the leading .
|
|
|
|
|
name = string([]byte(path.Ext(fullName))[1:]) |
|
|
|
|
break |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if name == "" { |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
allCaseInfos.lock.Lock() |
|
|
|
|
defer allCaseInfos.lock.Unlock() |
|
|
|
|
allCaseInfos.Cases = append(allCaseInfos.Cases, &caseInfo{ |
|
|
|
|
Name: name, |
|
|
|
|
Passed: !t.Failed() && !t.Skipped(), |
|
|
|
|
Skipped: t.Skipped(), |
|
|
|
|
Fatal: t.Failed() && !strings.HasPrefix(name, "TestSoon"), |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
type caseInfo struct { |
|
|
|
|
Name string `json:"name"` |
|
|
|
|
Passed bool `json:"passed"` |
|
|
|
|
Skipped bool `json:"skipped"` |
|
|
|
|
Skipped bool `json:"skipped,omitempty"` |
|
|
|
|
Fatal bool `json:"fatal,omitempty"` |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
type caseInfos struct { |
|
|
|
|