package org.limewire.http; import junit.framework.TestCase; import org.apache.http.message.BasicHeader; import org.limewire.http.RangeHeaderInterceptor.Range; public class RangeHeaderInterceptorTest extends TestCase { public void testProcessSingleRange() throws Exception { RangeHeaderInterceptor interceptor = new RangeHeaderInterceptor(); interceptor.process(new BasicHeader("Range", "bytes=1-"), null); assertTrue(interceptor.hasRequestedRanges()); Range[] ranges = interceptor.getRequestedRanges(); assertNotNull(ranges); assertEquals(1, ranges.length); assertEquals(1, ranges[0].getStartOffset(100)); assertEquals(99, ranges[0].getEndOffset(100)); interceptor = new RangeHeaderInterceptor(); interceptor.process(new BasicHeader("Range", "bytes= 1 - 1"), null); ranges = interceptor.getRequestedRanges(); assertNotNull(ranges); assertEquals(1, ranges.length); assertEquals(1, ranges[0].getStartOffset(100)); assertEquals(1, ranges[0].getEndOffset(100)); interceptor = new RangeHeaderInterceptor(); interceptor.process(new BasicHeader("Range", "bytes= - 2"), null); ranges = interceptor.getRequestedRanges(); assertNotNull(ranges); assertEquals(1, ranges.length); assertEquals(98, ranges[0].getStartOffset(100)); assertEquals(99, ranges[0].getEndOffset(100)); interceptor = new RangeHeaderInterceptor(); interceptor.process(new BasicHeader("Range", "bytes 4 - 4"), null); ranges = interceptor.getRequestedRanges(); assertNotNull(ranges); assertEquals(1, ranges.length); assertEquals(4, ranges[0].getStartOffset(100)); assertEquals(4, ranges[0].getEndOffset(100)); } public void testProcessMultipleRanges() throws Exception { RangeHeaderInterceptor interceptor = new RangeHeaderInterceptor(); interceptor.process(new BasicHeader("Range", "bytes=1-,2-5"), null); Range[] ranges = interceptor.getRequestedRanges(); assertNotNull(ranges); assertEquals(2, ranges.length); assertEquals(1, ranges[0].getStartOffset(100)); assertEquals(99, ranges[0].getEndOffset(100)); assertEquals(2, ranges[1].getStartOffset(100)); assertEquals(5, ranges[1].getEndOffset(100)); interceptor = new RangeHeaderInterceptor(); interceptor.process(new BasicHeader("Range", "bytes=1-1,1-1,-4"), null); ranges = interceptor.getRequestedRanges(); assertNotNull(ranges); assertEquals(3, ranges.length); assertEquals(1, ranges[0].getStartOffset(100)); assertEquals(1, ranges[0].getEndOffset(100)); assertEquals(1, ranges[1].getStartOffset(100)); assertEquals(1, ranges[1].getEndOffset(100)); assertEquals(96, ranges[2].getStartOffset(100)); assertEquals(99, ranges[2].getEndOffset(100)); } public void testProcessMultipleHeaders() throws Exception { RangeHeaderInterceptor interceptor = new RangeHeaderInterceptor(); interceptor.process(new BasicHeader("Range", "bytes=1-"), null); Range[] ranges = interceptor.getRequestedRanges(); assertNotNull(ranges); assertEquals(1, ranges.length); assertEquals(1, ranges[0].getStartOffset(100)); assertEquals(99, ranges[0].getEndOffset(100)); interceptor.process(new BasicHeader("Range", "bytes=2-4,4-5"), null); ranges = interceptor.getRequestedRanges(); assertNotNull(ranges); assertEquals(3, ranges.length); assertEquals(1, ranges[0].getStartOffset(100)); assertEquals(99, ranges[0].getEndOffset(100)); assertEquals(2, ranges[1].getStartOffset(100)); assertEquals(4, ranges[1].getEndOffset(100)); assertEquals(4, ranges[2].getStartOffset(100)); assertEquals(5, ranges[2].getEndOffset(100)); } public void testProcessBigValues() throws Exception { RangeHeaderInterceptor interceptor = new RangeHeaderInterceptor(); interceptor.process(new BasicHeader("Range", "bytes=-" + Long.MAX_VALUE), null); Range[] ranges = interceptor.getRequestedRanges(); assertNotNull(ranges); assertEquals(1, ranges.length); assertEquals(0, ranges[0].getStartOffset(100)); assertEquals(99, ranges[0].getEndOffset(100)); assertEquals(0, ranges[0].getStartOffset(Long.MAX_VALUE)); assertEquals(Long.MAX_VALUE - 1, ranges[0].getEndOffset(Long.MAX_VALUE)); } public void testProcessNegativeOffsets() throws Exception { RangeHeaderInterceptor interceptor = new RangeHeaderInterceptor(); try { interceptor.process(new BasicHeader("Range", "bytes=--1"), null); fail("Expected MalformedHeaderException"); } catch (MalformedHeaderException expected) { } try { interceptor.process(new BasicHeader("Range", "bytes=1--1"), null); fail("Expected MalformedHeaderException"); } catch (MalformedHeaderException expected) { } try { interceptor.process(new BasicHeader("Range", "bytes=-1-1"), null); fail("Expected MalformedHeaderException"); } catch (MalformedHeaderException expected) { } try { interceptor.process(new BasicHeader("Range", "bytes=1-1-"), null); fail("Expected MalformedHeaderException"); } catch (MalformedHeaderException expected) { } } public void testProcessInvalidFormat() throws Exception { RangeHeaderInterceptor interceptor = new RangeHeaderInterceptor(); try { interceptor.process(new BasicHeader("Range", "bytes=1-abc"), null); fail("Expected MalformedHeaderException"); } catch (MalformedHeaderException expected) { } try { interceptor.process(new BasicHeader("Range", "bytes=abc"), null); fail("Expected MalformedHeaderException"); } catch (MalformedHeaderException expected) { } try { interceptor.process(new BasicHeader("Range", "bytes=2-1"), null); fail("Expected MalformedHeaderException"); } catch (MalformedHeaderException expected) { } try { interceptor.process(new BasicHeader("Range", "bytes="), null); fail("Expected MalformedHeaderException"); } catch (MalformedHeaderException expected) { } try { interceptor.process(new BasicHeader("Range", "bytes "), null); fail("Expected MalformedHeaderException"); } catch (MalformedHeaderException expected) { } try { interceptor.process(new BasicHeader("Range", "abc"), null); fail("Expected MalformedHeaderException"); } catch (MalformedHeaderException expected) { } } public void testGetRequestedRanges() { RangeHeaderInterceptor interceptor = new RangeHeaderInterceptor(); assertNull(interceptor.getRequestedRanges()); assertFalse(interceptor.hasRequestedRanges()); } public void testStartEndOffset() { // last 100 bytes Range range = new RangeHeaderInterceptor.Range(-1, 100); assertEquals(0, range.getStartOffset(100)); assertEquals(99, range.getEndOffset(100)); assertEquals(1, range.getStartOffset(101)); assertEquals(100, range.getEndOffset(101)); assertEquals(0, range.getStartOffset(99)); assertEquals(98, range.getEndOffset(99)); // first 100 bytes range = new RangeHeaderInterceptor.Range(0, 99); assertEquals(0, range.getStartOffset(100)); assertEquals(99, range.getEndOffset(100)); assertEquals(0, range.getStartOffset(101)); assertEquals(99, range.getEndOffset(101)); assertEquals(99, range.getEndOffset(1000)); assertEquals(0, range.getStartOffset(99)); assertEquals(98, range.getEndOffset(99)); // byte 4-8 range = new RangeHeaderInterceptor.Range(4, 8); assertEquals(4, range.getStartOffset(100)); assertEquals(8, range.getEndOffset(100)); assertEquals(4, range.getStartOffset(9)); assertEquals(8, range.getEndOffset(9)); assertEquals(4, range.getStartOffset(8)); assertEquals(7, range.getEndOffset(8)); assertEquals(-1, range.getStartOffset(4)); assertEquals(-1, range.getStartOffset(1)); assertEquals(-1, range.getStartOffset(0)); // byte 0 range = new RangeHeaderInterceptor.Range(0, 0); assertEquals(0, range.getStartOffset(100)); assertEquals(0, range.getEndOffset(100)); assertEquals(-1, range.getStartOffset(0)); assertEquals(0, range.getStartOffset(1)); assertEquals(0, range.getEndOffset(1)); } }