blob: 4b871b435ffc153fcf38f4f2f946108ea55bfbe4 [file] [log] [blame]
/*
* Copyright 2013 Google Inc.
*
* Licensed 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 com.google.common.jimfs;
import static com.google.common.jimfs.TestUtils.buffer;
import static com.google.common.jimfs.TestUtils.buffers;
import static com.google.common.jimfs.TestUtils.bytes;
import static com.google.common.primitives.Bytes.concat;
import static org.junit.Assert.assertArrayEquals;
import com.google.common.base.Predicate;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import java.io.IOException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.nio.ByteBuffer;
import java.util.Arrays;
import java.util.EnumSet;
import java.util.List;
import java.util.Random;
import java.util.Set;
/**
* Tests for {@link RegularFile} and by extension for {@link HeapDisk}. These tests test files
* created by a heap disk in a number of different states.
*
* @author Colin Decker
*/
public class RegularFileTest {
/**
* Returns a test suite for testing file methods with a variety of {@code HeapDisk}
* configurations.
*/
public static TestSuite suite() {
TestSuite suite = new TestSuite();
for (ReuseStrategy reuseStrategy : EnumSet.allOf(ReuseStrategy.class)) {
TestSuite suiteForReuseStrategy = new TestSuite(reuseStrategy.toString());
Set<List<Integer>> sizeOptions =
Sets.cartesianProduct(ImmutableList.of(BLOCK_SIZES, CACHE_SIZES));
for (List<Integer> options : sizeOptions) {
int blockSize = options.get(0);
int cacheSize = options.get(1);
if (cacheSize > 0 && cacheSize < blockSize) {
// skip cases where the cache size is not -1 (all) or 0 (none) but it is < blockSize,
// because this is equivalent to a cache size of 0
continue;
}
TestConfiguration state = new TestConfiguration(blockSize, cacheSize, reuseStrategy);
TestSuite suiteForTest = new TestSuite(state.toString());
for (Method method : TEST_METHODS) {
RegularFileTestRunner tester = new RegularFileTestRunner(method.getName(), state);
suiteForTest.addTest(tester);
}
suiteForReuseStrategy.addTest(suiteForTest);
}
suite.addTest(suiteForReuseStrategy);
}
return suite;
}
public static final ImmutableSet<Integer> BLOCK_SIZES = ImmutableSet.of(2, 8, 128, 8192);
public static final ImmutableSet<Integer> CACHE_SIZES = ImmutableSet.of(0, 4, 16, 128, -1);
private static final ImmutableList<Method> TEST_METHODS =
FluentIterable.from(Arrays.asList(RegularFileTestRunner.class.getDeclaredMethods()))
.filter(
new Predicate<Method>() {
@Override
public boolean apply(Method method) {
return method.getName().startsWith("test")
&& Modifier.isPublic(method.getModifiers())
&& method.getParameterTypes().length == 0;
}
})
.toList();
/**
* Different strategies for handling reuse of disks and/or files between tests, intended to
* ensure that {@link HeapDisk} operates properly in a variety of usage states including newly
* created, having created files that have not been deleted yet, having created files that have
* been deleted, and having created files some of which have been deleted and some of which have
* not.
*/
public enum ReuseStrategy {
/**
* Creates a new disk for each test.
*/
NEW_DISK,
/**
* Retains files after each test, forcing new blocks to be allocated.
*/
KEEP_FILES,
/**
* Deletes files after each test, allowing caching to be used if enabled.
*/
DELETE_FILES,
/**
* Randomly keeps or deletes a file after each test.
*/
KEEP_OR_DELETE_FILES
}
/**
* Configuration for a set of test cases.
*/
public static final class TestConfiguration {
private final int blockSize;
private final int cacheSize;
private final ReuseStrategy reuseStrategy;
private HeapDisk disk;
public TestConfiguration(int blockSize, int cacheSize, ReuseStrategy reuseStrategy) {
this.blockSize = blockSize;
this.cacheSize = cacheSize;
this.reuseStrategy = reuseStrategy;
if (reuseStrategy != ReuseStrategy.NEW_DISK) {
this.disk = createDisk();
}
}
private HeapDisk createDisk() {
int maxCachedBlockCount = cacheSize == -1 ? Integer.MAX_VALUE : (cacheSize / blockSize);
return new HeapDisk(blockSize, Integer.MAX_VALUE, maxCachedBlockCount);
}
public RegularFile createRegularFile() {
if (reuseStrategy == ReuseStrategy.NEW_DISK) {
disk = createDisk();
}
return RegularFile.create(0, disk);
}
public void tearDown(RegularFile file) {
switch (reuseStrategy) {
case DELETE_FILES:
file.deleted();
break;
case KEEP_OR_DELETE_FILES:
if (new Random().nextBoolean()) {
file.deleted();
}
break;
case KEEP_FILES:
break;
default:
break;
}
}
@Override
public String toString() {
return reuseStrategy + " [" + blockSize + ", " + cacheSize + "]";
}
}
/**
* Actual test cases for testing RegularFiles.
*/
public static class RegularFileTestRunner extends TestCase {
private final TestConfiguration configuration;
protected RegularFile file;
public RegularFileTestRunner(String methodName, TestConfiguration configuration) {
super(methodName);
this.configuration = configuration;
}
@Override
public String getName() {
return super.getName() + " [" + configuration + "]";
}
@Override
public void setUp() {
file = configuration.createRegularFile();
}
@Override
public void tearDown() {
configuration.tearDown(file);
}
private void fillContent(String fill) throws IOException {
file.write(0, buffer(fill));
}
public void testEmpty() {
assertEquals(0, file.size());
assertContentEquals("", file);
}
public void testEmpty_read_singleByte() {
assertEquals(-1, file.read(0));
assertEquals(-1, file.read(1));
}
public void testEmpty_read_byteArray() {
byte[] array = new byte[10];
assertEquals(-1, file.read(0, array, 0, array.length));
assertArrayEquals(bytes("0000000000"), array);
}
public void testEmpty_read_singleBuffer() {
ByteBuffer buffer = ByteBuffer.allocate(10);
int read = file.read(0, buffer);
assertEquals(-1, read);
assertEquals(0, buffer.position());
}
public void testEmpty_read_multipleBuffers() {
ByteBuffer buf1 = ByteBuffer.allocate(5);
ByteBuffer buf2 = ByteBuffer.allocate(5);
long read = file.read(0, ImmutableList.of(buf1, buf2));
assertEquals(-1, read);
assertEquals(0, buf1.position());
assertEquals(0, buf2.position());
}
public void testEmpty_write_singleByte_atStart() throws IOException {
file.write(0, (byte) 1);
assertContentEquals("1", file);
}
public void testEmpty_write_byteArray_atStart() throws IOException {
byte[] bytes = bytes("111111");
file.write(0, bytes, 0, bytes.length);
assertContentEquals(bytes, file);
}
public void testEmpty_write_partialByteArray_atStart() throws IOException {
byte[] bytes = bytes("2211111122");
file.write(0, bytes, 2, 6);
assertContentEquals("111111", file);
}
public void testEmpty_write_singleBuffer_atStart() throws IOException {
file.write(0, buffer("111111"));
assertContentEquals("111111", file);
}
public void testEmpty_write_multipleBuffers_atStart() throws IOException {
file.write(0, buffers("111", "111"));
assertContentEquals("111111", file);
}
public void testEmpty_write_singleByte_atNonZeroPosition() throws IOException {
file.write(5, (byte) 1);
assertContentEquals("000001", file);
}
public void testEmpty_write_byteArray_atNonZeroPosition() throws IOException {
byte[] bytes = bytes("111111");
file.write(5, bytes, 0, bytes.length);
assertContentEquals("00000111111", file);
}
public void testEmpty_write_partialByteArray_atNonZeroPosition() throws IOException {
byte[] bytes = bytes("2211111122");
file.write(5, bytes, 2, 6);
assertContentEquals("00000111111", file);
}
public void testEmpty_write_singleBuffer_atNonZeroPosition() throws IOException {
file.write(5, buffer("111"));
assertContentEquals("00000111", file);
}
public void testEmpty_write_multipleBuffers_atNonZeroPosition() throws IOException {
file.write(5, buffers("111", "222"));
assertContentEquals("00000111222", file);
}
public void testEmpty_write_noBytesArray_atStart() throws IOException {
file.write(0, bytes(), 0, 0);
assertContentEquals(bytes(), file);
}
public void testEmpty_write_noBytesArray_atNonZeroPosition() throws IOException {
file.write(5, bytes(), 0, 0);
assertContentEquals(bytes("00000"), file);
}
public void testEmpty_write_noBytesBuffer_atStart() throws IOException {
file.write(0, buffer(""));
assertContentEquals(bytes(), file);
}
public void testEmpty_write_noBytesBuffer_atNonZeroPosition() throws IOException {
ByteBuffer buffer = ByteBuffer.allocate(0);
file.write(5, buffer);
assertContentEquals(bytes("00000"), file);
}
public void testEmpty_write_noBytesBuffers_atStart() throws IOException {
file.write(0, ImmutableList.of(buffer(""), buffer(""), buffer("")));
assertContentEquals(bytes(), file);
}
public void testEmpty_write_noBytesBuffers_atNonZeroPosition() throws IOException {
file.write(5, ImmutableList.of(buffer(""), buffer(""), buffer("")));
assertContentEquals(bytes("00000"), file);
}
public void testEmpty_transferFrom_fromStart_countEqualsSrcSize() throws IOException {
long transferred = file.transferFrom(new ByteBufferChannel(buffer("111111")), 0, 6);
assertEquals(6, transferred);
assertContentEquals("111111", file);
}
public void testEmpty_transferFrom_fromStart_countLessThanSrcSize() throws IOException {
long transferred = file.transferFrom(new ByteBufferChannel(buffer("111111")), 0, 3);
assertEquals(3, transferred);
assertContentEquals("111", file);
}
public void testEmpty_transferFrom_fromStart_countGreaterThanSrcSize() throws IOException {
long transferred = file.transferFrom(new ByteBufferChannel(buffer("111111")), 0, 12);
assertEquals(6, transferred);
assertContentEquals("111111", file);
}
public void testEmpty_transferFrom_fromBeyondStart_countEqualsSrcSize() throws IOException {
long transferred = file.transferFrom(new ByteBufferChannel(buffer("111111")), 4, 6);
assertEquals(6, transferred);
assertContentEquals("0000111111", file);
}
public void testEmpty_transferFrom_fromBeyondStart_countLessThanSrcSize() throws IOException {
long transferred = file.transferFrom(new ByteBufferChannel(buffer("111111")), 4, 3);
assertEquals(3, transferred);
assertContentEquals("0000111", file);
}
public void testEmpty_transferFrom_fromBeyondStart_countGreaterThanSrcSize()
throws IOException {
long transferred = file.transferFrom(new ByteBufferChannel(buffer("111111")), 4, 12);
assertEquals(6, transferred);
assertContentEquals("0000111111", file);
}
public void testEmpty_transferFrom_fromStart_noBytes_countEqualsSrcSize() throws IOException {
long transferred = file.transferFrom(new ByteBufferChannel(buffer("")), 0, 0);
assertEquals(0, transferred);
assertContentEquals(bytes(), file);
}
public void testEmpty_transferFrom_fromStart_noBytes_countGreaterThanSrcSize()
throws IOException {
long transferred = file.transferFrom(new ByteBufferChannel(buffer("")), 0, 10);
assertEquals(0, transferred);
assertContentEquals(bytes(), file);
}
public void testEmpty_transferFrom_fromBeyondStart_noBytes_countEqualsSrcSize()
throws IOException {
long transferred = file.transferFrom(new ByteBufferChannel(buffer("")), 5, 0);
assertEquals(0, transferred);
assertContentEquals(bytes("00000"), file);
}
public void testEmpty_transferFrom_fromBeyondStart_noBytes_countGreaterThanSrcSize()
throws IOException {
long transferred = file.transferFrom(new ByteBufferChannel(buffer("")), 5, 10);
assertEquals(0, transferred);
assertContentEquals(bytes("00000"), file);
}
public void testEmpty_transferTo() throws IOException {
ByteBufferChannel channel = new ByteBufferChannel(100);
assertEquals(0, file.transferTo(0, 100, channel));
}
public void testEmpty_copy() throws IOException {
RegularFile copy = file.copyWithoutContent(1);
assertContentEquals("", copy);
}
public void testEmpty_truncate_toZero() throws IOException {
file.truncate(0);
assertContentEquals("", file);
}
public void testEmpty_truncate_sizeUp() throws IOException {
file.truncate(10);
assertContentEquals("", file);
}
public void testNonEmpty() throws IOException {
fillContent("222222");
assertContentEquals("222222", file);
}
public void testNonEmpty_read_singleByte() throws IOException {
fillContent("123456");
assertEquals(1, file.read(0));
assertEquals(2, file.read(1));
assertEquals(6, file.read(5));
assertEquals(-1, file.read(6));
assertEquals(-1, file.read(100));
}
public void testNonEmpty_read_all_byteArray() throws IOException {
fillContent("222222");
byte[] array = new byte[6];
assertEquals(6, file.read(0, array, 0, array.length));
assertArrayEquals(bytes("222222"), array);
}
public void testNonEmpty_read_all_singleBuffer() throws IOException {
fillContent("222222");
ByteBuffer buffer = ByteBuffer.allocate(6);
assertEquals(6, file.read(0, buffer));
assertBufferEquals("222222", 0, buffer);
}
public void testNonEmpty_read_all_multipleBuffers() throws IOException {
fillContent("223334");
ByteBuffer buf1 = ByteBuffer.allocate(3);
ByteBuffer buf2 = ByteBuffer.allocate(3);
assertEquals(6, file.read(0, ImmutableList.of(buf1, buf2)));
assertBufferEquals("223", 0, buf1);
assertBufferEquals("334", 0, buf2);
}
public void testNonEmpty_read_all_byteArray_largerThanContent() throws IOException {
fillContent("222222");
byte[] array = new byte[10];
assertEquals(6, file.read(0, array, 0, array.length));
assertArrayEquals(bytes("2222220000"), array);
array = new byte[10];
assertEquals(6, file.read(0, array, 2, 6));
assertArrayEquals(bytes("0022222200"), array);
}
public void testNonEmpty_read_all_singleBuffer_largerThanContent() throws IOException {
fillContent("222222");
ByteBuffer buffer = ByteBuffer.allocate(16);
assertBufferEquals("0000000000000000", 16, buffer);
assertEquals(6, file.read(0, buffer));
assertBufferEquals("2222220000000000", 10, buffer);
}
public void testNonEmpty_read_all_multipleBuffers_largerThanContent() throws IOException {
fillContent("222222");
ByteBuffer buf1 = ByteBuffer.allocate(4);
ByteBuffer buf2 = ByteBuffer.allocate(8);
assertEquals(6, file.read(0, ImmutableList.of(buf1, buf2)));
assertBufferEquals("2222", 0, buf1);
assertBufferEquals("22000000", 6, buf2);
}
public void testNonEmpty_read_all_multipleBuffers_extraBuffers() throws IOException {
fillContent("222222");
ByteBuffer buf1 = ByteBuffer.allocate(4);
ByteBuffer buf2 = ByteBuffer.allocate(8);
ByteBuffer buf3 = ByteBuffer.allocate(4);
assertEquals(6, file.read(0, ImmutableList.of(buf1, buf2, buf3)));
assertBufferEquals("2222", 0, buf1);
assertBufferEquals("22000000", 6, buf2);
assertBufferEquals("0000", 4, buf3);
}
public void testNonEmpty_read_partial_fromStart_byteArray() throws IOException {
fillContent("222222");
byte[] array = new byte[3];
assertEquals(3, file.read(0, array, 0, array.length));
assertArrayEquals(bytes("222"), array);
array = new byte[10];
assertEquals(3, file.read(0, array, 1, 3));
assertArrayEquals(bytes("0222000000"), array);
}
public void testNonEmpty_read_partial_fromMiddle_byteArray() throws IOException {
fillContent("22223333");
byte[] array = new byte[3];
assertEquals(3, file.read(3, array, 0, array.length));
assertArrayEquals(bytes("233"), array);
array = new byte[10];
assertEquals(3, file.read(3, array, 1, 3));
assertArrayEquals(bytes("0233000000"), array);
}
public void testNonEmpty_read_partial_fromEnd_byteArray() throws IOException {
fillContent("2222222222");
byte[] array = new byte[3];
assertEquals(2, file.read(8, array, 0, array.length));
assertArrayEquals(bytes("220"), array);
array = new byte[10];
assertEquals(2, file.read(8, array, 1, 3));
assertArrayEquals(bytes("0220000000"), array);
}
public void testNonEmpty_read_partial_fromStart_singleBuffer() throws IOException {
fillContent("222222");
ByteBuffer buffer = ByteBuffer.allocate(3);
assertEquals(3, file.read(0, buffer));
assertBufferEquals("222", 0, buffer);
}
public void testNonEmpty_read_partial_fromMiddle_singleBuffer() throws IOException {
fillContent("22223333");
ByteBuffer buffer = ByteBuffer.allocate(3);
assertEquals(3, file.read(3, buffer));
assertBufferEquals("233", 0, buffer);
}
public void testNonEmpty_read_partial_fromEnd_singleBuffer() throws IOException {
fillContent("2222222222");
ByteBuffer buffer = ByteBuffer.allocate(3);
assertEquals(2, file.read(8, buffer));
assertBufferEquals("220", 1, buffer);
}
public void testNonEmpty_read_partial_fromStart_multipleBuffers() throws IOException {
fillContent("12345678");
ByteBuffer buf1 = ByteBuffer.allocate(2);
ByteBuffer buf2 = ByteBuffer.allocate(2);
assertEquals(4, file.read(0, ImmutableList.of(buf1, buf2)));
assertBufferEquals("12", 0, buf1);
assertBufferEquals("34", 0, buf2);
}
public void testNonEmpty_read_partial_fromMiddle_multipleBuffers() throws IOException {
fillContent("12345678");
ByteBuffer buf1 = ByteBuffer.allocate(2);
ByteBuffer buf2 = ByteBuffer.allocate(2);
assertEquals(4, file.read(3, ImmutableList.of(buf1, buf2)));
assertBufferEquals("45", 0, buf1);
assertBufferEquals("67", 0, buf2);
}
public void testNonEmpty_read_partial_fromEnd_multipleBuffers() throws IOException {
fillContent("123456789");
ByteBuffer buf1 = ByteBuffer.allocate(2);
ByteBuffer buf2 = ByteBuffer.allocate(2);
assertEquals(3, file.read(6, ImmutableList.of(buf1, buf2)));
assertBufferEquals("78", 0, buf1);
assertBufferEquals("90", 1, buf2);
}
public void testNonEmpty_read_fromPastEnd_byteArray() throws IOException {
fillContent("123");
byte[] array = new byte[3];
assertEquals(-1, file.read(3, array, 0, array.length));
assertArrayEquals(bytes("000"), array);
assertEquals(-1, file.read(3, array, 0, 2));
assertArrayEquals(bytes("000"), array);
}
public void testNonEmpty_read_fromPastEnd_singleBuffer() throws IOException {
fillContent("123");
ByteBuffer buffer = ByteBuffer.allocate(3);
file.read(3, buffer);
assertBufferEquals("000", 3, buffer);
}
public void testNonEmpty_read_fromPastEnd_multipleBuffers() throws IOException {
fillContent("123");
ByteBuffer buf1 = ByteBuffer.allocate(2);
ByteBuffer buf2 = ByteBuffer.allocate(2);
assertEquals(-1, file.read(6, ImmutableList.of(buf1, buf2)));
assertBufferEquals("00", 2, buf1);
assertBufferEquals("00", 2, buf2);
}
public void testNonEmpty_write_partial_fromStart_singleByte() throws IOException {
fillContent("222222");
assertEquals(1, file.write(0, (byte) 1));
assertContentEquals("122222", file);
}
public void testNonEmpty_write_partial_fromMiddle_singleByte() throws IOException {
fillContent("222222");
assertEquals(1, file.write(3, (byte) 1));
assertContentEquals("222122", file);
}
public void testNonEmpty_write_partial_fromEnd_singleByte() throws IOException {
fillContent("222222");
assertEquals(1, file.write(6, (byte) 1));
assertContentEquals("2222221", file);
}
public void testNonEmpty_write_partial_fromStart_byteArray() throws IOException {
fillContent("222222");
assertEquals(3, file.write(0, bytes("111"), 0, 3));
assertContentEquals("111222", file);
assertEquals(2, file.write(0, bytes("333333"), 0, 2));
assertContentEquals("331222", file);
}
public void testNonEmpty_write_partial_fromMiddle_byteArray() throws IOException {
fillContent("22222222");
assertEquals(3, file.write(3, buffer("111")));
assertContentEquals("22211122", file);
assertEquals(2, file.write(5, bytes("333333"), 1, 2));
assertContentEquals("22211332", file);
}
public void testNonEmpty_write_partial_fromBeforeEnd_byteArray() throws IOException {
fillContent("22222222");
assertEquals(3, file.write(6, bytes("111"), 0, 3));
assertContentEquals("222222111", file);
assertEquals(2, file.write(8, bytes("333333"), 2, 2));
assertContentEquals("2222221133", file);
}
public void testNonEmpty_write_partial_fromEnd_byteArray() throws IOException {
fillContent("222222");
assertEquals(3, file.write(6, bytes("111"), 0, 3));
assertContentEquals("222222111", file);
assertEquals(2, file.write(9, bytes("333333"), 3, 2));
assertContentEquals("22222211133", file);
}
public void testNonEmpty_write_partial_fromPastEnd_byteArray() throws IOException {
fillContent("222222");
assertEquals(3, file.write(8, bytes("111"), 0, 3));
assertContentEquals("22222200111", file);
assertEquals(2, file.write(13, bytes("333333"), 4, 2));
assertContentEquals("222222001110033", file);
}
public void testNonEmpty_write_partial_fromStart_singleBuffer() throws IOException {
fillContent("222222");
assertEquals(3, file.write(0, buffer("111")));
assertContentEquals("111222", file);
}
public void testNonEmpty_write_partial_fromMiddle_singleBuffer() throws IOException {
fillContent("22222222");
assertEquals(3, file.write(3, buffer("111")));
assertContentEquals("22211122", file);
}
public void testNonEmpty_write_partial_fromBeforeEnd_singleBuffer() throws IOException {
fillContent("22222222");
assertEquals(3, file.write(6, buffer("111")));
assertContentEquals("222222111", file);
}
public void testNonEmpty_write_partial_fromEnd_singleBuffer() throws IOException {
fillContent("222222");
assertEquals(3, file.write(6, buffer("111")));
assertContentEquals("222222111", file);
}
public void testNonEmpty_write_partial_fromPastEnd_singleBuffer() throws IOException {
fillContent("222222");
assertEquals(3, file.write(8, buffer("111")));
assertContentEquals("22222200111", file);
}
public void testNonEmpty_write_partial_fromStart_multipleBuffers() throws IOException {
fillContent("222222");
assertEquals(4, file.write(0, buffers("11", "33")));
assertContentEquals("113322", file);
}
public void testNonEmpty_write_partial_fromMiddle_multipleBuffers() throws IOException {
fillContent("22222222");
assertEquals(4, file.write(2, buffers("11", "33")));
assertContentEquals("22113322", file);
}
public void testNonEmpty_write_partial_fromBeforeEnd_multipleBuffers() throws IOException {
fillContent("22222222");
assertEquals(6, file.write(6, buffers("111", "333")));
assertContentEquals("222222111333", file);
}
public void testNonEmpty_write_partial_fromEnd_multipleBuffers() throws IOException {
fillContent("222222");
assertEquals(6, file.write(6, buffers("111", "333")));
assertContentEquals("222222111333", file);
}
public void testNonEmpty_write_partial_fromPastEnd_multipleBuffers() throws IOException {
fillContent("222222");
assertEquals(4, file.write(10, buffers("11", "33")));
assertContentEquals("22222200001133", file);
}
public void testNonEmpty_write_overwrite_sameLength() throws IOException {
fillContent("2222");
assertEquals(4, file.write(0, buffer("1234")));
assertContentEquals("1234", file);
}
public void testNonEmpty_write_overwrite_greaterLength() throws IOException {
fillContent("2222");
assertEquals(8, file.write(0, buffer("12345678")));
assertContentEquals("12345678", file);
}
public void testNonEmpty_transferTo_fromStart_countEqualsSize() throws IOException {
fillContent("123456");
ByteBufferChannel channel = new ByteBufferChannel(10);
assertEquals(6, file.transferTo(0, 6, channel));
assertBufferEquals("1234560000", 4, channel.buffer());
}
public void testNonEmpty_transferTo_fromStart_countLessThanSize() throws IOException {
fillContent("123456");
ByteBufferChannel channel = new ByteBufferChannel(10);
assertEquals(4, file.transferTo(0, 4, channel));
assertBufferEquals("1234000000", 6, channel.buffer());
}
public void testNonEmpty_transferTo_fromMiddle_countEqualsSize() throws IOException {
fillContent("123456");
ByteBufferChannel channel = new ByteBufferChannel(10);
assertEquals(2, file.transferTo(4, 6, channel));
assertBufferEquals("5600000000", 8, channel.buffer());
}
public void testNonEmpty_transferTo_fromMiddle_countLessThanSize() throws IOException {
fillContent("12345678");
ByteBufferChannel channel = new ByteBufferChannel(10);
assertEquals(4, file.transferTo(3, 4, channel));
assertBufferEquals("4567000000", 6, channel.buffer());
}
public void testNonEmpty_transferFrom_toStart_countEqualsSrcSize() throws IOException {
fillContent("22222222");
ByteBufferChannel channel = new ByteBufferChannel(buffer("11111"));
assertEquals(5, file.transferFrom(channel, 0, 5));
assertContentEquals("11111222", file);
}
public void testNonEmpty_transferFrom_toStart_countLessThanSrcSize() throws IOException {
fillContent("22222222");
ByteBufferChannel channel = new ByteBufferChannel(buffer("11111"));
assertEquals(3, file.transferFrom(channel, 0, 3));
assertContentEquals("11122222", file);
}
public void testNonEmpty_transferFrom_toStart_countGreaterThanSrcSize() throws IOException {
fillContent("22222222");
ByteBufferChannel channel = new ByteBufferChannel(buffer("11111"));
assertEquals(5, file.transferFrom(channel, 0, 10));
assertContentEquals("11111222", file);
}
public void testNonEmpty_transferFrom_toMiddle_countEqualsSrcSize() throws IOException {
fillContent("22222222");
ByteBufferChannel channel = new ByteBufferChannel(buffer("1111"));
assertEquals(4, file.transferFrom(channel, 2, 4));
assertContentEquals("22111122", file);
}
public void testNonEmpty_transferFrom_toMiddle_countLessThanSrcSize() throws IOException {
fillContent("22222222");
ByteBufferChannel channel = new ByteBufferChannel(buffer("11111"));
assertEquals(3, file.transferFrom(channel, 2, 3));
assertContentEquals("22111222", file);
}
public void testNonEmpty_transferFrom_toMiddle_countGreaterThanSrcSize() throws IOException {
fillContent("22222222");
ByteBufferChannel channel = new ByteBufferChannel(buffer("1111"));
assertEquals(4, file.transferFrom(channel, 2, 100));
assertContentEquals("22111122", file);
}
public void testNonEmpty_transferFrom_toMiddle_transferGoesBeyondContentSize()
throws IOException {
fillContent("222222");
ByteBufferChannel channel = new ByteBufferChannel(buffer("111111"));
assertEquals(6, file.transferFrom(channel, 4, 6));
assertContentEquals("2222111111", file);
}
public void testNonEmpty_transferFrom_toEnd() throws IOException {
fillContent("222222");
ByteBufferChannel channel = new ByteBufferChannel(buffer("111111"));
assertEquals(6, file.transferFrom(channel, 6, 6));
assertContentEquals("222222111111", file);
}
public void testNonEmpty_transferFrom_toPastEnd() throws IOException {
fillContent("222222");
ByteBufferChannel channel = new ByteBufferChannel(buffer("111111"));
assertEquals(6, file.transferFrom(channel, 10, 6));
assertContentEquals("2222220000111111", file);
}
public void testNonEmpty_transferFrom_hugeOverestimateCount() throws IOException {
fillContent("222222");
ByteBufferChannel channel = new ByteBufferChannel(buffer("111111"));
assertEquals(6, file.transferFrom(channel, 6, 1024 * 1024 * 10));
assertContentEquals("222222111111", file);
}
public void testNonEmpty_copy() throws IOException {
fillContent("123456");
RegularFile copy = file.copyWithoutContent(1);
file.copyContentTo(copy);
assertContentEquals("123456", copy);
}
public void testNonEmpty_copy_multipleTimes() throws IOException {
fillContent("123456");
RegularFile copy = file.copyWithoutContent(1);
file.copyContentTo(copy);
RegularFile copy2 = copy.copyWithoutContent(2);
copy.copyContentTo(copy2);
assertContentEquals("123456", copy);
}
public void testNonEmpty_truncate_toZero() throws IOException {
fillContent("123456");
file.truncate(0);
assertContentEquals("", file);
}
public void testNonEmpty_truncate_partial() throws IOException {
fillContent("12345678");
file.truncate(5);
assertContentEquals("12345", file);
}
public void testNonEmpty_truncate_sizeUp() throws IOException {
fillContent("123456");
file.truncate(12);
assertContentEquals("123456", file);
}
public void testDeletedStoreRemainsUsableWhileOpen() throws IOException {
byte[] bytes = bytes("1234567890");
file.write(0, bytes, 0, bytes.length);
file.opened();
file.opened();
file.deleted();
assertContentEquals(bytes, file);
byte[] moreBytes = bytes("1234");
file.write(bytes.length, moreBytes, 0, 4);
byte[] totalBytes = concat(bytes, bytes("1234"));
assertContentEquals(totalBytes, file);
file.closed();
assertContentEquals(totalBytes, file);
file.closed();
// don't check anything else; no guarantee of what if anything will happen once the file is
// deleted and completely closed
}
private static void assertBufferEquals(String expected, ByteBuffer actual) {
assertEquals(expected.length(), actual.capacity());
assertArrayEquals(bytes(expected), actual.array());
}
private static void assertBufferEquals(String expected, int remaining, ByteBuffer actual) {
assertBufferEquals(expected, actual);
assertEquals(remaining, actual.remaining());
}
private static void assertContentEquals(String expected, RegularFile actual) {
assertContentEquals(bytes(expected), actual);
}
protected static void assertContentEquals(byte[] expected, RegularFile actual) {
assertEquals(expected.length, actual.sizeWithoutLocking());
byte[] actualBytes = new byte[(int) actual.sizeWithoutLocking()];
actual.read(0, ByteBuffer.wrap(actualBytes));
assertArrayEquals(expected, actualBytes);
}
}
}