am c1823701: Handle EOF correctly in MemoryFile input stream.
Merge commit 'c1823701cc76790494fb622fe58f0942236cd7d0' * commit 'c1823701cc76790494fb622fe58f0942236cd7d0': Handle EOF correctly in MemoryFile input stream.
This commit is contained in:
committed by
The Android Open Source Project
commit
b15a5348e6
@@ -353,13 +353,22 @@ public class MemoryFile
|
||||
}
|
||||
int result = read(mSingleByte, 0, 1);
|
||||
if (result != 1) {
|
||||
throw new IOException("read() failed");
|
||||
return -1;
|
||||
}
|
||||
return mSingleByte[0];
|
||||
}
|
||||
|
||||
@Override
|
||||
public int read(byte buffer[], int offset, int count) throws IOException {
|
||||
if (offset < 0 || count < 0 || offset + count > buffer.length) {
|
||||
// readBytes() also does this check, but we need to do it before
|
||||
// changing count.
|
||||
throw new IndexOutOfBoundsException();
|
||||
}
|
||||
count = Math.min(count, available());
|
||||
if (count < 1) {
|
||||
return -1;
|
||||
}
|
||||
int result = readBytes(buffer, mOffset, offset, count);
|
||||
if (result > 0) {
|
||||
mOffset += result;
|
||||
|
||||
@@ -40,8 +40,7 @@ public class MemoryFileProviderTest extends AndroidTestCase {
|
||||
assertNotNull(in);
|
||||
int count = in.read(buf);
|
||||
assertEquals(buf.length, count);
|
||||
// TODO: MemoryFile throws IndexOutOfBoundsException for this, http://b/issue?id=1881894
|
||||
//assertEquals(-1, in.read());
|
||||
assertEquals(-1, in.read());
|
||||
in.close();
|
||||
assertTrue(Arrays.equals(MemoryFileProvider.TEST_BLOB, buf));
|
||||
}
|
||||
|
||||
@@ -97,6 +97,74 @@ public class MemoryFileTest extends AndroidTestCase {
|
||||
file.close();
|
||||
}
|
||||
|
||||
// Tests for the IndexOutOfBoundsException cases in read().
|
||||
|
||||
private void readIndexOutOfBoundsException(int offset, int count, String msg)
|
||||
throws Exception {
|
||||
MemoryFile file = new MemoryFile("MemoryFileTest", testString.length);
|
||||
try {
|
||||
file.writeBytes(testString, 0, 0, testString.length);
|
||||
InputStream is = file.getInputStream();
|
||||
byte[] buffer = new byte[testString.length + 10];
|
||||
try {
|
||||
is.read(buffer, offset, count);
|
||||
fail(msg);
|
||||
} catch (IndexOutOfBoundsException ex) {
|
||||
// this is what should happen
|
||||
} finally {
|
||||
is.close();
|
||||
}
|
||||
} finally {
|
||||
file.close();
|
||||
}
|
||||
}
|
||||
|
||||
@SmallTest
|
||||
public void testReadNegativeOffset() throws Exception {
|
||||
readIndexOutOfBoundsException(-1, 5,
|
||||
"read() with negative offset should throw IndexOutOfBoundsException");
|
||||
}
|
||||
|
||||
@SmallTest
|
||||
public void testReadNegativeCount() throws Exception {
|
||||
readIndexOutOfBoundsException(5, -1,
|
||||
"read() with negative length should throw IndexOutOfBoundsException");
|
||||
}
|
||||
|
||||
@SmallTest
|
||||
public void testReadOffsetOverflow() throws Exception {
|
||||
readIndexOutOfBoundsException(testString.length + 10, 5,
|
||||
"read() with offset outside buffer should throw IndexOutOfBoundsException");
|
||||
}
|
||||
|
||||
@SmallTest
|
||||
public void testReadOffsetCountOverflow() throws Exception {
|
||||
readIndexOutOfBoundsException(testString.length, 11,
|
||||
"read() with offset + count outside buffer should throw IndexOutOfBoundsException");
|
||||
}
|
||||
|
||||
// Test behavior of read() at end of file
|
||||
@SmallTest
|
||||
public void testReadEOF() throws Exception {
|
||||
MemoryFile file = new MemoryFile("MemoryFileTest", testString.length);
|
||||
try {
|
||||
file.writeBytes(testString, 0, 0, testString.length);
|
||||
InputStream is = file.getInputStream();
|
||||
try {
|
||||
byte[] buffer = new byte[testString.length + 10];
|
||||
// read() with count larger than data should succeed, and return # of bytes read
|
||||
assertEquals(testString.length, is.read(buffer));
|
||||
compareBuffers(testString, buffer, testString.length);
|
||||
// Read at EOF should return -1
|
||||
assertEquals(-1, is.read());
|
||||
} finally {
|
||||
is.close();
|
||||
}
|
||||
} finally {
|
||||
file.close();
|
||||
}
|
||||
}
|
||||
|
||||
// Tests that close() is idempotent
|
||||
@SmallTest
|
||||
public void testCloseClose() throws Exception {
|
||||
@@ -194,6 +262,7 @@ public class MemoryFileTest extends AndroidTestCase {
|
||||
}
|
||||
}
|
||||
|
||||
@SmallTest
|
||||
public void testFileDescriptor() throws Exception {
|
||||
MemoryFile file = new MemoryFile("MemoryFileTest", 1000000);
|
||||
MemoryFile ref = new MemoryFile(file.getFileDescriptor(), file.length(), "r");
|
||||
|
||||
Reference in New Issue
Block a user