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.MockitoAnnotations.initMocks;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
import static org.powermock.api.mockito.PowerMockito.when;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.ovirt.engine.core.common.action.StorageDomainPoolParametersBase;
import org.ovirt.engine.core.common.businessentities.StorageDomainStatus;
import org.ovirt.engine.core.common.businessentities.StoragePoolStatus;
import org.ovirt.engine.core.common.businessentities.storage_domains;
import org.ovirt.engine.core.common.businessentities.storage_pool;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dal.VdcBllMessages;
import org.ovirt.engine.core.dal.dbbroker.DbFacade;
import org.ovirt.engine.core.dao.StorageDomainDAO;
import org.ovirt.engine.core.dao.StoragePoolDAO;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
@PrepareForTest({DbFacade.class})
@RunWith(PowerMockRunner.class)
public class ActivateStorageDomainCommandTest {
@Mock DbFacade dbFacade;
@Mock StorageDomainDAO storageDomainDAO;
@Mock StoragePoolDAO storagePoolDAO;
private ActivateStorageDomainCommand cmd;
@Before
public void setUp() {
initMocks(this);
mockStatic(DbFacade.class);
when(DbFacade.getInstance()).thenReturn(dbFacade);
when(dbFacade.getStorageDomainDAO()).thenReturn(storageDomainDAO);
when(dbFacade.getStoragePoolDAO()).thenReturn(storagePoolDAO);
}
@Test
public void internalLockedAllowed() {
testInternalExecution(StorageDomainStatus.Locked);
canDoActionSucceeds();
noIllegalStatusMessage();
}
@Test
public void nonInternalLockedDisallowed() {
testExecution(StorageDomainStatus.Locked);
canDoActionFails();
hasIllegalStatusMessage();
}
@Test
public void internalInactiveAllowed() {
testInternalExecution(StorageDomainStatus.InActive);
canDoActionSucceeds();
noIllegalStatusMessage();
}
@Test
public void nonInternalInactiveAllowed() {
testExecution(StorageDomainStatus.InActive);
canDoActionSucceeds();
noIllegalStatusMessage();
}
@Test
public void activeDisallowed() {
testExecution(StorageDomainStatus.Active);
canDoActionFails();
hasIllegalStatusMessage();
}
@Test
public void internalActiveDisallowed() {
testInternalExecution(StorageDomainStatus.Active);
canDoActionFails();
hasIllegalStatusMessage();
}
@Test
public void internalUnknownAllowed() {
testInternalExecution(StorageDomainStatus.Unknown);
canDoActionSucceeds();
noIllegalStatusMessage();
}
@Test
public void nonInternalUnknownAllowed() {
testExecution(StorageDomainStatus.Unknown);
canDoActionSucceeds();
noIllegalStatusMessage();
}
@Test
public void internalMaintenanceAllowed() {
testInternalExecution(StorageDomainStatus.Maintenance);
canDoActionSucceeds();
noIllegalStatusMessage();
}
@Test
public void nonInternalMaintenanceAllowed() {
testExecution(StorageDomainStatus.Maintenance);
canDoActionSucceeds();
noIllegalStatusMessage();
}
private void testInternalExecution(StorageDomainStatus status) {
testExecution(status);
setIsInternal();
}
private void testExecution(StorageDomainStatus status) {
createStorageDomain(status);
createUpStoragePool();
createCommand();
}
private void createStorageDomain(StorageDomainStatus status) {
storage_domains domain = new storage_domains();
domain.setstatus(status);
domain.setid(Guid.NewGuid());
when(storageDomainDAO.get(any(Guid.class))).thenReturn(domain);
when(storageDomainDAO.getForStoragePool(any(Guid.class), any(Guid.class))).thenReturn(domain);
}
private void createUpStoragePool() {
storage_pool pool = new storage_pool();
pool.setId(Guid.NewGuid());
pool.setstatus(StoragePoolStatus.Up);
when(storagePoolDAO.get(any(Guid.class))).thenReturn(pool);
}
private void createCommand() {
StorageDomainPoolParametersBase params = new StorageDomainPoolParametersBase();
params.setStorageDomainId(Guid.NewGuid());
params.setStoragePoolId(Guid.NewGuid());
cmd = new ActivateStorageDomainCommand(params);
}
private void canDoActionSucceeds() {
assertTrue(cmd.canDoAction());
}
private void canDoActionFails() {
assertFalse(cmd.canDoAction());
}
private void noIllegalStatusMessage() {
assertFalse(cmd.getReturnValue().getCanDoActionMessages().contains(
VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_DOMAIN_STATUS_ILLEGAL.toString()));
}
private void hasIllegalStatusMessage() {
assertTrue(cmd.getReturnValue().getCanDoActionMessages().contains(
VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_DOMAIN_STATUS_ILLEGAL.toString()));
}
private void setIsInternal() {
cmd.setInternalExecution(true);
}
}