package usecases; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.*; import java.nio.file.Files; import java.nio.file.StandardOpenOption; import com.beijunyi.parallelgit.filesystem.AbstractGitFileSystemTest; import com.beijunyi.parallelgit.filesystem.GitPath; import org.junit.Before; import org.junit.Test; import static org.eclipse.jgit.lib.Constants.encodeASCII; import static org.junit.Assert.*; public class FilesNewByteChannelTest extends AbstractGitFileSystemTest { private static final byte[] ORIGINAL_TEXT_BYTES = someBytes(); private GitPath file; @Before public void setupFileSystem() throws IOException { initRepository(); writeToCache("/file.txt", ORIGINAL_TEXT_BYTES); commitToMaster(); initGitFileSystem(); file = gfs.getPath("/file.txt"); } @Test public void gitByteChannelReadTest() throws IOException { try(SeekableByteChannel channel = Files.newByteChannel(file, StandardOpenOption.READ)) { ByteBuffer buf = ByteBuffer.allocate(ORIGINAL_TEXT_BYTES.length); assertEquals(ORIGINAL_TEXT_BYTES.length, channel.read(buf)); assertArrayEquals(ORIGINAL_TEXT_BYTES, buf.array()); } } @Test public void gitByteChannelReadWithSmallBufferTest() throws IOException { try(SeekableByteChannel channel = Files.newByteChannel(file, StandardOpenOption.READ)) { int size = ORIGINAL_TEXT_BYTES.length / 2; ByteBuffer buf = ByteBuffer.allocate(size); assertEquals(size, channel.read(buf)); byte[] subArrayOfOriginal = new byte[size]; System.arraycopy(ORIGINAL_TEXT_BYTES, 0, subArrayOfOriginal, 0, size); assertArrayEquals(subArrayOfOriginal, buf.array()); } } @Test public void gitByteChannelReadWithBigBufferTest() throws IOException { try(SeekableByteChannel channel = Files.newByteChannel(file, StandardOpenOption.READ)) { int size = ORIGINAL_TEXT_BYTES.length * 2; ByteBuffer buf = ByteBuffer.allocate(size); assertEquals(ORIGINAL_TEXT_BYTES.length, channel.read(buf)); byte[] subArrayOfResult = new byte[ORIGINAL_TEXT_BYTES.length]; System.arraycopy(buf.array(), 0, subArrayOfResult, 0, ORIGINAL_TEXT_BYTES.length); assertArrayEquals(ORIGINAL_TEXT_BYTES, subArrayOfResult); } } @Test public void gitByteChannelPartialOverwriteFromMiddleTest() throws IOException { int overwritePos = 5; byte[] data = encodeASCII("other"); try(SeekableByteChannel channel = Files.newByteChannel(file, StandardOpenOption.WRITE)) { ByteBuffer buf = ByteBuffer.wrap(data); channel.position(overwritePos); assertEquals(data.length, channel.write(buf)); } byte[] expect = new byte[ORIGINAL_TEXT_BYTES.length]; System.arraycopy(ORIGINAL_TEXT_BYTES, 0, expect, 0, ORIGINAL_TEXT_BYTES.length); System.arraycopy(data, 0, expect, overwritePos, data.length); assertArrayEquals(expect, Files.readAllBytes(file)); } @Test public void gitByteChannelPartialOverwriteFromBeginningTest() throws IOException { byte[] data = encodeASCII("test"); try(SeekableByteChannel channel = Files.newByteChannel(file, StandardOpenOption.WRITE)) { ByteBuffer buf = ByteBuffer.wrap(data); assertEquals(data.length, channel.write(buf)); } byte[] expect = new byte[ORIGINAL_TEXT_BYTES.length]; System.arraycopy(data, 0, expect, 0, data.length); System.arraycopy(ORIGINAL_TEXT_BYTES, data.length, expect, data.length, ORIGINAL_TEXT_BYTES.length - data.length); byte[] actual = Files.readAllBytes(file); assertArrayEquals(expect, actual); } @Test public void gitByteChannelCompleteOverwriteTest() throws IOException { byte[] data = encodeASCII("this is a big data array that will completely overwrite"); try(SeekableByteChannel channel = Files.newByteChannel(file, StandardOpenOption.WRITE)) { ByteBuffer buf = ByteBuffer.wrap(data); assertEquals(data.length, channel.write(buf)); } assertArrayEquals(data, Files.readAllBytes(file)); } @Test public void gitByteChannelTruncateAfterCurrentPositionTest() throws IOException { int pos = 4; int truncatePos = 10; byte[] expect = new byte[truncatePos]; try(SeekableByteChannel channel = Files.newByteChannel(file, StandardOpenOption.WRITE)) { channel.position(pos); channel.truncate(truncatePos); assertEquals(truncatePos, channel.size()); assertEquals(pos, channel.position()); System.arraycopy(ORIGINAL_TEXT_BYTES, 0, expect, 0, truncatePos); } assertArrayEquals(expect, Files.readAllBytes(file)); } @Test public void gitByteChannelTruncateBeforeCurrentPositionTest() throws IOException { int pos = 10; int truncatePos = 4; byte[] expect = new byte[truncatePos]; try(SeekableByteChannel channel = Files.newByteChannel(file, StandardOpenOption.WRITE)) { channel.position(pos); channel.truncate(truncatePos); assertEquals(truncatePos, channel.size()); assertEquals(truncatePos, channel.position()); System.arraycopy(ORIGINAL_TEXT_BYTES, 0, expect, 0, truncatePos); } assertArrayEquals(expect, Files.readAllBytes(file)); } @Test(expected = NonReadableChannelException.class) public void nonReadableGitByteChannelTest() throws IOException { try(SeekableByteChannel channel = Files.newByteChannel(file, StandardOpenOption.WRITE)) { channel.read(ByteBuffer.allocate(32)); } } @Test(expected = NonWritableChannelException.class) public void nonWritableGitByteChannelTest() throws IOException { try(SeekableByteChannel channel = Files.newByteChannel(file, StandardOpenOption.READ)) { channel.write(ByteBuffer.wrap(someBytes())); } } @Test(expected = ClosedChannelException.class) public void closedGitByteChannelTest() throws IOException { try(SeekableByteChannel channel = Files.newByteChannel(file, StandardOpenOption.READ)) { channel.close(); channel.read(ByteBuffer.allocate(32)); } } }