package com.beijunyi.parallelgit.filesystem.io;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.NonReadableChannelException;
import java.nio.channels.NonWritableChannelException;
import java.nio.channels.SeekableByteChannel;
import com.beijunyi.parallelgit.filesystem.AbstractGitFileSystemTest;
import org.junit.Before;
import org.junit.Test;
import static java.nio.file.StandardOpenOption.*;
import static java.util.Arrays.asList;
import static java.util.Collections.singleton;
import static org.eclipse.jgit.lib.Constants.encodeASCII;
import static org.junit.Assert.*;
public class GfsSeekableByteChannelTest extends AbstractGitFileSystemTest {
private static final byte[] FILE_DATA = encodeASCII("18 bytes test data");
private FileNode file;
@Before
public void setupChannel() throws IOException {
initRepository();
writeToCache("/file.txt", FILE_DATA);
commitToMaster();
initGitFileSystem();
file = GfsIO.findFile(gfs.getPath("/file.txt"));
}
@Test
public void testsIsOpenOnNewChannel_shouldReturnTrue() throws IOException {
try(SeekableByteChannel channel = new GfsSeekableByteChannel(file, singleton(READ))) {
assertTrue(channel.isOpen());
}
}
@Test
public void positionOfNewChannel_shouldReturnZero() throws IOException {
try(SeekableByteChannel channel = new GfsSeekableByteChannel(file, singleton(READ))) {
assertEquals(0, channel.position());
}
}
@Test
public void readFromChannelOpenedWithReadOption_shouldStreamTheFileData() throws IOException {
try(SeekableByteChannel channel = new GfsSeekableByteChannel(file, singleton(READ))) {
ByteBuffer buffer = ByteBuffer.allocate(FILE_DATA.length);
channel.read(buffer);
assertArrayEquals(FILE_DATA, buffer.array());
}
}
@Test(expected = NonReadableChannelException.class)
public void readFromChannelOpenedWithoutReadOption_shouldThrowNonReadableChannelException() throws IOException {
try(SeekableByteChannel channel = new GfsSeekableByteChannel(file, singleton(WRITE))) {
channel.read(ByteBuffer.allocate(FILE_DATA.length));
}
}
@Test
public void writeToChannelOpenedWithWriteOption_shouldWriteInputToFileFromBeginning() throws IOException {
try(GfsSeekableByteChannel channel = new GfsSeekableByteChannel(file, singleton(WRITE))) {
ByteBuffer buffer = ByteBuffer.wrap(encodeASCII("18 chars"));
channel.write(buffer);
assertArrayEquals(encodeASCII("18 chars test data"), channel.getBytes());
}
}
@Test(expected = NonWritableChannelException.class)
public void writeToChannelOpenedWithoutReadOption_shouldThrowNonWritableChannelException() throws IOException {
try(SeekableByteChannel channel = new GfsSeekableByteChannel(file, singleton(READ))) {
channel.write(ByteBuffer.wrap(someBytes()));
}
}
@Test
public void writeToChannelOpenedWithWriteAndAppendOption_inputShouldBeAppendedToTheEndOfTheFile() throws IOException {
try(GfsSeekableByteChannel channel = new GfsSeekableByteChannel(file, asList(WRITE, APPEND))) {
ByteBuffer buffer = ByteBuffer.wrap(encodeASCII(" (not anymore)"));
channel.write(buffer);
assertArrayEquals(encodeASCII("18 bytes test data (not anymore)"), channel.getBytes());
}
}
@Test
public void writeToChannelOpenedWithWriteAndTruncateExistingOption_fileDataShouldBeOverwrittenByTheInput() throws IOException {
try(GfsSeekableByteChannel channel = new GfsSeekableByteChannel(file, asList(WRITE, TRUNCATE_EXISTING))) {
byte[] expected = encodeASCII("new short data");
ByteBuffer buffer = ByteBuffer.wrap(expected);
channel.write(buffer);
assertArrayEquals(expected, channel.getBytes());
}
}
@Test
public void getBytesOfNewChannel_shouldReturnTheSameDataAsTheInput() throws IOException {
try(GfsSeekableByteChannel channel = new GfsSeekableByteChannel(file, singleton(READ))) {
assertArrayEquals(FILE_DATA, channel.getBytes());
}
}
@Test
public void getSizeOfNewChannel_shouldReturnTheLengthOfTheInputByteArray() throws IOException {
try(SeekableByteChannel channel = new GfsSeekableByteChannel(file, singleton(READ))) {
assertEquals(FILE_DATA.length, channel.size());
}
}
}