Browse Source
This commit adds Clock and DefaultClock and moves the private invoices.testClock under the clock package while adding basic unit tests for it. Clock is an interface currently encapsulating Now() and TickAfter(). It can be added as an external dependency to any class. This way tests can stub out time.Now() or time.After(). The DefaultClock class simply returns the real time.Now() and time.After().master
Andras Banki-Horvath
5 years ago
8 changed files with 131 additions and 31 deletions
@ -0,0 +1,24 @@
|
||||
package clock |
||||
|
||||
import ( |
||||
"time" |
||||
) |
||||
|
||||
// DefaultClock implements Clock interface by simply calling the appropriate
|
||||
// time functions.
|
||||
type DefaultClock struct{} |
||||
|
||||
// NewDefaultClock constructs a new DefaultClock.
|
||||
func NewDefaultClock() Clock { |
||||
return &DefaultClock{} |
||||
} |
||||
|
||||
// Now simply returns time.Now().
|
||||
func (DefaultClock) Now() time.Time { |
||||
return time.Now() |
||||
} |
||||
|
||||
// TickAfter simply wraps time.After().
|
||||
func (DefaultClock) TickAfter(duration time.Duration) <-chan time.Time { |
||||
return time.After(duration) |
||||
} |
@ -0,0 +1,16 @@
|
||||
package clock |
||||
|
||||
import ( |
||||
"time" |
||||
) |
||||
|
||||
// Clock is an interface that provides a time functions for LND packages.
|
||||
// This is useful during testing when a concrete time reference is needed.
|
||||
type Clock interface { |
||||
// Now returns the current local time (as defined by the Clock).
|
||||
Now() time.Time |
||||
|
||||
// TickAfter returns a channel that will receive a tick after the specified
|
||||
// duration has passed.
|
||||
TickAfter(duration time.Duration) <-chan time.Time |
||||
} |
@ -0,0 +1,63 @@
|
||||
package clock |
||||
|
||||
import ( |
||||
"testing" |
||||
"time" |
||||
) |
||||
|
||||
var ( |
||||
testTime = time.Date(2009, time.January, 3, 12, 0, 0, 0, time.UTC) |
||||
) |
||||
|
||||
func TestNow(t *testing.T) { |
||||
c := NewTestClock(testTime) |
||||
now := c.Now() |
||||
|
||||
if now != testTime { |
||||
t.Fatalf("expected: %v, got: %v", testTime, now) |
||||
} |
||||
|
||||
now = now.Add(time.Hour) |
||||
c.SetTime(now) |
||||
if c.Now() != now { |
||||
t.Fatalf("epected: %v, got: %v", now, c.Now()) |
||||
} |
||||
} |
||||
|
||||
func TestTickAfter(t *testing.T) { |
||||
c := NewTestClock(testTime) |
||||
|
||||
// Should be ticking immediately.
|
||||
ticker0 := c.TickAfter(0) |
||||
|
||||
// Both should be ticking after SetTime
|
||||
ticker1 := c.TickAfter(time.Hour) |
||||
ticker2 := c.TickAfter(time.Hour) |
||||
|
||||
// We don't expect this one to tick.
|
||||
ticker3 := c.TickAfter(2 * time.Hour) |
||||
|
||||
tickOrTimeOut := func(ticker <-chan time.Time, expectTick bool) { |
||||
tick := false |
||||
select { |
||||
case <-ticker: |
||||
tick = true |
||||
case <-time.After(time.Millisecond): |
||||
} |
||||
|
||||
if tick != expectTick { |
||||
t.Fatalf("expected tick: %v, ticked: %v", expectTick, tick) |
||||
} |
||||
} |
||||
|
||||
tickOrTimeOut(ticker0, true) |
||||
tickOrTimeOut(ticker1, false) |
||||
tickOrTimeOut(ticker2, false) |
||||
tickOrTimeOut(ticker3, false) |
||||
|
||||
c.SetTime(c.Now().Add(time.Hour)) |
||||
|
||||
tickOrTimeOut(ticker1, true) |
||||
tickOrTimeOut(ticker2, true) |
||||
tickOrTimeOut(ticker3, false) |
||||
} |
Loading…
Reference in new issue