package org.ovirt.engine.core.bll.network.vm;
import static org.hamcrest.Matchers.empty;
import static org.hamcrest.Matchers.hasItem;
import static org.hamcrest.Matchers.hasKey;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.hamcrest.Matcher;
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.bll.network.macpool.MacPoolPerCluster;
import org.ovirt.engine.core.bll.network.macpool.ReadMacPool;
import org.ovirt.engine.core.bll.network.vm.mac.VmMacsValidation;
import org.ovirt.engine.core.bll.network.vm.mac.VmMacsValidationsFactory;
import org.ovirt.engine.core.common.businessentities.VM;
import org.ovirt.engine.core.common.errors.EngineMessage;
import org.ovirt.engine.core.common.queries.ValidateVmMacsParameters;
import org.ovirt.engine.core.common.queries.VdcQueryReturnValue;
import org.ovirt.engine.core.compat.Guid;
@RunWith(MockitoJUnitRunner.class)
public class ValidateVmMacsQueryTest {
private static final Guid CLUSTER_ID = Guid.newGuid();
private static final Guid VM_ID1 = Guid.newGuid();
private static final Guid VM_ID2 = Guid.newGuid();
private static final String REPLACEMENT1 = "replacement1";
private static final String REPLACEMENT2 = "replacement2";
private static final List<String> VALIDATION_MESSAGES =
Arrays.asList(EngineMessage.Unassigned.name(), REPLACEMENT1, REPLACEMENT2);
@Mock
private MacPoolPerCluster macPoolPerCluster;
@Mock
private VmMacsValidationsFactory vmMacsValidationsFactory;
@Mock
private ReadMacPool readMacPool;
@Mock
private VmMacsValidation vmMacsValidation;
private final HashMap<Guid, List<VM>> vmsByCluster = new HashMap<>();
private final List<VM> vms = new ArrayList<>();
private ValidateVmMacsParameters params = new ValidateVmMacsParameters(vmsByCluster);
@InjectMocks
private ValidateVmMacsQuery<ValidateVmMacsParameters> underTest = new ValidateVmMacsQuery<>(params);
@Before
public void setUp() {
vmsByCluster.put(CLUSTER_ID, vms);
when(macPoolPerCluster.getMacPoolForCluster(CLUSTER_ID)).thenReturn(readMacPool);
when(vmMacsValidationsFactory.createVmMacsValidationList(CLUSTER_ID, readMacPool))
.thenReturn(Collections.singletonList(vmMacsValidation));
}
@Test
public void testExecuteQueryCommand() {
final VM vm1 = createVm(VM_ID1);
final VM vm2 = createVm(VM_ID2);
vms.add(vm1);
vms.add(vm2);
when(vmMacsValidation.validate(vm2))
.thenReturn(new ValidationResult(EngineMessage.Unassigned, REPLACEMENT1, REPLACEMENT2));
underTest.executeQueryCommand();
final VdcQueryReturnValue queryReturnValue = underTest.getQueryReturnValue();
final Map<Guid, List<List<String>>> actual = queryReturnValue.getReturnValue();
assertValidVmInOutput(actual, VM_ID1);
assertInvalidVmInOutput(actual, VM_ID2, VALIDATION_MESSAGES);
}
private void assertInvalidVmInOutput(Map<Guid, List<List<String>>> returnValue,
Guid vmId,
List<String> validationMessages) {
assertVmInOutput(returnValue, vmId, hasItem(validationMessages));
}
private VM createVm(Guid vmId) {
final VM vm = new VM();
vm.setId(vmId);
return vm;
}
private void assertValidVmInOutput(Map<Guid, List<List<String>>> returnValue, Guid vmId) {
assertVmInOutput(returnValue, vmId, empty());
}
private void assertVmInOutput(Map<Guid, List<List<String>>> returnValue,
Guid vmId,
Matcher violationsMatcher) {
assertThat(returnValue, hasKey(vmId));
final List<List<String>> vmViolations = returnValue.get(vmId);
assertThat(vmViolations, violationsMatcher);
}
}