/** * 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 org.junit.Assert; import org.junit.Test; /** * @author Shuyang Zhou */ public class UnsyncBufferedInputStreamTest { @Test public void testBlockRead() throws IOException { ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( _BUFFER); int size = 10; UnsyncBufferedInputStream unsyncBufferedInputStream = new UnsyncBufferedInputStream(byteArrayInputStream, size); Assert.assertEquals(_SIZE, byteArrayInputStream.available()); Assert.assertEquals(_SIZE, unsyncBufferedInputStream.available()); byte[] buffer = new byte[5]; // Zero length read Assert.assertEquals(0, unsyncBufferedInputStream.read(buffer, 0, 0)); // Negative length read Assert.assertEquals(0, unsyncBufferedInputStream.read(buffer, 0, -1)); // In-memory Assert.assertEquals(0, unsyncBufferedInputStream.read()); Assert.assertEquals(_SIZE - size, byteArrayInputStream.available()); Assert.assertEquals(_SIZE - 1, unsyncBufferedInputStream.available()); int read = unsyncBufferedInputStream.read(buffer); Assert.assertEquals(buffer.length, read); for (int i = 1; i < buffer.length + 1; i++) { Assert.assertEquals(i, buffer[i - 1]); } // Exhaust buffer Assert.assertEquals(6, unsyncBufferedInputStream.read()); Assert.assertEquals(7, unsyncBufferedInputStream.read()); Assert.assertEquals(8, unsyncBufferedInputStream.read()); Assert.assertEquals(9, unsyncBufferedInputStream.read()); // Force reload read = unsyncBufferedInputStream.read(buffer); Assert.assertEquals(buffer.length, read); for (int i = 10; i < buffer.length + 10; i++) { Assert.assertEquals(i, buffer[i - 10]); } Assert.assertEquals(_SIZE - size * 2, byteArrayInputStream.available()); Assert.assertEquals(_SIZE - 15, unsyncBufferedInputStream.available()); // Fill the buffer buffer = new byte[10]; read = unsyncBufferedInputStream.read(buffer); Assert.assertEquals(buffer.length, read); for (int i = 15; i < buffer.length + 15; i++) { Assert.assertEquals(i, buffer[i - 15]); } Assert.assertEquals(_SIZE - size * 3, byteArrayInputStream.available()); Assert.assertEquals(_SIZE - 25, unsyncBufferedInputStream.available()); // Leave 5 bytes for (int i = 25; i < _SIZE - 5; i++) { Assert.assertEquals(i & 0xff, unsyncBufferedInputStream.read()); } Assert.assertEquals(_SIZE % 5, byteArrayInputStream.available()); Assert.assertEquals(5, unsyncBufferedInputStream.available()); // Finish read = unsyncBufferedInputStream.read(buffer); Assert.assertEquals(5, read); Assert.assertEquals(-1, unsyncBufferedInputStream.read(buffer)); // Mark and EOF byteArrayInputStream = new ByteArrayInputStream(_BUFFER); unsyncBufferedInputStream = new UnsyncBufferedInputStream( byteArrayInputStream, size); unsyncBufferedInputStream.mark(_SIZE); byte[] tempBuffer = new byte[_SIZE]; Assert.assertEquals(_SIZE, unsyncBufferedInputStream.read(tempBuffer)); Assert.assertEquals(-1, unsyncBufferedInputStream.read(tempBuffer)); } @Test public void testClose() throws IOException { int size = 10; UnsyncBufferedInputStream unsyncBufferedInputStream = new UnsyncBufferedInputStream( new ByteArrayInputStream(new byte[size])); unsyncBufferedInputStream.close(); Assert.assertTrue(unsyncBufferedInputStream.inputStream == null); Assert.assertTrue(unsyncBufferedInputStream.buffer == null); try { unsyncBufferedInputStream.available(); Assert.fail(); } catch (IOException ioe) { } try { unsyncBufferedInputStream.read(); Assert.fail(); } catch (IOException ioe) { } try { unsyncBufferedInputStream.read(new byte[5]); Assert.fail(); } catch (IOException ioe) { } try { unsyncBufferedInputStream.reset(); Assert.fail(); } catch (IOException ioe) { } try { unsyncBufferedInputStream.skip(0); Assert.fail(); } catch (IOException ioe) { } unsyncBufferedInputStream.close(); } @Test public void testConstructor() throws IOException { int size = 10; UnsyncBufferedInputStream unsyncBufferedInputStream = new UnsyncBufferedInputStream( new ByteArrayInputStream(new byte[size])); Assert.assertEquals(size, unsyncBufferedInputStream.available()); unsyncBufferedInputStream = new UnsyncBufferedInputStream( new ByteArrayInputStream(new byte[size]), _SIZE); Assert.assertEquals(size, unsyncBufferedInputStream.available()); try { new UnsyncBufferedInputStream( new ByteArrayInputStream(new byte[size]), 0); Assert.fail(); } catch (IllegalArgumentException iae) { } try { new UnsyncBufferedInputStream( new ByteArrayInputStream(new byte[size]), -1); Assert.fail(); } catch (IllegalArgumentException iae) { } } @Test public void testMarkAndReset() throws IOException { UnsyncBufferedInputStream unsyncBufferedInputStream = new UnsyncBufferedInputStream(new ByteArrayInputStream(_BUFFER)); Assert.assertEquals(-1, unsyncBufferedInputStream.markLimitIndex); // Zero marking unsyncBufferedInputStream.mark(0); Assert.assertEquals(-1, unsyncBufferedInputStream.markLimitIndex); // Negative marking unsyncBufferedInputStream.mark(-2); Assert.assertEquals(-1, unsyncBufferedInputStream.markLimitIndex); // Normal int markLimitIndex = 10; unsyncBufferedInputStream.mark(markLimitIndex); Assert.assertEquals( markLimitIndex, unsyncBufferedInputStream.markLimitIndex); Assert.assertEquals(_SIZE, unsyncBufferedInputStream.available()); Assert.assertEquals(0, unsyncBufferedInputStream.read()); Assert.assertEquals(1, unsyncBufferedInputStream.read()); Assert.assertEquals(2, unsyncBufferedInputStream.read()); Assert.assertEquals(3, unsyncBufferedInputStream.index); unsyncBufferedInputStream.reset(); Assert.assertEquals(_SIZE, unsyncBufferedInputStream.available()); Assert.assertEquals(0, unsyncBufferedInputStream.read()); Assert.assertEquals(1, unsyncBufferedInputStream.read()); Assert.assertEquals(2, unsyncBufferedInputStream.read()); Assert.assertEquals(3, unsyncBufferedInputStream.index); // Overrun int bufferSize = 20; unsyncBufferedInputStream = new UnsyncBufferedInputStream( new ByteArrayInputStream(_BUFFER), bufferSize); Assert.assertEquals(-1, unsyncBufferedInputStream.markLimitIndex); unsyncBufferedInputStream.mark(markLimitIndex); Assert.assertEquals( markLimitIndex, unsyncBufferedInputStream.markLimitIndex); for (int i = 0; i < bufferSize * 2; i++) { Assert.assertEquals(i, unsyncBufferedInputStream.read()); } Assert.assertEquals(bufferSize, unsyncBufferedInputStream.index); Assert.assertEquals( _SIZE - bufferSize * 2, unsyncBufferedInputStream.available()); Assert.assertEquals(-1, unsyncBufferedInputStream.markLimitIndex); try { unsyncBufferedInputStream.reset(); Assert.fail(); } catch (IOException ioe) { } // Shuffle unsyncBufferedInputStream = new UnsyncBufferedInputStream( new ByteArrayInputStream(_BUFFER)); Assert.assertEquals(0, unsyncBufferedInputStream.read()); Assert.assertEquals(1, unsyncBufferedInputStream.read()); Assert.assertEquals(2, unsyncBufferedInputStream.read()); Assert.assertEquals(3, unsyncBufferedInputStream.index); unsyncBufferedInputStream.mark(markLimitIndex); Assert.assertEquals(0, unsyncBufferedInputStream.index); Assert.assertEquals(3, unsyncBufferedInputStream.read()); Assert.assertEquals(4, unsyncBufferedInputStream.read()); Assert.assertEquals(5, unsyncBufferedInputStream.read()); // Reset buffer unsyncBufferedInputStream = new UnsyncBufferedInputStream( new ByteArrayInputStream(_BUFFER), _SIZE); byte[] tempBuffer = new byte[_SIZE / 2]; Assert.assertEquals( _SIZE / 2, unsyncBufferedInputStream.read(tempBuffer)); Assert.assertEquals( _SIZE / 2, unsyncBufferedInputStream.read(tempBuffer)); Assert.assertEquals(_SIZE, unsyncBufferedInputStream.index); Assert.assertEquals(_SIZE, unsyncBufferedInputStream.firstInvalidIndex); unsyncBufferedInputStream.mark(markLimitIndex); Assert.assertEquals(0, unsyncBufferedInputStream.index); Assert.assertEquals(0, unsyncBufferedInputStream.firstInvalidIndex); } @Test public void testMarkSupported() { int size = 10; UnsyncBufferedInputStream unsyncBufferedInputStream = new UnsyncBufferedInputStream( new ByteArrayInputStream(new byte[size])); Assert.assertTrue(unsyncBufferedInputStream.markSupported()); } @Test public void testRead() throws IOException { int size = 10; ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( _BUFFER); UnsyncBufferedInputStream unsyncBufferedInputStream = new UnsyncBufferedInputStream(byteArrayInputStream, size); Assert.assertEquals(_SIZE, byteArrayInputStream.available()); Assert.assertEquals(_SIZE, unsyncBufferedInputStream.available()); Assert.assertEquals(0, unsyncBufferedInputStream.read()); Assert.assertEquals(_SIZE - size, byteArrayInputStream.available()); Assert.assertEquals(_SIZE - 1, unsyncBufferedInputStream.available()); for (int i = 1; i < size + 1; i++) { Assert.assertEquals(i, unsyncBufferedInputStream.read()); } Assert.assertEquals(_SIZE - size * 2, byteArrayInputStream.available()); Assert.assertEquals( _SIZE - size - 1, unsyncBufferedInputStream.available()); for (int i = size + 1; i < _SIZE; i++) { Assert.assertEquals( (byte)i, (byte)unsyncBufferedInputStream.read()); } Assert.assertEquals(-1, unsyncBufferedInputStream.read()); } @Test public void testSkip() throws IOException { ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( _BUFFER); int size = 10; UnsyncBufferedInputStream unsyncBufferedInputStream = new UnsyncBufferedInputStream(byteArrayInputStream, size); // Zero skip Assert.assertEquals(0, unsyncBufferedInputStream.skip(0)); Assert.assertEquals(_SIZE, byteArrayInputStream.available()); Assert.assertEquals(_SIZE, unsyncBufferedInputStream.available()); // Negative skip Assert.assertEquals(0, unsyncBufferedInputStream.skip(-1)); Assert.assertEquals(_SIZE, byteArrayInputStream.available()); Assert.assertEquals(_SIZE, unsyncBufferedInputStream.available()); // Load data into buffer Assert.assertEquals(0, unsyncBufferedInputStream.read()); Assert.assertEquals(_SIZE - size, byteArrayInputStream.available()); Assert.assertEquals(_SIZE - 1, unsyncBufferedInputStream.available()); // In-memory Assert.assertEquals(size - 1, unsyncBufferedInputStream.skip(size * 2)); Assert.assertEquals(10, unsyncBufferedInputStream.read()); Assert.assertEquals(size - 1, unsyncBufferedInputStream.skip(size * 2)); // Underlying input stream Assert.assertEquals(size * 2, unsyncBufferedInputStream.skip(size * 2)); Assert.assertEquals(40, unsyncBufferedInputStream.read()); // Clear out buffer Assert.assertEquals(size - 1, unsyncBufferedInputStream.skip(size)); // Mark unsyncBufferedInputStream.mark(size * 2); // Load data into buffer for skipping Assert.assertEquals(size, unsyncBufferedInputStream.skip(size * 2)); // In-memory Assert.assertEquals(size / 2, unsyncBufferedInputStream.skip(size / 2)); unsyncBufferedInputStream.reset(); Assert.assertEquals(50, unsyncBufferedInputStream.read()); // Clear out buffer Assert.assertEquals( size * 2 - 1, unsyncBufferedInputStream.skip(size * 2)); // Mark a large size for EOF unsyncBufferedInputStream.mark(_SIZE); // Consume all the data while (unsyncBufferedInputStream.read() != -1); // Skip on EOF Assert.assertEquals(0, unsyncBufferedInputStream.skip(1)); } private static final byte[] _BUFFER = new byte[UnsyncBufferedInputStreamTest._SIZE]; private static final int _SIZE = 16 * 1024; static { for (int i = 0; i < _SIZE; i++) { _BUFFER[i] = (byte)i; } } }