| Index: common/clock/systemtimer_test.go
|
| diff --git a/common/clock/systemtimer_test.go b/common/clock/systemtimer_test.go
|
| index 8b9cbc54174ea2dfe1f4d9fb861fe771ad73ecb0..40b25ae1fec39b78449ba0c6fcc8c9914ddd41a2 100644
|
| --- a/common/clock/systemtimer_test.go
|
| +++ b/common/clock/systemtimer_test.go
|
| @@ -8,6 +8,8 @@ import (
|
| "testing"
|
| "time"
|
|
|
| + "golang.org/x/net/context"
|
| +
|
| . "github.com/smartystreets/goconvey/convey"
|
| )
|
|
|
| @@ -15,33 +17,70 @@ func TestSystemTimer(t *testing.T) {
|
| t.Parallel()
|
|
|
| Convey(`A systemTimer instance`, t, func() {
|
| - t := new(systemTimer)
|
| + ctx, cancelFunc := context.WithCancel(context.Background())
|
| + t := GetSystemClock().NewTimer(ctx)
|
| + defer t.Stop()
|
|
|
| - Convey(`Should start with a nil channel.`, func() {
|
| - So(t.GetC(), ShouldBeNil)
|
| + Convey(`Should start with a non-nil channel.`, func() {
|
| + So(t.GetC(), ShouldNotBeNil)
|
| })
|
|
|
| Convey(`When stopped, should return inactive.`, func() {
|
| So(t.Stop(), ShouldBeFalse)
|
| })
|
|
|
| + Convey(`Will return immediately if the Context is canceled before Reset.`, func() {
|
| + cancelFunc()
|
| +
|
| + t.Reset(veryLongTime)
|
| + So((<-t.GetC()).Err, ShouldEqual, context.Canceled)
|
| + })
|
| +
|
| + Convey(`Will return if the Context is canceled after Reset.`, func() {
|
| + t.Reset(veryLongTime)
|
| + cancelFunc()
|
| +
|
| + So((<-t.GetC()).Err, ShouldEqual, context.Canceled)
|
| + })
|
| +
|
| + Convey(`A timer will use the same channel when Reset.`, func() {
|
| + timerC := t.GetC()
|
| +
|
| + // Reset our timer to something more reasonable. It should trigger the
|
| + // timer channel, which should trigger our
|
| + t.Reset(timeBase)
|
| + So((<-timerC).Err, ShouldBeNil)
|
| + })
|
| +
|
| + Convey(`A timer will not signal if stopped.`, func() {
|
| + t.Reset(timeBase)
|
| + t.Stop()
|
| +
|
| + // This isn't a perfect test, but it's a good boundary for flake.
|
| + time.Sleep(3 * timeBase)
|
| +
|
| + triggered := false
|
| + select {
|
| + case <-t.GetC():
|
| + triggered = true
|
| + default:
|
| + break
|
| + }
|
| + So(triggered, ShouldBeFalse)
|
| + })
|
| +
|
| Convey(`When reset`, func() {
|
| - active := t.Reset(1 * time.Hour)
|
| - So(active, ShouldBeFalse)
|
| + So(t.Reset(veryLongTime), ShouldBeFalse)
|
|
|
| - Convey(`When reset to a short duration`, func() {
|
| + Convey(`When reset again to a short duration, should return that it was active and trigger.`, func() {
|
| // Upper bound of supported platform resolution. Windows is 15ms, so
|
| // make sure we exceed that.
|
| - active := t.Reset(100 * time.Millisecond)
|
| -
|
| - Convey(`Should return active.`, func() {
|
| - So(active, ShouldBeTrue)
|
| - })
|
| + So(t.Reset(timeBase), ShouldBeTrue)
|
| + So((<-t.GetC()).IsZero(), ShouldBeFalse)
|
|
|
| - Convey(`Should trigger shortly.`, func() {
|
| - tm := <-t.GetC()
|
| - So(tm, ShouldNotResemble, time.Time{})
|
| - })
|
| + // Again (reschedule).
|
| + So(t.Reset(timeBase), ShouldBeFalse)
|
| + So((<-t.GetC()).IsZero(), ShouldBeFalse)
|
| })
|
|
|
| Convey(`When stopped, should return active and have a non-nil C.`, func() {
|
| @@ -58,10 +97,6 @@ func TestSystemTimer(t *testing.T) {
|
| Convey(`Should have a non-nil channel.`, func() {
|
| So(t.GetC(), ShouldNotBeNil)
|
| })
|
| -
|
| - Reset(func() {
|
| - t.Stop()
|
| - })
|
| })
|
| })
|
| }
|
|
|