package org.ovirt.engine.api.restapi.resource; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.ovirt.engine.api.restapi.resource.BackendHostNicsResourceTest.PARENT_GUID; import static org.ovirt.engine.api.restapi.resource.BackendHostNicsResourceTest.getEntitySpecific; import static org.ovirt.engine.api.restapi.resource.BackendHostNicsResourceTest.setUpInterfaces; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import javax.ws.rs.WebApplicationException; import org.junit.Test; import org.mockito.MockitoAnnotations; import org.ovirt.engine.api.model.HostNic; import org.ovirt.engine.api.model.Statistic; import org.ovirt.engine.api.restapi.util.RxTxCalculator; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.network.VdsNetworkInterface; import org.ovirt.engine.core.common.businessentities.network.VdsNetworkStatistics; import org.ovirt.engine.core.common.queries.IdQueryParameters; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.core.compat.Guid; public class BackendHostNicResourceTest extends AbstractBackendSubResourceTest<HostNic, VdsNetworkInterface, BackendHostNicResource> { private static final int NIC_IDX = 1; private static final Guid NIC_ID = GUIDS[NIC_IDX]; private static final int SPEED = 50; private static final double RECEIVE_RATE = 10; private static final double TRANSMIT_RATE = 20; private static final double RECEIVE_DROP_RATE = 30; private static final double TRANSMIT_DROP_RATE = 40; private static final long RECEIVED_BYTES = 50; private static final long TRANSMITTED_BYTES = 60; private final BackendHostNicsResourceTest hostNicsResource; public BackendHostNicResourceTest() { super(new BackendHostNicResource(NIC_ID.toString(), new BackendHostNicsResource(PARENT_GUID.toString()))); hostNicsResource = new BackendHostNicsResourceTest(); MockitoAnnotations.initMocks(hostNicsResource); hostNicsResource.setUp(); } @Override protected void init() { super.init(); initResource(resource.getParent()); } @Override protected VdsNetworkInterface getEntity(int index) { return getEntitySpecific(index); } @Test public void testBadGuid() throws Exception { try { new BackendHostNicResource("foo", null); fail("expected WebApplicationException"); } catch (WebApplicationException wae) { verifyNotFoundException(wae); } } @Test public void testGetNotFound() throws Exception { setUriInfo(setUpBasicUriExpectations()); setUpEntityQueryExpectations(VdcQueryType.GetVdsInterfacesByVdsId, IdQueryParameters.class, new String[] { "Id" }, new Object[] { PARENT_GUID }, new ArrayList<VdsNetworkInterface>()); try { resource.get(); fail("expected WebApplicationException"); } catch (WebApplicationException wae) { verifyNotFoundException(wae); } } @Test public void testGet() throws Exception { setUriInfo(setUpBasicUriExpectations()); setGetVdsQueryExpectations(1); setGetNetworksQueryExpectations(1); setUpEntityQueryExpectations(); hostNicsResource.verifyModelSpecific(resource.get(), NIC_IDX); } @Test public void testGetIncludeStatistics() throws Exception { try { accepts.add("application/xml; detail=statistics"); setUriInfo(setUpBasicUriExpectations()); setGetVdsQueryExpectations(1); setGetNetworksQueryExpectations(1); setUpEntityQueryExpectations(); HostNic nic = resource.get(); assertTrue(nic.isSetStatistics()); hostNicsResource.verifyModelSpecific(nic, NIC_IDX); } finally { accepts.clear(); } } @Test public void testStatisticalQuery() throws Exception { VdsNetworkInterface entity = setUpStatisticalExpectations(); @SuppressWarnings("unchecked") BackendStatisticsResource<HostNic, VdsNetworkInterface> statisticsResource = (BackendStatisticsResource<HostNic, VdsNetworkInterface>)resource.getStatisticsResource(); assertNotNull(statisticsResource); verifyQuery(statisticsResource.getQuery(), entity); } protected VdsNetworkInterface setUpStatisticalExpectations() throws Exception { VdsNetworkStatistics stats = mock(VdsNetworkStatistics.class); VdsNetworkInterface entity = mock(VdsNetworkInterface.class); when(entity.getSpeed()).thenReturn(SPEED); when(entity.getStatistics()).thenReturn(stats); when(entity.getId()).thenReturn(NIC_ID); when(stats.getReceiveRate()).thenReturn(RECEIVE_RATE); when(stats.getTransmitRate()).thenReturn(TRANSMIT_RATE); when(stats.getReceiveDropRate()).thenReturn(RECEIVE_DROP_RATE); when(stats.getTransmitDropRate()).thenReturn(TRANSMIT_DROP_RATE); when(stats.getReceivedBytes()).thenReturn(RECEIVED_BYTES); when(stats.getTransmittedBytes()).thenReturn(TRANSMITTED_BYTES); List<VdsNetworkInterface> ifaces = new ArrayList<>(); ifaces.add(entity); setUpEntityQueryExpectations(VdcQueryType.GetVdsInterfacesByVdsId, IdQueryParameters.class, new String[] { "Id" }, new Object[] { PARENT_GUID }, ifaces); return entity; } protected void verifyQuery(AbstractStatisticalQuery<HostNic, VdsNetworkInterface> query, VdsNetworkInterface entity) throws Exception { assertEquals(HostNic.class, query.getParentType()); assertSame(entity, query.resolve(NIC_ID)); List<Statistic> statistics = query.getStatistics(entity); verifyStatistics(statistics, new String[] { "data.current.rx", "data.current.tx", "errors.total.rx", "errors.total.tx", "data.total.rx", "data.total.tx" }, new BigDecimal[] { asDec(RxTxCalculator.percent2bytes(SPEED, RECEIVE_RATE)), asDec(RxTxCalculator.percent2bytes(SPEED, TRANSMIT_RATE)), asDec(RECEIVE_DROP_RATE), asDec(TRANSMIT_DROP_RATE), asDec(RECEIVED_BYTES), asDec(TRANSMITTED_BYTES) }); Statistic adopted = query.adopt(new Statistic()); assertTrue(adopted.isSetHostNic()); assertEquals(NIC_ID.toString(), adopted.getHostNic().getId()); assertTrue(adopted.getHostNic().isSetHost()); assertEquals(GUIDS[0].toString(), adopted.getHostNic().getHost().getId()); } protected void setUpEntityQueryExpectations() throws Exception { setUpEntityQueryExpectations(VdcQueryType.GetVdsInterfacesByVdsId, IdQueryParameters.class, new String[] { "Id" }, new Object[] { PARENT_GUID }, setUpInterfaces()); } protected void setGetVdsQueryExpectations(int times) throws Exception { while (times-- > 0) { VDS vds = new VDS(); vds.setClusterId(GUIDS[0]); setUpEntityQueryExpectations(VdcQueryType.GetVdsByVdsId, IdQueryParameters.class, new String[] { "Id" }, new Object[] { PARENT_GUID }, vds); } } protected void setGetNetworksQueryExpectations(int times) throws Exception { while (times-- > 0) { ArrayList<org.ovirt.engine.core.common.businessentities.network.Network> networks = new ArrayList<>(); org.ovirt.engine.core.common.businessentities.network.Network network = new org.ovirt.engine.core.common.businessentities.network.Network(); network.setId(GUIDS[0]); network.setName("orcus"); networks.add(network); setUpEntityQueryExpectations(VdcQueryType.GetAllNetworksByClusterId, IdQueryParameters.class, new String[] { "Id" }, new Object[] { GUIDS[0] }, networks); } } }