/* This file is part of Libresonic. Libresonic is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Libresonic is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Libresonic. If not, see <http://www.gnu.org/licenses/>. Copyright 2016 (C) Libresonic Authors Based upon Subsonic, Copyright 2014 (C) Sindre Mehus */ package org.libresonic.player.io; import junit.framework.TestCase; import org.libresonic.player.util.HttpRange; import java.io.*; /** * @author Sindre Mehus * @version $Id$ */ public class RangeOutputStreamTestCase extends TestCase { public void testWrap() throws Exception { doTestWrap(0, 99, 100, 1); doTestWrap(0, 99, 100, 10); doTestWrap(0, 99, 100, 13); doTestWrap(0, 99, 100, 70); doTestWrap(0, 99, 100, 100); doTestWrap(10, 99, 100, 1); doTestWrap(10, 99, 100, 10); doTestWrap(10, 99, 100, 13); doTestWrap(10, 99, 100, 70); doTestWrap(10, 99, 100, 100); doTestWrap(66, 66, 100, 1); doTestWrap(66, 66, 100, 2); doTestWrap(10, 20, 100, 1); doTestWrap(10, 20, 100, 10); doTestWrap(10, 20, 100, 13); doTestWrap(10, 20, 100, 70); doTestWrap(10, 20, 100, 100); for (int start = 0; start < 10; start++) { for (int end = start; end < 10; end++) { for (int bufferSize = 1; bufferSize < 10; bufferSize++) { doTestWrap(start, end, 10, bufferSize); doTestWrap(start, null, 10, bufferSize); } } } } private void doTestWrap(int first, Integer last, int sourceSize, int bufferSize) throws Exception { byte[] source = createSource(sourceSize); ByteArrayOutputStream out = new ByteArrayOutputStream(); OutputStream rangeOut = RangeOutputStream.wrap(out, new HttpRange((long) first, last == null ? null : last.longValue())); copy(source, rangeOut, bufferSize); verify(out.toByteArray(), first, last, sourceSize); } private void verify(byte[] bytes, int first, Integer last, int sourceSize) { if (last == null) { assertEquals(sourceSize - first, bytes.length); } else { assertEquals(last - first + 1, bytes.length); } for (int i = 0; i < bytes.length; i++) { assertEquals(first + i, bytes[i]); } } private void copy(byte[] source, OutputStream out, int bufsz) throws IOException { InputStream in = new ByteArrayInputStream(source); byte[] buffer = new byte[bufsz]; int n; while (-1 != (n = in.read(buffer))) { int split = n / 2; out.write(buffer, 0, split); out.write(buffer, split, n - split); } } private byte[] createSource(int size) { byte[] result = new byte[size]; for (int i = 0; i < result.length; i++) { result[i] = (byte) i; } return result; } }