/* * Copyright 2015 Ben Manes. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.github.benmanes.caffeine.cache.testing; import static java.util.Objects.requireNonNull; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import java.util.Map; import java.util.Map.Entry; import java.util.function.BiConsumer; import org.mockito.Mockito; import com.github.benmanes.caffeine.cache.CacheWriter; import com.github.benmanes.caffeine.cache.RemovalCause; /** * A utility for verifying that the {@link CacheWriter} mock was operated on correctly. * * @author ben.manes@gmail.com (Ben Manes) */ public final class CacheWriterVerifier { private final CacheContext context; private CacheWriterVerifier(CacheContext context) { this.context = requireNonNull(context); } /** Checks that neither writes nor deletes occurred. */ public void zeroInteractions() { Mockito.verifyZeroInteractions(context.cacheWriter()); } /** Checks that the expected number of write operations occurred. */ public void writes(int count) { verify(context.cacheWriter(), times(count)).write(any(), any()); } /** Checks that the key and value were written. */ public void wrote(Integer key, Integer value) { verify(context.cacheWriter()).write(eq(key), eq(value)); } /** Checks that only these entries were written. */ public void wroteAll(Map<Integer, Integer> map) { map.entrySet().forEach(entry -> { wrote(entry.getKey(), entry.getValue()); }); verify(context.cacheWriter(), times(map.size())).write(any(), any()); } /** Checks that the expected number of delete operations occurred. */ public void deletions(long count) { verify(context.cacheWriter(), times((int) count)).delete(any(), any(), any()); } /** Checks that the expected number of delete operations occurred. */ public void deletions(long count, RemovalCause cause) { verify(context.cacheWriter(), times((int) count)).delete(any(), any(), eq(cause)); } /** Checks that the entry was deleted for the specified reason. */ public void deleted(Entry<Integer, Integer> entry, RemovalCause cause) { deleted(entry.getKey(), entry.getValue(), cause); } /** Checks that the key and value were deleted for the specified reason. */ public void deleted(Integer key, Integer value, RemovalCause cause) { verify(context.cacheWriter()).delete(eq(key), eq(value), eq(cause)); } /** Checks that only these entries were deleted. */ public void deletedAll(Map<Integer, Integer> map, RemovalCause cause) { map.entrySet().forEach(entry -> deleted(entry, cause)); deletions(map.size()); } /** Runs the verification block iff the cache writer is enabled. */ public static void verifyWriter(CacheContext context, BiConsumer<CacheWriterVerifier, CacheWriter<Integer, Integer>> consumer) { boolean mayVerify = context.isCaffeine() && context.isStrongKeys() && !context.isAsync(); if (mayVerify) { consumer.accept(new CacheWriterVerifier(context), context.cacheWriter()); } } }