/** * Build {@link TransactionalExternalCache} and set up mockito expectations for appropriate calls of {@link VCacheFactory} * * @param mockVcacheFactory mockito proxied or mocked {@link VCacheFactory} * @param name name of the cache * @param clazz class of cached objects * @param settings cache settings * @param <T> type of cached objects * @return {@link TransactionalExternalCache} proxied by mockito. */ public static <T extends Serializable> TransactionalExternalCache<T> getTransactionalCache(VCacheFactory mockVcacheFactory, String name, Class<T> clazz, ExternalCacheSettings settings) { final TransactionalExternalCache<T> desiredCache = spy(mockVcacheFactory.getTransactionalExternalCache(name, JavaSerializationMarshalling.pair(clazz), settings)); doReturn(desiredCache).when(mockVcacheFactory).getTransactionalExternalCache(eq(name), any(MarshallingPair.class), any(ExternalCacheSettings.class)); return desiredCache; }
@Test public void transactionalExternalCache_normal_marshalling() { final ExternalCacheSettings settings = new ExternalCacheSettingsBuilder() .defaultTtl(Duration.ofSeconds(60)) .entryGrowthRateHint(ChangeRate.LOW_CHANGE) .dataChangeRateHint(ChangeRate.LOW_CHANGE) .entryCountHint(100) .build(); final TransactionalExternalCache<String> cache = vCacheFactory().getTransactionalExternalCache( "my-txn-cache", StringMarshalling.pair(), settings); assertThat(cache, notNullValue()); assertThat(cache.getName(), is("my-txn-cache")); assertThat(invocationsOfBegunTxns, is(0)); cache.removeAll(); assertThat(invocationsOfBegunTxns, is(1)); cache.put("three", "drei", PUT_ALWAYS); final CompletionStage<Optional<String>> get1 = cache.get("three"); assertThat(get1, successfulWith(is(Optional.of("drei")))); vCacheLifecycleManager().transactionSync(currentRequestContext()); assertThat(invocationsOfBegunTxns, is(1)); forceNewRequestContext(); final CompletionStage<Optional<String>> get2 = cache.get("three"); assertThat(invocationsOfBegunTxns, is(2)); unsafeJoin(get2.toCompletableFuture()).get(); assertThat(get2, successfulWith(is(Optional.of("drei")))); assertThat(invocationsOfBegunTxns, is(2)); }
@Test public void transactionalExternalCache_normal_marshaller() { final ExternalCacheSettings settings = new ExternalCacheSettingsBuilder() .defaultTtl(Duration.ofSeconds(60)) .entryGrowthRateHint(ChangeRate.LOW_CHANGE) .dataChangeRateHint(ChangeRate.LOW_CHANGE) .entryCountHint(100) .build(); @SuppressWarnings("deprecation") final TransactionalExternalCache<String> cache = vCacheFactory().getTransactionalExternalCache( "my-txn-cache", MarshallerFactory.stringMarshaller(), settings); assertThat(cache, notNullValue()); assertThat(cache.getName(), is("my-txn-cache")); assertThat(invocationsOfBegunTxns, is(0)); cache.removeAll(); assertThat(invocationsOfBegunTxns, is(1)); cache.put("three", "drei", PUT_ALWAYS); final CompletionStage<Optional<String>> get1 = cache.get("three"); assertThat(get1, successfulWith(is(Optional.of("drei")))); vCacheLifecycleManager().transactionSync(currentRequestContext()); assertThat(invocationsOfBegunTxns, is(1)); forceNewRequestContext(); final CompletionStage<Optional<String>> get2 = cache.get("three"); assertThat(invocationsOfBegunTxns, is(2)); unsafeJoin(get2.toCompletableFuture()).get(); assertThat(get2, successfulWith(is(Optional.of("drei")))); assertThat(invocationsOfBegunTxns, is(2)); }
@Test public void txnexternalcache_duplicate_obtain() { final TransactionalExternalCache<String> firstTime = vCacheFactory().getTransactionalExternalCache( "duplicate", dodgyPair("first"), new ExternalCacheSettingsBuilder().build()); firstTime.put("key", "ignored", PUT_ALWAYS); vCacheLifecycleManager().transactionSync(currentRequestContext()); forceNewRequestContext(); final CompletionStage<Optional<String>> get1 = firstTime.get("key"); assertThat(VCacheUtils.unsafeJoin(get1), is(Optional.of("first"))); final TransactionalExternalCache<String> secondTime = vCacheFactory().getTransactionalExternalCache( "duplicate", dodgyPair("second"), new ExternalCacheSettingsBuilder().build()); forceNewRequestContext(); final CompletionStage<Optional<String>> get2 = secondTime.get("key"); assertThat(VCacheUtils.unsafeJoin(get2), is(Optional.of("second"))); }
.build(); final TransactionalExternalCache<String> cache1 = vCacheFactory().getTransactionalExternalCache( "discard_sync_discard-1", StringMarshalling.pair(), settings); final TransactionalExternalCache<String> cache2 = vCacheFactory().getTransactionalExternalCache( "discard_sync_discard-2", StringMarshalling.pair(), settings); final TransactionalExternalCache<String> cache3 = vCacheFactory().getTransactionalExternalCache( "discard_sync_discard-3", StringMarshalling.pair(), settings);
.build(); final TransactionalExternalCache<String> cache1 = vCacheFactory().getTransactionalExternalCache( "sync_sync_sync-1", StringMarshalling.pair(), settings); assertThat(invocationsOfBegunTxns, is(0)); assertThat(invocationsOfBegunTxns, is(1)); final TransactionalExternalCache<String> cache2 = vCacheFactory().getTransactionalExternalCache( "sync_sync_sync-2", StringMarshalling.pair(), settings); assertThat(invocationsOfBegunTxns, is(2)); final TransactionalExternalCache<String> cache3 = vCacheFactory().getTransactionalExternalCache( "sync_sync_sync-3", StringMarshalling.pair(), settings);
.build(); final TransactionalExternalCache<String> cache1 = vCacheFactory().getTransactionalExternalCache( "sync_discard_sync-1", StringMarshalling.pair(), settings); assertThat(invocationsOfBegunTxns, is(0)); final TransactionalExternalCache<String> cache2 = vCacheFactory().getTransactionalExternalCache( "sync_discard_sync-2", StringMarshalling.pair(), settings); final TransactionalExternalCache<String> cache3 = vCacheFactory().getTransactionalExternalCache( "sync_discard_sync-3", StringMarshalling.pair(), settings);
.build(); final TransactionalExternalCache<String> cache1 = vCacheFactory().getTransactionalExternalCache( "discard_discard_discard-1", StringMarshalling.pair(), settings); final TransactionalExternalCache<String> cache2 = vCacheFactory().getTransactionalExternalCache( "discard_discard_discard-2", StringMarshalling.pair(), settings); final TransactionalExternalCache<String> cache3 = vCacheFactory().getTransactionalExternalCache( "discard_discard_discard-3", StringMarshalling.pair(), settings);