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