summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorBjorn Bringert <bringert@android.com>2009-06-01 10:53:06 +0100
committerBjorn Bringert <bringert@android.com>2009-06-03 12:53:42 +0100
commitc1823701cc76790494fb622fe58f0942236cd7d0 (patch)
tree4732327a73e57fa5ad55e1724d79fbbf35654141 /tests
parent963cd006c45716b034f656bf7e7179e6476f7e4d (diff)
downloadframeworks_base-c1823701cc76790494fb622fe58f0942236cd7d0.zip
frameworks_base-c1823701cc76790494fb622fe58f0942236cd7d0.tar.gz
frameworks_base-c1823701cc76790494fb622fe58f0942236cd7d0.tar.bz2
Handle EOF correctly in MemoryFile input stream.
Before, the variants of MemoryFile.MemoryInputStream.read() would throw IOException or IndexOutOfBoundsException if EOF was encountered before the requested number of bytes was read. This violates the contract of InputStream.read(). This patch makes read() return the number of bytes available, if any. If already at EOF, -1 is returned. The patch also adds new tests, which checks cases where MemoryFile.MemoryInputStream.read() should throw IndexOutOfBoundsException or return -1. several of these tests failed with the old code and pass now. This fixes http://b/issue?id=1881894
Diffstat (limited to 'tests')
-rw-r--r--tests/AndroidTests/src/com/android/unit_tests/content/MemoryFileProviderTest.java3
-rw-r--r--tests/AndroidTests/src/com/android/unit_tests/os/MemoryFileTest.java69
2 files changed, 70 insertions, 2 deletions
diff --git a/tests/AndroidTests/src/com/android/unit_tests/content/MemoryFileProviderTest.java b/tests/AndroidTests/src/com/android/unit_tests/content/MemoryFileProviderTest.java
index 2d8190a..f88a9da 100644
--- a/tests/AndroidTests/src/com/android/unit_tests/content/MemoryFileProviderTest.java
+++ b/tests/AndroidTests/src/com/android/unit_tests/content/MemoryFileProviderTest.java
@@ -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));
}
diff --git a/tests/AndroidTests/src/com/android/unit_tests/os/MemoryFileTest.java b/tests/AndroidTests/src/com/android/unit_tests/os/MemoryFileTest.java
index 66f2b50..18b3d63 100644
--- a/tests/AndroidTests/src/com/android/unit_tests/os/MemoryFileTest.java
+++ b/tests/AndroidTests/src/com/android/unit_tests/os/MemoryFileTest.java
@@ -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");