1package sdk
2
3import (
4	"context"
5	"time"
6)
7
8func 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.
16var 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.
20var 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.
27var 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.
32func 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.
47func noOpSleepWithContext(context.Context, time.Duration) error {
48	return nil
49}
50
51func noOpSleep(time.Duration) {}
52
53// TestingUseNopSleep is a utility for disabling sleep across the SDK for
54// testing.
55func 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.
67func TestingUseReferenceTime(referenceTime time.Time) func() {
68	NowTime = func() time.Time {
69		return referenceTime
70	}
71	return func() {
72		NowTime = time.Now
73	}
74}
75