blob: 1dc9df22b7178c847d4d5fd92805117cb76142f3 [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.truth.Truth.assertThat;
import com.google.common.primitives.Bytes;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
/**
* Tests for the lower-level operations dealing with the blocks of a {@link RegularFile}.
*
* @author Colin Decker
*/
@RunWith(JUnit4.class)
public class RegularFileBlocksTest {
private RegularFile file;
@Before
public void setUp() {
file = createFile();
}
private static RegularFile createFile() {
return RegularFile.create(-1, new HeapDisk(2, 2, 2));
}
@Test
public void testInitialState() {
assertThat(file.blockCount()).isEqualTo(0);
// no bounds checking, but there should never be a block at an index >= size
assertThat(file.getBlock(0)).isNull();
}
@Test
public void testAddAndGet() {
file.addBlock(new byte[] {1});
assertThat(file.blockCount()).isEqualTo(1);
assertThat(Bytes.asList(file.getBlock(0))).isEqualTo(Bytes.asList(new byte[] {1}));
assertThat(file.getBlock(1)).isNull();
file.addBlock(new byte[] {1, 2});
assertThat(file.blockCount()).isEqualTo(2);
assertThat(Bytes.asList(file.getBlock(1))).isEqualTo(Bytes.asList(new byte[] {1, 2}));
assertThat(file.getBlock(2)).isNull();
}
@Test
public void testTruncate() {
file.addBlock(new byte[0]);
file.addBlock(new byte[0]);
file.addBlock(new byte[0]);
file.addBlock(new byte[0]);
assertThat(file.blockCount()).isEqualTo(4);
file.truncateBlocks(2);
assertThat(file.blockCount()).isEqualTo(2);
assertThat(file.getBlock(2)).isNull();
assertThat(file.getBlock(3)).isNull();
assertThat(file.getBlock(0)).isNotNull();
file.truncateBlocks(0);
assertThat(file.blockCount()).isEqualTo(0);
assertThat(file.getBlock(0)).isNull();
}
@Test
public void testCopyTo() {
file.addBlock(new byte[] {1});
file.addBlock(new byte[] {1, 2});
RegularFile other = createFile();
assertThat(other.blockCount()).isEqualTo(0);
file.copyBlocksTo(other, 2);
assertThat(other.blockCount()).isEqualTo(2);
assertThat(other.getBlock(0)).isEqualTo(file.getBlock(0));
assertThat(other.getBlock(1)).isEqualTo(file.getBlock(1));
file.copyBlocksTo(other, 1); // should copy the last block
assertThat(other.blockCount()).isEqualTo(3);
assertThat(other.getBlock(2)).isEqualTo(file.getBlock(1));
other.copyBlocksTo(file, 3);
assertThat(file.blockCount()).isEqualTo(5);
assertThat(file.getBlock(2)).isEqualTo(other.getBlock(0));
assertThat(file.getBlock(3)).isEqualTo(other.getBlock(1));
assertThat(file.getBlock(4)).isEqualTo(other.getBlock(2));
}
@Test
public void testTransferTo() {
file.addBlock(new byte[] {1});
file.addBlock(new byte[] {1, 2});
file.addBlock(new byte[] {1, 2, 3});
RegularFile other = createFile();
assertThat(file.blockCount()).isEqualTo(3);
assertThat(other.blockCount()).isEqualTo(0);
file.transferBlocksTo(other, 3);
assertThat(file.blockCount()).isEqualTo(0);
assertThat(other.blockCount()).isEqualTo(3);
assertThat(file.getBlock(0)).isNull();
assertThat(Bytes.asList(other.getBlock(0))).isEqualTo(Bytes.asList(new byte[] {1}));
assertThat(Bytes.asList(other.getBlock(1))).isEqualTo(Bytes.asList(new byte[] {1, 2}));
assertThat(Bytes.asList(other.getBlock(2))).isEqualTo(Bytes.asList(new byte[] {1, 2, 3}));
other.transferBlocksTo(file, 1);
assertThat(file.blockCount()).isEqualTo(1);
assertThat(other.blockCount()).isEqualTo(2);
assertThat(other.getBlock(2)).isNull();
assertThat(Bytes.asList(file.getBlock(0))).isEqualTo(Bytes.asList(new byte[] {1, 2, 3}));
assertThat(file.getBlock(1)).isNull();
}
}