package com.spotify.heroic.elasticsearch.index; import com.google.common.util.concurrent.RateLimiter; import com.spotify.heroic.elasticsearch.DefaultRateLimitedCache; import com.spotify.heroic.elasticsearch.RateLimitExceededException; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import java.util.concurrent.Callable; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ExecutionException; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; @RunWith(MockitoJUnitRunner.class) public class DefaultRateLimitedCacheTest { @Mock ConcurrentMap<K, Boolean> cache; @Mock RateLimiter rateLimiter; final Boolean value = true; @Mock K key; @Mock Callable<V> callable; @Test public void testCacheEarlyHit() throws ExecutionException, RateLimitExceededException { final DefaultRateLimitedCache<K> c = new DefaultRateLimitedCache<K>(cache, rateLimiter); doReturn(value).when(cache).get(key); assertEquals(false, c.acquire(key)); verify(cache).get(key); verify(rateLimiter, never()).tryAcquire(); verify(cache, never()).putIfAbsent(key, true); } @Test public void testGetRateLimiting() throws ExecutionException, RateLimitExceededException { final DefaultRateLimitedCache<K> c = new DefaultRateLimitedCache<K>(cache, rateLimiter); doReturn(null).when(cache).get(key); doReturn(false).when(rateLimiter).tryAcquire(); assertEquals(false, c.acquire(key)); verify(cache).get(key); verify(rateLimiter).tryAcquire(); verify(cache, never()).putIfAbsent(key, true); } @Test public void testGet() throws ExecutionException, RateLimitExceededException { final DefaultRateLimitedCache<K> c = new DefaultRateLimitedCache<K>(cache, rateLimiter); doReturn(null).when(cache).get(key); doReturn(true).when(rateLimiter).tryAcquire(); doReturn(null).when(cache).putIfAbsent(key, true); assertEquals(true, c.acquire(key)); verify(cache).get(key); verify(rateLimiter).tryAcquire(); verify(cache).putIfAbsent(key, true); } public static interface K { } public static interface V { } }