8 "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/clock"
9 . "github.com/onsi/ginkgo"
10 . "github.com/onsi/gomega"
14 testGlobalEpoch = 1000000000
15 testLocalEpoch = 1234567890
18var _ = Describe("Clock suite", func() {
19 var testClock = clock.Clock{}
26 Context("Global time not overridden", func() {
27 It("errors when trying to Add", func() {
28 err := clock.Add(123 * time.Hour)
29 Expect(err).To(HaveOccurred())
32 Context("Clock not mocked via Set", func() {
34 outsideTolerance = int32(0)
35 withinTolerance = int32(1)
38 It("uses time.After for After", func() {
41 time.Sleep(10 * time.Millisecond)
42 atomic.StoreInt32(&tolerance, withinTolerance)
45 time.Sleep(30 * time.Millisecond)
46 atomic.StoreInt32(&tolerance, outsideTolerance)
49 Expect(atomic.LoadInt32(&tolerance)).To(Equal(outsideTolerance))
51 <-testClock.After(20 * time.Millisecond)
52 Expect(atomic.LoadInt32(&tolerance)).To(Equal(withinTolerance))
54 <-testClock.After(20 * time.Millisecond)
55 Expect(atomic.LoadInt32(&tolerance)).To(Equal(outsideTolerance))
58 It("uses time.AfterFunc for AfterFunc", func() {
61 time.Sleep(10 * time.Millisecond)
62 atomic.StoreInt32(&tolerance, withinTolerance)
65 time.Sleep(30 * time.Millisecond)
66 atomic.StoreInt32(&tolerance, outsideTolerance)
69 Expect(atomic.LoadInt32(&tolerance)).To(Equal(outsideTolerance))
73 testClock.AfterFunc(20*time.Millisecond, func() {
77 Expect(atomic.LoadInt32(&tolerance)).To(Equal(withinTolerance))
80 testClock.AfterFunc(20*time.Millisecond, func() {
84 Expect(atomic.LoadInt32(&tolerance)).To(Equal(outsideTolerance))
87 It("uses time.Now for Now", func() {
90 Expect(b.Sub(a).Round(10 * time.Millisecond)).To(Equal(0 * time.Millisecond))
93 It("uses time.Since for Since", func() {
94 past := time.Now().Add(-60 * time.Second)
95 Expect(time.Since(past).Round(10 * time.Millisecond)).
96 To(Equal(60 * time.Second))
99 It("uses time.Sleep for Sleep", func() {
102 time.Sleep(10 * time.Millisecond)
103 atomic.StoreInt32(&tolerance, withinTolerance)
106 time.Sleep(30 * time.Millisecond)
107 atomic.StoreInt32(&tolerance, outsideTolerance)
110 Expect(atomic.LoadInt32(&tolerance)).To(Equal(outsideTolerance))
112 testClock.Sleep(20 * time.Millisecond)
113 Expect(atomic.LoadInt32(&tolerance)).To(Equal(withinTolerance))
115 testClock.Sleep(20 * time.Millisecond)
116 Expect(atomic.LoadInt32(&tolerance)).To(Equal(outsideTolerance))
119 It("uses time.Tick for Tick", func() {
122 time.Sleep(10 * time.Millisecond)
123 atomic.StoreInt32(&tolerance, withinTolerance)
126 time.Sleep(50 * time.Millisecond)
127 atomic.StoreInt32(&tolerance, outsideTolerance)
130 ch := testClock.Tick(20 * time.Millisecond)
131 Expect(atomic.LoadInt32(&tolerance)).To(Equal(outsideTolerance))
133 Expect(atomic.LoadInt32(&tolerance)).To(Equal(withinTolerance))
135 Expect(atomic.LoadInt32(&tolerance)).To(Equal(withinTolerance))
137 Expect(atomic.LoadInt32(&tolerance)).To(Equal(outsideTolerance))
140 It("uses time.Ticker for Ticker", func() {
143 time.Sleep(10 * time.Millisecond)
144 atomic.StoreInt32(&tolerance, withinTolerance)
147 time.Sleep(50 * time.Millisecond)
148 atomic.StoreInt32(&tolerance, outsideTolerance)
151 ticker := testClock.Ticker(20 * time.Millisecond)
152 Expect(atomic.LoadInt32(&tolerance)).To(Equal(outsideTolerance))
154 Expect(atomic.LoadInt32(&tolerance)).To(Equal(withinTolerance))
156 Expect(atomic.LoadInt32(&tolerance)).To(Equal(withinTolerance))
158 Expect(atomic.LoadInt32(&tolerance)).To(Equal(outsideTolerance))
161 It("errors if Add is used", func() {
162 err := testClock.Add(100 * time.Second)
163 Expect(err).To(HaveOccurred())
167 Context("Clock mocked via Set", func() {
168 var now = time.Unix(testLocalEpoch, 0)
174 It("mocks After", func() {
176 ready := make(chan struct{})
177 ch := testClock.After(10 * time.Second)
178 go func(ch <-chan time.Time) {
181 atomic.StoreInt32(&after, 1)
185 err := testClock.Add(9 * time.Second)
186 Expect(err).ToNot(HaveOccurred())
187 Expect(atomic.LoadInt32(&after)).To(Equal(int32(0)))
189 err = testClock.Add(1 * time.Second)
190 Expect(err).ToNot(HaveOccurred())
191 Expect(atomic.LoadInt32(&after)).To(Equal(int32(1)))
194 It("mocks AfterFunc", func() {
196 testClock.AfterFunc(10*time.Second, func() {
197 atomic.StoreInt32(&after, 1)
200 err := testClock.Add(9 * time.Second)
201 Expect(err).ToNot(HaveOccurred())
202 Expect(atomic.LoadInt32(&after)).To(Equal(int32(0)))
204 err = testClock.Add(1 * time.Second)
205 Expect(err).ToNot(HaveOccurred())
206 Expect(atomic.LoadInt32(&after)).To(Equal(int32(1)))
209 It("mocks AfterFunc with a stopped timer", func() {
211 timer := testClock.AfterFunc(10*time.Second, func() {
212 atomic.StoreInt32(&after, 1)
216 err := testClock.Add(11 * time.Second)
217 Expect(err).ToNot(HaveOccurred())
218 Expect(atomic.LoadInt32(&after)).To(Equal(int32(0)))
221 It("mocks Now", func() {
222 Expect(testClock.Now()).To(Equal(now))
223 err := testClock.Add(123 * time.Hour)
224 Expect(err).ToNot(HaveOccurred())
225 Expect(testClock.Now()).To(Equal(now.Add(123 * time.Hour)))
228 It("mocks Since", func() {
229 Expect(testClock.Since(time.Unix(testLocalEpoch-100, 0))).
230 To(Equal(100 * time.Second))
233 It("mocks Sleep", func() {
235 ready := make(chan struct{})
238 testClock.Sleep(10 * time.Second)
239 atomic.StoreInt32(&after, 1)
243 err := testClock.Add(9 * time.Second)
244 Expect(err).ToNot(HaveOccurred())
245 Expect(atomic.LoadInt32(&after)).To(Equal(int32(0)))
247 err = testClock.Add(1 * time.Second)
248 Expect(err).ToNot(HaveOccurred())
249 Expect(atomic.LoadInt32(&after)).To(Equal(int32(1)))
252 It("mocks Tick", func() {
254 ready := make(chan struct{})
257 tick := testClock.Tick(10 * time.Second)
260 atomic.AddInt32(&ticks, 1)
265 Expect(atomic.LoadInt32(&ticks)).To(Equal(int32(0)))
267 err := testClock.Add(9 * time.Second)
268 Expect(err).ToNot(HaveOccurred())
269 Expect(atomic.LoadInt32(&ticks)).To(Equal(int32(0)))
271 err = testClock.Add(1 * time.Second)
272 Expect(err).ToNot(HaveOccurred())
273 Expect(atomic.LoadInt32(&ticks)).To(Equal(int32(1)))
275 err = testClock.Add(30 * time.Second)
276 Expect(err).ToNot(HaveOccurred())
277 Expect(atomic.LoadInt32(&ticks)).To(Equal(int32(4)))
279 err = testClock.Add(10 * time.Second)
280 Expect(err).ToNot(HaveOccurred())
281 Expect(atomic.LoadInt32(&ticks)).To(Equal(int32(5)))
284 It("mocks Ticker", func() {
286 ready := make(chan struct{})
288 ticker := testClock.Ticker(10 * time.Second)
292 atomic.AddInt32(&ticks, 1)
297 Expect(atomic.LoadInt32(&ticks)).To(Equal(int32(0)))
299 err := testClock.Add(9 * time.Second)
300 Expect(err).ToNot(HaveOccurred())
301 Expect(atomic.LoadInt32(&ticks)).To(Equal(int32(0)))
303 err = testClock.Add(1 * time.Second)
304 Expect(err).ToNot(HaveOccurred())
305 Expect(atomic.LoadInt32(&ticks)).To(Equal(int32(1)))
307 err = testClock.Add(30 * time.Second)
308 Expect(err).ToNot(HaveOccurred())
309 Expect(atomic.LoadInt32(&ticks)).To(Equal(int32(4)))
311 err = testClock.Add(10 * time.Second)
312 Expect(err).ToNot(HaveOccurred())
313 Expect(atomic.LoadInt32(&ticks)).To(Equal(int32(5)))
316 It("mocks Timer", func() {
318 ready := make(chan struct{})
320 timer := testClock.Timer(10 * time.Second)
323 atomic.AddInt32(&after, 1)
327 err := testClock.Add(9 * time.Second)
328 Expect(err).ToNot(HaveOccurred())
329 Expect(atomic.LoadInt32(&after)).To(Equal(int32(0)))
331 err = testClock.Add(1 * time.Second)
332 Expect(err).ToNot(HaveOccurred())
333 Expect(atomic.LoadInt32(&after)).To(Equal(int32(1)))
338 Context("Global time overridden", func() {
340 globalNow = time.Unix(testGlobalEpoch, 0)
341 localNow = time.Unix(testLocalEpoch, 0)
348 Context("Clock not mocked via Set", func() {
349 It("uses globally mocked Now", func() {
350 Expect(testClock.Now()).To(Equal(globalNow))
351 err := clock.Add(123 * time.Hour)
352 Expect(err).ToNot(HaveOccurred())
353 Expect(testClock.Now()).To(Equal(globalNow.Add(123 * time.Hour)))
356 It("errors when Add is called on the local Clock", func() {
357 err := testClock.Add(100 * time.Hour)
358 Expect(err).To(HaveOccurred())
362 Context("Clock is mocked via Set", func() {
364 testClock.Set(localNow)
367 It("uses the local mock and ignores the global", func() {
368 Expect(testClock.Now()).To(Equal(localNow))
370 err := clock.Add(456 * time.Hour)
371 Expect(err).ToNot(HaveOccurred())
373 err = testClock.Add(123 * time.Hour)
374 Expect(err).ToNot(HaveOccurred())
376 Expect(testClock.Now()).To(Equal(localNow.Add(123 * time.Hour)))
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list