blob: 32af30847fa37b36d36f71a00019a47392a734a3 [file] [log] [blame]
/*
* 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);
}
}