diff --git a/tstest/clock.go b/tstest/clock.go index bd63278c8..ee7523430 100644 --- a/tstest/clock.go +++ b/tstest/clock.go @@ -303,6 +303,11 @@ func (c *Clock) AfterFunc(d time.Duration, f func()) tstime.TimerController { return t } +// Since subtracts specified duration from Now(). +func (c *Clock) Since(t time.Time) time.Duration { + return c.Now().Sub(t) +} + // eventHandler offers a common interface for Timer and Ticker events to avoid // code duplication in eventManager. type eventHandler interface { diff --git a/tstest/clock_test.go b/tstest/clock_test.go index 42572827b..461aaade1 100644 --- a/tstest/clock_test.go +++ b/tstest/clock_test.go @@ -2437,3 +2437,47 @@ type testStep struct { }) } } + +func TestSince(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + start time.Time + since time.Time + want time.Duration + }{ + { + name: "positive", + start: time.Unix(12345, 1000), + since: time.Unix(11111, 1000), + want: 1234 * time.Second, + }, + { + name: "negative", + start: time.Unix(12345, 1000), + since: time.Unix(15436, 1000), + want: -3091 * time.Second, + }, + { + name: "zero", + start: time.Unix(12345, 1000), + since: time.Unix(12345, 1000), + want: 0, + }, + } + + for _, tt := range tests { + tt := tt + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + clock := NewClock(ClockOpts{ + Start: tt.start, + }) + got := clock.Since(tt.since) + if got != tt.want { + t.Errorf("Since duration %v, want %v", got, tt.want) + } + }) + } +} diff --git a/tstime/tstime.go b/tstime/tstime.go index 82a6f53da..69073639a 100644 --- a/tstime/tstime.go +++ b/tstime/tstime.go @@ -84,6 +84,9 @@ type Clock interface { // by this Clock. When the ticker expires, it will call the provided func. // It follows the semantics of time.AfterFunc. AfterFunc(d time.Duration, f func()) TimerController + // Since returns the time elapsed since t. + // It follows the semantics of time.Since. + Since(t time.Time) time.Duration } // TickerController offers the receivers of a time.Ticker to ensure @@ -135,3 +138,8 @@ func (StdClock) NewTicker(d time.Duration) (TickerController, <-chan time.Time) func (StdClock) AfterFunc(d time.Duration, f func()) TimerController { return time.AfterFunc(d, f) } + +// Since calls time.Since. +func (StdClock) Since(t time.Time) time.Duration { + return time.Since(t) +}