@Test public void evictionHonorsLruFromCurrentSession() throws Exception { cache.close(); cache = DiskLruCache.open(cacheDir, appVersion, 2, 10); set("a", "a", "a"); set("b", "b", "b"); set("c", "c", "c"); set("d", "d", "d"); set("e", "e", "e"); cache.get("b"); // 'B' is now least recently used. // Causing the size to grow to 12 should evict 'A'. set("f", "f", "f"); // Causing the size to grow to 12 should evict 'C'. set("g", "g", "g"); cache.flush(); assertThat(cache.size()).isEqualTo(10); assertAbsent("a"); assertValue("b", "b", "b"); assertAbsent("c"); assertValue("d", "d", "d"); assertValue("e", "e", "e"); assertValue("f", "f", "f"); }
@Test public void openWithInvalidVersionClearsDirectory() throws Exception { cache.close(); generateSomeGarbageFiles(); createJournalWithHeader(MAGIC, "0", "100", "2", ""); cache = DiskLruCache.open(cacheDir, appVersion, 2, Integer.MAX_VALUE); assertGarbageFilesAllDeleted(); }
@Test public void openWithTruncatedLineDiscardsThatLine() throws Exception { cache.close(); writeFile(getCleanFile("k1", 0), "A"); writeFile(getCleanFile("k1", 1), "B"); Writer writer = new FileWriter(journalFile); writer.write(MAGIC + "\n" + VERSION_1 + "\n100\n2\n\nCLEAN k1 1 1"); // no trailing newline writer.close(); cache = DiskLruCache.open(cacheDir, appVersion, 2, Integer.MAX_VALUE); assertThat(cache.get("k1")).isNull(); // The journal is not corrupt when editing after a truncated line. set("k1", "C", "D"); cache.close(); cache = DiskLruCache.open(cacheDir, appVersion, 2, Integer.MAX_VALUE); assertValue("k1", "C", "D"); }
private void generateSomeGarbageFiles() throws Exception { File dir1 = new File(cacheDir, "dir1"); File dir2 = new File(dir1, "dir2"); writeFile(getCleanFile("g1", 0), "A"); writeFile(getCleanFile("g1", 1), "B"); writeFile(getCleanFile("g2", 0), "C"); writeFile(getCleanFile("g2", 1), "D"); writeFile(getCleanFile("g2", 1), "D"); writeFile(new File(cacheDir, "otherFile0"), "E"); dir1.mkdir(); dir2.mkdir(); writeFile(new File(dir2, "otherFile1"), "F"); }
/** @see <a href="https://github.com/JakeWharton/DiskLruCache/issues/2">Issue #2</a> */ @Test public void aggressiveClearingHandlesWrite() throws Exception { FileUtils.deleteDirectory(cacheDir); set("a", "a", "a"); assertValue("a", "a", "a"); }
@Test public void openWithTooManyFileSizesClearsDirectory() throws Exception { cache.close(); generateSomeGarbageFiles(); createJournal("CLEAN k1 1 1 1"); cache = DiskLruCache.open(cacheDir, appVersion, 2, Integer.MAX_VALUE); assertGarbageFilesAllDeleted(); assertThat(cache.get("k1")).isNull(); }
@Test public void openWithDirtyKeyDeletesAllFilesForThatKey() throws Exception { cache.close(); File cleanFile0 = getCleanFile("k1", 0); File cleanFile1 = getCleanFile("k1", 1); File dirtyFile0 = getDirtyFile("k1", 0); File dirtyFile1 = getDirtyFile("k1", 1); writeFile(cleanFile0, "A"); writeFile(cleanFile1, "B"); writeFile(dirtyFile0, "C"); writeFile(dirtyFile1, "D"); createJournal("CLEAN k1 1 1", "DIRTY k1"); cache = DiskLruCache.open(cacheDir, appVersion, 2, Integer.MAX_VALUE); assertThat(cleanFile0.exists()).isFalse(); assertThat(cleanFile1.exists()).isFalse(); assertThat(dirtyFile0.exists()).isFalse(); assertThat(dirtyFile1.exists()).isFalse(); assertThat(cache.get("k1")).isNull(); }
private void assertAbsent(String key) throws Exception { DiskLruCache.Value value = cache.get(key); if (value != null) { Assert.fail(); } assertThat(getCleanFile(key, 0)).doesNotExist(); assertThat(getCleanFile(key, 1)).doesNotExist(); assertThat(getDirtyFile(key, 0)).doesNotExist(); assertThat(getDirtyFile(key, 1)).doesNotExist(); }
@Test public void removeHandlesMissingFile() throws Exception { set("a", "a", "a"); getCleanFile("a", 0).delete(); cache.remove("a"); }
@Test public void cacheSingleValueOfSizeGreaterThanMaxSize() throws Exception { cache.close(); cache = DiskLruCache.open(cacheDir, appVersion, 2, 10); set("a", "aaaaaaaaaaa", "a"); // size=12 cache.flush(); assertAbsent("a"); }
@Test public void emptyCache() throws Exception { cache.close(); assertJournalEquals(); }
@Test public void explicitRemoveAppliedToDiskImmediately() throws Exception { DiskLruCache.Editor editor = cache.edit("k1"); editor.set(0, "ABC"); editor.set(1, "B"); editor.commit(); File k1 = getCleanFile("k1", 0); assertThat(readFile(k1)).isEqualTo("ABC"); cache.remove("k1"); assertThat(k1.exists()).isFalse(); }
private void assertGarbageFilesAllDeleted() throws Exception { assertThat(getCleanFile("g1", 0)).doesNotExist(); assertThat(getCleanFile("g1", 1)).doesNotExist(); assertThat(getCleanFile("g2", 0)).doesNotExist(); assertThat(getCleanFile("g2", 1)).doesNotExist(); assertThat(new File(cacheDir, "otherFile0")).doesNotExist(); assertThat(new File(cacheDir, "dir1")).doesNotExist(); }
@Test public void cannotOperateOnEditAfterPublish() throws Exception { DiskLruCache.Editor editor = cache.edit("k1"); editor.set(0, "A"); editor.set(1, "B"); editor.commit(); assertInoperable(editor); }
private void createJournal(String... bodyLines) throws Exception { createJournalWithHeader(MAGIC, VERSION_1, "100", "2", "", bodyLines); }
@Test public void openWithInvalidJournalLineClearsDirectory() throws Exception { cache.close(); generateSomeGarbageFiles(); createJournal("CLEAN k1 1 1", "BOGUS"); cache = DiskLruCache.open(cacheDir, appVersion, 2, Integer.MAX_VALUE); assertGarbageFilesAllDeleted(); assertThat(cache.get("k1")).isNull(); }
@Test public void rebuildJournalOnRepeatedEdits() throws Exception { long lastJournalLength = 0; while (true) { long journalLength = journalFile.length(); set("a", "a", "a"); set("b", "b", "b"); if (journalLength < lastJournalLength) { System.out .printf("Journal compacted from %s bytes to %s bytes\n", lastJournalLength, journalLength); break; } lastJournalLength = journalLength; } // Sanity check that a rebuilt journal behaves normally. assertValue("a", "a", "a"); assertValue("b", "b", "b"); }
@Test public void revertWithTooFewValues() throws Exception { DiskLruCache.Editor creator = cache.edit("k1"); creator.set(1, "A"); creator.abort(); assertThat(getCleanFile("k1", 0).exists()).isFalse(); assertThat(getCleanFile("k1", 1).exists()).isFalse(); assertThat(getDirtyFile("k1", 0).exists()).isFalse(); assertThat(getDirtyFile("k1", 1).exists()).isFalse(); assertThat(cache.get("k1")).isNull(); }
@Test public void fileDeletedExternally() throws Exception { set("a", "a", "a"); getCleanFile("a", 1).delete(); assertThat(cache.get("a")).isNull(); }
@Test public void cacheSingleEntryOfSizeGreaterThanMaxSize() throws Exception { cache.close(); cache = DiskLruCache.open(cacheDir, appVersion, 2, 10); set("a", "aaaaa", "aaaaaa"); // size=11 cache.flush(); assertAbsent("a"); }