1 package com.atlassian.cache.hazelcast;
2
3 import java.util.concurrent.ExecutorService;
4 import java.util.concurrent.Executors;
5
6 import com.atlassian.cache.CacheLoader;
7
8 import org.junit.After;
9 import org.junit.Before;
10 import org.junit.ClassRule;
11 import org.junit.Rule;
12 import org.junit.Test;
13 import org.mockito.Mock;
14 import org.mockito.invocation.InvocationOnMock;
15 import org.mockito.junit.MockitoJUnit;
16 import org.mockito.junit.MockitoRule;
17 import org.mockito.stubbing.Answer;
18
19 import static org.junit.Assert.assertEquals;
20 import static org.mockito.Mockito.when;
21
22
23 public class CacheVersionAwareCacheLoaderTest
24 {
25 @ClassRule
26 public static InitOnceHazelcastCluster cluster = InitOnceHazelcastCluster.getInstance();
27
28 @Rule
29 public MockitoRule mockitoRule = MockitoJUnit.rule();
30
31 @Mock
32 private CacheLoader<String, String> delegate;
33
34 private ExecutorService executorService;
35 private CacheVersionAwareCacheLoader<String, String> cacheLoader;
36 private CacheVersion cacheVersion;
37
38 @Before
39 public void setUp() throws Exception
40 {
41 cacheVersion = new CacheVersion(cluster.getNode(0), "mock");
42 executorService = Executors.newSingleThreadExecutor();
43 cacheLoader = new CacheVersionAwareCacheLoader(delegate, cacheVersion);
44 }
45
46 @After
47 public void tearDown() throws Exception
48 {
49 executorService.shutdownNow();
50 }
51
52 @Test
53 public void shouldLoadValues()
54 {
55 when(delegate.load("key")).thenReturn("value");
56
57 assertEquals("value", cacheLoader.load("key"));
58 }
59
60 @Test
61 public void shouldLoadValuesAfterInvalidation()
62 {
63 when(delegate.load("key")).thenReturn("value");
64
65 cacheVersion.incrementAndGet();
66
67 assertEquals("value", cacheLoader.load("key"));
68 }
69
70 @Test
71 public void shouldReloadValuesWhenInvalidating()
72 {
73 when(delegate.load("key")).then(invalidateAllAndReturnInvalid()).thenReturn("value");
74
75 assertEquals("value", cacheLoader.load("key"));
76 }
77
78 private Answer<String> invalidateAllAndReturnInvalid()
79 {
80 return new Answer<String>()
81 {
82 @Override
83 public String answer(InvocationOnMock invocationOnMock) throws Throwable
84 {
85 cacheVersion.incrementAndGet();
86 return "invalid";
87 }
88 };
89 }
90 }