| /* |
| * 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); |
| } |
| } |
| } |