benbjohnson / clock

Clock is a small library for mocking time in Go.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Mocked `time.After` and `time.Timer` are not monotonic

fasmat opened this issue · comments

The standard library versions of these behave monotonic, meaning that if I change the system clock while the program is running time.After and time.Timer still fire after the time I programmed them to. The mocked variants don't behave this way:

now := time.Now()

mClock := clock.NewMock()
mClock.Set(now)

ch := mClock.After(10 * time.Second)
mClock.Set(now.Add(-1 * time.Minute))

mClock.Add(15 * time.Second)

select {
case <-ch:
	fmt.Println("it works!")
default:
	fmt.Println("mocked After is not monotonic")
}

In terms of the mock pointers, how would you see this working? When the clock is set back, would we subtract that amount from all of the pending timers?

Also, I'm not sure how this relates to testing - the m.Set method isn't available on a "real" clock.