Browse Source

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

stable-2.1
Shawn Pearce 13 years ago committed by Gerrit Code Review @ Eclipse.org
parent
commit
c25ea295e0
  1. 23
      org.eclipse.jgit.test/tst/org/eclipse/jgit/util/io/UnionInputStreamTest.java
  2. 21
      org.eclipse.jgit/src/org/eclipse/jgit/util/io/UnionInputStream.java

23
org.eclipse.jgit.test/tst/org/eclipse/jgit/util/io/UnionInputStreamTest.java

@ -50,6 +50,7 @@ import static org.junit.Assert.fail;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays; import java.util.Arrays;
import org.junit.Test; import org.junit.Test;
@ -238,4 +239,26 @@ public class UnionInputStreamTest {
assertEquals("I AM A TEST", e.getMessage()); 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());
}
}
} }

21
org.eclipse.jgit/src/org/eclipse/jgit/util/io/UnionInputStream.java

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

Loading…
Cancel
Save