/* The contents of this file are subject to the license and copyright terms
* detailed in the license directory at the root of the source tree (also
* available online at http://fedora-commons.org/license/).
*/
package org.fcrepo.utilities.io;
import static org.junit.Assert.assertEquals;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.IOException;
import java.io.SequenceInputStream;
import java.nio.charset.Charset;
import junit.framework.JUnit4TestAdapter;
import org.junit.Test;
import org.apache.commons.io.IOUtils;
import org.fcrepo.utilities.io.NullInputStream;
/**
* @author armintor@gmail.com
*/
public class TestByteRangeInputStream {
@Test
public void testGoodRangeHeaders() throws IOException {
// these are semantically equivalent for a 10 byte stream
String [] inputs = new String[]{"bytes=0-9","bytes=0","bytes=-10", "bytes=-12", "bytes=0-"};
for (String input: inputs) {
ByteRangeInputStream test = new ByteRangeInputStream(NullInputStream.NULL_STREAM, 10, input);
try {
assertEquals("bad offset of " + test.offset + " for " + input, 0, test.offset);
assertEquals("bad length of " + test.length + " for " + input, 10, test.length);
assertEquals("bytes 0-9/10", test.contentRange);
} finally {
test.close();
}
}
inputs = new String[]{"bytes=1-9","bytes=1","bytes=-9","bytes=1-12","bytes=1-"};
for (String input: inputs) {
ByteRangeInputStream test = new ByteRangeInputStream(NullInputStream.NULL_STREAM, 10, input);
try {
assertEquals("bad offset of " + test.offset + " for " + input, 1, test.offset);
assertEquals("bad length of " + test.length + " for " + input, 9, test.length);
assertEquals("bytes 1-9/10", test.contentRange);
} finally {
test.close();
}
}
inputs = new String[]{"bytes= 1-9 ","bytes= 1","bytes= - 9","bytes = 1-12","bytes= 1 - "};
for (String input: inputs) {
ByteRangeInputStream test = new ByteRangeInputStream(NullInputStream.NULL_STREAM, 10, input);
try {
assertEquals("bad offset of " + test.offset + " for " + input, 1, test.offset);
assertEquals("bad length of " + test.length + " for " + input, 9, test.length);
assertEquals("bytes 1-9/10", test.contentRange);
} finally {
test.close();
}
}
String input = "bytes=2-6";
ByteRangeInputStream test = new ByteRangeInputStream(NullInputStream.NULL_STREAM, 10, input);
try {
assertEquals("bad offset of " + test.offset + " for " + input, 2, test.offset);
assertEquals("bad length of " + test.length + " for " + input, 5, test.length);
assertEquals("bytes 2-6/10", test.contentRange);
} finally {
test.close();
}
input = "bytes=2-2";
test = new ByteRangeInputStream(NullInputStream.NULL_STREAM, 10, input);
try {
assertEquals("bad offset of " + test.offset + " for " + input, 2, test.offset);
assertEquals("bad length of " + test.length + " for " + input, 1, test.length);
assertEquals("bytes 2-2/10", test.contentRange);
} finally {
test.close();
}
}
@Test(expected=IndexOutOfBoundsException.class)
public void testBadRangeHeaderOffset() throws IOException {
@SuppressWarnings({"unused", "resource"})
ByteRangeInputStream test = new ByteRangeInputStream(NullInputStream.NULL_STREAM, 10, "bytes=10");
}
@Test(expected=IndexOutOfBoundsException.class)
public void testBadRangeHeaderOrder() throws IOException {
@SuppressWarnings({"unused", "resource"})
ByteRangeInputStream test = new ByteRangeInputStream(NullInputStream.NULL_STREAM, 10, "bytes=6-2");
}
@SuppressWarnings("resource")
@Test
public void testSkippedBytes() throws IndexOutOfBoundsException, IOException {
String data = "1234567890";
String input = "bytes=3-12";
InputStream bytes = new ByteArrayInputStream(data.getBytes(Charset.forName("UTF-8")));
ByteRangeInputStream test = new ByteRangeInputStream(bytes, 10, input);
assertEquals("bad offset of " + test.offset + " for " + input, 3, test.offset);
assertEquals("bad length of " + test.length + " for " + input, 7, test.length);
assertEquals("bytes 3-9/10", test.contentRange);
bytes.reset();
test = new ByteRangeInputStream(bytes, 10, "bytes=0-8");
assertEquals("123456789", IOUtils.toString(test));
bytes.reset();
InputStream bytes2 = new ByteArrayInputStream(data.getBytes(Charset.forName("UTF-8")));
test = new ByteRangeInputStream(bytes, 10, "bytes=0-2");
ByteRangeInputStream test2 = new ByteRangeInputStream(bytes2, 10, "bytes=-7");
SequenceInputStream test3 = new SequenceInputStream(test, test2);
String actual = IOUtils.toString(test3);
assertEquals(data, actual);
}
public static junit.framework.Test suite() {
return new JUnit4TestAdapter(TestByteRangeInputStream.class);
}
}