package org.ovirt.engine.core.bll.qos;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.junit.Assert.assertThat;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.hamcrest.Matchers;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.ovirt.engine.core.common.businessentities.VDS;
import org.ovirt.engine.core.common.businessentities.network.Network;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dao.VdsDao;
import org.ovirt.engine.core.dao.network.NetworkDao;
@RunWith(MockitoJUnitRunner.class)
public class RefreshNetworksParametersFactoryTest {
@Mock
private PersistentHostSetupNetworksParametersFactory persistentHostSetupNetworksParametersFactory;
@Mock
private NetworkDao networkDao;
@Mock
private VdsDao vdsDao;
@InjectMocks
private RefreshNetworksParametersFactory underTest;
private static final Guid QOS_ID = Guid.newGuid();
private Network networkA;
private Network networkB;
private VDS vdsA;
private VDS vdsB;
private List<Network> networksHavingQos;
@Before
public void setUp() throws Exception {
vdsA = createVds();
vdsB = createVds();
networkA = createNetwork();
networkB = createNetwork();
when(vdsDao.getAllForNetwork(networkA.getId())).thenReturn(Arrays.asList(vdsA, vdsB));
when(vdsDao.getAllForNetwork(networkB.getId())).thenReturn(Collections.singletonList(vdsA));
networksHavingQos = Arrays.asList(networkA, networkB);
}
@Test
public void testCreateParametersToRefreshNetworksHavingQos() {
when(networkDao.getAllForQos(QOS_ID)).thenReturn(networksHavingQos);
underTest.create(QOS_ID);
assertCreatedParameters();
}
@Test
public void testCreateParametersToRefreshGivenNetworks() {
underTest.create(networksHavingQos);
assertCreatedParameters();
}
private void assertCreatedParameters() {
assertCallToParametersCreationForVdsA();
assertCallToParametersCreationForVdsB();
}
@SuppressWarnings("unchecked")
private void assertCallToParametersCreationForVdsA() {
ArgumentCaptor<List> captor = ArgumentCaptor.forClass(List.class);
verify(persistentHostSetupNetworksParametersFactory).create(eq(vdsA.getId()), captor.capture());
assertCollectionContainingOnlyThese(captor.getValue(), networkA, networkB);
}
@SuppressWarnings("unchecked")
private void assertCallToParametersCreationForVdsB() {
ArgumentCaptor<List> captor = ArgumentCaptor.forClass(List.class);
verify(persistentHostSetupNetworksParametersFactory).create(eq(vdsB.getId()), captor.capture());
assertCollectionContainingOnlyThese(captor.getValue(), networkA);
}
private void assertCollectionContainingOnlyThese(List<Network> actualNetworks, Network ... expectedNetworks) {
assertThat(actualNetworks, Matchers.hasSize(expectedNetworks.length));
assertThat(actualNetworks, containsInAnyOrder(expectedNetworks));
}
private Network createNetwork() {
Network network = new Network();
network.setId(Guid.newGuid());
return network;
}
private VDS createVds() {
VDS vds = new VDS();
vds.setId(Guid.newGuid());
return vds;
}
}