mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
Merge pull request #7481 from heyitsanthony/testafter-clientv3
clientv3: use CheckAfterTest after terminating cluster
This commit is contained in:
commit
5193965005
@ -15,10 +15,12 @@
|
||||
package clientv3_test
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"regexp"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/coreos/etcd/auth"
|
||||
"github.com/coreos/etcd/integration"
|
||||
@ -50,6 +52,10 @@ func TestMain(m *testing.M) {
|
||||
}
|
||||
v = m.Run()
|
||||
clus.Terminate(nil)
|
||||
if err := testutil.CheckAfterTest(time.Second); err != nil {
|
||||
fmt.Fprintf(os.Stderr, "%v", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
} else {
|
||||
v = m.Run()
|
||||
}
|
||||
|
@ -62,10 +62,11 @@ func CheckLeakedGoroutine() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func AfterTest(t *testing.T) {
|
||||
// CheckAfterTest returns an error if AfterTest would fail with an error.
|
||||
func CheckAfterTest(d time.Duration) error {
|
||||
http.DefaultTransport.(*http.Transport).CloseIdleConnections()
|
||||
if testing.Short() {
|
||||
return
|
||||
return nil
|
||||
}
|
||||
var bad string
|
||||
badSubstring := map[string]string{
|
||||
@ -78,7 +79,8 @@ func AfterTest(t *testing.T) {
|
||||
}
|
||||
|
||||
var stacks string
|
||||
for i := 0; i < 6; i++ {
|
||||
begin := time.Now()
|
||||
for time.Since(begin) < d {
|
||||
bad = ""
|
||||
stacks = strings.Join(interestingGoroutines(), "\n\n")
|
||||
for substr, what := range badSubstring {
|
||||
@ -87,13 +89,22 @@ func AfterTest(t *testing.T) {
|
||||
}
|
||||
}
|
||||
if bad == "" {
|
||||
return
|
||||
return nil
|
||||
}
|
||||
// Bad stuff found, but goroutines might just still be
|
||||
// shutting down, so give it some time.
|
||||
time.Sleep(50 * time.Millisecond)
|
||||
}
|
||||
t.Errorf("Test appears to have leaked %s:\n%s", bad, stacks)
|
||||
return fmt.Errorf("appears to have leaked %s:\n%s", bad, stacks)
|
||||
}
|
||||
|
||||
// AfterTest is meant to run in a defer that executes after a test completes.
|
||||
// It will detect common goroutine leaks, retrying in case there are goroutines
|
||||
// not synchronously torn down, and fail the test if any goroutines are stuck.
|
||||
func AfterTest(t *testing.T) {
|
||||
if err := CheckAfterTest(300 * time.Millisecond); err != nil {
|
||||
t.Errorf("Test %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func interestingGoroutines() (gs []string) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user