package org.ovirt.engine.core.vdsbroker.monitoring; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import static org.junit.Assume.assumeTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.util.Collections; import java.util.List; import org.junit.Before; import org.junit.experimental.theories.DataPoints; import org.junit.experimental.theories.Theories; import org.junit.experimental.theories.Theory; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VmDynamic; import org.ovirt.engine.core.common.vdscommands.VDSCommandType; import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; import org.ovirt.engine.core.common.vdscommands.VdsIdAndVdsVDSCommandParametersBase; import org.ovirt.engine.core.common.vdscommands.VdsIdVDSCommandParametersBase; import org.ovirt.engine.core.dal.dbbroker.DbFacade; import org.ovirt.engine.core.dao.VdsDao; import org.ovirt.engine.core.dao.VmDynamicDao; import org.ovirt.engine.core.vdsbroker.ResourceManager; import org.ovirt.engine.core.vdsbroker.VdsManager; @RunWith(Theories.class) public class VmsListFetcherTest { VmsListFetcher vmsListFetcher; @DataPoints public static VmTestPairs[] vms = VmTestPairs.values(); @Mock DbFacade dbFacade; @Mock VdsManager vdsManager; @Mock ResourceManager resourceManager; @Mock VdsDao vdsDao; @Mock private VmDynamicDao vmDynamicDao; @Captor ArgumentCaptor<List<VmDynamic>> vdsManagerArgumentCaptor; @Before public void setup() { MockitoAnnotations.initMocks(this); when(dbFacade.getVdsDao()).thenReturn(vdsDao); when(dbFacade.getVmDynamicDao()).thenReturn(vmDynamicDao); VDS vds = new VDS(); vds.setId(VmTestPairs.SRC_HOST_ID); when(vdsManager.getCopyVds()).thenReturn(vds); when(vdsManager.getVdsId()).thenReturn(vds.getId()); vmsListFetcher = new VmsListFetcher(vdsManager, dbFacade, resourceManager); } @Theory public void changedVms(VmTestPairs data) { //given stubCalls(data); //when assertTrue(vmsListFetcher.fetch()); assumeTrue(data.dbVm() != null); assumeTrue(data.vdsmVm() != null); assumeTrue(data.dbVm().getStatus() != data.vdsmVm().getVmDynamic().getStatus()); //then assertEquals(1, vmsListFetcher.getChangedVms().size()); assertSame(vmsListFetcher.getChangedVms().get(0).getFirst(), data.dbVm().getDynamicData()); } @Theory public void stableVms(VmTestPairs data) { //given stubCalls(data); //when assumeTrue(data.vdsmVm() != null); assumeTrue(data.dbVm() != null && data.dbVm().getStatus() == data.vdsmVm().getVmDynamic().getStatus()); //then assertTrue(vmsListFetcher.fetch()); assertTrue(vmsListFetcher.getChangedVms().isEmpty()); } @Theory public void lastVmListNotIncludingExternalVm(VmTestPairs data) { //given stubCalls(data); //when assertTrue(vmsListFetcher.fetch()); /* assume non external VM */ assumeTrue(data.vdsmVm() != null); assumeTrue(data.dbVm() != null); //then verify(vdsManager).setLastVmsList(vdsManagerArgumentCaptor.capture()); assertEquals(data.vdsmVm().getVmDynamic(), vdsManagerArgumentCaptor.getValue().get(0)); } @Theory public void externalVmAreNotSavedAsLastVm(VmTestPairs data) { //given stubCalls(data); //when assertTrue(vmsListFetcher.fetch()); /* assume external VM */ assumeTrue(data.vdsmVm() != null); assumeTrue(data.dbVm() == null); //then verify(vdsManager).setLastVmsList(vdsManagerArgumentCaptor.capture()); assertEquals(0, vdsManagerArgumentCaptor.getValue().size()); } @Theory public void callToVDSMFailed(VmTestPairs data) { // given stubFailedCalls(); assertFalse(vmsListFetcher.fetch()); } private void stubCalls(VmTestPairs data) { when(resourceManager.runVdsCommand( eq(VDSCommandType.List), any(VdsIdAndVdsVDSCommandParametersBase.class))). thenReturn(getVdsReturnValue(data.vdsmVm())); if (data.dbVm() != null) { when(vmDynamicDao.getAllRunningForVds(VmTestPairs.SRC_HOST_ID)). thenReturn(Collections.singletonList(data.dbVm().getDynamicData())); } if (data.vdsmVm() != null) { when(resourceManager.runVdsCommand( eq(VDSCommandType.GetVmStats), any(VdsIdVDSCommandParametersBase.class))). thenReturn(getStatsReturnValue(data.vdsmVm())); } } private VDSReturnValue getVdsReturnValue(VdsmVm vdsmVm) { VDSReturnValue value = new VDSReturnValue(); value.setSucceeded(true); if (vdsmVm != null) { value.setReturnValue( Collections.singletonMap( vdsmVm.getVmDynamic().getId(), vdsmVm)); } else { value.setReturnValue(Collections.emptyMap()); } return value; } private VDSReturnValue getStatsReturnValue(VdsmVm vdsmVm) { VDSReturnValue value = new VDSReturnValue(); value.setSucceeded(true); if (vdsmVm != null) { value.setReturnValue(vdsmVm); } else { value.setReturnValue(null); } return value; } private void stubFailedCalls() { when(resourceManager.runVdsCommand( any(VDSCommandType.class), any(VdsIdAndVdsVDSCommandParametersBase.class))). thenReturn(getFailedVdsReturnValue()); } private VDSReturnValue getFailedVdsReturnValue() { VDSReturnValue value = new VDSReturnValue(); value.setSucceeded(false); return value; } }