1 package com.atlassian.vcache.internal.core;
2
3 import com.atlassian.vcache.internal.BegunTransactionalActivityHandler;
4 import com.atlassian.vcache.internal.core.metrics.NoopMetricsCollector;
5 import org.junit.Before;
6 import org.junit.Test;
7 import org.junit.runner.RunWith;
8 import org.mockito.InjectMocks;
9 import org.mockito.Mock;
10 import org.mockito.runners.MockitoJUnitRunner;
11
12 import java.util.Set;
13
14 import static org.hamcrest.Matchers.contains;
15 import static org.hamcrest.Matchers.empty;
16 import static org.junit.Assert.assertThat;
17 import static org.mockito.Matchers.anyString;
18 import static org.mockito.Matchers.eq;
19 import static org.mockito.Mockito.times;
20 import static org.mockito.Mockito.verify;
21 import static org.mockito.Mockito.when;
22
23 @RunWith(MockitoJUnitRunner.class)
24 public class DefaultTransactionControlManagerTest {
25 @InjectMocks
26 private DefaultTransactionControlManager transactionControlManager;
27
28 @Mock
29 private Instrumentor instrumentor = new NoopMetricsCollector();
30
31 @Mock
32 private BegunTransactionalActivityHandler activityHandler;
33
34 @Mock
35 private TransactionControl transactionControl;
36
37 @Mock
38 private TransactionControl wrappedTransactionControl;
39
40 private final DefaultRequestContext requestContext = new DefaultRequestContext("pid");
41
42 @Before
43 public void setUp() {
44 when(instrumentor.wrap(eq(transactionControl), anyString())).thenReturn(wrappedTransactionControl);
45 when(wrappedTransactionControl.transactionDiscard()).thenReturn(true);
46 }
47
48 @Test
49 public void repeatedRegistrationOfSameCacheOnlyInvokesCallbackOnce() {
50 transactionControlManager.registerTransactionalExternalCache(requestContext, "mycache", transactionControl);
51 transactionControlManager.registerTransactionalExternalCache(requestContext, "mycache", transactionControl);
52
53 verify(activityHandler, times(1)).onRequest(requestContext);
54 }
55
56 @Test
57 public void repeatedRegistrationOfDifferentCachesOnlyInvokesCallbackOnce() {
58 transactionControlManager.registerTransactionalExternalCache(requestContext, "cache1", transactionControl);
59 transactionControlManager.registerTransactionalExternalCache(requestContext, "cache2", transactionControl);
60
61 verify(activityHandler, times(1)).onRequest(requestContext);
62 }
63
64 @Test
65 public void syncAllWithNoRegistrationsDoesNothing() {
66 transactionControlManager.syncAll(requestContext);
67 }
68
69 @Test
70 public void syncAllInvokesTransactionControlOncePerCacheAndClearsCallbackFlag() {
71 transactionControlManager.registerTransactionalExternalCache(requestContext, "mycache", transactionControl);
72 transactionControlManager.registerTransactionalExternalCache(requestContext, "mycache", transactionControl);
73
74 verify(activityHandler, times(1)).onRequest(requestContext);
75
76
77 transactionControlManager.syncAll(requestContext);
78
79
80 transactionControlManager.registerTransactionalExternalCache(requestContext, "mycache", transactionControl);
81
82 verify(activityHandler, times(2)).onRequest(requestContext);
83 }
84
85 @Test
86 public void discardAllWithNoRegistrationsDoesNothing() {
87 final Set<String> discardedCaches = transactionControlManager.discardAll(requestContext);
88
89 assertThat(discardedCaches, empty());
90 }
91
92 @Test
93 public void discardAllInvokesTransactionControlOncePerCacheAndClearsCallbackFlag() {
94 transactionControlManager.registerTransactionalExternalCache(requestContext, "mycache", transactionControl);
95 transactionControlManager.registerTransactionalExternalCache(requestContext, "mycache", transactionControl);
96
97 verify(activityHandler, times(1)).onRequest(requestContext);
98
99
100 final Set<String> discardedCaches = transactionControlManager.discardAll(requestContext);
101
102 assertThat(discardedCaches, contains("mycache"));
103
104
105 transactionControlManager.registerTransactionalExternalCache(requestContext, "mycache", transactionControl);
106
107 verify(activityHandler, times(2)).onRequest(requestContext);
108 }
109
110 @Test
111 public void discardAllReturnsNoCachenamesIfAllCacheshaveBeenSynchronized() {
112 transactionControlManager.registerTransactionalExternalCache(requestContext, "mycache", transactionControl);
113
114 transactionControlManager.syncAll(requestContext);
115
116 when(wrappedTransactionControl.transactionDiscard()).thenReturn(false);
117
118 final Set<String> discardedCaches = transactionControlManager.discardAll(requestContext);
119
120 assertThat(discardedCaches, empty());
121 }
122
123 @Test
124 public void discardAllReturnsNoCachenamesIfAlreadyDiscarded() {
125 transactionControlManager.registerTransactionalExternalCache(requestContext, "mycache", transactionControl);
126
127 final Set<String> discardedCaches = transactionControlManager.discardAll(requestContext);
128
129 assertThat(discardedCaches, contains("mycache"));
130
131 when(wrappedTransactionControl.transactionDiscard()).thenReturn(false);
132
133 final Set<String> discardedCaches2 = transactionControlManager.discardAll(requestContext);
134
135 assertThat(discardedCaches2, empty());
136 }
137 }