}
}
@Test
public void testByteRange() throws IOException {
URLOpener ospy = spy(new URLOpener(new URL("http://test/")));
doReturn(new MockHttpURLConnection(ospy.getURL())).when(ospy)
.openConnection();
URLOpener rspy = spy(new URLOpener((URL) null));
doReturn(new MockHttpURLConnection(rspy.getURL())).when(rspy)
.openConnection();
ByteRangeInputStream is = new ByteRangeInputStream(ospy, rspy);
assertEquals("getPos wrong", 0, is.getPos());
is.read();
assertNull("Initial call made incorrectly (Range Check)", ospy
.openConnection().getRequestProperty("Range"));
assertEquals("getPos should be 1 after reading one byte", 1, is.getPos());
is.read();
assertEquals("getPos should be 2 after reading two bytes", 2, is.getPos());
// No additional connections should have been made (no seek)
rspy.setURL(new URL("http://resolvedurl/"));
is.seek(100);
is.read();
assertEquals("Seek to 100 bytes made incorrectly (Range Check)",
"bytes=100-", rspy.openConnection().getRequestProperty("Range"));
assertEquals("getPos should be 101 after reading one byte", 101,
is.getPos());
verify(rspy, times(2)).openConnection();
is.seek(101);
is.read();
verify(rspy, times(2)).openConnection();
// Seek to 101 should not result in another request"
is.seek(2500);
is.read();
assertEquals("Seek to 2500 bytes made incorrectly (Range Check)",
"bytes=2500-", rspy.openConnection().getRequestProperty("Range"));
((MockHttpURLConnection) rspy.openConnection()).setResponseCode(200);
is.seek(500);
try {
is.read();
fail("Exception should be thrown when 200 response is given "
+ "but 206 is expected");
} catch (IOException e) {
assertEquals("Should fail because incorrect response code was sent",
"HTTP_PARTIAL expected, received 200", e.getMessage());
}
((MockHttpURLConnection) rspy.openConnection()).setResponseCode(206);
is.seek(0);
try {
is.read();
fail("Exception should be thrown when 206 response is given "