/ clock / test_clock_test.go
test_clock_test.go
 1  package clock
 2  
 3  import (
 4  	"fmt"
 5  	"testing"
 6  	"time"
 7  
 8  	"github.com/stretchr/testify/require"
 9  )
10  
11  var (
12  	testTime = time.Date(2009, time.January, 3, 12, 0, 0, 0, time.UTC)
13  )
14  
15  func TestNow(t *testing.T) {
16  	c := NewTestClock(testTime)
17  	now := c.Now()
18  	require.Equal(t, testTime, now)
19  
20  	now = now.Add(time.Hour)
21  	c.SetTime(now)
22  	require.Equal(t, now, c.Now())
23  }
24  
25  func TestTickAfter(t *testing.T) {
26  	c := NewTestClock(testTime)
27  
28  	// Should be ticking immediately.
29  	ticker0 := c.TickAfter(0)
30  
31  	// Both should be ticking after SetTime
32  	ticker1 := c.TickAfter(time.Hour)
33  	ticker2 := c.TickAfter(time.Hour)
34  
35  	// We don't expect this one to tick.
36  	ticker3 := c.TickAfter(2 * time.Hour)
37  
38  	tickOrTimeOut := func(ticker <-chan time.Time, expectTick bool) {
39  		tick := false
40  		select {
41  		case <-ticker:
42  			tick = true
43  
44  		case <-time.After(time.Millisecond):
45  		}
46  
47  		require.Equal(t, expectTick, tick)
48  	}
49  
50  	tickOrTimeOut(ticker0, true)
51  	tickOrTimeOut(ticker1, false)
52  	tickOrTimeOut(ticker2, false)
53  	tickOrTimeOut(ticker3, false)
54  
55  	c.SetTime(c.Now().Add(time.Hour))
56  
57  	tickOrTimeOut(ticker1, true)
58  	tickOrTimeOut(ticker2, true)
59  	tickOrTimeOut(ticker3, false)
60  }
61  
62  // TestTickSignal tests that TickAfter signals registration allowing
63  // safe time advancement.
64  func TestTickSignal(t *testing.T) {
65  	const interval = time.Second
66  
67  	ch := make(chan time.Duration)
68  	c := NewTestClockWithTickSignal(testTime, ch)
69  	err := make(chan error, 1)
70  
71  	go func() {
72  		select {
73  		// TickAfter will signal registration but will not
74  		// tick, unless we read the signal and set the time.
75  		case <-c.TickAfter(interval):
76  			err <- nil
77  
78  		// Signal timeout if tick didn't happen.
79  		case <-time.After(time.Second):
80  			err <- fmt.Errorf("timeout")
81  		}
82  	}()
83  
84  	tick := <-ch
85  	// Expect that the interval is correctly passed over the channel.
86  	require.Equal(t, interval, tick)
87  
88  	// Once the ticker is registered, set the time to make it fire.
89  	c.SetTime(testTime.Add(time.Second))
90  	require.NoError(t, <-err)
91  }