/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library 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 Lesser General Public License for more
* details.
*/
package com.liferay.portal.kernel.io.unsync;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
import org.junit.Assert;
import org.junit.Test;
/**
* @author Shuyang Zhou
*/
public class UnsyncBufferedReaderTest {
@Test
public void testBlockRead() throws IOException {
StringReader stringReader = new StringReader("abcdefghi");
UnsyncBufferedReader unsyncBufferedReader = new UnsyncBufferedReader(
stringReader, 5);
Assert.assertEquals(5, unsyncBufferedReader.buffer.length);
Assert.assertTrue(stringReader.ready());
Assert.assertTrue(unsyncBufferedReader.ready());
char[] buffer = new char[3];
// Zero length read
Assert.assertEquals(0, unsyncBufferedReader.read(buffer, 0, 0));
// Negative length read
Assert.assertEquals(0, unsyncBufferedReader.read(buffer, 0, -1));
// In-memory
Assert.assertEquals('a', unsyncBufferedReader.read());
Assert.assertEquals(1, unsyncBufferedReader.index);
Assert.assertEquals(5, unsyncBufferedReader.firstInvalidIndex);
int read = unsyncBufferedReader.read(buffer);
Assert.assertEquals(buffer.length, read);
Assert.assertEquals('b', buffer[0]);
Assert.assertEquals('c', buffer[1]);
Assert.assertEquals('d', buffer[2]);
Assert.assertEquals(4, unsyncBufferedReader.index);
Assert.assertEquals(5, unsyncBufferedReader.firstInvalidIndex);
// Exhaust buffer
Assert.assertEquals('e', unsyncBufferedReader.read());
Assert.assertEquals(5, unsyncBufferedReader.index);
Assert.assertEquals(5, unsyncBufferedReader.firstInvalidIndex);
// Force reload
read = unsyncBufferedReader.read(buffer);
Assert.assertEquals(buffer.length, read);
Assert.assertEquals('f', buffer[0]);
Assert.assertEquals('g', buffer[1]);
Assert.assertEquals('h', buffer[2]);
Assert.assertEquals(3, unsyncBufferedReader.index);
Assert.assertEquals(4, unsyncBufferedReader.firstInvalidIndex);
// Finish
stringReader = new StringReader(new String(_BUFFER));
unsyncBufferedReader = new UnsyncBufferedReader(stringReader, _SIZE);
char[] tempBuffer = new char[_SIZE];
unsyncBufferedReader.read(tempBuffer);
// Mark and EOF
stringReader = new StringReader(new String(_BUFFER));
unsyncBufferedReader = new UnsyncBufferedReader(stringReader, 5);
unsyncBufferedReader.mark(_SIZE);
Assert.assertEquals(_SIZE, unsyncBufferedReader.read(tempBuffer));
Assert.assertEquals(-1, unsyncBufferedReader.read(tempBuffer));
}
@Test
public void testClose() throws IOException {
UnsyncBufferedReader unsyncBufferedReader = new UnsyncBufferedReader(
new StringReader(""));
unsyncBufferedReader.close();
Assert.assertNull(unsyncBufferedReader.buffer);
Assert.assertNull(unsyncBufferedReader.reader);
try {
unsyncBufferedReader.mark(0);
Assert.fail();
}
catch (IOException ioe) {
}
try {
unsyncBufferedReader.read();
Assert.fail();
}
catch (IOException ioe) {
}
try {
unsyncBufferedReader.read(new char[5]);
Assert.fail();
}
catch (IOException ioe) {
}
try {
unsyncBufferedReader.readLine();
Assert.fail();
}
catch (IOException ioe) {
}
try {
unsyncBufferedReader.ready();
Assert.fail();
}
catch (IOException ioe) {
}
try {
unsyncBufferedReader.reset();
Assert.fail();
}
catch (IOException ioe) {
}
try {
unsyncBufferedReader.skip(0);
Assert.fail();
}
catch (IOException ioe) {
}
unsyncBufferedReader.close();
}
@Test
public void testConstructor() {
UnsyncBufferedReader unsyncBufferedReader = new UnsyncBufferedReader(
new StringReader(""));
Assert.assertEquals(8192, unsyncBufferedReader.buffer.length);
unsyncBufferedReader = new UnsyncBufferedReader(
new StringReader(""), 10);
Assert.assertEquals(10, unsyncBufferedReader.buffer.length);
try {
new UnsyncBufferedReader(new StringReader(""), 0);
Assert.fail();
}
catch (IllegalArgumentException iae) {
}
try {
new UnsyncBufferedReader(new StringReader(""), -1);
Assert.fail();
}
catch (IllegalArgumentException iae) {
}
}
@Test
public void testMarkAndReset() throws IOException {
UnsyncBufferedReader unsyncBufferedReader = new UnsyncBufferedReader(
new StringReader("abcdefghi"), 5);
Assert.assertEquals(-1, unsyncBufferedReader.markLimitIndex);
// Zero marking
unsyncBufferedReader.mark(0);
Assert.assertEquals(-1, unsyncBufferedReader.markLimitIndex);
// Negative marking
try {
unsyncBufferedReader.mark(-2);
Assert.fail();
}
catch (IllegalArgumentException iae) {
}
Assert.assertEquals(-1, unsyncBufferedReader.markLimitIndex);
// Normal
int markLimit = 3;
unsyncBufferedReader.mark(markLimit);
Assert.assertEquals(markLimit, unsyncBufferedReader.markLimitIndex);
Assert.assertEquals(0, unsyncBufferedReader.index);
Assert.assertEquals('a', unsyncBufferedReader.read());
Assert.assertEquals('b', unsyncBufferedReader.read());
Assert.assertEquals('c', unsyncBufferedReader.read());
Assert.assertEquals(3, unsyncBufferedReader.index);
unsyncBufferedReader.reset();
Assert.assertEquals(0, unsyncBufferedReader.index);
Assert.assertEquals('a', unsyncBufferedReader.read());
Assert.assertEquals('b', unsyncBufferedReader.read());
Assert.assertEquals('c', unsyncBufferedReader.read());
Assert.assertEquals(3, unsyncBufferedReader.index);
// Overrun
unsyncBufferedReader = new UnsyncBufferedReader(
new StringReader("abcdefghi"), 5);
Assert.assertEquals(-1, unsyncBufferedReader.markLimitIndex);
unsyncBufferedReader.mark(markLimit);
Assert.assertEquals(markLimit, unsyncBufferedReader.markLimitIndex);
Assert.assertEquals('a', unsyncBufferedReader.read());
Assert.assertEquals('b', unsyncBufferedReader.read());
Assert.assertEquals('c', unsyncBufferedReader.read());
Assert.assertEquals('d', unsyncBufferedReader.read());
Assert.assertEquals('e', unsyncBufferedReader.read());
Assert.assertEquals('f', unsyncBufferedReader.read());
Assert.assertEquals(1, unsyncBufferedReader.index);
Assert.assertEquals(-1, unsyncBufferedReader.markLimitIndex);
try {
unsyncBufferedReader.reset();
Assert.fail();
}
catch (IOException ioe) {
}
// Shuffle
unsyncBufferedReader = new UnsyncBufferedReader(
new StringReader("abcdefghi"), 5);
Assert.assertEquals('a', unsyncBufferedReader.read());
Assert.assertEquals('b', unsyncBufferedReader.read());
Assert.assertEquals('c', unsyncBufferedReader.read());
Assert.assertEquals(3, unsyncBufferedReader.index);
unsyncBufferedReader.mark(markLimit);
Assert.assertEquals(0, unsyncBufferedReader.index);
Assert.assertEquals('d', unsyncBufferedReader.read());
Assert.assertEquals('e', unsyncBufferedReader.read());
Assert.assertEquals('f', unsyncBufferedReader.read());
// Reset buffer
unsyncBufferedReader = new UnsyncBufferedReader(
new StringReader(new String(_BUFFER)), _SIZE);
char[] tempBuffer = new char[_SIZE / 2];
Assert.assertEquals(_SIZE / 2, unsyncBufferedReader.read(tempBuffer));
Assert.assertEquals(_SIZE / 2, unsyncBufferedReader.read(tempBuffer));
Assert.assertEquals(_SIZE, unsyncBufferedReader.index);
Assert.assertEquals(_SIZE, unsyncBufferedReader.firstInvalidIndex);
unsyncBufferedReader.mark(markLimit);
Assert.assertEquals(0, unsyncBufferedReader.index);
Assert.assertEquals(0, unsyncBufferedReader.firstInvalidIndex);
}
@Test
public void testMarkSupported() {
UnsyncBufferedReader unsyncBufferedReader = new UnsyncBufferedReader(
new StringReader("abcdefghi"), 5);
Assert.assertTrue(unsyncBufferedReader.markSupported());
}
@Test
public void testRead() throws IOException {
UnsyncBufferedReader unsyncBufferedReader = new UnsyncBufferedReader(
new StringReader("ab\r\nef"), 3);
Assert.assertEquals(3, unsyncBufferedReader.buffer.length);
Assert.assertEquals(0, unsyncBufferedReader.index);
Assert.assertEquals('a', unsyncBufferedReader.read());
Assert.assertEquals(1, unsyncBufferedReader.index);
Assert.assertEquals('b', unsyncBufferedReader.read());
Assert.assertEquals(2, unsyncBufferedReader.index);
Assert.assertEquals('\r', unsyncBufferedReader.read());
Assert.assertEquals(3, unsyncBufferedReader.index);
Assert.assertEquals('\n', unsyncBufferedReader.read());
Assert.assertEquals(1, unsyncBufferedReader.index);
Assert.assertEquals('e', unsyncBufferedReader.read());
Assert.assertEquals(2, unsyncBufferedReader.index);
Assert.assertEquals('f', unsyncBufferedReader.read());
Assert.assertEquals(3, unsyncBufferedReader.index);
Assert.assertEquals(-1, unsyncBufferedReader.read());
}
@Test
public void testReadLine() throws IOException {
// With \r
UnsyncBufferedReader unsyncBufferedReader = new UnsyncBufferedReader(
new StringReader("abc\rde"), 5);
Assert.assertEquals("abc", unsyncBufferedReader.readLine());
Assert.assertEquals(4, unsyncBufferedReader.index);
// With \n
unsyncBufferedReader = new UnsyncBufferedReader(
new StringReader("abc\nde"), 5);
Assert.assertEquals("abc", unsyncBufferedReader.readLine());
Assert.assertEquals(4, unsyncBufferedReader.index);
// With \r\n
unsyncBufferedReader = new UnsyncBufferedReader(
new StringReader("abc\r\nde"), 5);
Assert.assertEquals("abc", unsyncBufferedReader.readLine());
Assert.assertEquals(5, unsyncBufferedReader.index);
// Without \r or \n
unsyncBufferedReader = new UnsyncBufferedReader(
new StringReader("abc"), 5);
Assert.assertEquals("abc", unsyncBufferedReader.readLine());
Assert.assertEquals(0, unsyncBufferedReader.index);
// Empty
Assert.assertNull(unsyncBufferedReader.readLine());
// Load multiple times for one line
unsyncBufferedReader = new UnsyncBufferedReader(
new StringReader("abcdefghijklmn\r"), 5);
Assert.assertEquals("abcdefghijklmn", unsyncBufferedReader.readLine());
Assert.assertEquals(5, unsyncBufferedReader.index);
}
@Test
public void testReady() throws IOException {
UnsyncBufferedReader unsyncBufferedReader = new UnsyncBufferedReader(
new StringReader(""));
Assert.assertTrue(unsyncBufferedReader.ready());
unsyncBufferedReader = new UnsyncBufferedReader(
new InputStreamReader(new ByteArrayInputStream(new byte[0])));
Assert.assertFalse(unsyncBufferedReader.ready());
}
@Test
public void testSkip() throws IOException {
int size = 10;
UnsyncBufferedReader unsyncBufferedReader = new UnsyncBufferedReader(
new StringReader(new String(_BUFFER)), size);
// Zero skip
Assert.assertEquals(0, unsyncBufferedReader.skip(0));
// Negetive skip
try {
unsyncBufferedReader.skip(-1);
}
catch (IllegalArgumentException iae) {
}
// Load data into buffer
Assert.assertEquals('a', unsyncBufferedReader.read());
Assert.assertEquals(1, unsyncBufferedReader.index);
Assert.assertEquals(size, unsyncBufferedReader.firstInvalidIndex);
// In-memory
Assert.assertEquals(size - 1, unsyncBufferedReader.skip(size * 2));
Assert.assertEquals('a' + 10, unsyncBufferedReader.read());
Assert.assertEquals(size - 1, unsyncBufferedReader.skip(size * 2));
// Underlying reader
Assert.assertEquals(size * 2, unsyncBufferedReader.skip(size * 2));
Assert.assertEquals('a' + (40 % 26), unsyncBufferedReader.read());
// Clear out buffer
Assert.assertEquals(size - 1, unsyncBufferedReader.skip(size));
// Mark
unsyncBufferedReader.mark(size * 2);
// Load data into buffer for skipping
Assert.assertEquals(size, unsyncBufferedReader.skip(size * 2));
// In-memory
Assert.assertEquals(size / 2, unsyncBufferedReader.skip(size / 2));
unsyncBufferedReader.reset();
Assert.assertEquals('a' + (50 % 26), unsyncBufferedReader.read());
// Clear out buffer
Assert.assertEquals(size * 2 - 1, unsyncBufferedReader.skip(size * 2));
// Mark a large size for EOF
unsyncBufferedReader.mark(_SIZE);
// Consume all the data
while (unsyncBufferedReader.read() != -1);
// Skip on EOF
Assert.assertEquals(0, unsyncBufferedReader.skip(1));
}
private static final char[] _BUFFER =
new char[UnsyncBufferedReaderTest._SIZE];
private static final int _SIZE = 16 * 1024;
static {
for (int i = 0; i < _SIZE; i++) {
_BUFFER[i] = (char)(i % 26 + 'a');
}
}
}