package org.ovirt.engine.core.bll.snapshots; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.when; import static org.ovirt.engine.core.bll.validator.ValidationResultMatchers.failsWith; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; 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.Snapshot.SnapshotStatus; import org.ovirt.engine.core.common.businessentities.Snapshot.SnapshotType; import org.ovirt.engine.core.common.errors.EngineMessage; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dao.SnapshotDao; @RunWith(MockitoJUnitRunner.class) public class SnapshotsValidatorTest { /** * The class being tested. */ @InjectMocks private SnapshotsValidator validator = new SnapshotsValidator(); @Mock private SnapshotDao snapshotDao; private Guid vmId; private Snapshot snapshot; @Before public void setUp() { vmId = Guid.newGuid(); snapshot = new Snapshot(); snapshot.setId(Guid.newGuid()); snapshot.setType(Snapshot.SnapshotType.REGULAR); } @Test public void vmNotDuringSnapshotReturnsInvalidResultWhenInSnapshot() throws Exception { when(snapshotDao.exists(vmId, SnapshotStatus.LOCKED)).thenReturn(true); validateInvalidResult(validator.vmNotDuringSnapshot(vmId), EngineMessage.ACTION_TYPE_FAILED_VM_IS_DURING_SNAPSHOT); } @Test public void vmNotDuringSnapshotReturnsValidForNoSnapshotInProgress() throws Exception { when(snapshotDao.exists(vmId, SnapshotStatus.LOCKED)).thenReturn(false); validateValidResult(validator.vmNotDuringSnapshot(vmId)); } @Test public void vmNotInPreviewReturnsInvalidResultWhenInSnapshot() throws Exception { when(snapshotDao.exists(vmId, SnapshotStatus.IN_PREVIEW)).thenReturn(true); validateInvalidResult(validator.vmNotInPreview(vmId), EngineMessage.ACTION_TYPE_FAILED_VM_IN_PREVIEW); } @Test public void vmNotInPreviewReturnsValidForNoSnapshotInProgress() throws Exception { when(snapshotDao.exists(vmId, SnapshotStatus.IN_PREVIEW)).thenReturn(false); validateValidResult(validator.vmNotInPreview(vmId)); } @Test public void snapshotExistsByGuidReturnsInvalidResultWhenNoSnapshot() throws Exception { when(snapshotDao.exists(vmId, snapshot.getId())).thenReturn(false); validateInvalidResult(validator.snapshotExists(vmId, snapshot.getId()), EngineMessage.ACTION_TYPE_FAILED_VM_SNAPSHOT_DOES_NOT_EXIST); } @Test public void snapshotExistsByGuidReturnsValidResultWhenSnapshotExists() throws Exception { when(snapshotDao.exists(vmId, snapshot.getId())).thenReturn(true); validateValidResult(validator.snapshotExists(vmId, snapshot.getId())); } @Test public void snapshotTypeSupported() throws Exception { snapshot.setType(SnapshotType.REGULAR); validateValidResult(validator.isRegularSnapshot(snapshot)); } @Test public void snapshotTypeNotSupported() throws Exception { snapshot.setType(SnapshotType.ACTIVE); validateInvalidResult(validator.isRegularSnapshot(snapshot), EngineMessage.ACTION_TYPE_FAILED_VM_SNAPSHOT_TYPE_NOT_REGULAR); } @Test public void snapshotExistsBySnapshotReturnsInvalidResultWhenNoSnapshot() throws Exception { validateInvalidResult(validator.snapshotExists(null), EngineMessage.ACTION_TYPE_FAILED_VM_SNAPSHOT_DOES_NOT_EXIST); } @Test public void snapshotExistsBySnapshotReturnsValidResultWhenSnapshotExists() throws Exception { validateValidResult(validator.snapshotExists(snapshot)); } /** * Validate that the given result is valid. * * @param validationResult * The result. */ private static void validateValidResult(ValidationResult validationResult) { validateResult(validationResult, true, null); } /** * Validate that the given result is invalid and contains the given message. * * @param validationResult * The result. * @param message * The error to expect. */ private static void validateInvalidResult(ValidationResult validationResult, EngineMessage message) { validateResult(validationResult, false, message); } /** * Validate that the result is as expected. * * @param validationResult * The result. * @param isValid * Should be valid or not? * @param message * The error to expect. */ private static void validateResult(ValidationResult validationResult, boolean isValid, EngineMessage message) { assertEquals(isValid, validationResult.isValid()); if (!isValid) { assertThat(validationResult, failsWith(message)); } } }