1 package com.atlassian.vcache.internal.memcached;
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 net.spy.memcached.AddrUtil;
17 import net.spy.memcached.BinaryConnectionFactory;
18 import net.spy.memcached.MemcachedClient;
19 import org.junit.Before;
20 import org.junit.BeforeClass;
21
22 import java.io.IOException;
23 import java.time.Duration;
24 import java.util.concurrent.CompletionStage;
25
26 import static com.atlassian.vcache.internal.test.CompletionStageSuccessful.successful;
27 import static org.hamcrest.MatcherAssert.assertThat;
28
29 public class MemcachedTransactionalExternalCacheIT extends AbstractTransactionalExternalCacheIT {
30 private static MemcachedClient client;
31
32 private final RequestContext requestContext = new DefaultRequestContext("txn-it-test");
33 private final MetricsCollector metricsCollector = new DefaultMetricsCollector(() -> requestContext);
34
35 private MemcachedTransactionalExternalCache<String> cache;
36 private MemcachedDirectExternalCache<String> directCache;
37
38 @Override
39 protected TransactionalExternalCache<String> cache() {
40 return cache;
41 }
42
43 @Override
44 protected DirectExternalCache<String> directCache() {
45 return directCache;
46 }
47
48 @Override
49 protected void directCacheRefresh() {
50 directCache.refreshCacheVersion();
51 }
52
53 @Override
54 protected void cacheTransactionSync() {
55 cache.transactionSync();
56 }
57
58 @Override
59 protected void cacheTransactionDiscard() {
60 cache.transactionDiscard();
61 }
62
63 @BeforeClass
64 public static void init_client() throws IOException {
65 client = new MemcachedClient(
66 new BinaryConnectionFactory(),
67 AddrUtil.getAddresses(System.getProperty("memcached.svr")));
68 }
69
70 @Before
71 public void ensureCache() {
72 final ExternalCacheSettings settings = new ExternalCacheSettingsBuilder()
73 .entryGrowthRateHint(ChangeRate.LOW_CHANGE)
74 .entryCountHint(5)
75 .defaultTtl(Duration.ofSeconds(60))
76 .dataChangeRateHint(ChangeRate.HIGH_CHANGE)
77 .build();
78 cache = new MemcachedTransactionalExternalCache<>(
79 () -> client,
80 () -> requestContext,
81 new Sha1ExternalCacheKeyGenerator("it-test"),
82 CACHE_NAME,
83 StringMarshalling.pair(),
84 settings,
85 new DefaultTransactionControlManager(metricsCollector, context -> {}),
86 metricsCollector);
87
88 directCache = new MemcachedDirectExternalCache<>(
89 () -> client,
90 () -> requestContext,
91 new Sha1ExternalCacheKeyGenerator("it-test"),
92 CACHE_NAME,
93 StringMarshalling.pair(),
94 settings);
95
96
97 final CompletionStage<Void> rm = directCache.removeAll();
98 assertThat(rm, successful());
99 }
100 }