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.core.DefaultRequestContext;
11 import com.atlassian.vcache.internal.core.DefaultTransactionControlManager;
12 import com.atlassian.vcache.internal.core.Sha1ExternalCacheKeyGenerator;
13 import com.atlassian.vcache.internal.core.metrics.DefaultMetricsCollector;
14 import com.atlassian.vcache.internal.core.metrics.MetricsCollector;
15 import com.atlassian.vcache.internal.test.AbstractTransactionalExternalCacheIT;
16 import org.junit.Before;
17 import org.junit.BeforeClass;
18 import redis.clients.jedis.JedisPool;
19 import redis.clients.jedis.JedisPoolConfig;
20
21 import java.io.IOException;
22 import java.net.URI;
23 import java.net.URISyntaxException;
24 import java.time.Duration;
25 import java.util.concurrent.CompletionStage;
26
27 import static com.atlassian.vcache.internal.test.CompletionStageSuccessful.successful;
28 import static org.hamcrest.MatcherAssert.assertThat;
29
30 public class RedisTransactionalExternalCacheIT extends AbstractTransactionalExternalCacheIT {
31 private static JedisPool jedisPool;
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 RedisDirectExternalCache<String> directCache;
38
39 @Override
40 protected TransactionalExternalCache<String> cache() {
41 return cache;
42 }
43
44 @Override
45 protected DirectExternalCache<String> directCache() {
46 return directCache;
47 }
48
49 @Override
50 protected void directCacheRefresh() {
51 directCache.refreshCacheVersion();
52 }
53
54 @Override
55 protected void cacheTransactionSync() {
56 cache.transactionSync();
57 }
58
59 @Override
60 protected void cacheTransactionDiscard() {
61 cache.transactionDiscard();
62 }
63
64 @BeforeClass
65 public static void init_client() throws IOException, URISyntaxException {
66 final JedisPoolConfig poolConfig = new JedisPoolConfig();
67 poolConfig.setMaxTotal(1);
68 jedisPool = new JedisPool(poolConfig, new URI(System.getProperty("redis.svr")));
69 }
70
71 @Before
72 public void ensureCache() {
73 final ExternalCacheSettings settings = new ExternalCacheSettingsBuilder()
74 .entryGrowthRateHint(ChangeRate.LOW_CHANGE)
75 .entryCountHint(5)
76 .defaultTtl(Duration.ofMinutes(10))
77 .dataChangeRateHint(ChangeRate.HIGH_CHANGE)
78 .build();
79 cache = new RedisTransactionalExternalCache<>(
80 jedisPool::getResource,
81 () -> requestContext,
82 new Sha1ExternalCacheKeyGenerator("it-test"),
83 CACHE_NAME,
84 StringMarshalling.pair(),
85 settings,
86 new DefaultTransactionControlManager(metricsCollector, context -> {}),
87 metricsCollector);
88
89 directCache = new RedisDirectExternalCache<>(
90 jedisPool::getResource,
91 () -> requestContext,
92 new Sha1ExternalCacheKeyGenerator("it-test"),
93 CACHE_NAME,
94 StringMarshalling.pair(),
95 settings);
96
97
98 final CompletionStage<Void> rm = directCache.removeAll();
99 assertThat(rm, successful());
100 }
101 }