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:
Bjorn Bringert
2009-06-03 04:56:52 -07:00
committed by The Android Open Source Project
3 changed files with 80 additions and 3 deletions

View File

@@ -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;

View File

@@ -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));
}

View File

@@ -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");