forked from vitessio/vitess
-
Notifications
You must be signed in to change notification settings - Fork 1
/
test_clock.go
70 lines (60 loc) · 1.6 KB
/
test_clock.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package vttime
import (
"sync"
"time"
)
var (
// testClock is the global test instance of the clock for tests.
testClock *TestClock
)
// TestClock is an implementation of Clock for tests, where it is
// possible to set the current time and the uncertainty at any time.
//
// To use it:
// vttime.UseTestClock()
// vttime.SetTestClockTime(now)
// vttime.SetTestClockUncertainty(dur)
type TestClock struct {
// mu protects the following fields
mu sync.Mutex
now time.Time
uncertainty time.Duration
}
// Now is part of the Clock interface.
func (t *TestClock) Now() (Interval, error) {
t.mu.Lock()
defer t.mu.Unlock()
return NewInterval(t.now.Add(-(t.uncertainty)), t.now.Add(t.uncertainty))
}
// Set let the user set the time
func (t *TestClock) Set(now time.Time) {
t.mu.Lock()
defer t.mu.Unlock()
t.now = now
}
// SetUncertainty lets the user set the uncertainty
func (t *TestClock) SetUncertainty(uncertainty time.Duration) {
t.mu.Lock()
defer t.mu.Unlock()
t.uncertainty = uncertainty
}
// SetTestClockTime sets the 'test' implementation time to the provided value.
func SetTestClockTime(now time.Time) {
testClock.Set(now)
}
// SetTestClockUncertainty sets the 'test' implementation uncertainty
// to the provided value.
func SetTestClockUncertainty(uncertainty time.Duration) {
testClock.SetUncertainty(uncertainty)
}
// UseTestClock is meant to be used in tests to start using the test clock.
func UseTestClock() {
*defaultClockType = "test"
}
func init() {
testClock = &TestClock{
now: time.Now(),
uncertainty: 10 * time.Millisecond,
}
clockTypes["test"] = testClock
}