| /* |
| * 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. |
| */ |
| package org.apache.commons.compress.utils; |
| |
| import org.junit.Test; |
| |
| import java.io.IOException; |
| import java.nio.ByteBuffer; |
| import java.nio.channels.ClosedChannelException; |
| import java.nio.charset.Charset; |
| import java.util.Arrays; |
| |
| import static org.apache.commons.compress.utils.CharsetNames.UTF_8; |
| import static org.junit.Assert.assertArrayEquals; |
| import static org.junit.Assert.assertEquals; |
| |
| public class SeekableInMemoryByteChannelTest { |
| |
| private final byte[] testData = "Some data".getBytes(Charset.forName(UTF_8)); |
| |
| @Test |
| public void shouldReadContentsProperly() throws IOException { |
| //given |
| SeekableInMemoryByteChannel c = new SeekableInMemoryByteChannel(testData); |
| ByteBuffer readBuffer = ByteBuffer.allocate(testData.length); |
| //when |
| int readCount = c.read(readBuffer); |
| //then |
| assertEquals(testData.length, readCount); |
| assertArrayEquals(testData, readBuffer.array()); |
| assertEquals(testData.length, c.position()); |
| c.close(); |
| } |
| |
| @Test |
| public void shouldReadContentsWhenBiggerBufferSupplied() throws IOException { |
| //given |
| SeekableInMemoryByteChannel c = new SeekableInMemoryByteChannel(testData); |
| ByteBuffer readBuffer = ByteBuffer.allocate(testData.length + 1); |
| //when |
| int readCount = c.read(readBuffer); |
| //then |
| assertEquals(testData.length, readCount); |
| assertArrayEquals(testData, Arrays.copyOf(readBuffer.array(), testData.length)); |
| assertEquals(testData.length, c.position()); |
| c.close(); |
| } |
| |
| @Test |
| public void shouldReadDataFromSetPosition() throws IOException { |
| //given |
| SeekableInMemoryByteChannel c = new SeekableInMemoryByteChannel(testData); |
| ByteBuffer readBuffer = ByteBuffer.allocate(4); |
| //when |
| c.position(5L); |
| int readCount = c.read(readBuffer); |
| //then |
| assertEquals(4L, readCount); |
| assertEquals("data", new String(readBuffer.array(), Charset.forName(UTF_8))); |
| assertEquals(testData.length, c.position()); |
| c.close(); |
| } |
| |
| @Test |
| public void shouldSignalEOFWhenPositionAtTheEnd() throws IOException { |
| //given |
| SeekableInMemoryByteChannel c = new SeekableInMemoryByteChannel(testData); |
| ByteBuffer readBuffer = ByteBuffer.allocate(testData.length); |
| //when |
| c.position(testData.length + 1); |
| int readCount = c.read(readBuffer); |
| //then |
| assertEquals(0L, readBuffer.position()); |
| assertEquals(-1, readCount); |
| c.close(); |
| } |
| |
| @Test(expected = ClosedChannelException.class) |
| public void shouldThrowExceptionOnReadingClosedChannel() throws IOException { |
| //given |
| SeekableInMemoryByteChannel c = new SeekableInMemoryByteChannel(); |
| //when |
| c.close(); |
| c.read(ByteBuffer.allocate(1)); |
| } |
| |
| @Test |
| public void shouldWriteDataProperly() throws IOException { |
| //given |
| SeekableInMemoryByteChannel c = new SeekableInMemoryByteChannel(); |
| ByteBuffer inData = ByteBuffer.wrap(testData); |
| //when |
| int writeCount = c.write(inData); |
| //then |
| assertEquals(testData.length, writeCount); |
| assertArrayEquals(testData, Arrays.copyOf(c.array(), (int) c.size())); |
| assertEquals(testData.length, c.position()); |
| c.close(); |
| } |
| |
| @Test |
| public void shouldWriteDataProperlyAfterPositionSet() throws IOException { |
| //given |
| SeekableInMemoryByteChannel c = new SeekableInMemoryByteChannel(testData); |
| ByteBuffer inData = ByteBuffer.wrap(testData); |
| ByteBuffer expectedData = ByteBuffer.allocate(testData.length + 5).put(testData, 0, 5).put(testData); |
| //when |
| c.position(5L); |
| int writeCount = c.write(inData); |
| |
| //then |
| assertEquals(testData.length, writeCount); |
| assertArrayEquals(expectedData.array(), Arrays.copyOf(c.array(), (int) c.size())); |
| assertEquals(testData.length + 5, c.position()); |
| c.close(); |
| } |
| |
| |
| @Test(expected = ClosedChannelException.class) |
| public void shouldThrowExceptionOnWritingToClosedChannel() throws IOException { |
| //given |
| SeekableInMemoryByteChannel c = new SeekableInMemoryByteChannel(); |
| //when |
| c.close(); |
| c.write(ByteBuffer.allocate(1)); |
| } |
| |
| @Test |
| public void shouldTruncateContentsProperly() throws IOException { |
| //given |
| SeekableInMemoryByteChannel c = new SeekableInMemoryByteChannel(testData); |
| //when |
| c.truncate(4); |
| //then |
| byte[] bytes = Arrays.copyOf(c.array(), (int) c.size()); |
| assertEquals("Some", new String(bytes, Charset.forName(UTF_8))); |
| c.close(); |
| } |
| |
| @Test |
| public void shouldSetProperPositionOnTruncate() throws IOException { |
| //given |
| SeekableInMemoryByteChannel c = new SeekableInMemoryByteChannel(testData); |
| //when |
| c.position(testData.length); |
| c.truncate(4L); |
| //then |
| assertEquals(4L, c.position()); |
| assertEquals(4L, c.size()); |
| c.close(); |
| } |
| |
| @Test |
| public void shouldSetProperPosition() throws IOException { |
| //given |
| SeekableInMemoryByteChannel c = new SeekableInMemoryByteChannel(testData); |
| //when |
| long posAtFour = c.position(4L).position(); |
| long posAtTheEnd = c.position(testData.length).position(); |
| long posPastTheEnd = c.position(testData.length + 1L).position(); |
| //then |
| assertEquals(4L, posAtFour); |
| assertEquals(c.size(), posAtTheEnd); |
| assertEquals(posPastTheEnd, posPastTheEnd); |
| c.close(); |
| } |
| |
| @Test(expected = IllegalArgumentException.class) |
| public void shouldThrowExceptionWhenSettingIncorrectPosition() throws IOException { |
| //given |
| SeekableInMemoryByteChannel c = new SeekableInMemoryByteChannel(); |
| //when |
| c.position(Integer.MAX_VALUE + 1L); |
| c.close(); |
| } |
| |
| @Test(expected = ClosedChannelException.class) |
| public void shouldThrowExceptionWhenSettingPositionOnClosedChannel() throws IOException { |
| //given |
| SeekableInMemoryByteChannel c = new SeekableInMemoryByteChannel(); |
| //when |
| c.close(); |
| c.position(1L); |
| } |
| |
| } |