package org.ovirt.engine.core.bll.storage;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyBoolean;
import static org.powermock.api.mockito.PowerMockito.doReturn;
import static org.powermock.api.mockito.PowerMockito.spy;
import static org.powermock.api.mockito.PowerMockito.when;
import org.junit.Before;
import org.junit.Test;
import org.ovirt.engine.core.common.action.StorageDomainParametersBase;
import org.ovirt.engine.core.common.businessentities.StorageDomainStatus;
import org.ovirt.engine.core.common.businessentities.storage_domains;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.compat.NGuid;
import org.ovirt.engine.core.dal.VdcBllMessages;
public class StorageDomainCommandBaseTest {
public StorageDomainCommandBase<StorageDomainParametersBase> cmd;
@Before
public void setUp() {
createTestCommand();
}
@Test
public void statusMatches() {
storageDomainIsInactive();
assertTrue(cmd.checkStorageDomainStatus(StorageDomainStatus.InActive));
assertFalse(commandHasInvalidStatusMessage());
}
@Test
public void statusNotMatch() {
storageDomainIsInactive();
assertFalse(cmd.checkStorageDomainStatus(StorageDomainStatus.Active));
assertTrue(commandHasInvalidStatusMessage());
}
@Test
public void statusInList() {
storageDomainIsInactive();
assertTrue(cmd.checkStorageDomainStatus(StorageDomainStatus.Locked, StorageDomainStatus.InActive,
StorageDomainStatus.Unknown));
assertFalse(commandHasInvalidStatusMessage());
}
@Test
public void statusNotInList() {
storageDomainIsInactive();
assertFalse(cmd.checkStorageDomainStatus(StorageDomainStatus.Locked, StorageDomainStatus.Active,
StorageDomainStatus.Unknown));
assertTrue(commandHasInvalidStatusMessage());
}
@Test
public void activeDomain() {
doReturn(true).when(cmd).IsDomainActive(any(Guid.class), any(NGuid.class));
assertTrue(cmd.IsDomainActive(Guid.NewGuid(), Guid.NewGuid()));
}
@Test
public void canDetachInactiveDomain() {
storageDomainIsInactive();
storagePoolExists();
masterDomainIsUp();
isNotLocalData();
canDetachDomain();
assertTrue(cmd.canDetachDomain(false, false, false));
}
@Test
public void canDetachMaintenanceDomain() {
storageDomainIsMaintenance();
storagePoolExists();
masterDomainIsUp();
isNotLocalData();
canDetachDomain();
assertTrue(cmd.canDetachDomain(false, false, false));
}
private void storagePoolExists() {
when(cmd.CheckStoragePool()).thenReturn(true);
}
private void masterDomainIsUp() {
doReturn(true).when(cmd).CheckMasterDomainIsUp();
}
private void isNotLocalData() {
doReturn(true).when(cmd).isNotLocalData(anyBoolean());
}
private void canDetachDomain() {
doReturn(true).when(cmd).isDetachAllowed(anyBoolean());
}
private boolean commandHasInvalidStatusMessage() {
return cmd.getReturnValue().getCanDoActionMessages().contains(
VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_DOMAIN_STATUS_ILLEGAL.toString());
}
private void storageDomainIsInactive() {
storage_domains domain = new storage_domains();
domain.setstatus(StorageDomainStatus.InActive);
when(cmd.getStorageDomain()).thenReturn(domain);
}
private void storageDomainIsMaintenance() {
storage_domains domain = new storage_domains();
domain.setstatus(StorageDomainStatus.Maintenance);
when(cmd.getStorageDomain()).thenReturn(domain);
}
private void createTestCommand() {
StorageDomainParametersBase parameters = new StorageDomainParametersBase();
cmd = spy(new TestStorageCommandBase(parameters));
}
class TestStorageCommandBase extends StorageDomainCommandBase<StorageDomainParametersBase> {
public TestStorageCommandBase(StorageDomainParametersBase parameters) {
super(parameters);
}
@Override
protected void executeCommand() {
}
}
}