package diskCacheV111.util;
import org.junit.Test;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import dmg.util.HttpException;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
public class HttpByteRangeTests{
private final long LOWER=0;
private final long UPPER=9999;
@Test
public void tryRFC2086Tests() throws HttpException{
String rangeString;
List<HttpByteRange> ranges;
/*The first 500 bytes (byte offsets 0-499, inclusive):*/
rangeString = "bytes=0-499";
ranges = HttpByteRange.parseRanges(rangeString,LOWER,UPPER);
assertEquals(ranges.size(), 1);
assertEquals(ranges.get(0).getLower(), 0);
assertEquals(ranges.get(0).getUpper(), 499);
/*The second 500 bytes (byte offsets 500-999, inclusive):*/
rangeString = "bytes=500-999";
ranges = HttpByteRange.parseRanges(rangeString,LOWER,UPPER);
assertEquals(ranges.size(), 1);
assertEquals(ranges.get(0).getLower(), 500);
assertEquals(ranges.get(0).getUpper(), 999);
/*The final 500 bytes (byte offsets 9500-9999, inclusive):*/
rangeString = "bytes=-500";
ranges = HttpByteRange.parseRanges(rangeString,LOWER,UPPER);
assertEquals(ranges.size(), 1);
assertEquals(ranges.get(0).getLower(), 9500);
assertEquals(ranges.get(0).getUpper(), 9999);
/*Or:*/
rangeString = "bytes=9500-";
ranges = HttpByteRange.parseRanges(rangeString,LOWER,UPPER);
assertEquals(ranges.size(), 1);
assertEquals(ranges.get(0).getLower(), 9500);
assertEquals(ranges.get(0).getUpper(), 9999);
/*The first and last bytes only (bytes 0 and 9999):*/
rangeString = "bytes=0-0,-1";
ranges = HttpByteRange.parseRanges(rangeString,LOWER,UPPER);
assertEquals(ranges.size(), 2);
assertEquals(ranges.get(0).getLower(), 0);
assertEquals(ranges.get(0).getUpper(), 0);
assertEquals(ranges.get(1).getLower(), 9999);
assertEquals(ranges.get(1).getUpper(), 9999);
/*Several legal but non-canonical specifications of the second 500
bytes (byte offsets 500-999, inclusive):*/
rangeString = "bytes=500-600,601-999";
ranges = HttpByteRange.parseRanges(rangeString,LOWER,UPPER);
assertEquals(ranges.size(), 2);
assertEquals(ranges.get(0).getLower(), 500);
assertEquals(ranges.get(0).getUpper(), 600);
assertEquals(ranges.get(1).getLower(), 601);
assertEquals(ranges.get(1).getUpper(), 999);
rangeString = "bytes=500-700,601-999";
ranges = HttpByteRange.parseRanges(rangeString,LOWER,UPPER);
assertEquals(ranges.size(), 2);
assertEquals(ranges.get(0).getLower(), 500);
assertEquals(ranges.get(0).getUpper(), 700);
assertEquals(ranges.get(1).getLower(), 601);
assertEquals(ranges.get(1).getUpper(), 999);
}
@Test
public void otherTests() throws HttpException{
String rangeString;
List<HttpByteRange> ranges;
rangeString = "bytes=500700, -4d, 601-999 , ,-1000000, ";
ranges = HttpByteRange.parseRanges(rangeString,LOWER,UPPER);
assertEquals(ranges.size(), 2);
assertEquals(ranges.get(0).getLower(), 601);
assertEquals(ranges.get(0).getUpper(), 999);
// Suffix too big; should default to the entire file
assertEquals(ranges.get(1).getLower(), LOWER);
assertEquals(ranges.get(1).getUpper(), UPPER);
}
// Negative tests
@Test(expected=HttpException.class)
public void emtpyRangeTest() throws HttpException{
String rangeString;
List<HttpByteRange> ranges;
rangeString = "bytes=";
ranges = HttpByteRange.parseRanges(rangeString,LOWER,UPPER);
//Expected
}
@Test(expected=HttpException.class)
public void emptySuffixTest() throws HttpException{
String rangeString;
List<HttpByteRange> ranges;
rangeString = "blocks=0-";
ranges = HttpByteRange.parseRanges(rangeString,LOWER,UPPER);
}
@Test(expected=HttpException.class)
public void invalidRangesTest() throws HttpException{
String rangeString;
List<HttpByteRange> ranges;
rangeString = "bytes=500700, -4d, ";
ranges = HttpByteRange.parseRanges(rangeString,LOWER,UPPER);
}
@Test
public void behindUpperLimitTest()
{
String rangeString = "bytes=" + (UPPER + 1) + "-" + (UPPER + 2);
try {
List<HttpByteRange> ranges = HttpByteRange.parseRanges(rangeString, LOWER, UPPER);
fail("invalid range not detected");
}catch (HttpException e) {
assertEquals(HttpServletResponse.SC_REQUESTED_RANGE_NOT_SATISFIABLE, e.getErrorCode());
}
}
}