View Javadoc

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          //With the changes to the delegated memory reset / remove there will be another call on the
59          //listener when this test is run as part of the suite
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 }