001/*
002 * The contents of this file are subject to the license and copyright
003 * detailed in the LICENSE and NOTICE files at the root of the source
004 * tree.
005 */
006package org.fcrepo.http.commons.domain;
007
008import static org.junit.Assert.assertEquals;
009import static org.junit.Assert.assertFalse;
010import static org.junit.Assert.assertTrue;
011
012import org.junit.Test;
013
014/**
015 * <p>RangeTest class.</p>
016 *
017 * @author awoods
018 */
019public class RangeTest {
020    @Test
021    public void testUnboundedRange() {
022        final Range range = new Range(5);
023
024        assertEquals(5L, range.start());
025        assertEquals(-1L, range.end());
026        assertEquals(-1L, range.size());
027    }
028
029    @Test
030    public void testRangeParsing() {
031        final Range range = Range.convert("bytes=50-100");
032
033        assertEquals(50L, range.start());
034        assertEquals(100L, range.end());
035        assertEquals(51L, range.size());
036        assertTrue(range.hasRange());
037
038    }
039
040    @Test
041    public void testUnboundedUpperRangeParsing() {
042        final Range range = Range.convert("bytes=50-");
043
044        assertEquals(50L, range.start());
045        assertEquals(-1L, range.end());
046        assertEquals(-1L, range.size());
047        assertTrue(range.hasRange());
048
049    }
050
051    @Test
052    public void testUnboundedLowerRangeParsing() {
053        final Range range = Range.convert("bytes=-50");
054
055        assertEquals(-1L, range.start());
056        assertEquals(50L, range.end());
057        assertEquals(50L, range.size());
058        assertTrue(range.hasRange());
059
060    }
061
062    @Test
063    public void testGarbageRangeParsing() {
064        final Range range = Range.convert("something-thats-not-a-range");
065
066        assertFalse(range.hasRange());
067    }
068
069    @Test
070    public void testRangeIsSatisfiable1() {
071        // If we specify a start point less than the length of the file, the range is satisfiable
072        final Range range = Range.convert("bytes=0-100");
073        assertTrue(range.rangeOfLength(101).isSatisfiable());
074        assertTrue(range.rangeOfLength(5).isSatisfiable());
075        assertTrue(range.rangeOfLength(10).isSatisfiable());
076        assertTrue(range.rangeOfLength(200).isSatisfiable());
077    }
078
079    @Test
080    public void testRangeIsSatisfiable2() {
081        // If we specify a start point greater than the length of the file, the range is not satisfiable
082        final Range range = Range.convert("bytes=101-200");
083        assertFalse(range.rangeOfLength(100).isSatisfiable());
084        assertFalse(range.rangeOfLength(5).isSatisfiable());
085    }
086
087    @Test
088    public void testRangeIsSatisfiable3() {
089        final Range range = Range.convert("bytes=0-8199");
090        assertTrue(range.rangeOfLength(9040).isSatisfiable());
091    }
092
093    @Test
094    public void testRangeOfContentLength1() {
095        final Range range = Range.convert("bytes=0-100");
096        final var rangeOfLength = range.rangeOfLength(200);
097        assertEquals(0, rangeOfLength.start());
098        assertEquals(100, rangeOfLength.end());
099        assertEquals(101, rangeOfLength.size());
100    }
101
102    @Test
103    public void testRangeOfContentLength2() {
104        final Range range = Range.convert("bytes=5-");
105        final var rangeOfLength = range.rangeOfLength(200);
106        assertEquals(5, rangeOfLength.start());
107        assertEquals(199, rangeOfLength.end());
108        assertEquals(195, rangeOfLength.size());
109    }
110
111    @Test
112    public void testRangeOfContentLength3() {
113        final Range range = Range.convert("bytes=-150");
114        final var rangeOfLength = range.rangeOfLength(200);
115        assertEquals(50, rangeOfLength.start());
116        assertEquals(199, rangeOfLength.end());
117        assertEquals(150, rangeOfLength.size());
118    }
119
120    /**
121     * For a content size smaller than the requested range, we need to adjust the range.
122     */
123    @Test
124    public void testRangeSizeIsValid() {
125        final Range range = Range.convert("bytes=0-100");
126        final var rangeOfLength = range.rangeOfLength(90);
127        assertEquals(0, rangeOfLength.start());
128        assertEquals(89, rangeOfLength.end());
129        assertEquals(90, rangeOfLength.size());
130    }
131
132    @Test
133    public void testSpecExamples() {
134        final Range range1 = Range.convert("bytes=-500");
135        final var rangeOfLength1 = range1.rangeOfLength(10000);
136        assertEquals(9500, rangeOfLength1.start());
137        assertEquals(9999, rangeOfLength1.end());
138        assertEquals(500, rangeOfLength1.size());
139
140        final Range range2 = Range.convert("bytes=9500-");
141        final var rangeOfLength2 = range2.rangeOfLength(10000);
142        assertEquals(9500, rangeOfLength2.start());
143        assertEquals(9999, rangeOfLength2.end());
144        assertEquals(500, rangeOfLength2.size());
145    }
146
147    @Test
148    public void testZeroRange() {
149        final Range range = Range.convert("bytes=0-0");
150        final var rangeOfLength = range.rangeOfLength(100);
151        assertEquals(0, rangeOfLength.start());
152        assertEquals(0, rangeOfLength.end());
153        assertEquals(1, rangeOfLength.size());
154        assertTrue(rangeOfLength.isSatisfiable());
155    }
156}