1   package com.atlassian.util.concurrent;
2   
3   import static com.google.common.base.Predicates.alwaysFalse;
4   import static com.google.common.base.Predicates.alwaysTrue;
5   import static java.lang.Integer.valueOf;
6   import static org.junit.Assert.assertEquals;
7   import static org.junit.Assert.assertFalse;
8   
9   import org.junit.Test;
10  
11  import com.google.common.base.Predicate;
12  
13  public class ExpiringTest {
14      @Test
15      public void expiring() {
16          final Counter counter = new Counter();
17  
18          final Supplier<Integer> e = new Expiring<Integer>(counter, new Supplier<Predicate<Void>>() {
19              @Override
20              public Predicate<Void> get() {
21                  return new Predicate<Void>() {
22                      boolean once = true; // first time true
23  
24                      @Override
25                      public boolean apply(final Void input) {
26                          try {
27                              return once;
28                          } finally {
29                              once = false;
30                          }
31                      }
32                  };
33              }
34          });
35          assertEquals(0, counter.count.get());
36          assertEquals(valueOf(1), e.get());
37          assertEquals(1, counter.count.get());
38          assertEquals(valueOf(2), e.get());
39          assertEquals(2, counter.count.get());
40      }
41  
42      @Test
43      public void notExpiring() {
44          final Counter counter = new Counter();
45  
46          final Supplier<Integer> e = new Expiring<Integer>(counter, new Supplier<Predicate<Void>>() {
47              @Override
48              public Predicate<Void> get() {
49                  return alwaysTrue();
50              }
51          });
52          assertEquals(0, counter.count.get());
53          assertEquals(valueOf(1), e.get());
54          assertEquals(1, counter.count.get());
55          assertEquals(valueOf(1), e.get());
56          assertEquals(1, counter.count.get());
57          assertEquals(valueOf(1), e.get());
58      }
59  
60      @Test(expected = AssertionError.class)
61      public void detectsProgramErrorInfiniteLoopProtection() {
62          new Expiring<Integer>(new Counter(), new Supplier<Predicate<Void>>() {
63              @Override
64              public Predicate<Void> get() {
65                  return alwaysFalse();
66              }
67          }).get();
68      }
69  
70      @Test(expected = UnsupportedOperationException.class)
71      public void deadGet() {
72          Expiring.Dead.DEAD.get();
73      }
74  
75      @Test
76      public void deadReallyIs() {
77          assertFalse(Expiring.Dead.DEAD.alive());
78      }
79  }