package io.eguan.vvr.persistence.repository;
/*
* #%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.NrsFile;
import io.eguan.proto.Common.OpCode;
import io.eguan.proto.Common.ProtocolVersion;
import io.eguan.proto.Common.Type;
import io.eguan.proto.Common.Uuid;
import io.eguan.proto.nrs.NrsRemote.NrsVersion;
import io.eguan.proto.vvr.VvrRemote.RemoteOperation;
import io.eguan.vvr.configuration.AbstractVvrCommonFixture;
import io.eguan.vvr.persistence.repository.NrsRepository;
import io.eguan.vvr.persistence.repository.NrsSnapshot;
import io.eguan.vvr.remote.VvrRemoteUtils;
import io.eguan.vvr.repository.core.api.Device;
import io.eguan.vvr.repository.core.api.FutureSnapshot;
import io.eguan.vvr.repository.core.api.FutureVoid;
import io.eguan.vvr.repository.core.api.Snapshot;
import io.eguan.vvr.repository.core.api.VersionedVolumeRepository;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Tests the history of a repository.
*
* @author oodrive
* @author llambert
* @author ebredzinski
* @author pwehrle
* @author jmcaba
*/
public class TestRepositoryHistory extends AbstractVvrCommonFixture {
protected static final Logger LOGGER = LoggerFactory.getLogger(TestRepositoryHistory.class);
private VersionedVolumeRepository repository = null;
private Snapshot rootSnapshot = null;
private UUID nodeId = null;
public TestRepositoryHistory() {
super(true);
}
/**
* Create the repository to test.
*/
@Before
public void createRepository() {
boolean done = false;
// Nrs
final NrsRepository.Builder vvrBuilder = new NrsRepository.Builder();
vvrBuilder.configuration(getConfiguration());
vvrBuilder.uuid(UUID.randomUUID());
vvrBuilder.ownerId(UUID.randomUUID());
vvrBuilder.nodeId(nodeId = UUID.randomUUID());
vvrBuilder.rootUuid(UUID.randomUUID());
repository = vvrBuilder.create();
Assert.assertNotNull(repository);
try {
repository.init();
try {
repository.start(true);
try {
rootSnapshot = repository.getRootSnapshot();
done = true;
}
finally {
if (!done) {
repository.stop(false);
}
}
}
finally {
if (!done) {
repository.fini();
}
}
}
finally {
if (!done) {
repository = null;
rootSnapshot = null;
}
}
}
/**
* Release resources.
*/
@After
public void finiRepository() {
if (repository != null) {
try {
repository.stop(false);
}
catch (final Throwable t) {
LOGGER.warn("Failed to stop repository " + repository, t);
}
try {
repository.fini();
}
catch (final Throwable t) {
LOGGER.warn("Failed to fini repository " + repository, t);
}
repository = null;
}
}
@Test
public void testHistory() throws Exception {
final long size1 = getDefaultBlockSize() * 512;
final long size2 = getDefaultBlockSize() * 1071;
final long size3 = getDefaultBlockSize() * 12;
final long size4 = getDefaultBlockSize() * 333;
final UUID device1Uuid;
final UUID device2Uuid;
final UUID device3Uuid;
final UUID cloneDevice1Uuid;
final UUID snapshot1Uuid;
final UUID snapshot2Uuid;
final UUID snapshot3Uuid;
{
// New device
final Device device1 = rootSnapshot.createDevice("D1", size1).get();
Assert.assertEquals(size1, device1.getSize());
Assert.assertEquals(rootSnapshot.getUuid(), device1.getParent());
{ // rootSnapshot has 0 snapshot and 1 device
final Collection<UUID> snapshots = rootSnapshot.getChildrenSnapshotsUuid();
Assert.assertTrue(snapshots.isEmpty());
final Collection<UUID> devices = rootSnapshot.getSnapshotDevicesUuid();
Assert.assertEquals(1, devices.size());
Assert.assertEquals(devices.iterator().next(), device1.getUuid());
}
// New snapshot
final Snapshot snapshot1 = device1.createSnapshot().get();
Assert.assertEquals(size1, snapshot1.getSize());
Assert.assertEquals(device1.getParent(), snapshot1.getUuid());
Assert.assertEquals(rootSnapshot.getUuid(), snapshot1.getParent());
{ // rootSnapshot has 1 snapshot and 0 device
final Collection<UUID> snapshots = rootSnapshot.getChildrenSnapshotsUuid();
Assert.assertEquals(1, snapshots.size());
Assert.assertEquals(snapshots.iterator().next(), snapshot1.getUuid());
final Collection<UUID> devices = rootSnapshot.getSnapshotDevicesUuid();
Assert.assertTrue(devices.isEmpty());
}
{ // snapshot1 has 0 snapshot and 1 device
final Collection<UUID> snapshots = snapshot1.getChildrenSnapshotsUuid();
Assert.assertTrue(snapshots.isEmpty());
final Collection<UUID> devices = snapshot1.getSnapshotDevicesUuid();
Assert.assertEquals(1, devices.size());
Assert.assertEquals(devices.iterator().next(), device1.getUuid());
}
// New device
final Device device2 = snapshot1.createDevice("D2", size2).get();
Assert.assertEquals(size2, device2.getSize());
Assert.assertEquals(snapshot1.getUuid(), device2.getParent());
{ // snapshot1 has 0 snapshot and 2 devices
final Collection<UUID> snapshots = snapshot1.getChildrenSnapshotsUuid();
Assert.assertTrue(snapshots.isEmpty());
final Collection<UUID> devices = snapshot1.getSnapshotDevicesUuid();
Assert.assertEquals(2, devices.size());
Assert.assertTrue(devices.contains(device1.getUuid()));
Assert.assertTrue(devices.contains(device2.getUuid()));
}
// New snapshot
final Snapshot snapshot2 = device2.createSnapshot("snap2").get();
Assert.assertEquals(size2, snapshot2.getSize());
Assert.assertEquals(snapshot1.getUuid(), snapshot2.getParent());
Assert.assertEquals(snapshot2.getUuid(), device2.getParent());
{ // rootSnapshot has 1 snapshot and 0 device
final Collection<UUID> snapshots = rootSnapshot.getChildrenSnapshotsUuid();
Assert.assertEquals(1, snapshots.size());
Assert.assertEquals(snapshots.iterator().next(), snapshot1.getUuid());
final Collection<UUID> devices = rootSnapshot.getSnapshotDevicesUuid();
Assert.assertTrue(devices.isEmpty());
}
{ // snapshot1 has 1 snapshot and 1 device
final Collection<UUID> snapshots = snapshot1.getChildrenSnapshotsUuid();
Assert.assertEquals(1, snapshots.size());
Assert.assertEquals(snapshots.iterator().next(), snapshot2.getUuid());
final Collection<UUID> devices = snapshot1.getSnapshotDevicesUuid();
Assert.assertEquals(1, devices.size());
Assert.assertEquals(devices.iterator().next(), device1.getUuid());
}
{ // snapshot2 has 0 snapshot and 1 device
final Collection<UUID> snapshots = snapshot2.getChildrenSnapshotsUuid();
Assert.assertTrue(snapshots.isEmpty());
final Collection<UUID> devices = snapshot2.getSnapshotDevicesUuid();
Assert.assertEquals(1, devices.size());
Assert.assertEquals(devices.iterator().next(), device2.getUuid());
}
// clone device1
final Device cloneDevice1 = device1.clone("clonedev1", "description").get();
Assert.assertEquals(device1.getParent(), cloneDevice1.getParent());
Assert.assertEquals(device1.getSize(), cloneDevice1.getSize());
Assert.assertEquals(device1.getBlockSize(), cloneDevice1.getBlockSize());
Assert.assertEquals(device1.getDataSize(), cloneDevice1.getDataSize());
// Resize device2
device2.setSize(size3).get();
Assert.assertEquals(size3, device2.getSize());
Assert.assertEquals(size1, device1.getSize());
Assert.assertEquals(size1, snapshot1.getSize());
Assert.assertEquals(size2, snapshot2.getSize());
Assert.assertEquals(snapshot1.getUuid(), snapshot2.getParent());
Assert.assertEquals(snapshot2.getUuid(), device2.getParent());
Assert.assertEquals(snapshot1.getUuid(), device1.getParent());
{ // rootSnapshot has 1 snapshot and 0 device
final Collection<UUID> snapshots = rootSnapshot.getChildrenSnapshotsUuid();
Assert.assertEquals(1, snapshots.size());
Assert.assertEquals(snapshots.iterator().next(), snapshot1.getUuid());
final Collection<UUID> devices = rootSnapshot.getSnapshotDevicesUuid();
Assert.assertTrue(devices.isEmpty());
}
{ // snapshot1 has 1 snapshot and 1 device
final Collection<UUID> snapshots = snapshot1.getChildrenSnapshotsUuid();
Assert.assertEquals(1, snapshots.size());
Assert.assertEquals(snapshots.iterator().next(), snapshot2.getUuid());
final Collection<UUID> devices = snapshot1.getSnapshotDevicesUuid();
Assert.assertEquals(2, devices.size());
int count = 0;
for (final UUID deviceUuid : devices) {
if (deviceUuid.equals(device1.getUuid()) || deviceUuid.equals(cloneDevice1.getUuid())) {
count++;
}
}
Assert.assertEquals(2, count);
}
{ // snapshot2 has 0 snapshot and 1 device
final Collection<UUID> snapshots = snapshot2.getChildrenSnapshotsUuid();
Assert.assertTrue(snapshots.isEmpty());
final Collection<UUID> devices = snapshot2.getSnapshotDevicesUuid();
Assert.assertEquals(1, devices.size());
Assert.assertEquals(devices.iterator().next(), device2.getUuid());
}
// New snapshot of device2
final Snapshot snapshot3 = device2.createSnapshot("snap3").get();
Assert.assertEquals(size3, snapshot3.getSize());
Assert.assertEquals(size3, device2.getSize());
Assert.assertEquals(size1, device1.getSize());
Assert.assertEquals(size1, snapshot1.getSize());
Assert.assertEquals(size2, snapshot2.getSize());
Assert.assertEquals(rootSnapshot.getUuid(), snapshot1.getParent());
Assert.assertEquals(snapshot1.getUuid(), snapshot2.getParent());
Assert.assertEquals(snapshot2.getUuid(), snapshot3.getParent());
Assert.assertEquals(snapshot3.getUuid(), device2.getParent());
Assert.assertEquals(snapshot1.getUuid(), device1.getParent());
{ // rootSnapshot has 1 snapshot and 0 device
final Collection<UUID> snapshots = rootSnapshot.getChildrenSnapshotsUuid();
Assert.assertEquals(1, snapshots.size());
Assert.assertEquals(snapshots.iterator().next(), snapshot1.getUuid());
final Collection<UUID> devices = rootSnapshot.getSnapshotDevicesUuid();
Assert.assertTrue(devices.isEmpty());
}
{ // snapshot1 has 1 snapshot and 1 device
final Collection<UUID> snapshots = snapshot1.getChildrenSnapshotsUuid();
Assert.assertEquals(1, snapshots.size());
Assert.assertEquals(snapshots.iterator().next(), snapshot2.getUuid());
final Collection<UUID> devices = snapshot1.getSnapshotDevicesUuid();
Assert.assertEquals(2, devices.size());
int count = 0;
for (final UUID deviceUuid : devices) {
if (deviceUuid.equals(device1.getUuid()) || deviceUuid.equals(cloneDevice1.getUuid())) {
count++;
}
}
Assert.assertEquals(2, count);
}
{ // snapshot2 has 1 snapshot and 0 device
final Collection<UUID> snapshots = snapshot2.getChildrenSnapshotsUuid();
Assert.assertEquals(1, snapshots.size());
Assert.assertEquals(snapshots.iterator().next(), snapshot3.getUuid());
final Collection<UUID> devices = snapshot2.getSnapshotDevicesUuid();
Assert.assertTrue(devices.isEmpty());
}
{ // snapshot3 has 0 snapshot and 1 device
final Collection<UUID> snapshots = snapshot3.getChildrenSnapshotsUuid();
Assert.assertTrue(snapshots.isEmpty());
final Collection<UUID> devices = snapshot3.getSnapshotDevicesUuid();
Assert.assertEquals(1, devices.size());
Assert.assertEquals(devices.iterator().next(), device2.getUuid());
}
// Test resize under root
// New device under root
final Device device3 = rootSnapshot.createDevice("D3", size3).get();
Assert.assertEquals(size3, device3.getSize());
Assert.assertEquals(rootSnapshot.getUuid(), device3.getParent());
{ // rootSnapshot has 1 snapshot and 1 device
final Collection<UUID> snapshots = rootSnapshot.getChildrenSnapshotsUuid();
Assert.assertEquals(1, snapshots.size());
Assert.assertEquals(snapshots.iterator().next(), snapshot1.getUuid());
final Collection<UUID> devices = rootSnapshot.getSnapshotDevicesUuid();
Assert.assertEquals(1, devices.size());
Assert.assertEquals(devices.iterator().next(), device3.getUuid());
}
// Resize device4
device3.setSize(size4).get();
Assert.assertEquals(size4, device3.getSize());
Assert.assertEquals(rootSnapshot.getUuid(), device3.getParent());
{ // rootSnapshot has 1 snapshot and 1 device
final Collection<UUID> snapshots = rootSnapshot.getChildrenSnapshotsUuid();
Assert.assertEquals(1, snapshots.size());
Assert.assertEquals(snapshots.iterator().next(), snapshot1.getUuid());
final Collection<UUID> devices = rootSnapshot.getSnapshotDevicesUuid();
Assert.assertEquals(1, devices.size());
Assert.assertEquals(devices.iterator().next(), device3.getUuid());
}
device1Uuid = device1.getUuid();
device2Uuid = device2.getUuid();
device3Uuid = device3.getUuid();
cloneDevice1Uuid = cloneDevice1.getUuid();
snapshot1Uuid = snapshot1.getUuid();
snapshot2Uuid = snapshot2.getUuid();
snapshot3Uuid = snapshot3.getUuid();
}
//
// Restart repository and check state
//
repository.stop(true);
repository.fini();
Thread.sleep(100);
repository.init();
repository.start(true);
// Load new objects
rootSnapshot = repository.getRootSnapshot();
final Device device1 = repository.getDevice(device1Uuid);
final Device device2 = repository.getDevice(device2Uuid);
final Device device3 = repository.getDevice(device3Uuid);
final Device cloneDevice1 = repository.getDevice(cloneDevice1Uuid);
final Snapshot snapshot1 = repository.getSnapshot(snapshot1Uuid);
final Snapshot snapshot2 = repository.getSnapshot(snapshot2Uuid);
final Snapshot snapshot3 = repository.getSnapshot(snapshot3Uuid);
Assert.assertEquals(size3, snapshot3.getSize());
Assert.assertEquals(size3, device2.getSize());
Assert.assertEquals(size1, device1.getSize());
Assert.assertEquals(size1, snapshot1.getSize());
Assert.assertEquals(size2, snapshot2.getSize());
Assert.assertEquals(size4, device3.getSize());
Assert.assertEquals(rootSnapshot.getUuid(), device3.getParent());
Assert.assertEquals(rootSnapshot.getUuid(), snapshot1.getParent());
Assert.assertEquals(snapshot1.getUuid(), snapshot2.getParent());
Assert.assertEquals(snapshot2.getUuid(), snapshot3.getParent());
Assert.assertEquals(snapshot3.getUuid(), device2.getParent());
Assert.assertEquals(snapshot1.getUuid(), device1.getParent());
{ // rootSnapshot has 1 snapshot and 1 device
final Collection<UUID> snapshots = rootSnapshot.getChildrenSnapshotsUuid();
Assert.assertEquals(1, snapshots.size());
Assert.assertEquals(snapshots.iterator().next(), snapshot1.getUuid());
final Collection<UUID> devices = rootSnapshot.getSnapshotDevicesUuid();
Assert.assertEquals(1, devices.size());
Assert.assertEquals(devices.iterator().next(), device3.getUuid());
}
{ // snapshot1 has 1 snapshot and 1 device
final Collection<UUID> snapshots = snapshot1.getChildrenSnapshotsUuid();
Assert.assertEquals(1, snapshots.size());
Assert.assertEquals(snapshots.iterator().next(), snapshot2.getUuid());
final Collection<UUID> devices = snapshot1.getSnapshotDevicesUuid();
Assert.assertEquals(2, devices.size());
int count = 0;
for (final UUID deviceUuid : devices) {
if (deviceUuid.equals(device1.getUuid()) || deviceUuid.equals(cloneDevice1.getUuid())) {
count++;
}
}
Assert.assertEquals(2, count);
}
{ // snapshot2 has 1 snapshot and 0 device
final Collection<UUID> snapshots = snapshot2.getChildrenSnapshotsUuid();
Assert.assertEquals(1, snapshots.size());
Assert.assertEquals(snapshots.iterator().next(), snapshot3.getUuid());
final Collection<UUID> devices = snapshot2.getSnapshotDevicesUuid();
Assert.assertTrue(devices.isEmpty());
}
{ // snapshot3 has 0 snapshot and 1 device
final Collection<UUID> snapshots = snapshot3.getChildrenSnapshotsUuid();
Assert.assertTrue(snapshots.isEmpty());
final Collection<UUID> devices = snapshot3.getSnapshotDevicesUuid();
Assert.assertEquals(1, devices.size());
Assert.assertEquals(devices.iterator().next(), device2.getUuid());
}
// Take a snapshot of cloneDevice1
final Snapshot snapshot4 = cloneDevice1.createSnapshot("snap4").get();
Assert.assertEquals(size3, snapshot3.getSize());
Assert.assertEquals(size3, device2.getSize());
Assert.assertEquals(size1, device1.getSize());
Assert.assertEquals(size1, cloneDevice1.getSize());
Assert.assertEquals(size1, snapshot4.getSize());
Assert.assertEquals(size1, snapshot1.getSize());
Assert.assertEquals(size2, snapshot2.getSize());
Assert.assertEquals(size4, device3.getSize());
Assert.assertEquals(rootSnapshot.getUuid(), device3.getParent());
Assert.assertEquals(rootSnapshot.getUuid(), snapshot1.getParent());
Assert.assertEquals(snapshot1.getUuid(), snapshot2.getParent());
Assert.assertEquals(snapshot2.getUuid(), snapshot3.getParent());
Assert.assertEquals(snapshot3.getUuid(), device2.getParent());
Assert.assertEquals(snapshot1.getUuid(), device1.getParent());
{ // rootSnapshot has 1 snapshot and 1 device
final Collection<UUID> snapshots = rootSnapshot.getChildrenSnapshotsUuid();
Assert.assertEquals(1, snapshots.size());
Assert.assertEquals(snapshots.iterator().next(), snapshot1.getUuid());
final Collection<UUID> devices = rootSnapshot.getSnapshotDevicesUuid();
Assert.assertEquals(1, devices.size());
Assert.assertEquals(devices.iterator().next(), device3.getUuid());
}
{ // snapshot1 has 2 snapshot and 1 device
final Collection<UUID> snapshots = snapshot1.getChildrenSnapshotsUuid();
Assert.assertEquals(2, snapshots.size());
int count = 0;
for (final UUID snapshotUuid : snapshots) {
if (snapshotUuid.equals(snapshot2.getUuid()) || snapshotUuid.equals(snapshot4.getUuid())) {
count++;
}
}
Assert.assertEquals(2, count);
final Collection<UUID> devices = snapshot1.getSnapshotDevicesUuid();
Assert.assertEquals(1, devices.size());
Assert.assertEquals(devices.iterator().next(), device1.getUuid());
}
{ // snapshot2 has 1 snapshot and 0 device
final Collection<UUID> snapshots = snapshot2.getChildrenSnapshotsUuid();
Assert.assertEquals(1, snapshots.size());
Assert.assertEquals(snapshots.iterator().next(), snapshot3.getUuid());
final Collection<UUID> devices = snapshot2.getSnapshotDevicesUuid();
Assert.assertTrue(devices.isEmpty());
}
{ // snapshot3 has 0 snapshot and 1 device
final Collection<UUID> snapshots = snapshot3.getChildrenSnapshotsUuid();
Assert.assertTrue(snapshots.isEmpty());
final Collection<UUID> devices = snapshot3.getSnapshotDevicesUuid();
Assert.assertEquals(1, devices.size());
Assert.assertEquals(devices.iterator().next(), device2.getUuid());
}
{ // snapshot4 has 0 snapshot and 1 device
final Collection<UUID> snapshots = snapshot4.getChildrenSnapshotsUuid();
Assert.assertTrue(snapshots.isEmpty());
final Collection<UUID> devices = snapshot4.getSnapshotDevicesUuid();
Assert.assertEquals(1, devices.size());
Assert.assertEquals(devices.iterator().next(), cloneDevice1.getUuid());
}
}
@Test
public void testHistoryDeleteSnapshot() throws Exception {
final long size1 = getDefaultBlockSize() * 512;
final long size2 = getDefaultBlockSize() * 12;
final UUID device1Uuid;
final UUID snapshot2Uuid;
{
// New device
final Device device1 = rootSnapshot.createDevice("D1", size1).get();
Assert.assertEquals(size1, device1.getSize());
Assert.assertEquals(rootSnapshot.getUuid(), device1.getParent());
{ // rootSnapshot has 0 snapshot and 1 device
final Collection<UUID> snapshots = rootSnapshot.getChildrenSnapshotsUuid();
Assert.assertTrue(snapshots.isEmpty());
final Collection<UUID> devices = rootSnapshot.getSnapshotDevicesUuid();
Assert.assertEquals(1, devices.size());
Assert.assertEquals(devices.iterator().next(), device1.getUuid());
}
// New snapshot
final Snapshot snapshot1 = device1.createSnapshot("snap1").get();
Assert.assertEquals(size1, snapshot1.getSize());
Assert.assertEquals(device1.getParent(), snapshot1.getUuid());
Assert.assertEquals(rootSnapshot.getUuid(), snapshot1.getParent());
{ // rootSnapshot has 1 snapshot and 0 device
final Collection<UUID> snapshots = rootSnapshot.getChildrenSnapshotsUuid();
Assert.assertEquals(1, snapshots.size());
Assert.assertEquals(snapshots.iterator().next(), snapshot1.getUuid());
final Collection<UUID> devices = rootSnapshot.getSnapshotDevicesUuid();
Assert.assertTrue(devices.isEmpty());
}
{ // snapshot1 has 0 snapshot and 1 device
final Collection<UUID> snapshots = snapshot1.getChildrenSnapshotsUuid();
Assert.assertTrue(snapshots.isEmpty());
final Collection<UUID> devices = snapshot1.getSnapshotDevicesUuid();
Assert.assertEquals(1, devices.size());
Assert.assertEquals(devices.iterator().next(), device1.getUuid());
}
// New snapshot
final Snapshot snapshot2 = device1.createSnapshot("snap2").get();
Assert.assertEquals(snapshot1.getUuid(), snapshot2.getParent());
Assert.assertEquals(snapshot2.getUuid(), device1.getParent());
Assert.assertEquals(size1, snapshot2.getSize());
{ // rootSnapshot has 1 snapshot and 0 device
final Collection<UUID> snapshots = rootSnapshot.getChildrenSnapshotsUuid();
Assert.assertEquals(1, snapshots.size());
Assert.assertEquals(snapshots.iterator().next(), snapshot1.getUuid());
final Collection<UUID> devices = rootSnapshot.getSnapshotDevicesUuid();
Assert.assertTrue(devices.isEmpty());
}
{ // snapshot1 has 1 snapshot and 0 device
final Collection<UUID> snapshots = snapshot1.getChildrenSnapshotsUuid();
Assert.assertEquals(1, snapshots.size());
Assert.assertEquals(snapshots.iterator().next(), snapshot2.getUuid());
final Collection<UUID> devices = snapshot1.getSnapshotDevicesUuid();
Assert.assertTrue(devices.isEmpty());
}
{ // snapshot2 has 0 snapshot and 1 device
final Collection<UUID> snapshots = snapshot2.getChildrenSnapshotsUuid();
Assert.assertTrue(snapshots.isEmpty());
final Collection<UUID> devices = snapshot2.getSnapshotDevicesUuid();
Assert.assertEquals(1, devices.size());
Assert.assertEquals(devices.iterator().next(), device1.getUuid());
}
// Resize device1
device1.setSize(size2).get();
Assert.assertEquals(size2, device1.getSize());
Assert.assertEquals(size1, snapshot1.getSize());
Assert.assertEquals(size1, snapshot2.getSize());
Assert.assertEquals(snapshot1.getUuid(), snapshot2.getParent());
Assert.assertEquals(snapshot2.getUuid(), device1.getParent());
{ // rootSnapshot has 1 snapshot and 0 device
final Collection<UUID> snapshots = rootSnapshot.getChildrenSnapshotsUuid();
Assert.assertEquals(1, snapshots.size());
Assert.assertEquals(snapshots.iterator().next(), snapshot1.getUuid());
final Collection<UUID> devices = rootSnapshot.getSnapshotDevicesUuid();
Assert.assertTrue(devices.isEmpty());
}
{ // snapshot1 has 1 snapshot and 0 device
final Collection<UUID> snapshots = snapshot1.getChildrenSnapshotsUuid();
Assert.assertEquals(1, snapshots.size());
Assert.assertEquals(snapshots.iterator().next(), snapshot2.getUuid());
final Collection<UUID> devices = snapshot1.getSnapshotDevicesUuid();
Assert.assertTrue(devices.isEmpty());
}
{ // snapshot2 has 0 snapshot and 1 device
final Collection<UUID> snapshots = snapshot2.getChildrenSnapshotsUuid();
Assert.assertTrue(snapshots.isEmpty());
final Collection<UUID> devices = snapshot2.getSnapshotDevicesUuid();
Assert.assertEquals(1, devices.size());
Assert.assertEquals(devices.iterator().next(), device1.getUuid());
}
// New snapshot of device1
final Snapshot snapshot3 = device1.createSnapshot("snap3").get();
Assert.assertEquals(size2, snapshot3.getSize());
Assert.assertEquals(size2, device1.getSize());
Assert.assertEquals(size1, snapshot1.getSize());
Assert.assertEquals(size1, snapshot2.getSize());
Assert.assertEquals(rootSnapshot.getUuid(), snapshot1.getParent());
Assert.assertEquals(snapshot1.getUuid(), snapshot2.getParent());
Assert.assertEquals(snapshot2.getUuid(), snapshot3.getParent());
Assert.assertEquals(snapshot3.getUuid(), device1.getParent());
{ // rootSnapshot has 1 snapshot and 0 device
final Collection<UUID> snapshots = rootSnapshot.getChildrenSnapshotsUuid();
Assert.assertEquals(1, snapshots.size());
Assert.assertEquals(snapshots.iterator().next(), snapshot1.getUuid());
final Collection<UUID> devices = rootSnapshot.getSnapshotDevicesUuid();
Assert.assertTrue(devices.isEmpty());
}
{ // snapshot1 has 1 snapshot and 0 device
final Collection<UUID> snapshots = snapshot1.getChildrenSnapshotsUuid();
Assert.assertEquals(1, snapshots.size());
Assert.assertEquals(snapshots.iterator().next(), snapshot2.getUuid());
final Collection<UUID> devices = snapshot1.getSnapshotDevicesUuid();
Assert.assertTrue(devices.isEmpty());
}
{ // snapshot2 has 1 snapshot and 0 device
final Collection<UUID> snapshots = snapshot2.getChildrenSnapshotsUuid();
Assert.assertEquals(1, snapshots.size());
Assert.assertEquals(snapshots.iterator().next(), snapshot3.getUuid());
final Collection<UUID> devices = snapshot2.getSnapshotDevicesUuid();
Assert.assertTrue(devices.isEmpty());
}
{ // snapshot3 has 0 snapshot and 1 device
final Collection<UUID> snapshots = snapshot3.getChildrenSnapshotsUuid();
Assert.assertTrue(snapshots.isEmpty());
final Collection<UUID> devices = snapshot3.getSnapshotDevicesUuid();
Assert.assertEquals(1, devices.size());
Assert.assertEquals(devices.iterator().next(), device1.getUuid());
}
// Delete snapshot1
snapshot1.delete().get();
Assert.assertEquals(size2, snapshot3.getSize());
Assert.assertEquals(size2, device1.getSize());
Assert.assertEquals(size1, snapshot1.getSize());
Assert.assertEquals(size1, snapshot2.getSize());
Assert.assertEquals(rootSnapshot.getUuid(), snapshot2.getParent());
Assert.assertEquals(snapshot2.getUuid(), snapshot3.getParent());
Assert.assertEquals(snapshot3.getUuid(), device1.getParent());
{ // rootSnapshot has 1 snapshot and 0 device
final Collection<UUID> snapshots = rootSnapshot.getChildrenSnapshotsUuid();
Assert.assertEquals(1, snapshots.size());
Assert.assertEquals(snapshots.iterator().next(), snapshot2.getUuid());
final Collection<UUID> devices = rootSnapshot.getSnapshotDevicesUuid();
Assert.assertTrue(devices.isEmpty());
}
{ // snapshot2 has 1 snapshot and 0 device
final Collection<UUID> snapshots = snapshot2.getChildrenSnapshotsUuid();
Assert.assertEquals(1, snapshots.size());
Assert.assertEquals(snapshots.iterator().next(), snapshot3.getUuid());
final Collection<UUID> devices = snapshot2.getSnapshotDevicesUuid();
Assert.assertTrue(devices.isEmpty());
}
{ // snapshot3 has 0 snapshot and 1 device
final Collection<UUID> snapshots = snapshot3.getChildrenSnapshotsUuid();
Assert.assertTrue(snapshots.isEmpty());
final Collection<UUID> devices = snapshot3.getSnapshotDevicesUuid();
Assert.assertEquals(1, devices.size());
Assert.assertEquals(devices.iterator().next(), device1.getUuid());
}
// Delete snapshot3
snapshot3.delete();
Assert.assertEquals(size2, snapshot3.getSize());
Assert.assertEquals(size2, device1.getSize());
Assert.assertEquals(size1, snapshot1.getSize());
Assert.assertEquals(size1, snapshot2.getSize());
Assert.assertEquals(rootSnapshot.getUuid(), snapshot2.getParent());
Assert.assertEquals(snapshot2.getUuid(), device1.getParent());
{ // rootSnapshot has 1 snapshot and 0 device
final Collection<UUID> snapshots = rootSnapshot.getChildrenSnapshotsUuid();
Assert.assertEquals(1, snapshots.size());
Assert.assertEquals(snapshots.iterator().next(), snapshot2.getUuid());
final Collection<UUID> devices = rootSnapshot.getSnapshotDevicesUuid();
Assert.assertTrue(devices.isEmpty());
}
{ // snapshot2 has 0 snapshot and 1 device
final Collection<UUID> snapshots = snapshot2.getChildrenSnapshotsUuid();
Assert.assertTrue(snapshots.isEmpty());
final Collection<UUID> devices = snapshot2.getSnapshotDevicesUuid();
Assert.assertEquals(1, devices.size());
Assert.assertEquals(devices.iterator().next(), device1.getUuid());
}
device1Uuid = device1.getUuid();
snapshot2Uuid = snapshot2.getUuid();
}
//
// Restart repository and check state
//
repository.stop(true);
repository.fini();
Thread.sleep(1000);
repository.init();
repository.start(true);
// Load new objects
rootSnapshot = repository.getRootSnapshot();
final Device device1 = repository.getDevice(device1Uuid);
final Snapshot snapshot2 = repository.getSnapshot(snapshot2Uuid);
Assert.assertEquals(size2, device1.getSize());
Assert.assertEquals(size1, snapshot2.getSize());
Assert.assertEquals(rootSnapshot.getUuid(), snapshot2.getParent());
Assert.assertEquals(snapshot2.getUuid(), device1.getParent());
{ // rootSnapshot has 1 snapshot and 0 device
final Collection<UUID> snapshots = rootSnapshot.getChildrenSnapshotsUuid();
Assert.assertEquals(1, snapshots.size());
Assert.assertEquals(snapshots.iterator().next(), snapshot2.getUuid());
final Collection<UUID> devices = rootSnapshot.getSnapshotDevicesUuid();
Assert.assertTrue(devices.isEmpty());
}
{ // snapshot2 has 0 snapshot and 1 device
final Collection<UUID> snapshots = snapshot2.getChildrenSnapshotsUuid();
Assert.assertTrue(snapshots.isEmpty());
final Collection<UUID> devices = snapshot2.getSnapshotDevicesUuid();
Assert.assertEquals(1, devices.size());
Assert.assertEquals(devices.iterator().next(), device1.getUuid());
}
}
/**
* Check the {@link NrsFile} created with a simplest history.
*
* @throws Exception
*/
@Test
public void testNrsFiles() throws Exception {
final long size1 = getDefaultBlockSize() * 512;
final long size2 = getDefaultBlockSize() * 12;
final Uuid snapshot1FileUuid;
{
// New device
final Device device1 = rootSnapshot.createDevice("D1", size1).get();
Assert.assertEquals(size1, device1.getSize());
Assert.assertEquals(rootSnapshot.getUuid(), device1.getParent());
{ // rootSnapshot has 0 snapshot and 1 device
final Collection<UUID> snapshots = rootSnapshot.getChildrenSnapshotsUuid();
Assert.assertTrue(snapshots.isEmpty());
final Collection<UUID> devices = rootSnapshot.getSnapshotDevicesUuid();
Assert.assertEquals(1, devices.size());
Assert.assertEquals(devices.iterator().next(), device1.getUuid());
}
// New snapshot
final NrsSnapshot snapshot1 = (NrsSnapshot) device1.createSnapshot("snap1").get();
Assert.assertEquals(size1, snapshot1.getSize());
Assert.assertEquals(device1.getParent(), snapshot1.getUuid());
Assert.assertEquals(rootSnapshot.getUuid(), snapshot1.getParent());
{ // rootSnapshot has 1 snapshot and 0 device
final Collection<UUID> snapshots = rootSnapshot.getChildrenSnapshotsUuid();
Assert.assertEquals(1, snapshots.size());
Assert.assertEquals(snapshots.iterator().next(), snapshot1.getUuid());
final Collection<UUID> devices = rootSnapshot.getSnapshotDevicesUuid();
Assert.assertTrue(devices.isEmpty());
}
{ // snapshot1 has 0 snapshot and 1 device
final Collection<UUID> snapshots = snapshot1.getChildrenSnapshotsUuid();
Assert.assertTrue(snapshots.isEmpty());
final Collection<UUID> devices = snapshot1.getSnapshotDevicesUuid();
Assert.assertEquals(1, devices.size());
Assert.assertEquals(devices.iterator().next(), device1.getUuid());
}
// Resize device1
device1.setSize(size2).get();
Assert.assertEquals(size2, device1.getSize());
Assert.assertEquals(size1, snapshot1.getSize());
Assert.assertEquals(device1.getParent(), snapshot1.getUuid());
Assert.assertEquals(rootSnapshot.getUuid(), snapshot1.getParent());
{ // rootSnapshot has 1 snapshot and 0 device
final Collection<UUID> snapshots = rootSnapshot.getChildrenSnapshotsUuid();
Assert.assertEquals(1, snapshots.size());
Assert.assertEquals(snapshots.iterator().next(), snapshot1.getUuid());
final Collection<UUID> devices = rootSnapshot.getSnapshotDevicesUuid();
Assert.assertTrue(devices.isEmpty());
}
{ // snapshot1 has 0 snapshot and 1 device
final Collection<UUID> snapshots = snapshot1.getChildrenSnapshotsUuid();
Assert.assertTrue(snapshots.isEmpty());
final Collection<UUID> devices = snapshot1.getSnapshotDevicesUuid();
Assert.assertEquals(1, devices.size());
Assert.assertEquals(devices.iterator().next(), device1.getUuid());
}
snapshot1FileUuid = VvrRemoteUtils.newTUuid(snapshot1.getNrsFileId());
}
// Get the NrsFile list
final List<NrsVersion> versions;
final Uuid nodeUuid = VvrRemoteUtils.newUuid(nodeId);
{
final RemoteOperation.Builder builder = RemoteOperation.newBuilder();
builder.setVersion(ProtocolVersion.VERSION_1);
builder.setType(Type.NRS);
builder.setOp(OpCode.LIST);
final RemoteOperation reply = (RemoteOperation) repository.handleMsg(builder.build());
Assert.assertSame(Type.NRS, reply.getType());
Assert.assertSame(OpCode.LIST, reply.getOp());
Assert.assertTrue(VvrRemoteUtils.equalsUuid(nodeUuid, reply.getSource()));
Assert.assertEquals(4, reply.getNrsVersionsCount());
versions = reply.getNrsVersionsList();
}
final Uuid rootSnapshotUuid = VvrRemoteUtils.newUuid(rootSnapshot.getUuid());
{
boolean rootFound = false;
boolean snapFound = false;
boolean unknownWritableFound = false;
int unknownCount = 0;
{
for (final NrsVersion version : versions) {
Assert.assertTrue(VvrRemoteUtils.equalsUuid(nodeUuid, version.getSource()));
Assert.assertEquals(0L, version.getVersion());
if (VvrRemoteUtils.equalsUuid(rootSnapshotUuid, version.getUuid())) {
Assert.assertFalse(rootFound);
rootFound = true;
Assert.assertFalse(version.getWritable());
}
else if (VvrRemoteUtils.equalsUuid(snapshot1FileUuid, version.getUuid())) {
Assert.assertFalse(snapFound);
snapFound = true;
Assert.assertFalse(version.getWritable());
}
else {
unknownCount++;
if (version.getWritable()) {
// Only the NrsFile after resize should be writable
Assert.assertFalse(unknownWritableFound);
unknownWritableFound = true;
}
}
}
}
// Found everything?
Assert.assertTrue(rootFound);
Assert.assertTrue(snapFound);
Assert.assertTrue(unknownWritableFound);
Assert.assertEquals(2, unknownCount);
}
}
@Test(expected = IllegalArgumentException.class)
public void testRootSnapshotCreateDeviceNullName() throws Throwable {
rootSnapshot.createDevice(null, 12345678);
}
@Test(expected = IllegalArgumentException.class)
public void testRootSnapshotCreateDeviceZeroSize() throws Throwable {
try {
rootSnapshot.createDevice("D1", 0);
}
catch (final Exception e) {
if (e.getCause() != null)
throw e.getCause();
}
}
@Test(expected = IllegalStateException.class)
public void testRootSnapshotCreateDeviceBadSize() throws Exception {
rootSnapshot.createDevice("D1", 256);
}
@Test(expected = IllegalArgumentException.class)
public void testRootSnapshotCreateDeviceNoSize() throws Throwable {
try {
rootSnapshot.createDevice("D1");
}
catch (final Exception e) {
if (e.getCause() != null)
throw e.getCause();
}
}
@Test(expected = NullPointerException.class)
public void testRootSnapshotCreateDeviceNullUuid1() throws Throwable {
rootSnapshot.createDevice("D1", (UUID) null);
}
@Test(expected = NullPointerException.class)
public void testRootSnapshotCreateDeviceNullUuid2() throws Throwable {
rootSnapshot.createDevice("D1", (UUID) null, 123456789);
}
@Test(expected = NullPointerException.class)
public void testRootSnapshotCreateDeviceNullUuid3() throws Throwable {
rootSnapshot.createDevice("D1", "description", (UUID) null);
}
@Test(expected = NullPointerException.class)
public void testRootSnapshotCreateDeviceNullUuid4() throws Throwable {
rootSnapshot.createDevice("D1", "description", (UUID) null, 123456789);
}
@Test(expected = IllegalStateException.class)
public void testRootSnapshotCreateDeviceDuplicateUuid() throws Throwable {
final UUID uuid1 = UUID.randomUUID();
final long size1 = getDefaultBlockSize() * 512;
// New device
final Device device1 = rootSnapshot.createDevice("D1", uuid1, size1).get();
Assert.assertEquals(size1, device1.getSize());
Assert.assertEquals(rootSnapshot.getUuid(), device1.getParent());
Assert.assertEquals(uuid1, device1.getUuid());
// Other device, same uuid
rootSnapshot.createDevice("D2", uuid1, size1).get();
}
@Test(expected = IllegalStateException.class)
public void testRootSnapshotCreateDeviceDuplicateUuidSnapshot() throws Throwable {
final long size1 = getDefaultBlockSize() * 512;
// New device
rootSnapshot.createDevice("D1", rootSnapshot.getUuid(), size1).get();
}
@Test
public void testCreateSnapshotUuid1() throws Throwable {
final long size1 = getDefaultBlockSize() * 512;
// New device
final Device device1 = rootSnapshot.createDevice("D1", size1).get();
Assert.assertEquals(size1, device1.getSize());
Assert.assertEquals(rootSnapshot.getUuid(), device1.getParent());
// New snapshot
final UUID uuid = UUID.randomUUID();
final Snapshot snapshot1 = device1.createSnapshot(uuid).get();
Assert.assertEquals(uuid, snapshot1.getUuid());
}
@Test
public void testCreateSnapshotUuid2() throws Throwable {
final long size1 = getDefaultBlockSize() * 512;
// New device
final Device device1 = rootSnapshot.createDevice("D1", size1).get();
Assert.assertEquals(size1, device1.getSize());
Assert.assertEquals(rootSnapshot.getUuid(), device1.getParent());
// New snapshot
final UUID uuid = UUID.randomUUID();
final Snapshot snapshot1 = device1.createSnapshot("snap1", uuid).get();
Assert.assertEquals("snap1", snapshot1.getName());
Assert.assertEquals(uuid, snapshot1.getUuid());
}
@Test(expected = IllegalStateException.class)
public void testCreateSnapshotDuplicateUuid() throws Throwable {
final long size1 = getDefaultBlockSize() * 512;
// New device
final Device device1 = rootSnapshot.createDevice("D1", size1).get();
Assert.assertEquals(size1, device1.getSize());
Assert.assertEquals(rootSnapshot.getUuid(), device1.getParent());
// New snapshot
final Snapshot snapshot1 = device1.createSnapshot("snap1").get();
// Other snapshot, same uuid
device1.createSnapshot("snap2", snapshot1.getUuid()).get();
}
@Test(expected = IllegalStateException.class)
public void testCreateSnapshotDuplicateUuidDevice() throws Throwable {
final long size1 = getDefaultBlockSize() * 512;
// New device
final Device device1 = rootSnapshot.createDevice("D1", size1).get();
Assert.assertEquals(size1, device1.getSize());
Assert.assertEquals(rootSnapshot.getUuid(), device1.getParent());
final Device device2 = rootSnapshot.createDevice("D2", size1).get();
// Other snapshot, same uuid as device
device1.createSnapshot(device2.getUuid()).get();
}
@Test
public void testCreateSnapshotsNoWait() throws Throwable {
// New device
final long size1 = getDefaultBlockSize() * 512;
final Device device1 = rootSnapshot.createDevice("D1", size1).get();
Assert.assertEquals(size1, device1.getSize());
Assert.assertEquals(rootSnapshot.getUuid(), device1.getParent());
final FutureSnapshot futureSnapshot1 = device1.createSnapshot();
final FutureSnapshot futureSnapshot2 = device1.createSnapshot();
// Wait for the end of the second one, the first should be done too
final Snapshot snapshot2 = futureSnapshot2.get();
Assert.assertTrue(futureSnapshot1.isDone());
final Snapshot snapshot1 = futureSnapshot1.get();
// Check history
Assert.assertEquals(snapshot1.getParent(), rootSnapshot.getUuid());
Assert.assertEquals(snapshot2.getParent(), snapshot1.getUuid());
Assert.assertEquals(device1.getParent(), snapshot2.getUuid());
}
@Test
public void testResizeDeviceNoWait() throws Throwable {
// New device
final long size1 = getDefaultBlockSize() * 512;
final Device device1 = rootSnapshot.createDevice("D1", size1).get();
Assert.assertEquals(size1, device1.getSize());
Assert.assertEquals(rootSnapshot.getUuid(), device1.getParent());
final FutureVoid futureVoid1 = device1.setSize(size1 * 2);
final FutureVoid futureVoid2 = device1.setSize(size1 * 3);
// Wait for the end of the second one, the first should be done too
futureVoid2.get();
Assert.assertTrue(futureVoid1.isDone());
// Check history and size
Assert.assertEquals(device1.getParent(), rootSnapshot.getUuid());
Assert.assertEquals(size1 * 3, device1.getSize());
}
@Test(expected = IllegalArgumentException.class)
public void testSnapshotCreateDeviceZeroSize() throws Throwable {
final long size1 = getDefaultBlockSize() * 512;
// New device
final Device device1 = rootSnapshot.createDevice("D1", size1).get();
Assert.assertEquals(size1, device1.getSize());
Assert.assertEquals(rootSnapshot.getUuid(), device1.getParent());
// New snapshot
final Snapshot snapshot1 = device1.createSnapshot("snap1").get();
try {
snapshot1.createDevice("D1", 0);
}
catch (final IllegalStateException e) {
if (e.getCause() != null)
throw e.getCause();
}
}
@Test
public void testSnapshotCreateDeviceNoSize() throws Throwable {
final long size1 = getDefaultBlockSize() * 512;
// New device
final Device device1 = rootSnapshot.createDevice("D1", size1).get();
Assert.assertEquals(size1, device1.getSize());
Assert.assertEquals(rootSnapshot.getUuid(), device1.getParent());
// New snapshot
final Snapshot snapshot1 = device1.createSnapshot("snap1").get();
snapshot1.createDevice("D1");
}
@Test(expected = IllegalStateException.class)
public void testSnapshotCreateDeviceBadSize() throws Exception {
final long size1 = getDefaultBlockSize() * 512;
// New device
final Device device1 = rootSnapshot.createDevice("D1", size1).get();
Assert.assertEquals(size1, device1.getSize());
Assert.assertEquals(rootSnapshot.getUuid(), device1.getParent());
// New snapshot
final Snapshot snapshot1 = device1.createSnapshot("snap1").get();
snapshot1.createDevice("D1", 256);
}
@Test(expected = NullPointerException.class)
public void testSnapshotCreateDeviceNullUuid1() throws Throwable {
final long size1 = getDefaultBlockSize() * 512;
// New device
final Device device1 = rootSnapshot.createDevice("D1", size1).get();
Assert.assertEquals(size1, device1.getSize());
Assert.assertEquals(rootSnapshot.getUuid(), device1.getParent());
// New snapshot
final Snapshot snapshot1 = device1.createSnapshot("snap1").get();
snapshot1.createDevice("D1", (UUID) null);
}
@Test(expected = NullPointerException.class)
public void testSnapshotCreateDeviceNullUuid2() throws Throwable {
final long size1 = getDefaultBlockSize() * 512;
// New device
final Device device1 = rootSnapshot.createDevice("D1", size1).get();
Assert.assertEquals(size1, device1.getSize());
Assert.assertEquals(rootSnapshot.getUuid(), device1.getParent());
// New snapshot
final Snapshot snapshot1 = device1.createSnapshot("snap1").get();
snapshot1.createDevice("D1", (UUID) null, 123456789);
}
@Test(expected = NullPointerException.class)
public void testSnapshotCreateDeviceNullUuid3() throws Throwable {
final long size1 = getDefaultBlockSize() * 512;
// New device
final Device device1 = rootSnapshot.createDevice("D1", size1).get();
Assert.assertEquals(size1, device1.getSize());
Assert.assertEquals(rootSnapshot.getUuid(), device1.getParent());
// New snapshot
final Snapshot snapshot1 = device1.createSnapshot("snap1").get();
snapshot1.createDevice("D1", "description", (UUID) null);
}
@Test(expected = NullPointerException.class)
public void testSnapshotCreateDeviceNullUuid4() throws Throwable {
final long size1 = getDefaultBlockSize() * 512;
// New device
final Device device1 = rootSnapshot.createDevice("D1", size1).get();
Assert.assertEquals(size1, device1.getSize());
Assert.assertEquals(rootSnapshot.getUuid(), device1.getParent());
// New snapshot
final Snapshot snapshot1 = device1.createSnapshot("snap1").get();
snapshot1.createDevice("D1", "description", (UUID) null, 123456789);
}
@Test(expected = IllegalStateException.class)
public void testSnapshotCreateDeviceDuplicateUuid() throws Throwable {
final long size1 = getDefaultBlockSize() * 512;
// New device
final Device device1 = rootSnapshot.createDevice("D1", size1).get();
Assert.assertEquals(size1, device1.getSize());
Assert.assertEquals(rootSnapshot.getUuid(), device1.getParent());
// New snapshot
final Snapshot snapshot1 = device1.createSnapshot("snap1").get();
// Other device, same uuid
snapshot1.createDevice("D2", device1.getUuid()).get();
}
@Test(expected = IllegalStateException.class)
public void testSnapshotCreateDeviceDuplicateUuidSnapshot() throws Throwable {
final long size1 = getDefaultBlockSize() * 512;
// New device
final Device device1 = rootSnapshot.createDevice("D1", size1).get();
Assert.assertEquals(size1, device1.getSize());
Assert.assertEquals(rootSnapshot.getUuid(), device1.getParent());
// New snapshots
final Snapshot snapshot1 = device1.createSnapshot("snap1").get();
final Snapshot snapshot2 = device1.createSnapshot("snap2").get();
// Other device, same uuid
snapshot1.createDevice("D2", "description", snapshot2.getUuid(), 123456789);
}
/**
* Create a device, giving its UUID.
*
* @throws Throwable
*/
@Test
public void testCreateDeviceUuid() throws Throwable {
final long size1 = getDefaultBlockSize() * 512;
{// New device
final UUID uuid1 = UUID.randomUUID();
final Device device1 = rootSnapshot.createDevice("D1", uuid1, size1).get();
Assert.assertEquals(size1, device1.getSize());
Assert.assertEquals(rootSnapshot.getUuid(), device1.getParent());
Assert.assertEquals(uuid1, device1.getUuid());
Assert.assertEquals("D1", device1.getName());
Assert.assertNull(device1.getDescription());
}
final Snapshot snapshot1;
{
final UUID uuid1 = UUID.randomUUID();
final Device device1 = rootSnapshot.createDevice("D1", "Descr", uuid1, size1).get();
Assert.assertEquals(size1, device1.getSize());
Assert.assertEquals(rootSnapshot.getUuid(), device1.getParent());
Assert.assertEquals(uuid1, device1.getUuid());
Assert.assertEquals("D1", device1.getName());
Assert.assertEquals("Descr", device1.getDescription());
// New snapshot
snapshot1 = device1.createSnapshot("snap1").get();
}
// Create device, not changing the size
{
final UUID uuid2 = UUID.randomUUID();
final Device device2 = snapshot1.createDevice("D1", uuid2).get();
Assert.assertEquals(size1, device2.getSize());
Assert.assertEquals(snapshot1.getUuid(), device2.getParent());
Assert.assertEquals(uuid2, device2.getUuid());
Assert.assertEquals("D1", device2.getName());
Assert.assertNull(device2.getDescription());
}
{
final UUID uuid2 = UUID.randomUUID();
final Device device2 = snapshot1.createDevice("D1", "description", uuid2).get();
Assert.assertEquals(size1, device2.getSize());
Assert.assertEquals(snapshot1.getUuid(), device2.getParent());
Assert.assertEquals(uuid2, device2.getUuid());
Assert.assertEquals("D1", device2.getName());
Assert.assertEquals("description", device2.getDescription());
}
}
@Test
public void testUserProperties() {
final String PROP1 = "the first property";
final String PROP2 = "the second property";
final String PROP3 = "the third property";
final String PROP4 = "not set property";
final String VAL11 = "the first value of property 1";
final String VAL12 = "the second value of property 1";
final String VAL2 = "value of property 2";
final String VAL3 = "value of property 3";
Assert.assertTrue(rootSnapshot.getUserProperties().isEmpty());
Assert.assertNull(rootSnapshot.getUserProperty(PROP1));
Assert.assertNull(rootSnapshot.getUserProperty(PROP2));
Assert.assertNull(rootSnapshot.getUserProperty(PROP3));
Assert.assertNull(rootSnapshot.getUserProperty(PROP4));
rootSnapshot.setUserProperties(PROP1, VAL11, PROP2, VAL2);
Assert.assertEquals(VAL11, rootSnapshot.getUserProperty(PROP1));
Assert.assertEquals(VAL2, rootSnapshot.getUserProperty(PROP2));
Assert.assertNull(rootSnapshot.getUserProperty(PROP3));
Assert.assertNull(rootSnapshot.getUserProperty(PROP4));
rootSnapshot.setUserProperties(PROP1, VAL12);
Assert.assertEquals(VAL12, rootSnapshot.getUserProperty(PROP1));
Assert.assertEquals(VAL2, rootSnapshot.getUserProperty(PROP2));
Assert.assertNull(rootSnapshot.getUserProperty(PROP3));
Assert.assertNull(rootSnapshot.getUserProperty(PROP4));
// Unsetting VAL12, which is not a user property should not fail
rootSnapshot.unsetUserProperties(PROP1, VAL12);
Assert.assertNull(rootSnapshot.getUserProperty(PROP1));
Assert.assertEquals(VAL2, rootSnapshot.getUserProperty(PROP2));
Assert.assertNull(rootSnapshot.getUserProperty(PROP3));
Assert.assertNull(rootSnapshot.getUserProperty(PROP4));
rootSnapshot.setUserProperties(PROP3, VAL3);
Assert.assertNull(rootSnapshot.getUserProperty(PROP1));
Assert.assertEquals(VAL2, rootSnapshot.getUserProperty(PROP2));
Assert.assertEquals(VAL3, rootSnapshot.getUserProperty(PROP3));
Assert.assertNull(rootSnapshot.getUserProperty(PROP4));
final Map<String, String> keyValues = rootSnapshot.getUserProperties();
Assert.assertEquals(VAL2, keyValues.remove(PROP2));
Assert.assertEquals(VAL3, keyValues.remove(PROP3));
Assert.assertEquals(0, keyValues.size());
}
@Test(expected = NullPointerException.class)
public void testUserPropertiesNull() {
rootSnapshot.setUserProperties((String[]) null);
}
@Test(expected = IllegalArgumentException.class)
public void testUserPropertiesEmpty() {
rootSnapshot.setUserProperties(new String[0]);
}
@Test(expected = IllegalArgumentException.class)
public void testUserPropertiesOdd1() {
final String PROP1 = "the first property";
Assert.assertNull(rootSnapshot.getUserProperty(PROP1));
// Odd number of key/value items
rootSnapshot.setUserProperties(PROP1);
}
@Test(expected = IllegalArgumentException.class)
public void testUserPropertiesOdd3() {
final String PROP1 = "the first property";
final String PROP2 = "the second property";
final String VAL1 = "the first value of property 1";
Assert.assertNull(rootSnapshot.getUserProperty(PROP1));
Assert.assertNull(rootSnapshot.getUserProperty(PROP2));
// Odd number of key/value items
rootSnapshot.setUserProperties(PROP1, VAL1, PROP2);
}
}