package org.ovirt.engine.api.restapi.resource;
import java.util.ArrayList;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import org.junit.Test;
import org.ovirt.engine.api.model.Action;
import org.ovirt.engine.api.model.Snapshot;
import org.ovirt.engine.api.model.CreationStatus;
import org.ovirt.engine.core.common.action.RestoreAllSnapshotsParameters;
import org.ovirt.engine.core.common.action.VdcActionParametersBase;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.businessentities.AsyncTaskStatus;
import org.ovirt.engine.core.common.businessentities.AsyncTaskStatusEnum;
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.easymock.classextension.EasyMock.expect;
import static org.ovirt.engine.api.restapi.resource.BackendSnapshotsResourceTest.mangle;
import static org.ovirt.engine.api.restapi.resource.BackendSnapshotsResourceTest.verifyModelSpecific;
import static org.ovirt.engine.api.restapi.resource.BackendSnapshotsResourceTest.IMAGE_IDS;
import static org.ovirt.engine.api.restapi.resource.BackendSnapshotsResourceTest.SNAPSHOT_IDS;
import static org.ovirt.engine.api.restapi.resource.BackendSnapshotsResourceTest.VM_ID;
public class BackendSnapshotResourceTest
extends AbstractBackendSubResourceTest<Snapshot, DiskImage, BackendSnapshotResource> {
protected static final String BASE_HREF = "vms/" + VM_ID + "/snapshots/" + SNAPSHOT_IDS[0];
public BackendSnapshotResourceTest() {
super(new BackendSnapshotResource(SNAPSHOT_IDS[0].toString(), VM_ID, new BackendSnapshotsResource(VM_ID)));
}
protected void init() {
super.init();
initResource(resource.getCollection());
}
@Test
public void testBadGuid() throws Exception {
control.replay();
try {
new BackendSnapshotResource("foo", null, null);
fail("expected WebApplicationException");
} catch (WebApplicationException wae) {
verifyNotFoundException(wae);
}
}
@Test
public void testGetNotFound() throws Exception {
setUriInfo(setUpBasicUriExpectations());
setUpGetEntityExpectations(VdcQueryType.GetAllDisksByVmId,
GetAllDisksByVmIdParameters.class,
new String[] { "VmId" },
new Object[] { VM_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());
setUpGetEntityExpectations();
control.replay();
verifyModel(resource.get(), 0);
}
@Test
public void testRestore() throws Exception {
setUriInfo(setUpActionExpectations(VdcActionType.RestoreAllSnapshots,
RestoreAllSnapshotsParameters.class,
new String[] { "VmId", "DstSnapshotId" },
new Object[] { VM_ID, SNAPSHOT_IDS[0] }));
verifyActionResponse(resource.restore(new Action()), BASE_HREF, false);
}
@Test
public void testRestoreAsyncPending() throws Exception {
doTestRestoreAsync(AsyncTaskStatusEnum.init, CreationStatus.PENDING);
}
@Test
public void testRestoreAsyncInProgress() throws Exception {
doTestRestoreAsync(AsyncTaskStatusEnum.running, CreationStatus.IN_PROGRESS);
}
@Test
public void testRestoreAsyncFinished() throws Exception {
doTestRestoreAsync(AsyncTaskStatusEnum.finished, CreationStatus.COMPLETE);
}
private void doTestRestoreAsync(AsyncTaskStatusEnum asyncStatus, CreationStatus actionStatus) throws Exception {
setUriInfo(setUpActionExpectations(VdcActionType.RestoreAllSnapshots,
RestoreAllSnapshotsParameters.class,
new String[] { "VmId", "DstSnapshotId" },
new Object[] { VM_ID, SNAPSHOT_IDS[0] },
asList(GUIDS[1]),
asList(new AsyncTaskStatus(asyncStatus))));
Response response = resource.restore(new Action());
verifyActionResponse(response, BASE_HREF, true, null, null);
Action action = (Action)response.getEntity();
assertTrue(action.isSetStatus());
assertEquals(actionStatus.value(), action.getStatus().getState());
}
@Override
protected DiskImage getEntity(int index) {
DiskImage image = control.createMock(DiskImage.class);
expect(image.getId()).andReturn(IMAGE_IDS[index]).anyTimes();
ArrayList<DiskImage> snapshots = new ArrayList<DiskImage>();
Guid parentId = Guid.Empty.getValue();
for (int i = 0 ; i < NAMES.length ; i++) {
DiskImage snapshot = control.createMock(DiskImage.class);
Guid snapshotImageId = mangle(IMAGE_IDS[index], i);
expect(snapshot.getId()).andReturn(snapshotImageId).anyTimes();
expect(snapshot.getvm_snapshot_id()).andReturn(SNAPSHOT_IDS[i]).anyTimes();
expect(snapshot.getParentId()).andReturn(parentId).anyTimes();
expect(snapshot.getdescription()).andReturn(DESCRIPTIONS[i]).anyTimes();
snapshots.add(snapshot);
parentId = snapshotImageId;
}
expect(image.getSnapshots()).andReturn(snapshots).anyTimes();
return image;
}
protected void setUpGetEntityExpectations() throws Exception {
setUpGetEntityExpectations(VdcQueryType.GetAllDisksByVmId,
GetAllDisksByVmIdParameters.class,
new String[] { "VmId" },
new Object[] { VM_ID },
asList(getEntity(0)));
}
protected UriInfo setUpActionExpectations(VdcActionType task,
Class<? extends VdcActionParametersBase> clz,
String[] names,
Object[] values,
ArrayList<Guid> asyncTasks,
ArrayList<AsyncTaskStatus> asyncStatuses) {
String uri = BASE_HREF + "/action";
return setUpActionExpectations(task, clz, names, values, true, true, null, asyncTasks, asyncStatuses, uri, true);
}
protected UriInfo setUpActionExpectations(VdcActionType task,
Class<? extends VdcActionParametersBase> clz,
String[] names,
Object[] values) {
return setUpActionExpectations(task, clz, names, values, true, true, null, null, true);
}
protected void verifyModel(Snapshot model, int index) {
verifyModelSpecific(model, index);
verifyLinks(model);
}
}