1 package com.atlassian.cache.impl;
2
3 import com.atlassian.cache.CachedReferenceListener;
4 import org.junit.Test;
5 import org.junit.runner.RunWith;
6 import org.mockito.runners.MockitoJUnitRunner;
7
8 import java.util.concurrent.atomic.AtomicInteger;
9
10 import static com.atlassian.cache.impl.CachedReferenceEventMatcher.event;
11 import static org.junit.Assert.assertEquals;
12 import static org.mockito.Mockito.mock;
13 import static org.mockito.Mockito.verify;
14 import static org.mockito.Mockito.verifyNoMoreInteractions;
15
16 @RunWith(MockitoJUnitRunner.class)
17 public class ValueCachedReferenceListenerSupportTest
18 {
19 @Test
20 public void testNotifyListeners()
21 {
22 final AtomicInteger callCount = new AtomicInteger(0);
23 ValueCachedReferenceListenerSupport<String> listenerSupport = new ValueCachedReferenceListenerSupport<String>()
24 {
25 @Override
26 protected void init(CachedReferenceListenerSupport<String> actualListenerSupport)
27 {
28 callCount.incrementAndGet();
29 }
30 };
31
32 CachedReferenceListener<String> valueListener = mock(CachedReferenceListener.class);
33 CachedReferenceListener<String> valuelessListener = mock(CachedReferenceListener.class);
34
35 listenerSupport.add(valueListener, true);
36 listenerSupport.add(valuelessListener, false);
37
38 listenerSupport.notifyEvict("EVICT");
39 listenerSupport.notifyReset("RESET");
40 listenerSupport.notifySet("SET");
41
42 verify(valueListener).onEvict(event("EVICT"));
43 verify(valueListener).onReset(event("RESET"));
44 verify(valueListener).onSet(event("SET"));
45 verifyNoMoreInteractions(valueListener);
46
47 verify(valuelessListener).onEvict(event(null));
48 verify(valuelessListener).onReset(event(null));
49 verify(valuelessListener).onSet(event(null));
50 verifyNoMoreInteractions(valuelessListener);
51
52 assertEquals(1, callCount.get());
53 }
54
55 @Test
56 public void testLazyValue()
57 {
58 final AtomicInteger callCount = new AtomicInteger(0);
59 ValueCachedReferenceListenerSupport<String> listenerSupport = new ValueCachedReferenceListenerSupport<String>()
60 {
61 @Override
62 protected void init(CachedReferenceListenerSupport<String> actualListenerSupport)
63 {
64 callCount.incrementAndGet();
65 }
66
67 @Override
68 protected void initValue(CachedReferenceListenerSupport<String> actualListenerSupport)
69 {
70 throw new RuntimeException("Should not be called");
71 }
72 };
73
74 CachedReferenceListener<String> valuelessListener = mock(CachedReferenceListener.class);
75 listenerSupport.add(valuelessListener, false);
76
77 listenerSupport.notifyEvict("EVICT");
78 listenerSupport.notifyReset("RESET");
79 listenerSupport.notifySet("SET");
80
81 verify(valuelessListener).onEvict(event(null));
82 verify(valuelessListener).onReset(event(null));
83 verify(valuelessListener).onSet(event(null));
84 verifyNoMoreInteractions(valuelessListener);
85
86 assertEquals(1, callCount.get());
87 }
88
89 @Test
90 public void testLazyValueless()
91 {
92 final AtomicInteger callCount = new AtomicInteger(0);
93 ValueCachedReferenceListenerSupport<String> listenerSupport = new ValueCachedReferenceListenerSupport<String>()
94 {
95 @Override
96 protected void init(CachedReferenceListenerSupport<String> actualListenerSupport)
97 {
98 callCount.incrementAndGet();
99 }
100
101 @Override
102 protected void initValueless(CachedReferenceListenerSupport<String> actualListenerSupport)
103 {
104 throw new RuntimeException("Should not be called");
105 }
106 };
107
108 CachedReferenceListener<String> valueListener = mock(CachedReferenceListener.class);
109 listenerSupport.add(valueListener, true);
110
111 listenerSupport.notifyEvict("EVICT");
112 listenerSupport.notifyReset("RESET");
113 listenerSupport.notifySet("SET");
114
115 verify(valueListener).onEvict(event("EVICT"));
116 verify(valueListener).onReset(event("RESET"));
117 verify(valueListener).onSet(event("SET"));
118 verifyNoMoreInteractions(valueListener);
119
120 assertEquals(1, callCount.get());
121 }
122 }