Merge "Fix UnionInputStream.read to be more Java-like"

This commit is contained in:
Shawn Pearce 2012-06-15 01:27:43 -04:00 committed by Gerrit Code Review @ Eclipse.org
commit c25ea295e0
2 changed files with 31 additions and 13 deletions

View File

@ -50,6 +50,7 @@
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import org.junit.Test;
@ -238,4 +239,26 @@ public void close() throws IOException {
assertEquals("I AM A TEST", e.getMessage());
}
}
@Test
public void testNonBlockingPartialRead() throws Exception {
InputStream errorReadStream = new InputStream() {
@Override
public int read() throws IOException {
throw new IOException("Expected");
}
};
final UnionInputStream u = new UnionInputStream(
new ByteArrayInputStream(new byte[]{1,2,3}),
errorReadStream);
byte buf[] = new byte[10];
assertEquals(3, u.read(buf, 0, 10));
assertTrue(Arrays.equals(new byte[] {1,2,3}, slice(buf, 3)));
try {
u.read(buf, 0, 1);
fail("Expected exception from errorReadStream");
} catch (IOException e) {
assertEquals("Expected", e.getMessage());
}
}
}

View File

@ -138,23 +138,18 @@ else if (in == EOF)
@Override
public int read(byte[] b, int off, int len) throws IOException {
int cnt = 0;
while (0 < len) {
if (len == 0)
return 0;
for (;;) {
final InputStream in = head();
final int n = in.read(b, off, len);
if (0 < n) {
cnt += n;
off += n;
len -= n;
} else if (in == EOF)
return 0 < cnt ? cnt : -1;
else {
if (0 < n)
return n;
else if (in == EOF)
return -1;
else
pop();
if (0 < cnt)
break;
}
}
return cnt;
}
@Override