View Javadoc

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); // only allow one connection to check for connection leaks
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          // Start from a clean slate
98          final CompletionStage<Void> rm = directCache.removeAll();
99          assertThat(rm, successful());
100     }
101 }