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;
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 }