1 package com.atlassian.cache;
2
3 import org.junit.Test;
4 import org.junit.runner.RunWith;
5 import org.mockito.ArgumentCaptor;
6 import org.mockito.runners.MockitoJUnitRunner;
7
8 import java.util.concurrent.TimeUnit;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.mockito.Mockito.mock;
12 import static org.mockito.Mockito.timeout;
13 import static org.mockito.Mockito.verify;
14 import static org.mockito.Mockito.when;
15
16 @SuppressWarnings ("unchecked")
17 @RunWith(MockitoJUnitRunner.class)
18 public abstract class AbstractCachedReferenceListenerTest
19 {
20 protected CacheFactory factory;
21
22 @Test
23 public void testOnSet() throws Exception
24 {
25 Supplier<String> supplier = mock(Supplier.class);
26 when(supplier.get()).thenReturn("SET");
27
28 CachedReference<String> reference = factory.getCachedReference("set", supplier, settingsBuilder().build());
29
30 CachedReferenceListener listener = mock(CachedReferenceListener.class);
31 reference.addListener(listener, true);
32
33 reference.get();
34
35 ArgumentCaptor<CachedReferenceEvent> captor = ArgumentCaptor.forClass(CachedReferenceEvent.class);
36 verify(listener, timeout(1000)).onSet(captor.capture());
37
38 CachedReferenceEvent<String> event = captor.getValue();
39 assertEquals("SET", event.getValue());
40 }
41
42 @Test
43 public void testOnReset() throws Exception
44 {
45 Supplier<String> supplier = mock(Supplier.class);
46 when(supplier.get()).thenReturn("RESET");
47
48 CachedReference<String> reference = factory.getCachedReference("reset", supplier, settingsBuilder().build());
49
50 CachedReferenceListener listener = mock(CachedReferenceListener.class);
51 reference.addListener(listener, true);
52
53 reference.get();
54
55 reference.reset();
56
57 ArgumentCaptor<CachedReferenceEvent> captor = ArgumentCaptor.forClass(CachedReferenceEvent.class);
58
59
60 verify(listener, timeout(1000).atLeastOnce()).onReset(captor.capture());
61
62 CachedReferenceEvent<String> event = captor.getValue();
63 assertEquals("RESET", event.getValue());
64 }
65
66 @Test
67 public void testOnEvict() throws Exception
68 {
69 Supplier<String> supplier = mock(Supplier.class);
70 when(supplier.get()).thenReturn("EVICT");
71
72 CachedReference<String> reference = factory.getCachedReference("evict", supplier,
73 settingsBuilder().expireAfterAccess(1, TimeUnit.SECONDS).expireAfterWrite(1, TimeUnit.SECONDS).build());
74
75 CachedReferenceListener listener = mock(CachedReferenceListener.class);
76 reference.addListener(listener, true);
77
78 reference.get();
79
80 Thread.sleep(2000);
81
82 reference.get();
83
84 ArgumentCaptor<CachedReferenceEvent> captor = ArgumentCaptor.forClass(CachedReferenceEvent.class);
85 verify(listener, timeout(2000).atLeastOnce()).onEvict(captor.capture());
86
87 CachedReferenceEvent<String> event = captor.getValue();
88 assertEquals("EVICT", event.getValue());
89 }
90
91 protected CacheSettingsBuilder settingsBuilder()
92 {
93 return new CacheSettingsBuilder();
94 }
95
96 protected boolean supportsSetValue()
97 {
98 return true;
99 }
100
101 protected boolean supportsResetOldValue()
102 {
103 return true;
104 }
105
106 protected boolean supportsEvictOldValue()
107 {
108 return true;
109 }
110 }