package io.eguan.nrs;
/*
* #%L
* Project eguan
* %%
* Copyright (C) 2012 - 2017 Oodrive
* %%
* 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.
* #L%
*/
import io.eguan.nrs.NrsException;
import io.eguan.nrs.NrsFile;
import io.eguan.nrs.NrsFileBlock;
import io.eguan.nrs.NrsFileFlag;
import io.eguan.nrs.NrsFileHeader;
import io.eguan.utils.SimpleIdentifierProvider;
import io.eguan.utils.UuidT;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.EnumSet;
import java.util.Set;
import java.util.UUID;
import org.junit.Assert;
import org.junit.Test;
/**
* Unit tests for {@link NrsFileHeader}s.
*
* @author oodrive
* @author llambert
*
*/
public class TestNrsFileHeader {
@Test(expected = NrsException.class)
public void testNrsFileHeaderReadSmall() throws IOException {
final ByteBuffer buffer = ByteBuffer.allocate(NrsFileHeader.HEADER_LENGTH / 2);
NrsFileHeader.readFromBuffer(buffer);
}
@Test(expected = NrsException.class)
public void testNrsFileHeaderReadWrongMagic() throws IOException {
final ByteBuffer buffer = ByteBuffer.allocate(NrsFileHeader.HEADER_LENGTH);
buffer.put((byte) 'N').put((byte) 'R').put((byte) 'S').put((byte) '2').put((byte) '3');
buffer.rewind();
NrsFileHeader.readFromBuffer(buffer);
}
@Test(expected = IllegalArgumentException.class)
public void testNrsFileHeaderWriteSmall() throws IOException {
final int blockSize = 6541;
final int size = 56370 * blockSize;
final int hashSize = 664;
final int clusterSize = 1240;
final NrsFileHeader.Builder<NrsFile> headerBuilder = new NrsFileHeader.Builder<>();
final UuidT<NrsFile> parent = SimpleIdentifierProvider.newId();
headerBuilder.parent(parent);
final UUID device = UUID.randomUUID();
headerBuilder.device(device);
final UUID node = UUID.randomUUID();
headerBuilder.node(node);
final UuidT<NrsFile> fileId = SimpleIdentifierProvider.newId();
headerBuilder.file(fileId);
headerBuilder.size(size);
headerBuilder.blockSize(blockSize);
headerBuilder.hashSize(hashSize);
headerBuilder.clusterSize(clusterSize);
final long now = System.currentTimeMillis();
headerBuilder.timestamp(now);
final Set<NrsFileFlag> flags = EnumSet.noneOf(NrsFileFlag.class);
flags.add(NrsFileFlag.ROOT);
headerBuilder.flags(flags);
final NrsFileHeader<NrsFile> header = headerBuilder.build();
final ByteBuffer buffer = ByteBuffer.allocate(NrsFileHeader.HEADER_LENGTH / 2);
header.writeToBuffer(buffer);
}
@Test(expected = IllegalStateException.class)
public void testNrsFileHeaderInvalidBlockSize() {
final int blockSize = 0;
final int size = 56370 * blockSize;
final int hashSize = 550;
final int clusterSize = 1240;
final NrsFileHeader.Builder<NrsFile> headerBuilder = new NrsFileHeader.Builder<>();
final UuidT<NrsFile> parent = SimpleIdentifierProvider.newId();
headerBuilder.parent(parent);
final UUID device = UUID.randomUUID();
headerBuilder.device(device);
final UUID node = UUID.randomUUID();
headerBuilder.node(node);
final UuidT<NrsFile> fileId = SimpleIdentifierProvider.newId();
headerBuilder.file(fileId);
headerBuilder.size(size);
headerBuilder.blockSize(blockSize);
headerBuilder.hashSize(hashSize);
headerBuilder.clusterSize(clusterSize);
final long now = System.currentTimeMillis();
headerBuilder.timestamp(now);
headerBuilder.addFlags(NrsFileFlag.ROOT);
headerBuilder.build();
}
@Test(expected = IllegalStateException.class)
public void testNrsFileHeaderInvalidSize() {
final int size = -1;
final NrsFileHeader.Builder<NrsFile> headerBuilder = new NrsFileHeader.Builder<>();
final UuidT<NrsFile> parent = SimpleIdentifierProvider.newId();
headerBuilder.parent(parent);
final UUID device = UUID.randomUUID();
headerBuilder.device(device);
final UUID node = UUID.randomUUID();
headerBuilder.node(node);
final UuidT<NrsFile> fileId = SimpleIdentifierProvider.newId();
headerBuilder.file(fileId);
headerBuilder.size(size);
}
/**
* Size not a number of blocks.
*/
@Test(expected = IllegalStateException.class)
public void testNrsFileHeaderInvalidSize2() {
final int blockSize = 6541;
final int size = 56370 * blockSize - 2;
final int hashSize = 550;
final int clusterSize = 1240;
final NrsFileHeader.Builder<NrsFile> headerBuilder = new NrsFileHeader.Builder<>();
final UuidT<NrsFile> parent = SimpleIdentifierProvider.newId();
headerBuilder.parent(parent);
final UUID device = UUID.randomUUID();
headerBuilder.device(device);
final UUID node = UUID.randomUUID();
headerBuilder.node(node);
final UuidT<NrsFile> fileId = SimpleIdentifierProvider.newId();
headerBuilder.file(fileId);
headerBuilder.size(size);
headerBuilder.blockSize(blockSize);
headerBuilder.hashSize(hashSize);
headerBuilder.clusterSize(clusterSize);
final long now = System.currentTimeMillis();
headerBuilder.timestamp(now);
headerBuilder.addFlags(NrsFileFlag.ROOT);
headerBuilder.build();
}
@Test(expected = IllegalStateException.class)
public void testNrsFileHeaderHashSize() {
final int blockSize = 6541;
final int size = 56370 * blockSize;
final int hashSize = 0;
final int clusterSize = 1240;
final NrsFileHeader.Builder<NrsFile> headerBuilder = new NrsFileHeader.Builder<>();
final UuidT<NrsFile> parent = SimpleIdentifierProvider.newId();
headerBuilder.parent(parent);
final UUID device = UUID.randomUUID();
headerBuilder.device(device);
final UUID node = UUID.randomUUID();
headerBuilder.node(node);
final UuidT<NrsFile> fileId = SimpleIdentifierProvider.newId();
headerBuilder.file(fileId);
headerBuilder.size(size);
headerBuilder.blockSize(blockSize);
headerBuilder.hashSize(hashSize);
headerBuilder.clusterSize(clusterSize);
final long now = System.currentTimeMillis();
headerBuilder.timestamp(now);
headerBuilder.addFlags(NrsFileFlag.ROOT);
headerBuilder.build();
}
/**
* Hash size smaller than cluster size.
*/
@Test(expected = IllegalStateException.class)
public void testNrsFileHeaderHashSize2() {
final int blockSize = 6541;
final int size = 56370 * blockSize;
final int hashSize = 12;
final int clusterSize = 11;
final NrsFileHeader.Builder<NrsFile> headerBuilder = new NrsFileHeader.Builder<>();
final UuidT<NrsFile> parent = SimpleIdentifierProvider.newId();
headerBuilder.parent(parent);
final UUID device = UUID.randomUUID();
headerBuilder.device(device);
final UUID node = UUID.randomUUID();
headerBuilder.node(node);
final UuidT<NrsFile> fileId = SimpleIdentifierProvider.newId();
headerBuilder.file(fileId);
headerBuilder.size(size);
headerBuilder.blockSize(blockSize);
headerBuilder.hashSize(hashSize);
headerBuilder.clusterSize(clusterSize);
final long now = System.currentTimeMillis();
headerBuilder.timestamp(now);
headerBuilder.addFlags(NrsFileFlag.ROOT);
headerBuilder.build();
}
@Test(expected = IllegalStateException.class)
public void testNrsFileHeaderClusterSizeZero() {
final int blockSize = 6541;
final int size = 56370 * blockSize;
final int hashSize = 664;
final int clusterSize = 0;
final NrsFileHeader.Builder<NrsFile> headerBuilder = new NrsFileHeader.Builder<>();
final UuidT<NrsFile> parent = SimpleIdentifierProvider.newId();
headerBuilder.parent(parent);
final UUID device = UUID.randomUUID();
headerBuilder.device(device);
final UUID node = UUID.randomUUID();
headerBuilder.node(node);
final UuidT<NrsFile> fileId = SimpleIdentifierProvider.newId();
headerBuilder.file(fileId);
headerBuilder.size(size);
headerBuilder.blockSize(blockSize);
headerBuilder.hashSize(hashSize);
headerBuilder.clusterSize(clusterSize);
final long now = System.currentTimeMillis();
headerBuilder.timestamp(now);
headerBuilder.addFlags(NrsFileFlag.ROOT);
headerBuilder.build();
}
@Test
public void testNrsFileHeaderMiniClusterSize() {
final int blockSize = 6541;
final int size = 56370 * blockSize;
final int hashSize = 6;
final int clusterSize = 20;
final NrsFileHeader.Builder<NrsFile> headerBuilder = new NrsFileHeader.Builder<>();
final UuidT<NrsFile> parent = SimpleIdentifierProvider.newId();
headerBuilder.parent(parent);
final UUID device = UUID.randomUUID();
headerBuilder.device(device);
final UUID node = UUID.randomUUID();
headerBuilder.node(node);
final UuidT<NrsFile> fileId = SimpleIdentifierProvider.newId();
headerBuilder.file(fileId);
headerBuilder.size(size);
headerBuilder.blockSize(blockSize);
headerBuilder.hashSize(hashSize);
headerBuilder.clusterSize(clusterSize);
final long now = System.currentTimeMillis();
headerBuilder.timestamp(now);
final Set<NrsFileFlag> flags = EnumSet.noneOf(NrsFileFlag.class);
flags.add(NrsFileFlag.ROOT);
flags.add(NrsFileFlag.BLOCKS);
headerBuilder.flags(flags);
final NrsFileHeader<NrsFile> header = headerBuilder.build();
// Check that the H1 address is a fixed number of clusters
Assert.assertEquals(0, header.getH1Address() % header.getClusterSize());
}
@Test(expected = NullPointerException.class)
public void testNrsFileHeaderNullParent() {
final int blockSize = 6541;
final int size = 56370 * blockSize;
final int hashSize = 664;
final int clusterSize = 1240;
final NrsFileHeader.Builder<NrsFile> headerBuilder = new NrsFileHeader.Builder<>();
final UuidT<NrsFile> parent = null;
headerBuilder.parent(parent);
final UUID device = UUID.randomUUID();
headerBuilder.device(device);
final UUID node = UUID.randomUUID();
headerBuilder.node(node);
final UuidT<NrsFile> fileId = SimpleIdentifierProvider.newId();
headerBuilder.file(fileId);
headerBuilder.size(size);
headerBuilder.blockSize(blockSize);
headerBuilder.hashSize(hashSize);
headerBuilder.clusterSize(clusterSize);
final long now = System.currentTimeMillis();
headerBuilder.timestamp(now);
headerBuilder.addFlags(NrsFileFlag.ROOT);
headerBuilder.build();
}
@Test(expected = NullPointerException.class)
public void testNrsFileHeaderNullDevice() {
final int blockSize = 6541;
final int size = 56370 * blockSize;
final int hashSize = 664;
final int clusterSize = 1240;
final NrsFileHeader.Builder<NrsFile> headerBuilder = new NrsFileHeader.Builder<>();
final UuidT<NrsFile> parent = SimpleIdentifierProvider.newId();
headerBuilder.parent(parent);
final UUID device = null;
headerBuilder.device(device);
final UUID node = UUID.randomUUID();
headerBuilder.node(node);
final UuidT<NrsFile> fileId = SimpleIdentifierProvider.newId();
headerBuilder.file(fileId);
headerBuilder.size(size);
headerBuilder.blockSize(blockSize);
headerBuilder.hashSize(hashSize);
headerBuilder.clusterSize(clusterSize);
final long now = System.currentTimeMillis();
headerBuilder.timestamp(now);
headerBuilder.addFlags(NrsFileFlag.ROOT);
headerBuilder.build();
}
@Test(expected = NullPointerException.class)
public void testNrsFileHeaderNullNode() {
final int blockSize = 6541;
final int size = 56370 * blockSize;
final int hashSize = 664;
final int clusterSize = 1240;
final NrsFileHeader.Builder<NrsFile> headerBuilder = new NrsFileHeader.Builder<>();
final UuidT<NrsFile> parent = SimpleIdentifierProvider.newId();
headerBuilder.parent(parent);
final UUID device = UUID.randomUUID();
headerBuilder.device(device);
final UUID node = null;
headerBuilder.node(node);
final UuidT<NrsFile> fileId = SimpleIdentifierProvider.newId();
headerBuilder.file(fileId);
headerBuilder.size(size);
headerBuilder.blockSize(blockSize);
headerBuilder.hashSize(hashSize);
headerBuilder.clusterSize(clusterSize);
final long now = System.currentTimeMillis();
headerBuilder.timestamp(now);
headerBuilder.addFlags(NrsFileFlag.ROOT);
headerBuilder.build();
}
@Test(expected = NullPointerException.class)
public void testNrsFileHeaderNullSnapshot() {
final int blockSize = 6541;
final int size = 56370 * blockSize;
final int hashSize = 664;
final int clusterSize = 1240;
final NrsFileHeader.Builder<NrsFile> headerBuilder = new NrsFileHeader.Builder<>();
final UuidT<NrsFile> parent = SimpleIdentifierProvider.newId();
headerBuilder.parent(parent);
final UUID device = UUID.randomUUID();
headerBuilder.device(device);
final UUID node = UUID.randomUUID();
headerBuilder.node(node);
final UuidT<NrsFile> fileId = null;
headerBuilder.file(fileId);
headerBuilder.size(size);
headerBuilder.blockSize(blockSize);
headerBuilder.hashSize(hashSize);
headerBuilder.clusterSize(clusterSize);
final long now = System.currentTimeMillis();
headerBuilder.timestamp(now);
headerBuilder.addFlags(NrsFileFlag.ROOT);
headerBuilder.build();
}
@Test
public void testNrsFileHeaderNoFlags() {
final int blockSize = 6541;
final int size = 56370 * blockSize;
final int hashSize = 664;
final int clusterSize = 1240;
final NrsFileHeader.Builder<NrsFile> headerBuilder = new NrsFileHeader.Builder<>();
final UuidT<NrsFile> parent = SimpleIdentifierProvider.newId();
headerBuilder.parent(parent);
final UUID device = UUID.randomUUID();
headerBuilder.device(device);
final UUID node = UUID.randomUUID();
headerBuilder.node(node);
final UuidT<NrsFile> fileId = SimpleIdentifierProvider.newId();
headerBuilder.file(fileId);
headerBuilder.size(size);
headerBuilder.blockSize(blockSize);
headerBuilder.hashSize(hashSize);
headerBuilder.clusterSize(clusterSize);
final long now = System.currentTimeMillis();
headerBuilder.timestamp(now);
final NrsFileHeader<NrsFile> header = headerBuilder.build();
Assert.assertFalse(header.isRoot());
Assert.assertFalse(header.isPartial());
}
@Test(expected = IllegalStateException.class)
public void testNrsFileHeaderWrongLOneAddr() {
final int blockSize = 6541;
final int size = 56370 * blockSize;
final int hashSize = 664;
final int clusterSize = 1240;
final NrsFileHeader.Builder<NrsFile> headerBuilder = new NrsFileHeader.Builder<>();
final UuidT<NrsFile> parent = SimpleIdentifierProvider.newId();
headerBuilder.parent(parent);
final UUID device = UUID.randomUUID();
headerBuilder.device(device);
final UUID node = UUID.randomUUID();
headerBuilder.node(node);
final UuidT<NrsFile> fileId = SimpleIdentifierProvider.newId();
headerBuilder.file(fileId);
headerBuilder.size(size);
headerBuilder.blockSize(blockSize);
headerBuilder.hashSize(hashSize);
headerBuilder.clusterSize(clusterSize);
final long now = System.currentTimeMillis();
headerBuilder.timestamp(now);
final NrsFileHeader<NrsFile> header = headerBuilder.build();
Assert.assertFalse(header.isRoot());
Assert.assertFalse(header.isPartial());
headerBuilder.addFlags(NrsFileFlag.ROOT);
headerBuilder.hOneAddress(545);
headerBuilder.build();
}
@Test
public void testNrsFileHeaderFlagsSet() {
final int blockSize = 6541;
final int size = 56370 * blockSize;
final int hashSize = 664;
final int clusterSize = 1240;
final NrsFileHeader.Builder<NrsFile> headerBuilder = new NrsFileHeader.Builder<>();
final UuidT<NrsFile> parent = SimpleIdentifierProvider.newId();
headerBuilder.parent(parent);
final UUID device = UUID.randomUUID();
headerBuilder.device(device);
final UUID node = UUID.randomUUID();
headerBuilder.node(node);
final UuidT<NrsFile> fileId = SimpleIdentifierProvider.newId();
headerBuilder.file(fileId);
headerBuilder.size(size);
headerBuilder.blockSize(blockSize);
headerBuilder.hashSize(hashSize);
headerBuilder.clusterSize(clusterSize);
final long now = System.currentTimeMillis();
headerBuilder.timestamp(now);
final Set<NrsFileFlag> flags = EnumSet.noneOf(NrsFileFlag.class);
flags.add(NrsFileFlag.ROOT);
headerBuilder.flags(flags);
final NrsFileHeader<NrsFile> header = headerBuilder.build();
Assert.assertTrue(header.isRoot());
Assert.assertFalse(header.isPartial());
Assert.assertFalse(header.isBlocks());
}
@Test(expected = IllegalStateException.class)
public void testNrsFileHeaderFlagsBlockNotSet() {
final int blockSize = 6541;
final int size = 56370 * blockSize;
final int hashSize = 664;
final int clusterSize = 1240;
final NrsFileHeader.Builder<NrsFile> headerBuilder = new NrsFileHeader.Builder<>();
final UuidT<NrsFile> parent = SimpleIdentifierProvider.newId();
headerBuilder.parent(parent);
final UUID device = UUID.randomUUID();
headerBuilder.device(device);
final UUID node = UUID.randomUUID();
headerBuilder.node(node);
final UuidT<NrsFile> fileId = SimpleIdentifierProvider.newId();
headerBuilder.file(fileId);
headerBuilder.size(size);
headerBuilder.blockSize(blockSize);
headerBuilder.hashSize(hashSize);
headerBuilder.clusterSize(clusterSize);
final long now = System.currentTimeMillis();
headerBuilder.timestamp(now);
final Set<NrsFileFlag> flags = EnumSet.noneOf(NrsFileFlag.class);
flags.add(NrsFileFlag.ROOT);
headerBuilder.flags(flags);
final NrsFileHeader<NrsFile> header = headerBuilder.build();
Assert.assertTrue(header.isRoot());
Assert.assertFalse(header.isPartial());
Assert.assertFalse(header.isBlocks());
header.newBlocksHeader();
}
@Test
public void testNrsFileHeaderFlagsBlockSet() {
final int blockSize = 6541;
final int size = 56370 * blockSize;
final int hashSize = 664;
final int clusterSize = 1240;
final NrsFileHeader.Builder<NrsFile> headerBuilder = new NrsFileHeader.Builder<>();
final UuidT<NrsFile> parent = SimpleIdentifierProvider.newId();
headerBuilder.parent(parent);
final UUID device = UUID.randomUUID();
headerBuilder.device(device);
final UUID node = UUID.randomUUID();
headerBuilder.node(node);
final UuidT<NrsFile> fileId = SimpleIdentifierProvider.newId();
headerBuilder.file(fileId);
headerBuilder.size(size);
headerBuilder.blockSize(blockSize);
headerBuilder.hashSize(hashSize);
headerBuilder.clusterSize(clusterSize);
final long now = System.currentTimeMillis();
headerBuilder.timestamp(now);
final Set<NrsFileFlag> flags = EnumSet.noneOf(NrsFileFlag.class);
flags.add(NrsFileFlag.ROOT);
flags.add(NrsFileFlag.BLOCKS);
headerBuilder.flags(flags);
final NrsFileHeader<NrsFile> header = headerBuilder.build();
Assert.assertTrue(header.isRoot());
Assert.assertFalse(header.isPartial());
Assert.assertTrue(header.isBlocks());
// Get header for file of blocks
final NrsFileHeader<NrsFileBlock> headerBlocks = header.newBlocksHeader();
Assert.assertTrue(headerBlocks.isRoot());
Assert.assertFalse(headerBlocks.isPartial());
Assert.assertFalse(headerBlocks.isBlocks());
Assert.assertEquals(header.getParentId(), headerBlocks.getParentId());
Assert.assertEquals(header.getDeviceId(), headerBlocks.getDeviceId());
Assert.assertEquals(header.getNodeId(), headerBlocks.getNodeId());
Assert.assertEquals(header.getFileId(), headerBlocks.getFileId());
Assert.assertEquals(header.getSize(), headerBlocks.getSize());
Assert.assertEquals(header.getBlockSize(), headerBlocks.getBlockSize());
Assert.assertEquals(header.getHashSize(), headerBlocks.getHashSize());
Assert.assertEquals(header.getTimestamp(), headerBlocks.getTimestamp());
// The new cluster size depends on the block size
Assert.assertEquals(0, headerBlocks.getClusterSize() % headerBlocks.getBlockSize());
Assert.assertTrue(header.getClusterSize() < headerBlocks.getClusterSize());
// Not the same H1 address (depends on the cluster size)
Assert.assertFalse(header.getH1Address() == headerBlocks.getH1Address());
Assert.assertEquals(headerBlocks.getClusterSize(), headerBlocks.getH1Address());
}
@Test
public void testNrsFileHeaderWriteRead() throws NrsException {
final int blockSize = 6541;
final int size = 56370 * blockSize;
final int hashSize = 664;
final int clusterSize = 1240;
final NrsFileHeader.Builder<NrsFile> headerBuilder = new NrsFileHeader.Builder<>();
final UuidT<NrsFile> parent = SimpleIdentifierProvider.newId();
headerBuilder.parent(parent);
final UUID device = UUID.randomUUID();
headerBuilder.device(device);
final UUID node = UUID.randomUUID();
headerBuilder.node(node);
final UuidT<NrsFile> fileId = SimpleIdentifierProvider.newId();
headerBuilder.file(fileId);
headerBuilder.size(size);
headerBuilder.blockSize(blockSize);
headerBuilder.hashSize(hashSize);
headerBuilder.clusterSize(clusterSize);
final long now = System.currentTimeMillis();
headerBuilder.timestamp(now);
final Set<NrsFileFlag> flags = EnumSet.noneOf(NrsFileFlag.class);
flags.add(NrsFileFlag.ROOT);
flags.add(NrsFileFlag.BLOCKS);
headerBuilder.flags(flags);
final NrsFileHeader<NrsFile> header = headerBuilder.build();
Assert.assertTrue(header.isRoot());
Assert.assertFalse(header.isPartial());
Assert.assertTrue(header.isBlocks());
// Write to ByteBuffer and create a new header
final ByteBuffer tmp = ByteBuffer.allocate(NrsFileHeader.HEADER_LENGTH);
header.writeToBuffer(tmp);
tmp.clear();
final NrsFileHeader<NrsFile> headerRead = NrsFileHeader.readFromBuffer(tmp);
// Compare to original buffer
Assert.assertEquals(header.getParentId(), headerRead.getParentId());
Assert.assertEquals(header.getDeviceId(), headerRead.getDeviceId());
Assert.assertEquals(header.getNodeId(), headerRead.getNodeId());
Assert.assertEquals(header.getFileId(), headerRead.getFileId());
Assert.assertEquals(header.getSize(), headerRead.getSize());
Assert.assertEquals(header.getBlockSize(), headerRead.getBlockSize());
Assert.assertEquals(header.getHashSize(), headerRead.getHashSize());
Assert.assertEquals(header.getTimestamp(), headerRead.getTimestamp());
Assert.assertEquals(header.getClusterSize(), headerRead.getClusterSize());
Assert.assertEquals(header.getH1Address(), headerRead.getH1Address());
}
}