@Test
public void simple_put_remove() throws ExecutionException, InterruptedException {
final CompletionStage<Void> rm1 = cache.remove("claira");
assertThat(rm1, successful());
assertThat(unsafeJoin(rm1), nullValue());
final CompletionStage<Boolean> put1 = cache.put("claira", "dancing", PutPolicy.PUT_ALWAYS);
assertThat(put1, successfulWith(is(true)));
final CompletionStage<Void> rm2 = cache.remove("claira");
assertThat(rm2, successful());
final CompletionStage<Boolean> put2 = cache.put("claira", "dancing", PutPolicy.PUT_ALWAYS);
assertThat(put2, successfulWith(is(true)));
final CompletionStage<Optional<String>> get1 = cache.get("claira");
assertThat(get1, successfulWith(is(Optional.of("dancing"))));
final CompletionStage<Void> rm3 = cache.remove("josie", "claira", "jasmin");
assertThat(rm3, successful());
final CompletionStage<Optional<String>> get2 = cache.get("claira");
assertThat(get2, successfulWith(is(Optional.empty())));
final Map<MetricLabel, ? extends LongMetric> cacheMetrics =
requestMetrics().allExternalCacheLongMetrics().get(CACHE_NAME);
assertThat(cacheMetrics, hasMetric(MetricLabel.TIMED_GET_CALL, is(2L), greaterThan(0L)));
assertThat(cacheMetrics, hasMetric(MetricLabel.TIMED_PUT_CALL, is(2L), greaterThan(0L)));
assertThat(cacheMetrics, hasMetric(MetricLabel.TIMED_REMOVE_CALL, is(3L), greaterThan(0L)));
assertThat(cacheMetrics, hasMetric(MetricLabel.TIMED_REMOVE_ALL_CALL, is(1L), greaterThan(0L)));
assertThat(cacheMetrics, hasMetric(MetricLabel.NUMBER_OF_HITS, is(1L), is(1L)));
assertThat(cacheMetrics, hasMetric(MetricLabel.NUMBER_OF_MISSES, is(1L), is(1L)));
assertThat(cacheMetrics, hasSize(is(6)));
}