package lego.gracekelly; /** * Copyright 2013 Flipkart Internet, pvt ltd. * * 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. */ import lego.gracekelly.api.CacheLoader; import lego.gracekelly.api.CacheProvider; import lego.gracekelly.entities.CacheEntry; import lego.gracekelly.exceptions.CacheLoaderException; import lego.gracekelly.exceptions.CacheProviderException; import lego.gracekelly.exceptions.KellyException; import org.mockito.Mockito; import org.testng.annotations.Test; public class KellyTest { @Test public void kellyExceptionsTest() throws CacheProviderException { CacheProvider<String> cacheProvider = Mockito.mock(CacheProvider.class); CacheLoader<String> cacheLoader = Mockito.mock(CacheLoader.class); CacheEntry<String> cacheEntry = new CacheEntry<String>("dude","suman",50); boolean kellyExceptionThrown = false; Mockito.when(cacheProvider.get("dude")).thenThrow(new CacheProviderException("exception")); Mockito.when(cacheProvider.put("dude",cacheEntry)).thenThrow(new CacheProviderException("exception")); Kelly kelly = new Kelly(cacheProvider, cacheLoader, 1); try { kelly.get("dude"); } catch (KellyException e) { kellyExceptionThrown = true; } assert kellyExceptionThrown; kellyExceptionThrown = false; try { kelly.put("dude",cacheEntry); } catch (KellyException e){ kellyExceptionThrown = true; } assert kellyExceptionThrown; } @Test public void noCacheEntryTest() throws CacheProviderException, KellyException { CacheProvider<String> cacheProvider = Mockito.mock(CacheProvider.class); CacheLoader<String> cacheLoader = Mockito.mock(CacheLoader.class); Mockito.when(cacheProvider.get("dude")).thenReturn(null); Kelly kelly = new Kelly(cacheProvider, cacheLoader, 1); assert kelly.get("dude") == null; } @Test public void reloadCacheEntryTest() throws CacheProviderException, KellyException, InterruptedException, CacheLoaderException { CacheProvider<String> cacheProvider = Mockito.mock(CacheProvider.class); CacheLoader<String> cacheLoader = Mockito.mock(CacheLoader.class); CacheEntry<String> cacheEntry = new CacheEntry<String>("dude", "suman karthik", 1); CacheEntry<String> cacheEntry1 = new CacheEntry<String>("dude", "suman", 1); Kelly<String> kelly = new Kelly<String>(cacheProvider, cacheLoader, 1); Mockito.when(cacheProvider.get("dude")).thenReturn(cacheEntry); Mockito.when(cacheLoader.reload("dude", "suman karthik")).thenReturn(cacheEntry1); assert kelly.get("dude").equals("suman karthik"); Thread.sleep(3000); assert kelly.get("dude").equals("suman karthik"); Thread.sleep(1000); Mockito.verify(cacheLoader).reload("dude","suman karthik"); Mockito.verify(cacheProvider).put("dude", cacheEntry1); } @Test public void ttlZeroTest() throws CacheLoaderException, CacheProviderException, InterruptedException, KellyException { CacheProvider<String> cacheProvider = Mockito.mock(CacheProvider.class); CacheLoader<String> cacheLoader = Mockito.mock(CacheLoader.class); CacheEntry<String> cacheEntry = new CacheEntry<String>("dude", "suman karthik"); Kelly<String> kelly = new Kelly<String>(cacheProvider, cacheLoader, 1); Mockito.when(cacheProvider.get("dude")).thenReturn(cacheEntry); assert kelly.get("dude").equals("suman karthik"); Thread.sleep(1000); assert kelly.get("dude").equals("suman karthik"); Mockito.verify(cacheLoader, Mockito.never()).reload("dude","suman karthik"); } @Test public void kellyGetTest() throws CacheProviderException, KellyException { CacheProvider<String> cacheProvider = Mockito.mock(CacheProvider.class); CacheLoader<String> cacheLoader = Mockito.mock(CacheLoader.class); CacheEntry<String> cacheEntry = new CacheEntry<String>("dude","suman",1); Mockito.when(cacheProvider.get("dude")).thenReturn(cacheEntry); Kelly<String> kelly = new Kelly<String>(cacheProvider,cacheLoader,1); assert kelly.get("dude").equals("suman"); } @Test public void kellyPutTest() throws CacheProviderException, KellyException { CacheProvider<String> cacheProvider = Mockito.mock(CacheProvider.class); CacheLoader<String> cacheLoader = Mockito.mock(CacheLoader.class); CacheEntry<String> cacheEntry = new CacheEntry<String>("dude","suman",1); Mockito.when(cacheProvider.put("dude",cacheEntry)).thenReturn(true); Kelly<String> kelly = new Kelly<String>(cacheProvider,cacheLoader,1); assert kelly.put("dude",cacheEntry); Mockito.verify(cacheProvider).put("dude", cacheEntry); } @Test(singleThreaded = true) public void requestsInFlightTest() throws InterruptedException, CacheProviderException, KellyException { CacheProvider<String> cacheProvider = Mockito.mock(CacheProvider.class); CacheLoader<String> cacheLoader = new DummyCacheLoader(); CacheEntry<String> cacheEntry = new CacheEntry<String>("dude","suman",1); Kelly<String> kelly = new Kelly<String>(cacheProvider,cacheLoader,10); Thread.sleep(2000); Mockito.when(cacheProvider.get("dude")).thenReturn(cacheEntry); kelly.get("dude"); kelly.get("dude"); Thread.sleep(1000); assert DummyCacheLoader.invocations==1; } @Test(dependsOnMethods = {"requestsInFlightTest"}) public void expireTest() throws KellyException, CacheProviderException, InterruptedException { CacheEntry<String> cacheEntry = new CacheEntry<String>("dude","suman",300); CacheProvider<String> cacheProvider = new DummyCacheProvider(); CacheLoader<String> cacheLoader = new DummyCacheLoader(); Kelly<String> kelly = new Kelly<String>(cacheProvider,cacheLoader,10); kelly.put("dude",cacheEntry); kelly.expire("dude"); assert cacheProvider.get("dude").getTtl()==-10; Thread.sleep(4000); assert kelly.get("dude").equals("suman karthik"); } }