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}