private Range getRange(final String[] values) throws MalformedInputException { try { return new Range(Long.parseLong(values[0].trim()), Long.parseLong(values[1].trim())); } catch (NumberFormatException e) { throw new MalformedInputException("Invalid range value, unable to parse numeric values " + e.getMessage()); } } }
String partHeader = serialize(new RangePartHeader(new Range(0L, 0L), boundary, contentType, 0L)); int partHeaderWithoutDigits = partHeader.length() - RANGE_DIGITS_LENGTH;
@Test public void shouldNotBeSatisfiable() { assertThat(rangeHelper.isSatisfiable(Collections.singletonList(new Range(0, 0)), 0), is(false)); assertThat(rangeHelper.isSatisfiable(Collections.singletonList(new Range(0, 1)), 1), is(false)); assertThat(rangeHelper.isSatisfiable(Collections.singletonList(new Range(0, 2)), 1), is(false)); assertThat(rangeHelper.isSatisfiable(Collections.singletonList(new Range(-1, 0)), 0), is(false)); assertThat(rangeHelper.isSatisfiable(Collections.singletonList(new Range(-1, 0)), 55), is(false)); assertThat(rangeHelper.isSatisfiable(Collections.singletonList(new Range(50, 49)), 0), is(false)); }
@Test public void shouldComputeLength() { assertThat(rangeHelper.getRangeLength(new Range(0, 0)), is(1L)); assertThat(rangeHelper.getRangeLength(new Range(0, 10)), is(11L)); assertThat(rangeHelper.getRangeLength(new Range(2, 3)), is(2L)); assertThat(rangeHelper.getRangeLength(new Range(11, 12)), is(2L)); }
@Test public void shouldBeSatisfiable() { assertThat(rangeHelper.isSatisfiable(Collections.singletonList(new Range(0, 0)), 1), is(true)); assertThat(rangeHelper.isSatisfiable(Collections.singletonList(new Range(0, 1)), 2), is(true)); assertThat(rangeHelper.isSatisfiable(Collections.singletonList(new Range(0, 2)), 3), is(true)); }
@Test public void shouldServeTheSameBytesForMultipleRangeSmallerThanTheBuffer() throws IOException { List<Range> ranges = new ArrayList<>(); ranges.add(new Range(0, 2)); ranges.add(new Range(2, 2)); byte[] inputBytesSliced = sliceHelper.getSliceForRanges(inputBytes, ranges); streamHelper.serveMultiRangeStream(inputStream, outputStream, ranges, BOUNDARY, CONTENT_TYPE, 0); byte[] out = outputStream.toByteArray(); assertThat(out.length, is(equalTo(inputBytesSliced.length))); assertThat(out, new ArrayEquals(inputBytesSliced)); }
@Test public void shouldServeTheSameBytesForMultipleRangeGreaterThanTheBuffer() throws IOException { List<Range> ranges = new ArrayList<>(); ranges.add(new Range(0, 550)); ranges.add(new Range(1024, 1623)); byte[] inputBytesSliced = sliceHelper.getSliceForRanges(inputBytes, ranges); streamHelper.serveMultiRangeStream(inputStream, outputStream, ranges, BOUNDARY, CONTENT_TYPE, TOTAL_LENGTH); byte[] out = outputStream.toByteArray(); assertThat(out.length, is(equalTo(inputBytesSliced.length))); assertThat(out, new ArrayEquals(inputBytesSliced)); }
@Test public void shouldServeTheSameBytesForMultipleRangeSmallerThanTheBufferOverlapping() throws IOException { List<Range> ranges = new ArrayList<>(); ranges.add(new Range(0, 49)); ranges.add(new Range(40, 59)); byte[] inputBytesSliced = sliceHelper.getSliceForRanges(inputBytes, ranges); streamHelper.serveMultiRangeStream(inputStream, outputStream, ranges, BOUNDARY, CONTENT_TYPE, TOTAL_LENGTH); byte[] out = outputStream.toByteArray(); assertThat(out.length, is(equalTo(inputBytesSliced.length))); assertThat(out, new ArrayEquals(inputBytesSliced)); }
@Test public void shouldReturnLengthForASingeRange() { Range range = new Range(333L, 1234L); String boundary = "BBBOOUUNNNDDAARRYY"; String contentType = "application/pdf"; long totalLength = 12345L; long computedLength = rangePartHeaderSerializer.getPartHeadersLength(Collections.singletonList(range), boundary, contentType, totalLength); assertThat(computedLength, is(0L)); }
@Test public void selfTest() { byte[] sample = {0, 1, 2, 3, 4}; List<Range> ranges = new ArrayList<>(); ranges.add(new Range(2, 4)); assertThat(sliceHelper.getSliceForRanges(sample, ranges), new ArrayEquals(new byte[]{ 2, 3, 4 })); }
@Test public void shouldServeTheSameBytesForSingeRangeGreaterThanTheBuffer() throws IOException { Range range = new Range(3, 1024); byte[] inputBytesSliced = sliceHelper.getSliceForRanges(inputBytes, Arrays.asList(range)); streamHelper.serveMultiRangeStream(inputStream, outputStream, range); byte[] out = outputStream.toByteArray(); assertThat(out.length, is(equalTo((int) rangeHelper.getTotalLength(Arrays.asList(range))))); assertThat(out, new ArrayEquals(inputBytesSliced)); }
@Test public void shouldServeTheSameBytesForSingeRangeSmallerThanTheBuffer() throws IOException { Range range = new Range(3, 200); byte[] inputBytesSliced = sliceHelper.getSliceForRanges(inputBytes, Arrays.asList(range)); streamHelper.serveMultiRangeStream(inputStream, outputStream, range); byte[] out = outputStream.toByteArray(); assertThat(out.length, is(equalTo((int) rangeHelper.getTotalLength(Arrays.asList(range))))); assertThat(out, new ArrayEquals(inputBytesSliced)); }
@Test public void shouldReturnLengthForMultipleRanges() { Range range = new Range(333L, 1234L); String boundary = "BBBOOUUNNNDDAARRYY"; String contentType = "application/pdf"; long totalLength = 12345L; RangePartHeader rangePartHeader = new RangePartHeader(range, boundary, contentType, totalLength); String serialized = rangePartHeaderSerializer.serialize(rangePartHeader); long serializedLength = serialized.length(); long computedLength = rangePartHeaderSerializer.getPartHeadersLength(Arrays.asList(range, range), boundary, contentType, totalLength); long firstLineLength = "\r\n".length(); long lastLineLength = ("\r\n--" + boundary + "--\r\n\r\n").length(); assertThat(computedLength, is(firstLineLength + 2 * serializedLength + lastLineLength)); } }
@Test public void shouldSerializeRangeProperly() { Range range = new Range(333L, 1234L); String boundary = "BBBOOUUNNNDDAARRYY"; String contentType = "application/pdf"; long totalLength = 12345L; RangePartHeader rangePartHeader = new RangePartHeader(range, boundary, contentType, totalLength); String serialized = rangePartHeaderSerializer.serialize(rangePartHeader); assertThat(serialized, startsWith("--" + boundary + "\r\n")); assertThat(serialized, endsWith("\r\n\r\n")); assertThat(serialized, containsString("\r\nContent-Type: " + contentType + "\r\n")); assertThat(serialized, containsString("\r\nContent-Range: bytes 333-1234/12345\r\n")); }