@Test public void remove() { final String url = "store://some/url.bin"; final String path = "/some/path"; Mockito.when(lookupTable.get(Key.forUrl(url))).thenReturn(path); contentCache.remove(url); Mockito.verify(lookupTable).remove(Key.forUrl(url)); Mockito.verify(lookupTable).remove(Key.forCacheFile(path)); }
@Test public void contains() { final String url = "store://content/url.bin"; Mockito.when(lookupTable.contains(Key.forUrl(url))).thenReturn(true); assertTrue(contentCache.contains(Key.forUrl(url))); assertTrue(contentCache.contains(url)); Mockito.when(lookupTable.contains(Key.forUrl(url))).thenReturn(false); assertFalse(contentCache.contains(Key.forUrl(url))); assertFalse(contentCache.contains(url)); }
@Test(expected = CacheMissException.class) public void getReaderForItemInCacheButMissingContentFile() { final String url = "store://content/url.bin"; Mockito.when(lookupTable.contains(Key.forUrl(url))).thenReturn(true); final String path = "/no/content/file/at/this/path.bin"; Mockito.when(lookupTable.get(Key.forUrl(url))).thenReturn(path); try { contentCache.getReader(url); } finally { // Important the get(path) was called, so that the timeToIdle is reset // for the 'reverse lookup' as well as the URL to path mapping. Mockito.verify(lookupTable).get(Key.forCacheFile(path)); } }
@Test(expected = CacheMissException.class) public void getReaderWhenItemNotInCache() { final String url = "store://content/url.bin"; Mockito.when(lookupTable.contains(Key.forUrl(url))).thenReturn(false); contentCache.getReader(url); }
@Override public void remove(String contentUrl) { // Remove from the in-memory cache, but not from disk. Let the clean-up process do this // asynchronously. String path = getCacheFilePath(contentUrl); memoryStore.remove(Key.forUrl(contentUrl)); memoryStore.remove(Key.forCacheFile(path)); }
@Test public void canGetReaderForItemInCacheHavingLiveFile() { final String url = "store://content/url.bin"; Mockito.when(lookupTable.contains(Key.forUrl(url))).thenReturn(true); final String path = tempfile().getAbsolutePath(); Mockito.when(lookupTable.get(Key.forUrl(url))).thenReturn(path); FileContentReader reader = (FileContentReader) contentCache.getReader(url); assertEquals("Reader should have correct URL", url, reader.getContentUrl()); assertEquals( "Reader should be for correct cached content file", path, reader.getFile().getAbsolutePath()); // Important the get(path) was called, so that the timeToIdle is reset // for the 'reverse lookup' as well as the URL to path mapping. Mockito.verify(lookupTable).get(Key.forCacheFile(path)); }
@Test public void putIntoLookup() { final Key key = Key.forUrl("store://some/url"); final String value = "/some/path"; contentCache.putIntoLookup(key, value); Mockito.verify(lookupTable).put(key, value); }
@Test public void getCacheFilePath() { final String url = "store://some/url.bin"; final String expectedPath = "/some/cache/file/path"; Mockito.when(lookupTable.get(Key.forUrl(url))).thenReturn(expectedPath); String path = contentCache.getCacheFilePath(url); assertEquals("Paths must match", expectedPath, path); }
@Test public void getWriter() { final String url = "store://some/url.bin"; FileContentWriter writer = (FileContentWriter) contentCache.getWriter(url); writer.putContent("Some test content for " + getClass().getName()); assertEquals(url, writer.getContentUrl()); // Check cached item is recorded properly in ehcache Mockito.verify(lookupTable).put(Key.forUrl(url), writer.getFile().getAbsolutePath()); Mockito.verify(lookupTable).put(Key.forCacheFile(writer.getFile().getAbsolutePath()), url); }
@Test public void putForNonEmptyFile() { ContentReader contentReader = Mockito.mock(ContentReader.class); Mockito.when(contentReader.getSize()).thenReturn(999000L); final String url = "store://some/url.bin"; boolean putResult = contentCache.put(url, contentReader); assertTrue("Non-empty files should be cached", putResult); ArgumentCaptor<File> cacheFileArg = ArgumentCaptor.forClass(File.class); Mockito.verify(contentReader).getContent(cacheFileArg.capture()); // Check cached item is recorded properly in ehcache Mockito.verify(lookupTable).put(Key.forUrl(url), cacheFileArg.getValue().getAbsolutePath()); Mockito.verify(lookupTable) .put(Key.forCacheFile(cacheFileArg.getValue().getAbsolutePath()), url); }
@Override public ContentReader getReader(String contentUrl) { Key url = Key.forUrl(contentUrl); if (memoryStore.contains(url)) { String path = memoryStore.get(url); // Getting the path for a URL from the memoryStore will reset the timeToIdle for // that URL. It is important to perform a reverse lookup as well to ensure that the // cache file path to URL mapping is also kept in the cache. memoryStore.get(Key.forCacheFile(path)); File cacheFile = new File(path); if (cacheFile.exists()) { return new FileContentReader(cacheFile, contentUrl); } } throw new CacheMissException(contentUrl); }
/** * Get the path of a cache file for the given content URL - will return null if there is no entry * in the cache for the specified URL. * * @param contentUrl * @return cache file path */ public String getCacheFilePath(String contentUrl) { return memoryStore.get(Key.forUrl(contentUrl)); }
@Override public boolean contains(String contentUrl) { return memoryStore.contains(Key.forUrl(contentUrl)); }
// Not part of the ContentCache interface as this breaks encapsulation. // Handy method for tests though, since it allows us to find out where // the content was cached. protected String cacheFileLocation(String url) { return memoryStore.get(Key.forUrl(url)); }
private void recordCacheEntries(String contentUrl, File cacheFile) { memoryStore.put(Key.forUrl(contentUrl), cacheFile.getAbsolutePath()); memoryStore.put(Key.forCacheFile(cacheFile), contentUrl); }