/* This code is part of Freenet. It is distributed under the GNU General
* Public License, version 2 (or at your option any later version). See
* http://www.gnu.org/ for further details of the GPL. */
package freenet.support.io;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import junit.framework.TestCase;
public class LineReadingInputStreamTest extends TestCase {
public static final String BLOCK = "\ntesting1\ntesting2\r\ntesting3\n\n";
public static final String[] LINES = new String[] {
"",
"testing1",
"testing2",
"testing3",
""
};
public static final String STRESSED_LINE = "\n\u0114\n";
public static final String NULL_LINE = "a\u0000\u0000\u0000\u0000\n";
public static final String LENGTH_CHECKING_LINE = "a\u0000a\n";
public static final int LENGTH_CHECKING_LINE_LF = 3;
public static final int MAX_LENGTH = 128;
public static final int BUFFER_SIZE = 128;
public void testReadLineWithoutMarking() throws Exception {
// try utf8
InputStream is = new ByteArrayInputStream(STRESSED_LINE.getBytes("utf-8"));
LineReadingInputStream instance = new LineReadingInputStream(is);
assertEquals("", instance.readLineWithoutMarking(MAX_LENGTH, BUFFER_SIZE, true));
assertEquals("\u0114", instance.readLineWithoutMarking(MAX_LENGTH, BUFFER_SIZE, true));
assertNull(instance.readLineWithoutMarking(MAX_LENGTH, BUFFER_SIZE, true));
// try ISO-8859-1
is = new ByteArrayInputStream(BLOCK.getBytes("ISO-8859-1"));
instance = new LineReadingInputStream(is);
for(String expectedLine : LINES) {
assertEquals(expectedLine, instance.readLineWithoutMarking(MAX_LENGTH, BUFFER_SIZE, false));
}
assertNull(instance.readLineWithoutMarking(MAX_LENGTH, BUFFER_SIZE, false));
// is it returning null?
is = new MockInputStream();
instance = new LineReadingInputStream(is);
assertNull(instance.readLineWithoutMarking(0, BUFFER_SIZE, false));
assertNull(instance.readLineWithoutMarking(0, 0, false));
// is it throwing?
is = new ByteArrayInputStream(LENGTH_CHECKING_LINE.getBytes());
instance = new LineReadingInputStream(is);
try {
instance.readLineWithoutMarking(LENGTH_CHECKING_LINE_LF - 1, BUFFER_SIZE, true);
fail();
} catch (TooLongException e) {}
// Same test shouldn't throw
is = new ByteArrayInputStream(LENGTH_CHECKING_LINE.getBytes());
instance = new LineReadingInputStream(is);
assertEquals(LENGTH_CHECKING_LINE.substring(0, LENGTH_CHECKING_LINE_LF), instance.readLineWithoutMarking(LENGTH_CHECKING_LINE_LF, BUFFER_SIZE, true));
// is it handling nulls properly? @see #2501
is = new ByteArrayInputStream(NULL_LINE.getBytes());
instance = new LineReadingInputStream(is);
assertEquals(NULL_LINE.substring(0, 5), instance.readLineWithoutMarking(BUFFER_SIZE, 1, true));
}
public void testReadLine() throws Exception {
// try utf8
InputStream is = new ByteArrayInputStream(STRESSED_LINE.getBytes("utf-8"));
LineReadingInputStream instance = new LineReadingInputStream(is);
assertEquals("", instance.readLine(MAX_LENGTH, BUFFER_SIZE, true));
assertEquals("\u0114", instance.readLine(MAX_LENGTH, BUFFER_SIZE, true));
assertNull(instance.readLine(MAX_LENGTH, BUFFER_SIZE, true));
// try ISO-8859-1
is = new ByteArrayInputStream(BLOCK.getBytes("ISO-8859-1"));
instance = new LineReadingInputStream(is);
for(String expectedLine : LINES) {
assertEquals(expectedLine, instance.readLine(MAX_LENGTH, BUFFER_SIZE, false));
}
assertNull(instance.readLine(MAX_LENGTH, BUFFER_SIZE, false));
// is it returning null? and blocking when it should be?
is = new MockInputStream();
instance = new LineReadingInputStream(is);
assertNull(instance.readLine(0, BUFFER_SIZE, false));
assertNull(instance.readLine(0, 0, false));
// is it throwing?
is = new ByteArrayInputStream(LENGTH_CHECKING_LINE.getBytes());
instance = new LineReadingInputStream(is);
try {
instance.readLine(LENGTH_CHECKING_LINE_LF - 1, BUFFER_SIZE, true);
fail();
} catch (TooLongException e) {}
// Same test shouldn't throw
is = new ByteArrayInputStream(LENGTH_CHECKING_LINE.getBytes());
instance = new LineReadingInputStream(is);
assertEquals(LENGTH_CHECKING_LINE.substring(0, LENGTH_CHECKING_LINE_LF), instance.readLine(LENGTH_CHECKING_LINE_LF, BUFFER_SIZE, true));
// is it handling nulls properly? @see #2501
is = new ByteArrayInputStream(NULL_LINE.getBytes());
instance = new LineReadingInputStream(is);
assertEquals(NULL_LINE.substring(0, 5), instance.readLine(BUFFER_SIZE, 1, true));
}
public void testBothImplementation() throws Exception {
ByteArrayInputStream bis1 = new ByteArrayInputStream(BLOCK.getBytes("ISO-8859-1"));
ByteArrayInputStream bis2 = new ByteArrayInputStream(BLOCK.getBytes("ISO-8859-1"));
LineReadingInputStream lris1 = new LineReadingInputStream(bis1);
LineReadingInputStream lris2 = new LineReadingInputStream(bis2);
while(bis1.available() > 0 || bis2.available() > 0) {
String stringWithoutMark =lris2.readLineWithoutMarking(MAX_LENGTH*10, BUFFER_SIZE, true);
String stringWithMark = lris1.readLine(MAX_LENGTH*10, BUFFER_SIZE, true);
assertEquals(stringWithMark, stringWithoutMark);
}
assertNull(lris1.readLine(MAX_LENGTH, BUFFER_SIZE, true));
assertNull(lris2.readLineWithoutMarking(MAX_LENGTH, BUFFER_SIZE, true));
}
}