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

Abort disk cache edits if throws while writing.

上级 548ff09b
......@@ -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) {
......
......@@ -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 {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册