1 package com.atlassian.vcache.internal.redis;
2
3 import com.atlassian.marshalling.jdk.StringMarshalling;
4 import com.atlassian.vcache.ChangeRate;
5 import com.atlassian.vcache.DirectExternalCache;
6 import com.atlassian.vcache.ExternalCacheSettings;
7 import com.atlassian.vcache.ExternalCacheSettingsBuilder;
8 import com.atlassian.vcache.TransactionalExternalCache;
9 import com.atlassian.vcache.internal.RequestContext;
10 import com.atlassian.vcache.internal.RequestMetrics;
11 import com.atlassian.vcache.internal.core.DefaultRequestContext;
12 import com.atlassian.vcache.internal.core.DefaultTransactionControlManager;
13 import com.atlassian.vcache.internal.core.Sha1ExternalCacheKeyGenerator;
14 import com.atlassian.vcache.internal.core.metrics.DefaultMetricsCollector;
15 import com.atlassian.vcache.internal.core.metrics.MetricsCollector;
16 import com.atlassian.vcache.internal.test.AbstractUnreliableTransactionalExternalCacheIT;
17 import org.junit.Before;
18 import org.junit.Rule;
19
20 import java.time.Duration;
21 import java.util.concurrent.CompletionStage;
22
23 import static com.atlassian.vcache.internal.test.CompletionStageSuccessful.successful;
24 import static org.hamcrest.MatcherAssert.assertThat;
25
26 public class RedisTransactionalExternalCacheIT extends AbstractUnreliableTransactionalExternalCacheIT {
27 @Rule
28 public JedisTester jedisTester = new JedisTester();
29
30 @Rule
31 public JedisTester offlineJedisTester = new JedisTester(false);
32
33 private final RequestContext requestContext = new DefaultRequestContext(() -> "txn-it-test");
34 private final MetricsCollector metricsCollector = new DefaultMetricsCollector(() -> requestContext);
35
36 private RedisTransactionalExternalCache<String> cache;
37 private TransactionalExternalCache<String> wrappedCache;
38 private RedisDirectExternalCache<String> directCache;
39
40 private RedisTransactionalExternalCache<String> offlineCache;
41 private RedisDirectExternalCache<String> offlineDirectCache;
42
43 @Override
44 protected TransactionalExternalCache<String> cache() {
45 return wrappedCache;
46 }
47
48 @Override
49 protected DirectExternalCache<String> directCache() {
50 return directCache;
51 }
52
53 @Override
54 protected TransactionalExternalCache<String> offlineCache() {
55 return offlineCache;
56 }
57
58 @Override
59 protected DirectExternalCache<String> offlineDirectCache() {
60 return offlineDirectCache;
61 }
62
63 @Override
64 protected void directCacheRefresh() {
65 directCache.refreshCacheVersion();
66 }
67
68 @Override
69 protected void cacheTransactionSync() {
70 cache.transactionSync();
71 }
72
73 @Override
74 protected void cacheTransactionDiscard() {
75 cache.transactionDiscard();
76 }
77
78 @Override
79 protected void offlineCacheTransactionSync() {
80 offlineCache.transactionSync();
81 }
82
83 @Override
84 protected void offlineCacheTransactionDiscard() {
85 offlineCache.transactionDiscard();
86 }
87
88 @Override
89 protected RequestMetrics requestMetrics() {
90 return metricsCollector.obtainRequestMetrics(requestContext);
91 }
92
93 @Before
94 public void ensureCache() {
95 final ExternalCacheSettings settings = new ExternalCacheSettingsBuilder()
96 .entryGrowthRateHint(ChangeRate.LOW_CHANGE)
97 .entryCountHint(5)
98 .defaultTtl(Duration.ofMinutes(10))
99 .dataChangeRateHint(ChangeRate.HIGH_CHANGE)
100 .build();
101 cache = new RedisTransactionalExternalCache<>(
102 jedisTester.jedisSupplier(),
103 () -> requestContext,
104 new Sha1ExternalCacheKeyGenerator("it-test"),
105 CACHE_NAME,
106 StringMarshalling.pair(),
107 settings,
108 new DefaultTransactionControlManager(metricsCollector, context -> {}),
109 metricsCollector,
110 Duration.ofSeconds(1));
111 wrappedCache = metricsCollector.wrap(cache);
112
113 directCache = new RedisDirectExternalCache<>(
114 jedisTester.jedisSupplier(),
115 () -> requestContext,
116 new Sha1ExternalCacheKeyGenerator("it-test"),
117 CACHE_NAME,
118 StringMarshalling.pair(),
119 settings,
120 Duration.ofSeconds(1));
121
122 offlineCache = new RedisTransactionalExternalCache<>(
123 offlineJedisTester.jedisSupplier(),
124 () -> requestContext,
125 new Sha1ExternalCacheKeyGenerator("it-test-offline"),
126 CACHE_NAME + ".offline",
127 StringMarshalling.pair(),
128 settings,
129 new DefaultTransactionControlManager(metricsCollector, context -> {}),
130 metricsCollector,
131 Duration.ofSeconds(1));
132 wrappedCache = metricsCollector.wrap(cache);
133
134 offlineDirectCache = new RedisDirectExternalCache<>(
135 offlineJedisTester.jedisSupplier(),
136 () -> requestContext,
137 new Sha1ExternalCacheKeyGenerator("it-test-offline"),
138 CACHE_NAME + ".offline",
139 StringMarshalling.pair(),
140 settings,
141 Duration.ofSeconds(1));
142
143
144 final CompletionStage<Void> rm = directCache.removeAll();
145 assertThat(rm, successful());
146 }
147 }