package org.ovirt.engine.api.restapi.resource; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import javax.ws.rs.WebApplicationException; import org.junit.Test; import org.ovirt.engine.api.model.Disk; import org.ovirt.engine.api.model.Disks; import org.ovirt.engine.api.model.Statistic; import org.ovirt.engine.api.resource.DiskResource; import org.ovirt.engine.core.common.action.UpdateVmDiskParameters; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.businessentities.DiskImage; import org.ovirt.engine.core.common.queries.GetAllDisksByVmIdParameters; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.core.compat.Guid; import static org.ovirt.engine.api.restapi.resource.AbstractBackendDisksResourceTest.setUpEntityExpectations; import static org.ovirt.engine.api.restapi.resource.AbstractBackendDisksResourceTest.verifyModelSpecific; import static org.ovirt.engine.api.restapi.resource.AbstractBackendDisksResourceTest.PARENT_ID; import static org.easymock.EasyMock.expect; public class BackendDiskResourceTest extends AbstractBackendSubResourceTest<Disk, DiskImage, BackendDeviceResource<Disk, Disks, DiskImage>> { protected static final Guid DISK_ID = GUIDS[1]; protected static BackendDisksResource collection; public BackendDiskResourceTest() { super((BackendDiskResource)getCollection().getDeviceSubResource(DISK_ID.toString())); } protected static BackendDisksResource getCollection() { return new BackendDisksResource(PARENT_ID, VdcQueryType.GetAllDisksByVmId, new GetAllDisksByVmIdParameters(PARENT_ID)); } protected void init() { super.init(); initResource(resource.getCollection()); } @Test public void testGetNotFound() throws Exception { setUriInfo(setUpBasicUriExpectations()); setUpEntityQueryExpectations(VdcQueryType.GetAllDisksByVmId, GetAllDisksByVmIdParameters.class, new String[] { "VmId" }, new Object[] { PARENT_ID }, new ArrayList<DiskImage>()); control.replay(); try { resource.get(); fail("expected WebApplicationException"); } catch (WebApplicationException wae) { verifyNotFoundException(wae); } } @Test public void testGet() throws Exception { setUriInfo(setUpBasicUriExpectations()); setUpEntityQueryExpectations(1); control.replay(); Disk disk = resource.get(); verifyModelSpecific(disk, 1); verifyLinks(disk); } @Test public void testGetIncludeStatistics() throws Exception { try { accepts.add("application/xml; detail=statistics"); setUriInfo(setUpBasicUriExpectations()); setUpEntityQueryExpectations(1); control.replay(); Disk disk = resource.get(); assertTrue(disk.isSetStatistics()); verifyModelSpecific(disk, 1); verifyLinks(disk); } finally { accepts.clear(); } } @Test public void testUpdateNotFound() throws Exception { setUriInfo(setUpBasicUriExpectations()); setUpEntityQueryExpectations(VdcQueryType.GetAllDisksByVmId, GetAllDisksByVmIdParameters.class, new String[] { "VmId" }, new Object[] { PARENT_ID }, new ArrayList<DiskImage>()); control.replay(); try { resource.update(getUpdate()); fail("expected WebApplicationException"); } catch (WebApplicationException wae) { verifyNotFoundException(wae); } } @Test public void testUpdate() throws Exception { setUpGetEntityExpectations(2); setUriInfo(setUpActionExpectations(VdcActionType.UpdateVmDisk, UpdateVmDiskParameters.class, new String[] { "VmId", "ImageId", "DiskInfo.wipe_after_delete" }, new Object[] { PARENT_ID, GUIDS[1], Boolean.FALSE }, true, true)); Disk disk = resource.update(getUpdate()); assertNotNull(disk); } @Test public void testStatisticalQuery() throws Exception { DiskImage entity = setUpStatisticalExpectations(); @SuppressWarnings("unchecked") BackendStatisticsResource<Disk, DiskImage> statisticsResource = (BackendStatisticsResource<Disk, DiskImage>)((DiskResource)resource).getStatisticsResource(); assertNotNull(statisticsResource); verifyQuery(statisticsResource.getQuery(), entity); } protected DiskImage setUpStatisticalExpectations() throws Exception { DiskImage entity = control.createMock(DiskImage.class); expect(entity.getId()).andReturn(DISK_ID).anyTimes(); expect(entity.getread_rate()).andReturn(10); expect(entity.getwrite_rate()).andReturn(20); List<DiskImage> ifaces = new ArrayList<DiskImage>(); ifaces.add(entity); setUpGetEntityExpectations(1, entity); control.replay(); return entity; } protected void verifyQuery(AbstractStatisticalQuery<Disk, DiskImage> query, DiskImage entity) throws Exception { assertEquals(Disk.class, query.getParentType()); assertSame(entity, query.resolve(DISK_ID)); List<Statistic> statistics = query.getStatistics(entity); verifyStatistics(statistics, new String[] {"data.current.read", "data.current.write"}, new BigDecimal[] {asDec(10), asDec(20)}); Statistic adopted = query.adopt(new Statistic()); assertTrue(adopted.isSetDisk()); assertEquals(DISK_ID.toString(), adopted.getDisk().getId()); assertTrue(adopted.getDisk().isSetVm()); assertEquals(PARENT_ID.toString(), adopted.getDisk().getVm().getId()); } protected Disk getUpdate() { Disk update = new Disk(); update.setWipeAfterDelete(false); return update; } @Override protected DiskImage getEntity(int index) { return setUpEntityExpectations(control.createMock(DiskImage.class), index); } protected List<DiskImage> getEntityList() { List<DiskImage> entities = new ArrayList<DiskImage>(); for (int i = 0; i < NAMES.length; i++) { entities.add(getEntity(i)); } return entities; } protected void setUpEntityQueryExpectations(int times) throws Exception { while (times-- > 0) { setUpEntityQueryExpectations(VdcQueryType.GetAllDisksByVmId, GetAllDisksByVmIdParameters.class, new String[] { "VmId" }, new Object[] { PARENT_ID }, getEntityList()); } } protected void setUpGetEntityExpectations(int times) throws Exception { setUpGetEntityExpectations(times, getEntity(1)); } protected void setUpGetEntityExpectations(int times, DiskImage entity) throws Exception { while (times-- > 0) { setUpGetEntityExpectations(VdcQueryType.GetAllDisksByVmId, GetAllDisksByVmIdParameters.class, new String[] { "VmId" }, new Object[] { PARENT_ID }, entity); } } }