提交 ec059e31 编写于 作者: S Sam Judd

Abort disk cache edits if throws while writing.

上级 548ff09b
...@@ -87,9 +87,13 @@ public class DiskLruCacheWrapper implements DiskCache { ...@@ -87,9 +87,13 @@ public class DiskLruCacheWrapper implements DiskCache {
DiskLruCache.Editor editor = getDiskCache().edit(safeKey); 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. // Editor will be null if there are two concurrent puts. In the worst case we will just silently fail.
if (editor != null) { if (editor != null) {
File file = editor.getFile(0); try {
if (writer.write(file)) { File file = editor.getFile(0);
editor.commit(); if (writer.write(file)) {
editor.commit();
}
} finally {
editor.abortUnlessCommitted();
} }
} }
} catch (IOException e) { } catch (IOException e) {
......
...@@ -23,14 +23,13 @@ import static junit.framework.Assert.assertTrue; ...@@ -23,14 +23,13 @@ import static junit.framework.Assert.assertTrue;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
public class DiskLruCacheWrapperTest { public class DiskLruCacheWrapperTest {
private File dir;
private DiskLruCacheWrapper cache; private DiskLruCacheWrapper cache;
private byte[] data; private byte[] data;
private StringKey key; private StringKey key;
@Before @Before
public void setUp() { public void setUp() {
dir = Robolectric.application.getCacheDir(); File dir = Robolectric.application.getCacheDir();
cache = new DiskLruCacheWrapper(dir, 10 * 1024 * 1024); cache = new DiskLruCacheWrapper(dir, 10 * 1024 * 1024);
key = new StringKey("test"); key = new StringKey("test");
data = new byte[] { 1, 2, 3, 4, 5, 6 }; data = new byte[] { 1, 2, 3, 4, 5, 6 };
...@@ -84,6 +83,36 @@ public class DiskLruCacheWrapperTest { ...@@ -84,6 +83,36 @@ public class DiskLruCacheWrapperTest {
assertNull(cache.get(key)); 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) { private static byte[] isToBytes(InputStream is, int length) {
byte[] result = new byte[length]; byte[] result = new byte[length];
try { try {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册