clock icon indicating copy to clipboard operation
clock copied to clipboard

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

Open fasmat opened this issue 2 years ago • 1 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")
}

fasmat avatar Feb 03 '23 10:02 fasmat

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.

djmitche avatar Apr 19 '23 17:04 djmitche