package org.apache.lucene.util; import java.io.IOException; import org.junit.Test; import org.apache.lucene.util.LuceneTestCase; import org.apache.lucene.util.UnsafeByteArrayOutputStream; /* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ public class UnsafeByteArrayOutputStreamTest extends LuceneTestCase { @Test public void testSimpleWrite() throws IOException { int length = 100; byte[] buffer = new byte[length]; UnsafeByteArrayOutputStream ubaos = new UnsafeByteArrayOutputStream(buffer); for (int i = 0; i < 100; i++) { ubaos.write((byte) i); } byte[] result = ubaos.toByteArray(); assertEquals(length, ubaos.length()); for (int j = 0; j < length; ++j) { assertEquals(result[j], j); } } @Test public void testArrayWrite() throws IOException { int length = 100; byte[] buffer = new byte[length]; UnsafeByteArrayOutputStream ubaos = new UnsafeByteArrayOutputStream(buffer); for (int i = 0; i < 100; i++) { ubaos.write((byte) i); } int length2 = 10; byte[] buffer2 = new byte[length2]; for (int i = 0; i < length2; i++) { buffer2[i] = (byte) (8 + i); } ubaos.write(buffer2); byte[] result = ubaos.toByteArray(); assertEquals(length + length2, ubaos.length()); for (int j = 0; j < length; ++j) { assertEquals(result[j], j); } for (int j = 0; j < length2; ++j) { assertEquals(result[j + length], buffer2[j]); } } @Test public void testArrayWriteStartNotZero() throws IOException { int length = 100; byte[] buffer = new byte[length]; UnsafeByteArrayOutputStream ubaos = new UnsafeByteArrayOutputStream(buffer); for (int i = 0; i < 100; i++) { ubaos.write((byte) i); } int length2 = 1000; byte[] buffer2 = new byte[length2]; for (int i = 0; i < length2; i++) { buffer2[i] = (byte) (8 + i); } int length3 = 5; int start = 2; ubaos.write(buffer2, start, length3); byte[] result = ubaos.toByteArray(); assertEquals(length + length3, ubaos.length()); for (int j = 0; j < length; ++j) { assertEquals(result[j], j); } for (int j = 0; j < length3; ++j) { assertEquals(result[j + length], buffer2[j + start]); } } @Test public void testBufferGrow() throws IOException { int length = 100; byte[] buffer = new byte[length / 10]; UnsafeByteArrayOutputStream ubaos = new UnsafeByteArrayOutputStream(buffer); for (int i = 0; i < length; i++) { ubaos.write((byte) i); } byte[] result = ubaos.toByteArray(); assertEquals(length, ubaos.length()); for (int j = 0; j < length; ++j) { assertEquals(result[j], j); } buffer = ubaos.toByteArray(); int length2 = 10; byte[] buffer2 = new byte[length2]; for (int i = 0; i < length2; i++) { buffer2[i] = (byte) (8 + i); } ubaos.reInit(buffer2); for (int i = 0; i < length2; i++) { ubaos.write(7 + i); } byte[] result2 = ubaos.toByteArray(); assertEquals(length2, ubaos.length()); for (int j = 0; j < length2; ++j) { assertEquals(result2[j], j + 7); } for (int i = 0; i < length; i++) { assertEquals(buffer[i], i); } } @Test public void testStartPos() throws Exception { byte[] buf = new byte[10]; for (int i = 0; i < buf.length; i++) { buf[i] = (byte) i; } int startPos = 3; UnsafeByteArrayOutputStream ubaos = new UnsafeByteArrayOutputStream(buf, startPos); int numValues = 5; for (int i = 0; i < numValues; i++) { ubaos.write((i + 1) * 2); } // the length of the buffer should be whatever was written after startPos // and before that. assertEquals("invalid buffer length", startPos + numValues, ubaos.length()); assertEquals("invalid startPos", startPos, ubaos.getStartPos()); byte[] bytes = ubaos.toByteArray(); for (int i = 0; i < startPos; i++) { assertEquals(i, bytes[i]); } for (int i = startPos, j = 0; j < numValues; i++, j++) { assertEquals((j + 1) * 2, bytes[i]); } for (int i = startPos + numValues; i < buf.length; i++) { assertEquals(i, bytes[i]); } } @Test public void testDefaultCtor() throws Exception { UnsafeByteArrayOutputStream ubaos = new UnsafeByteArrayOutputStream(); int numValues = 5; for (int i = 0; i < numValues; i++) { ubaos.write(i); } assertEquals("invalid buffer length", numValues, ubaos.length()); byte[] bytes = ubaos.toByteArray(); for (int i = 0; i < numValues; i++) { assertEquals(i, bytes[i]); } } @Test(expected=IllegalArgumentException.class) public void testIllegalBufferSize() throws Exception { UnsafeByteArrayOutputStream ubaos = new UnsafeByteArrayOutputStream(); ubaos.reInit(new byte[0]); } }