package org.ovirt.engine.core.bll.validator; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.any; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.when; import java.util.Date; import java.util.LinkedList; import java.util.List; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.Spy; import org.mockito.junit.MockitoJUnitRunner; import org.ovirt.engine.core.bll.interfaces.BackendInternal; import org.ovirt.engine.core.bll.pm.FenceProxyLocator; import org.ovirt.engine.core.common.businessentities.Cluster; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.pm.FenceAgent; import org.ovirt.engine.core.common.config.ConfigValues; import org.ovirt.engine.core.compat.DateTime; import org.ovirt.engine.core.compat.Version; import org.ovirt.engine.core.utils.MockConfigRule; @RunWith(MockitoJUnitRunner.class) public class FenceValidatorTest { @Rule public MockConfigRule mcr = new MockConfigRule(); @Spy private FenceValidator validator; @Mock private FenceProxyLocator proxyLocator; @Mock private BackendInternal backend; @Before public void setup() { doReturn(proxyLocator).when(validator).getProxyLocator(any(VDS.class)); doReturn(backend).when(validator).getBackend(); } @Test public void failWhenProxyHostNotAvailable() { when(proxyLocator.isProxyHostAvailable()).thenReturn(false); List<String> messages = new LinkedList<>(); boolean result = validator.isProxyHostAvailable(new VDS(), messages); assertFalse(result); assertEquals(1, messages.size()); assertEquals("VDS_NO_VDS_PROXY_FOUND", messages.get(0)); } @Test public void succeedWhenProxyHostAvailable() { when(proxyLocator.isProxyHostAvailable()).thenReturn(true); List<String> messages = new LinkedList<>(); boolean result = validator.isProxyHostAvailable(new VDS(), messages); assertTrue(result); assertTrue(messages.isEmpty()); } @Test public void failWhenHostDoesNotExist() { List<String> messages = new LinkedList<>(); boolean result = validator.isHostExists(null, messages); assertFalse(result); assertEquals(1, messages.size()); assertEquals("ACTION_TYPE_FAILED_HOST_NOT_EXIST", messages.get(0)); } @Test public void succeedWhenHostExists() { List<String> messages = new LinkedList<>(); boolean result = validator.isHostExists(new VDS(), messages); assertTrue(result); assertTrue(messages.isEmpty()); } @Test public void failWhenStartupTimeoutHasNotPassed() { List<String> messages = new LinkedList<>(); mcr.mockConfigValue(ConfigValues.DisableFenceAtStartupInSec, 5); when(backend.getStartedAt()).thenReturn(new DateTime(new Date())); boolean result = validator.isStartupTimeoutPassed(messages); assertEquals(1, messages.size()); assertEquals("VDS_FENCE_DISABLED_AT_SYSTEM_STARTUP_INTERVAL", messages.get(0)); assertFalse(result); } @Test public void succeedWhenStartupTimeoutHasPassed() { List<String> messages = new LinkedList<>(); mcr.mockConfigValue(ConfigValues.DisableFenceAtStartupInSec, 5); when(backend.getStartedAt()).thenReturn(new DateTime(new Date().getTime() - 20000)); boolean result = validator.isStartupTimeoutPassed(messages); assertTrue(result); } @Test public void failWhenPowerManagementDisabled() { VDS vds = new VDS(); List<String> messages = new LinkedList<>(); boolean result = validator.isPowerManagementEnabledAndLegal(vds, null, messages); assertFalse(result); assertEquals(1, messages.size()); assertEquals("VDS_FENCE_DISABLED", messages.get(0)); } @Test public void failWhenNoAgentsExist() { VDS vds = new VDS(); vds.setPmEnabled(true); List<String> messages = new LinkedList<>(); boolean result = validator.isPowerManagementEnabledAndLegal(vds, null, messages); assertFalse(result); assertEquals(2, messages.size()); assertTrue(messages.contains("ACTION_TYPE_FAILED_PM_ENABLED_WITHOUT_AGENT")); assertTrue(messages.contains("VDS_FENCE_DISABLED")); } @Test public void failWhenClusterVersionNotCompatible() { VDS vds = new VDS(); vds.setPmEnabled(true); Cluster cluster = new Cluster(); cluster.setCompatibilityVersion(Version.getLast()); FenceAgent agent = new FenceAgent(); agent.setType("Some_Type"); vds.getFenceAgents().add(agent); List<String> messages = new LinkedList<>(); boolean result = validator.isPowerManagementEnabledAndLegal(vds, cluster, messages); assertFalse(result); assertEquals(2, messages.size()); assertTrue(messages.contains("ACTION_TYPE_FAILED_AGENT_NOT_SUPPORTED")); assertTrue(messages.contains("VDS_FENCE_DISABLED")); } @Test public void succeedWhenClusterVersionCompatible() { VDS vds = new VDS(); vds.setPmEnabled(true); Cluster cluster = new Cluster(); cluster.setCompatibilityVersion(Version.getLast()); FenceAgent agent = new FenceAgent(); agent.setType("apc"); vds.getFenceAgents().add(agent); List<String> messages = new LinkedList<>(); mcr.mockConfigValue(ConfigValues.VdsFenceType, Version.getLast(), "apc"); mcr.mockConfigValue(ConfigValues.CustomVdsFenceType, Version.getLast(), "apc"); boolean result = validator.isPowerManagementEnabledAndLegal(vds, cluster, messages); assertTrue(result); } }