etcdserver, test: don't access testing.T in time.AfterFunc()'s own goroutine

time.AfterFunc() creates its own goroutine and calls the callback
function in the goroutine. It can cause datarace like the problem
fixed in the commit de1a16e0f1 . This
commit also fixes the potential dataraces of tests in
etcdserver/server_test.go .
This commit is contained in:
Hitoshi Mitake
2015-10-06 11:37:08 +09:00
parent 46e5444d93
commit 68dd3ee621

View File

@ -604,11 +604,18 @@ func TestSync(t *testing.T) {
reqIDGen: idutil.NewGenerator(0, time.Time{}),
}
// check that sync is non-blocking
timer := time.AfterFunc(time.Second, func() {
t.Fatalf("sync should be non-blocking but did not return after 1s!")
})
done := make(chan struct{})
go func() {
srv.sync(10 * time.Second)
timer.Stop()
done <- struct{}{}
}()
select {
case <-done:
case <-time.After(time.Second):
t.Fatal("sync should be non-blocking but did not return after 1s!")
}
testutil.WaitSchedule()
action := n.Action()
@ -637,11 +644,17 @@ func TestSyncTimeout(t *testing.T) {
reqIDGen: idutil.NewGenerator(0, time.Time{}),
}
// check that sync is non-blocking
timer := time.AfterFunc(time.Second, func() {
t.Fatalf("sync should be non-blocking but did not return after 1s!")
})
done := make(chan struct{})
go func() {
srv.sync(0)
timer.Stop()
done <- struct{}{}
}()
select {
case <-done:
case <-time.After(time.Second):
t.Fatal("sync should be non-blocking but did not return after 1s!")
}
// give time for goroutine in sync to cancel
testutil.WaitSchedule()