package org.ovirt.engine.core.bll.validator.storage;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
import static org.ovirt.engine.core.bll.validator.ValidationResultMatchers.failsWith;
import static org.ovirt.engine.core.bll.validator.ValidationResultMatchers.isValid;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.ovirt.engine.core.bll.ValidationResult;
import org.ovirt.engine.core.common.businessentities.Snapshot;
import org.ovirt.engine.core.common.businessentities.storage.DiskImage;
import org.ovirt.engine.core.common.businessentities.storage.ImageStatus;
import org.ovirt.engine.core.common.errors.EngineMessage;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dao.DiskImageDao;
import org.ovirt.engine.core.dao.SnapshotDao;
@RunWith(MockitoJUnitRunner.class)
public class DiskSnapshotsValidatorTest {
private DiskImage disk1;
private DiskImage disk2;
private DiskSnapshotsValidator validator;
@Mock
private DiskImageDao diskImageDao;
@Mock
private SnapshotDao snapshotDao;
@Before
public void setUp() {
disk1 = createDisk();
disk1.setDiskAlias("disk1");
disk2 = createDisk();
disk2.setDiskAlias("disk2");
validator = spy(new DiskSnapshotsValidator(Arrays.asList(disk1, disk2)));
doReturn(diskImageDao).when(validator).getDiskImageDao();
doReturn(snapshotDao).when(validator).getSnapshotDao();
}
private static DiskImage createDisk() {
DiskImage disk = new DiskImage();
disk.setImageId(Guid.newGuid());
disk.setActive(true);
disk.setImageStatus(ImageStatus.OK);
ArrayList<Guid> storageDomainIds = new ArrayList<>();
storageDomainIds.add(Guid.newGuid());
disk.setStorageIds(storageDomainIds);
return disk;
}
@Test
public void diskSnapshotsExist() {
assertEquals(ValidationResult.VALID,
validator.diskSnapshotsNotExist(Arrays.asList(disk1.getImageId(), disk2.getImageId())));
}
@Test
public void diskSnapshotsDontExist() {
assertThat(validator.diskSnapshotsNotExist(Collections.singletonList(Guid.newGuid())),
failsWith(EngineMessage.ACTION_TYPE_FAILED_DISK_SNAPSHOTS_NOT_EXIST));
}
@Test
public void diskImagesBelongToSameImageGroup() {
Guid imageGroupId = Guid.newGuid();
disk1.setId(imageGroupId);
disk2.setId(imageGroupId);
assertThat(validator.diskImagesBelongToSameImageGroup(), isValid());
}
@Test
public void diskImagesDontBelongToSameImageGroup() {
disk1.setId(Guid.newGuid());
disk2.setId(Guid.newGuid());
assertThat(validator.diskImagesBelongToSameImageGroup(),
failsWith(EngineMessage.ACTION_TYPE_FAILED_DISKS_SNAPSHOTS_DONT_BELONG_TO_SAME_DISK));
}
@Test
public void allImagesAreSnapshots() {
disk1.setActive(false);
disk2.setActive(false);
assertThat(validator.imagesAreSnapshots(), isValid());
}
@Test
public void notAllImagesAreSnapshots() {
disk1.setActive(true);
disk2.setActive(false);
assertThat(validator.imagesAreSnapshots(),
failsWith(EngineMessage.ACTION_TYPE_FAILED_DISK_SNAPSHOTS_ACTIVE));
}
@Test
public void diskSnapshotsCanBePreviewed() {
Snapshot activeSnapshot = getActiveSnapshot();
when(snapshotDao.get(any(Guid.class))).thenReturn(activeSnapshot);
assertThat(validator.canDiskSnapshotsBePreviewed(activeSnapshot.getId()), isValid());
}
@Test
public void diskSnapshotsCannotBePreviewed() {
Snapshot activeSnapshot = getActiveSnapshot();
when(snapshotDao.get(any(Guid.class))).thenReturn(activeSnapshot);
when(diskImageDao.get(disk1.getImageId())).thenReturn(disk1);
when(diskImageDao.get(disk2.getImageId())).thenReturn(disk2);
assertThat(validator.canDiskSnapshotsBePreviewed(activeSnapshot.getId()),
failsWith(EngineMessage.CANNOT_PREVIEW_ACTIVE_SNAPSHOT));
}
private Snapshot getActiveSnapshot() {
Snapshot snapshot = new Snapshot();
snapshot.setId(Guid.newGuid());
snapshot.setType(Snapshot.SnapshotType.ACTIVE);
return snapshot;
}
}