package org.ovirt.engine.api.restapi.resource;
import java.util.ArrayList;
import java.util.List;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.UriInfo;
import org.junit.Test;
import org.ovirt.engine.api.model.CdRom;
import org.ovirt.engine.api.model.CdRoms;
import org.ovirt.engine.api.model.File;
import org.ovirt.engine.core.common.action.ChangeDiskCommandParameters;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.action.VmManagementParametersBase;
import org.ovirt.engine.core.common.businessentities.VM;
import org.ovirt.engine.core.common.businessentities.VMStatus;
import org.ovirt.engine.core.common.businessentities.VmStatic;
import org.ovirt.engine.core.common.queries.GetVmByVmIdParameters;
import org.ovirt.engine.core.common.queries.VdcQueryType;
import org.ovirt.engine.core.compat.Guid;
import static org.easymock.EasyMock.expect;
import static org.ovirt.engine.api.restapi.resource.AbstractBackendCdRomsResourceTest.setUpEntityExpectations;
import static org.ovirt.engine.api.restapi.resource.AbstractBackendCdRomsResourceTest.verifyModelSpecific;
import static org.ovirt.engine.api.restapi.resource.AbstractBackendCdRomsResourceTest.PARENT_ID;
public class BackendCdRomResourceTest
extends AbstractBackendSubResourceTest<CdRom, VM, BackendDeviceResource<CdRom, CdRoms, VM>> {
protected final static String ISO_PATH = "Fedora-13-x86_64-Live.iso";
protected static BackendCdRomsResource collection = getCollection();
public BackendCdRomResourceTest() {
super(getResource(GUIDS[0]));
}
protected static BackendDeviceResource<CdRom, CdRoms, VM> getResource(Guid id) {
return new BackendCdRomResource(CdRom.class,
VM.class,
id,
collection,
VdcActionType.UpdateVm,
collection.getUpdateParametersProvider(),
collection.getRequiredUpdateFields());
}
protected BackendDeviceResource<CdRom, CdRoms, VM> getNotFoundResource() {
BackendDeviceResource<CdRom, CdRoms, VM> ret = getResource(new Guid("0d0264ef-40de-45a1-b746-83a0088b47a7"));
ret.setUriInfo(setUpBasicUriExpectations());
initResource(ret);
initResource(ret.getCollection());
return ret;
}
protected static BackendCdRomsResource getCollection() {
return new BackendCdRomsResource(PARENT_ID,
VdcQueryType.GetVmByVmId,
new GetVmByVmIdParameters(PARENT_ID));
}
protected void init() {
super.init();
initResource(resource.getCollection());
}
@Test
public void testGetNotFound() throws Exception {
BackendDeviceResource<CdRom, CdRoms, VM> resource = getNotFoundResource();
setUriInfo(setUpBasicUriExpectations());
setUpEntityQueryExpectations(1);
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();
CdRom cdrom = resource.get();
verifyModelSpecific(cdrom, 1);
verifyLinks(cdrom);
}
@Test
public void testChangeCdNotFound() throws Exception {
BackendDeviceResource<CdRom, CdRoms, VM> resource = getNotFoundResource();
setUriInfo(setUpBasicUriExpectations());
resource.setUriInfo(setUpBasicUriExpectations());
setUpEntityQueryExpectations(1);
control.replay();
try {
resource.update(getUpdate());
fail("expected WebApplicationException");
} catch (WebApplicationException wae) {
verifyNotFoundException(wae);
}
}
@Test
public void testChangeCdIncompleteParameters() throws Exception {
setUriInfo(setUpBasicUriExpectations());
resource.setUriInfo(setUpBasicUriExpectations());
CdRom update = getUpdate();
update.getFile().setId(null);
control.replay();
try {
resource.update(update);
fail("expected WebApplicationException on incomplete parameters");
} catch (WebApplicationException wae) {
verifyIncompleteException(wae, "CdRom", "update", "file.id");
}
}
@Test
public void testChangeCd() throws Exception {
resource.setUriInfo(setUpChangeCdUriExpectations());
setUpGetEntityExpectations(1, VMStatus.Up);
setUpActionExpectations(VdcActionType.ChangeDisk,
ChangeDiskCommandParameters.class,
new String[] { "CdImagePath" },
new Object[] { ISO_PATH },
true,
true);
CdRom cdrom = resource.update(getUpdate());
assertTrue(cdrom.isSetFile());
}
protected UriInfo setUpChangeCdUriExpectations() {
UriInfo uriInfo = setUpBasicUriExpectations();
MultivaluedMap<String, String> queries = control.createMock(MultivaluedMap.class);
expect(queries.containsKey("current")).andReturn(true).anyTimes();
expect(uriInfo.getQueryParameters()).andReturn(queries).anyTimes();
return uriInfo;
}
@Test
public void testUpdateNotFound() throws Exception {
BackendDeviceResource<CdRom, CdRoms, VM> resource = getNotFoundResource();
setUriInfo(setUpBasicUriExpectations());
setUpEntityQueryExpectations(1, VMStatus.Down);
control.replay();
try {
resource.update(getUpdate());
fail("expected WebApplicationException");
} catch (WebApplicationException wae) {
verifyNotFoundException(wae);
}
}
@Test
public void testUpdate() throws Exception {
setUpGetEntityExpectations(3, VMStatus.Down);
setUriInfo(setUpActionExpectations(VdcActionType.UpdateVm,
VmManagementParametersBase.class,
new String[] { "VmStaticData.iso_path" },
new Object[] { ISO_PATH },
true,
true));
CdRom cdrom = resource.update(getUpdate());
assertTrue(cdrom.isSetFile());
}
@Test
public void testUpdateIncompleteParameters() throws Exception {
setUriInfo(setUpBasicUriExpectations());
CdRom update = getUpdate();
update.getFile().setId(null);
control.replay();
try {
resource.update(update);
fail("expected WebApplicationException on incomplete parameters");
} catch (WebApplicationException wae) {
verifyIncompleteException(wae, "CdRom", "update", "file.id");
}
}
protected CdRom getUpdate() {
CdRom update = new CdRom();
update.setFile(new File());
update.getFile().setId(ISO_PATH);
return update;
}
@Override
protected VM getEntity(int index) {
return setUpEntityExpectations(control.createMock(VM.class),
control.createMock(VmStatic.class),
index);
}
protected VM getEntity(int index, VMStatus status) {
return setUpEntityExpectations(control.createMock(VM.class),
control.createMock(VmStatic.class),
status,
index);
}
protected List<VM> getEntityList(VMStatus status) {
List<VM> entities = new ArrayList<VM>();
for (int i = 0; i < NAMES.length; i++) {
if (status != null) {
entities.add(getEntity(i, status));
} else {
entities.add(getEntity(i));
}
}
return entities;
}
protected List<VM> getEntityList() {
return getEntityList(null);
}
protected void setUpEntityQueryExpectations(int times, VMStatus status) throws Exception {
while (times-- > 0) {
setUpEntityQueryExpectations(VdcQueryType.GetVmByVmId,
GetVmByVmIdParameters.class,
new String[] { "Id" },
new Object[] { PARENT_ID },
getEntityList(status));
}
}
protected void setUpEntityQueryExpectations(int times) throws Exception {
setUpGetEntityExpectations(times, null);
}
protected void setUpGetEntityExpectations(int times, VMStatus status) throws Exception {
while (times-- > 0) {
setUpGetEntityExpectations(VdcQueryType.GetVmByVmId,
GetVmByVmIdParameters.class,
new String[] { "Id" },
new Object[] { PARENT_ID },
status !=null ? getEntity(0, status)
:
getEntity(0));
}
}
}