1 package sdk
2 3 import (
4 "context"
5 "time"
6 )
7 8 func init() {
9 NowTime = time.Now
10 Sleep = time.Sleep
11 SleepWithContext = sleepWithContext
12 }
13 14 // NowTime is a value for getting the current time. This value can be overridden
15 // for testing mocking out current time.
16 var NowTime func() time.Time
17 18 // Sleep is a value for sleeping for a duration. This value can be overridden
19 // for testing and mocking out sleep duration.
20 var Sleep func(time.Duration)
21 22 // SleepWithContext will wait for the timer duration to expire, or the context
23 // is canceled. Which ever happens first. If the context is canceled the Context's
24 // error will be returned.
25 //
26 // This value can be overridden for testing and mocking out sleep duration.
27 var SleepWithContext func(context.Context, time.Duration) error
28 29 // sleepWithContext will wait for the timer duration to expire, or the context
30 // is canceled. Which ever happens first. If the context is canceled the
31 // Context's error will be returned.
32 func sleepWithContext(ctx context.Context, dur time.Duration) error {
33 t := time.NewTimer(dur)
34 defer t.Stop()
35 36 select {
37 case <-t.C:
38 break
39 case <-ctx.Done():
40 return ctx.Err()
41 }
42 43 return nil
44 }
45 46 // noOpSleepWithContext does nothing, returns immediately.
47 func noOpSleepWithContext(context.Context, time.Duration) error {
48 return nil
49 }
50 51 func noOpSleep(time.Duration) {}
52 53 // TestingUseNopSleep is a utility for disabling sleep across the SDK for
54 // testing.
55 func TestingUseNopSleep() func() {
56 SleepWithContext = noOpSleepWithContext
57 Sleep = noOpSleep
58 59 return func() {
60 SleepWithContext = sleepWithContext
61 Sleep = time.Sleep
62 }
63 }
64 65 // TestingUseReferenceTime is a utility for swapping the time function across the SDK to return a specific reference time
66 // for testing purposes.
67 func TestingUseReferenceTime(referenceTime time.Time) func() {
68 NowTime = func() time.Time {
69 return referenceTime
70 }
71 return func() {
72 NowTime = time.Now
73 }
74 }
75