1   package com.atlassian.util.concurrent;
2   
3   import static org.junit.Assert.assertEquals;
4   import static org.junit.Assert.assertFalse;
5   import static org.junit.Assert.assertTrue;
6   
7   import java.util.concurrent.TimeUnit;
8   
9   import org.junit.Test;
10  
11  import com.atlassian.util.concurrent.Timeout.TimeSupplier;
12  
13  public class TimeoutTest {
14      @Test
15      public void timeInNanoseconds() {
16          final Timeout timeout = new Timeout(1, TimeUnit.SECONDS, new MockTimeSupplier(1000, TimeUnit.NANOSECONDS));
17          assertEquals(999999999L, timeout.getTime());
18          assertEquals(TimeUnit.NANOSECONDS, timeout.getUnit());
19          assertEquals(999999998L, timeout.getTime());
20          assertEquals(TimeUnit.NANOSECONDS, timeout.getUnit());
21      }
22  
23      @Test
24      public void timeInMicroseconds() {
25          final Timeout timeout = new Timeout(1, TimeUnit.SECONDS, new MockTimeSupplier(1000, TimeUnit.MICROSECONDS));
26          assertEquals(999999L, timeout.getTime());
27          assertEquals(TimeUnit.MICROSECONDS, timeout.getUnit());
28          assertEquals(999998L, timeout.getTime());
29          assertEquals(TimeUnit.MICROSECONDS, timeout.getUnit());
30      }
31  
32      @Test
33      public void timeInMilliseconds() {
34          final Timeout timeout = new Timeout(1, TimeUnit.SECONDS, new MockTimeSupplier(1000, TimeUnit.MILLISECONDS));
35          assertEquals(999L, timeout.getTime());
36          assertEquals(TimeUnit.MILLISECONDS, timeout.getUnit());
37          assertEquals(998L, timeout.getTime());
38          assertEquals(TimeUnit.MILLISECONDS, timeout.getUnit());
39      }
40  
41      @Test
42      public void hourInNanoseconds() {
43          final Timeout timeout = new Timeout(3600, TimeUnit.SECONDS, new MockTimeSupplier(1000, TimeUnit.NANOSECONDS));
44          assertEquals(3599999999999L, timeout.getTime());
45          assertEquals(TimeUnit.NANOSECONDS, timeout.getUnit());
46          assertEquals(3599999999998L, timeout.getTime());
47          assertEquals(TimeUnit.NANOSECONDS, timeout.getUnit());
48      }
49  
50      @Test
51      public void hourIsExpired() {
52          final Timeout timeout = new Timeout(3, TimeUnit.NANOSECONDS, new MockTimeSupplier(2, TimeUnit.NANOSECONDS));
53          assertEquals(2, timeout.getTime());
54          assertFalse(timeout.isExpired());
55          assertEquals(TimeUnit.NANOSECONDS, timeout.getUnit());
56          assertEquals(0L, timeout.getTime());
57          assertEquals(TimeUnit.NANOSECONDS, timeout.getUnit());
58          assertTrue(timeout.isExpired());
59      }
60  
61      @Test
62      public void millisFactory() {
63          final Timeout timeout = Timeout.getMillisTimeout(2, TimeUnit.MILLISECONDS);
64          assertFalse(timeout.isExpired());
65          assertEquals(TimeUnit.MILLISECONDS, timeout.getUnit());
66      }
67  
68      class MockTimeSupplier implements TimeSupplier {
69          private int currentTimeCalled;
70          private final long time;
71          private final TimeUnit unit;
72  
73          MockTimeSupplier(final long time, final TimeUnit unit) {
74              this.time = time;
75              this.unit = unit;
76          }
77  
78          public long currentTime() {
79              return time + currentTimeCalled++;
80          }
81  
82          public TimeUnit precision() {
83              return unit;
84          }
85      }
86  }