diff options
-rw-r--r-- | library/src/main/java/com/bumptech/glide/load/engine/cache/DiskLruCacheWrapper.java | 10 | ||||
-rw-r--r-- | library/src/test/java/com/bumptech/glide/load/engine/cache/DiskLruCacheWrapperTest.java | 33 |
2 files changed, 38 insertions, 5 deletions
diff --git a/library/src/main/java/com/bumptech/glide/load/engine/cache/DiskLruCacheWrapper.java b/library/src/main/java/com/bumptech/glide/load/engine/cache/DiskLruCacheWrapper.java index aea8000b..aa3089a4 100644 --- a/library/src/main/java/com/bumptech/glide/load/engine/cache/DiskLruCacheWrapper.java +++ b/library/src/main/java/com/bumptech/glide/load/engine/cache/DiskLruCacheWrapper.java @@ -87,9 +87,13 @@ public class DiskLruCacheWrapper implements DiskCache { DiskLruCache.Editor editor = getDiskCache().edit(safeKey); // Editor will be null if there are two concurrent puts. In the worst case we will just silently fail. if (editor != null) { - File file = editor.getFile(0); - if (writer.write(file)) { - editor.commit(); + try { + File file = editor.getFile(0); + if (writer.write(file)) { + editor.commit(); + } + } finally { + editor.abortUnlessCommitted(); } } } catch (IOException e) { diff --git a/library/src/test/java/com/bumptech/glide/load/engine/cache/DiskLruCacheWrapperTest.java b/library/src/test/java/com/bumptech/glide/load/engine/cache/DiskLruCacheWrapperTest.java index 15d7f0cb..f753cdbf 100644 --- a/library/src/test/java/com/bumptech/glide/load/engine/cache/DiskLruCacheWrapperTest.java +++ b/library/src/test/java/com/bumptech/glide/load/engine/cache/DiskLruCacheWrapperTest.java @@ -23,14 +23,13 @@ import static junit.framework.Assert.assertTrue; @RunWith(RobolectricTestRunner.class) public class DiskLruCacheWrapperTest { - private File dir; private DiskLruCacheWrapper cache; private byte[] data; private StringKey key; @Before public void setUp() { - dir = Robolectric.application.getCacheDir(); + File dir = Robolectric.application.getCacheDir(); cache = new DiskLruCacheWrapper(dir, 10 * 1024 * 1024); key = new StringKey("test"); data = new byte[] { 1, 2, 3, 4, 5, 6 }; @@ -84,6 +83,36 @@ public class DiskLruCacheWrapperTest { assertNull(cache.get(key)); } + @Test + public void testEditIsAbortedIfWriterThrows() throws FileNotFoundException { + try { + cache.put(key, new DiskCache.Writer() { + @Override + public boolean write(File file) { + throw new RuntimeException("test"); + } + }); + } catch (RuntimeException e) { + // Expected. + } + + cache.put(key, new DiskCache.Writer() { + @Override + public boolean write(File file) { + try { + new FileOutputStream(file).write(data); + } catch (IOException e) { + e.printStackTrace(); + } + return true ; + } + }); + + byte[] received = isToBytes(new FileInputStream(cache.get(key)), data.length); + + assertTrue(Arrays.equals(data, received)); + } + private static byte[] isToBytes(InputStream is, int length) { byte[] result = new byte[length]; try { |