package org.ovirt.engine.core.bll.network.dc;
import static org.junit.Assert.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doReturn;
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 java.util.ArrayList;
import java.util.List;
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.network.dc.AddNetworkCommand.AddNetworkValidator;
import org.ovirt.engine.core.common.businessentities.network.Network;
import org.ovirt.engine.core.common.businessentities.network.ProviderNetwork;
import org.ovirt.engine.core.common.errors.EngineMessage;
import org.ovirt.engine.core.dal.dbbroker.DbFacade;
import org.ovirt.engine.core.dao.VmDao;
import org.ovirt.engine.core.dao.network.NetworkDao;
import org.ovirt.engine.core.utils.RandomUtils;
@RunWith(MockitoJUnitRunner.class)
public class AddNetworkValidatorTest {
@Mock
private Network network;
@Mock
private DbFacade dbFacade;
@Mock
private NetworkDao networkDao;
@Mock
private VmDao vmDao;
private List<Network> networks = new ArrayList<>();
private AddNetworkValidator validator;
@Before
public void setup() {
validator = spy(new AddNetworkValidator(vmDao, network));
// spy on attempts to access the database
doReturn(dbFacade).when(validator).getDbFacade();
// mock some commonly used Daos
when(dbFacade.getNetworkDao()).thenReturn(networkDao);
// mock their getters
when(networkDao.getAllForDataCenter(any())).thenReturn(networks);
}
private void externalNetworkNewInDataCenterTestSetup(boolean equalToNetwork) {
Network externalNetwork = mock(Network.class);
ProviderNetwork providerNetwork = mock(ProviderNetwork.class);
when(network.getProvidedBy()).thenReturn(providerNetwork);
if (equalToNetwork) {
when(externalNetwork.getProvidedBy()).thenReturn(providerNetwork);
}
networks.add(externalNetwork);
}
@Test
public void externalNetworkIsNewInDataCenterNoNetworks() throws Exception {
assertThat(validator.externalNetworkNewInDataCenter(), isValid());
}
@Test
public void externalNetworkIsNewInDataCenter() throws Exception {
externalNetworkNewInDataCenterTestSetup(false);
assertThat(validator.externalNetworkNewInDataCenter(), isValid());
}
@Test
public void externalNetworkIsNotNewInDataCenter() throws Exception {
externalNetworkNewInDataCenterTestSetup(true);
assertThat(validator.externalNetworkNewInDataCenter(),
failsWith(EngineMessage.ACTION_TYPE_FAILED_EXTERNAL_NETWORK_ALREADY_EXISTS));
}
@Test
public void externalNetworkIsAVmNetwork() throws Exception {
when(network.isVmNetwork()).thenReturn(true);
assertThat(validator.externalNetworkIsVmNetwork(), isValid());
}
@Test
public void externalNetworkIsNotAVmNetwork() throws Exception {
when(network.isVmNetwork()).thenReturn(false);
assertThat(validator.externalNetworkIsVmNetwork(),
failsWith(EngineMessage.ACTION_TYPE_FAILED_EXTERNAL_NETWORK_MUST_BE_VM_NETWORK));
}
@Test
public void externalNetworkVlanValid() {
when(network.getVlanId()).thenReturn(RandomUtils.instance().nextInt());
when(network.getLabel()).thenReturn(RandomUtils.instance().nextString(10));
assertThat(validator.externalNetworkVlanValid(), isValid());
}
@Test
public void externalNetworkVlanInvalid() {
when(network.getVlanId()).thenReturn(RandomUtils.instance().nextInt());
assertThat(validator.externalNetworkVlanValid(),
failsWith(EngineMessage.ACTION_TYPE_FAILED_EXTERNAL_NETWORK_WITH_VLAN_MUST_BE_LABELED));
}
@Test
public void externalNetworkNoVlanWithLabel() {
when(network.getLabel()).thenReturn(RandomUtils.instance().nextString(10));
assertThat(validator.externalNetworkVlanValid(), isValid());
}
}