package org.ovirt.engine.core.bll.provider;
import static org.hamcrest.CoreMatchers.both;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.CoreMatchers.hasItem;
import static org.junit.Assert.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
import static org.ovirt.engine.core.bll.validator.ValidationResultMatchers.failsWith;
import static org.ovirt.engine.core.bll.validator.ValidationResultMatchers.isValid;
import static org.ovirt.engine.core.bll.validator.ValidationResultMatchers.replacements;
import java.util.ArrayList;
import java.util.List;
import org.hamcrest.Matcher;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.ovirt.engine.core.bll.ValidationResult;
import org.ovirt.engine.core.bll.provider.RemoveProviderCommand.RemoveProviderValidator;
import org.ovirt.engine.core.bll.validator.NetworkValidator;
import org.ovirt.engine.core.common.businessentities.Provider;
import org.ovirt.engine.core.common.businessentities.network.Network;
import org.ovirt.engine.core.common.errors.EngineMessage;
import org.ovirt.engine.core.dao.VmDao;
import org.ovirt.engine.core.dao.network.NetworkDao;
@RunWith(MockitoJUnitRunner.class)
public class RemoveProviderValidatorTest {
@Mock
private Provider<?> provider;
private List<Network> networks = new ArrayList<>();
private RemoveProviderValidator validator;
@Mock
private NetworkDao networkDao;
@Mock
private VmDao vmDao;
/* --- Set up for tests --- */
@Before
public void setUp() throws Exception {
validator = spy(new RemoveProviderValidator(vmDao, networkDao, provider));
when(networkDao.getAllForProvider(any())).thenReturn(networks);
}
@Test
public void networksNotUsedWhenNoNetworks() throws Exception {
assertThat(validator.providerNetworksNotUsed(), isValid());
}
private Network mockNetwork() {
Network net = mock(Network.class);
when(net.getName()).thenReturn("net");
networks.add(net);
return net;
}
private void networksUsedTest(boolean vmsNotUsingNetwork,
boolean templatesNotUsingNetwork,
Matcher<ValidationResult> matcher) {
NetworkValidator networkValidator = mock(NetworkValidator.class);
for (Network network : networks) {
when(validator.getValidator(network)).thenReturn(networkValidator);
}
when(networkValidator.networkNotUsedByVms()).thenReturn(createValidationResult(vmsNotUsingNetwork));
when(networkValidator.networkNotUsedByTemplates()).thenReturn(createValidationResult(templatesNotUsingNetwork));
assertThat(validator.providerNetworksNotUsed(), matcher);
}
private ValidationResult createValidationResult(boolean valid) {
return valid ? ValidationResult.VALID : new ValidationResult(EngineMessage.Unassigned);
}
@Test
public void networksNotUsedByVmsNorTemplates() throws Exception {
mockNetwork();
networksUsedTest(true, true, isValid());
}
@Test
public void networksUsedByAVm() throws Exception {
Network net = mockNetwork();
networksUsedTest(
false,
true,
both(failsWith(EngineMessage.ACTION_TYPE_FAILED_PROVIDER_NETWORKS_USED_ONCE))
.and(replacements(hasItem(containsString(net.getName())))));
}
@Test
public void networksUsedByAVmMultipleNetworks() throws Exception {
Network net = mockNetwork();
Network net2 = mockNetwork();
networksUsedTest(
false,
true,
both(failsWith(EngineMessage.ACTION_TYPE_FAILED_PROVIDER_NETWORKS_USED_MULTIPLE_TIMES))
.and(replacements(hasItem(containsString(net.getName()))))
.and(replacements(hasItem(containsString(net2.getName())))));
}
@Test
public void networksUsedByATemplate() throws Exception {
Network net = mockNetwork();
networksUsedTest(
false,
true,
both(failsWith(EngineMessage.ACTION_TYPE_FAILED_PROVIDER_NETWORKS_USED_ONCE))
.and(replacements(hasItem(containsString(net.getName())))));
}
@Test
public void networksUsedByATemplateMultipleNetworks() throws Exception {
Network net = mockNetwork();
Network net2 = mockNetwork();
networksUsedTest(
false,
true,
both(failsWith(EngineMessage.ACTION_TYPE_FAILED_PROVIDER_NETWORKS_USED_MULTIPLE_TIMES))
.and(replacements(hasItem(containsString(net.getName()))))
.and(replacements(hasItem(containsString(net2.getName())))));
}
}