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.ExternalCacheSettingsBuilder;
7 import com.atlassian.vcache.StableReadExternalCache;
8 import com.atlassian.vcache.TransactionalExternalCache;
9 import com.atlassian.vcache.internal.RequestContext;
10 import com.atlassian.vcache.internal.VCacheCreationHandler;
11 import com.atlassian.vcache.internal.core.DefaultVCacheCreationHandler;
12 import com.atlassian.vcache.internal.core.ThreadLocalRequestContextSupplier;
13 import com.atlassian.vcache.internal.core.metrics.NoopMetricsCollector;
14 import com.atlassian.vcache.internal.guava.GuavaDirectExternalCache;
15 import com.atlassian.vcache.internal.guava.GuavaStableReadExternalCache;
16 import com.atlassian.vcache.internal.guava.GuavaTransactionalExternalCache;
17 import com.atlassian.vcache.internal.test.EmptyVCacheSettingsDefaultsProvider;
18 import net.spy.memcached.MemcachedClient;
19 import net.spy.memcached.MemcachedClientIF;
20 import org.junit.Before;
21 import org.junit.Test;
22 import org.junit.runner.RunWith;
23 import org.mockito.Mock;
24 import org.mockito.runners.MockitoJUnitRunner;
25
26 import java.time.Duration;
27 import java.util.function.Supplier;
28
29 import static org.hamcrest.Matchers.instanceOf;
30 import static org.junit.Assert.assertThat;
31
32 @RunWith(MockitoJUnitRunner.class)
33 public class MemcachedVCacheServiceDontExternaliseTest {
34
35 private static final String GUAVA_CACHE_NAME = "to-be-guava-only";
36
37 @Mock
38 private MemcachedClient client;
39 private VCacheCreationHandler creationHandler = new DefaultVCacheCreationHandler(
40 10,
41 Duration.ofDays(666),
42 10,
43 ChangeRate.HIGH_CHANGE,
44 ChangeRate.HIGH_CHANGE);
45 @Mock
46 private Supplier<MemcachedClientIF> clientSupplier;
47 @Mock
48 private Supplier<RequestContext> contextSupplier;
49
50
51 @Mock
52 private ThreadLocalRequestContextSupplier requestContextSupplier;
53
54 private MemcachedVCacheService service;
55
56 @Before
57 public void initService() {
58 final MemcachedVCacheServiceSettings settings = new MemcachedVCacheServiceSettingsBuilder()
59 .creationHandler(creationHandler)
60 .clientSupplier(clientSupplier)
61 .threadLocalContextSupplier(contextSupplier)
62 .workContextContextSupplier(contextSupplier)
63 .defaultsProvider(new EmptyVCacheSettingsDefaultsProvider())
64 .productIdentifier("confira")
65 .metricsCollector(new NoopMetricsCollector())
66 .dontExternaliseCache(GUAVA_CACHE_NAME::equals)
67 .build();
68 service = new MemcachedVCacheService(settings);
69 }
70
71 @Test
72 public void verifyDontExternaliseCache_direct() {
73 final DirectExternalCache<String> localCache = service.getDirectExternalCache(
74 GUAVA_CACHE_NAME, StringMarshalling.pair(), new ExternalCacheSettingsBuilder().build());
75
76 assertThat(localCache, instanceOf(GuavaDirectExternalCache.class));
77
78 final DirectExternalCache<String> externalCache = service.getDirectExternalCache(
79 "external-please", StringMarshalling.pair(), new ExternalCacheSettingsBuilder().build());
80
81 assertThat(externalCache, instanceOf(MemcachedDirectExternalCache.class));
82 }
83
84 @Test
85 public void verifyDontExternaliseCache_stableRead() {
86 final StableReadExternalCache<String> localCache = service.getStableReadExternalCache(
87 GUAVA_CACHE_NAME, StringMarshalling.pair(), new ExternalCacheSettingsBuilder().build());
88
89 assertThat(localCache, instanceOf(GuavaStableReadExternalCache.class));
90
91 final StableReadExternalCache<String> externalCache = service.getStableReadExternalCache(
92 "external-please", StringMarshalling.pair(), new ExternalCacheSettingsBuilder().build());
93
94 assertThat(externalCache, instanceOf(MemcachedStableReadExternalCache.class));
95 }
96
97 @Test
98 public void verifyDontExternaliseCache_transactional() {
99 final TransactionalExternalCache<String> localCache = service.getTransactionalExternalCache(
100 GUAVA_CACHE_NAME, StringMarshalling.pair(), new ExternalCacheSettingsBuilder().build());
101
102 assertThat(localCache, instanceOf(GuavaTransactionalExternalCache.class));
103
104 final TransactionalExternalCache<String> externalCache = service.getTransactionalExternalCache(
105 "external-please", StringMarshalling.pair(), new ExternalCacheSettingsBuilder().build());
106
107 assertThat(externalCache, instanceOf(MemcachedTransactionalExternalCache.class));
108 }
109 }