diff --git a/testy/clock.go b/testy/clock.go new file mode 100644 index 000000000..006c0eaf1 --- /dev/null +++ b/testy/clock.go @@ -0,0 +1,44 @@ +// Copyright (c) 2020 Tailscale Inc & AUTHORS All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package testy + +import "time" + +// Clock is a testing clock that advances every time its Now method is +// called, beginning at Start. +// +// The zero value starts virtual time at an arbitrary value recorded +// in Start on the first call to Now, and increments by one second +// between calls to Now. +type Clock struct { + // Start is the first value returned by Now. + Start time.Time + // Step is how much to advance with each Now call. + // Zero means 1 second. + Step time.Duration + // Present is the time that the next Now call will receive. + Present time.Time +} + +// Now returns the virtual clock's current time, and avances it +// according to its step configuration. +func (c *Clock) Now() time.Time { + if c.Start.IsZero() { + c.Start = time.Now() + c.Present = c.Start + } + step := c.Step + if step == 0 { + step = time.Second + } + ret := c.Present + c.Present = c.Present.Add(step) + return ret +} + +// Reset rewinds the virtual clock to its start time. +func (c *Clock) Reset() { + c.Present = c.Start +} diff --git a/testy/doc.go b/testy/doc.go new file mode 100644 index 000000000..13dc2fae3 --- /dev/null +++ b/testy/doc.go @@ -0,0 +1,6 @@ +// Copyright (c) 2020 Tailscale Inc & AUTHORS All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package testy provides utilities for use in unit tests. +package testy