package io.eguan.vold.rest.resources; /* * #%L * Project eguan * %% * Copyright (C) 2012 - 2017 Oodrive * %% * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * #L% */ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import io.eguan.vold.rest.generated.model.Device; import io.eguan.vold.rest.generated.model.DeviceList; import io.eguan.vold.rest.generated.model.Snapshot; import io.eguan.vold.rest.generated.model.SnapshotList; import java.util.List; import java.util.UUID; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import javax.ws.rs.core.MediaType; import javax.xml.bind.JAXBException; import org.junit.Test; import com.sun.jersey.api.client.ClientResponse; import com.sun.jersey.api.client.ClientResponse.Status; import com.sun.jersey.api.client.WebResource; import com.sun.jersey.core.util.MultivaluedMapImpl; public final class TestSnapshotResourceL extends AbstractVvrResourceTest { private static final String classNamePrefix = TestSnapshotResourceL.class.getSimpleName(); public TestSnapshotResourceL(final MediaType runContentType, final MediaType runAcceptType) { super(runContentType, runAcceptType); } @Test public final void testGetSnapshot() throws TimeoutException { final WebResource snapshotResource = getSnapshotResource(); assertNotNull(snapshotResource); final Snapshot result = prebuildRequest(snapshotResource, null).get(Snapshot.class); assertNotNull(result); assertNotNull(result.getUuid()); final long oldSnapSize = result.getSize(); final long newSnapSize = oldSnapSize + DEFAULT_DEVICE_SIZE; final String newSnapName = classNamePrefix + "-newSnapshot"; final MultivaluedMapImpl createDevParams = new MultivaluedMapImpl(); createDevParams.add("name", classNamePrefix + "-getSnapshot"); createDevParams.add("size", newSnapSize); final WebResource devResource = createDevice(snapshotResource, createDevParams); final MultivaluedMapImpl createSnapParams = new MultivaluedMapImpl(); createSnapParams.add("name", newSnapName); final WebResource newSnapRes = createSnapshot(devResource, createSnapParams); final Snapshot readSnap = prebuildRequest(newSnapRes, null).get(Snapshot.class); assertNotNull(readSnap); assertEquals(newSnapSize, readSnap.getSize()); assertEquals(newSnapName, readSnap.getName()); } @Test public final void testPostSnapshot() throws TimeoutException, JAXBException { final WebResource snapshotResource = getSnapshotResource(); assertNotNull(snapshotResource); final Snapshot originalSnap = prebuildRequest(snapshotResource, null).get(Snapshot.class); assertNotNull(originalSnap); assertNotNull(originalSnap.getUuid()); final Snapshot modifiedSnap = snapshotReplicator.replicate(originalSnap); assertFalse(originalSnap == modifiedSnap); modifiedSnap.setName(classNamePrefix + " - modified snapshot"); modifiedSnap.setDescription(classNamePrefix + " is now modified "); final ClientResponse postResponse = prebuildRequest(snapshotResource, null).post(ClientResponse.class, modifiedSnap); assertEquals(Status.OK.getStatusCode(), postResponse.getStatus()); final Snapshot updatedSnap = postResponse.getEntity(Snapshot.class); assertNotNull(updatedSnap); assertEquals(originalSnap.getUuid(), updatedSnap.getUuid()); assertEquals(originalSnap.getSize(), updatedSnap.getSize()); assertEquals(modifiedSnap.getName(), updatedSnap.getName()); assertEquals(modifiedSnap.getDescription(), updatedSnap.getDescription()); } @Test public final void testPostSnapshotFailNull() throws TimeoutException { final WebResource snapshotResource = getSnapshotResource(); assertNotNull(snapshotResource); final ClientResponse postResponse = prebuildRequest(snapshotResource, null).post(ClientResponse.class, null); assertEquals(Status.BAD_REQUEST.getStatusCode(), postResponse.getStatus()); } @Test public final void testPostSnapshotFailIdChanged() throws TimeoutException, JAXBException { final WebResource snapshotResource = getSnapshotResource(); assertNotNull(snapshotResource); final Snapshot originalSnap = prebuildRequest(snapshotResource, null).get(Snapshot.class); assertNotNull(originalSnap); assertNotNull(originalSnap.getUuid()); final Snapshot modifiedSnap = snapshotReplicator.replicate(originalSnap); assertFalse(originalSnap == modifiedSnap); modifiedSnap.setName(classNamePrefix + " - modified snapshot"); modifiedSnap.setDescription(classNamePrefix + " is now modified "); // modifies the ID modifiedSnap.setUuid(UUID.randomUUID().toString()); final ClientResponse postResponse = prebuildRequest(snapshotResource, null).post(ClientResponse.class, modifiedSnap); assertEquals(Status.FORBIDDEN.getStatusCode(), postResponse.getStatus()); final Snapshot readSnap = prebuildRequest(snapshotResource, null).get(Snapshot.class); assertNotNull(readSnap); assertEquals(originalSnap.getUuid(), readSnap.getUuid()); assertEquals(originalSnap.getSize(), readSnap.getSize()); assertEquals(originalSnap.getName(), readSnap.getName()); assertEquals(originalSnap.getDescription(), readSnap.getDescription()); } @Test public final void testDeleteSnapshot() throws IllegalStateException, TimeoutException { final WebResource snapshotResource = getSnapshotResource(); assertNotNull(snapshotResource); final Snapshot targetSnap = prebuildRequest(snapshotResource, null).get(Snapshot.class); assertNotNull(targetSnap); assertNotNull(targetSnap.getUuid()); // checks the provided snapshot is not the root snapshot assertFalse(targetSnap.getUuid().equals(targetSnap.getParent())); final ClientResponse deleteResponse = prebuildRequest(snapshotResource, null).delete(ClientResponse.class); final WebResource deletedSnapshotRes = getResultFromTask(deleteResponse, TimeUnit.SECONDS, DEFAULT_TASK_TIMEOUT_S); final ClientResponse getResponse = prebuildRequest(deletedSnapshotRes, null).get(ClientResponse.class); assertEquals(Status.NOT_FOUND.getStatusCode(), getResponse.getStatus()); } @Test public final void testDeleteSnapshotFailRoot() throws IllegalStateException, TimeoutException { final WebResource rootSnapResource = getVvrResource().path("root"); assertNotNull(rootSnapResource); final Snapshot rootSnap = prebuildRequest(rootSnapResource, null).get(Snapshot.class); assertNotNull(rootSnap); assertNotNull(rootSnap.getUuid()); // checks the provided snapshot is really the root snapshot assertTrue(rootSnap.getUuid().equals(rootSnap.getParent())); final ClientResponse deleteResponse = prebuildRequest(rootSnapResource, null).delete(ClientResponse.class); assertEquals(Status.FORBIDDEN.getStatusCode(), deleteResponse.getStatus()); } // @Test public final void testDeleteSnapshotFailDeviceActive() { // TODO } @Test public final void testNewDevice() throws TimeoutException { final WebResource snapshotResource = getSnapshotResource(); final Snapshot snapshot = prebuildRequest(snapshotResource, null).get(Snapshot.class); assertNotNull(snapshot); // Name only { final String devName = "testDevice1"; final MultivaluedMapImpl createDevParams = new MultivaluedMapImpl(); createDevParams.add("name", devName); final WebResource createdDevRes = createDevice(snapshotResource, createDevParams); assertNotNull(createdDevRes); final Device createdDev = prebuildRequest(createdDevRes, null).get(Device.class); assertNotNull(createdDev); assertNotNull(createdDev.getUuid()); assertEquals(devName, createdDev.getName()); assertEquals(snapshot.getUuid(), createdDev.getParent()); } // Name + description { final String devName = "testDevice2"; final String devDescription = "testDescr2"; final MultivaluedMapImpl createDevParams = new MultivaluedMapImpl(); createDevParams.add("name", devName); createDevParams.add("description", devDescription); final WebResource createdDevRes = createDevice(snapshotResource, createDevParams); assertNotNull(createdDevRes); final Device createdDev = prebuildRequest(createdDevRes, null).get(Device.class); assertNotNull(createdDev); assertNotNull(createdDev.getUuid()); assertEquals(devName, createdDev.getName()); assertEquals(devDescription, createdDev.getDescription()); assertEquals(snapshot.getUuid(), createdDev.getParent()); } } @Test public final void testNewDeviceWithSize() throws TimeoutException { final WebResource snapshotResource = getSnapshotResource(); final Snapshot snapshot = prebuildRequest(snapshotResource, null).get(Snapshot.class); assertNotNull(snapshot); // Name + size { final String devName = "testDevice1"; final MultivaluedMapImpl createDevParams = new MultivaluedMapImpl(); createDevParams.add("name", devName); createDevParams.add("size", 4096); final WebResource createdDevRes = createDevice(snapshotResource, createDevParams); assertNotNull(createdDevRes); final Device createdDev = prebuildRequest(createdDevRes, null).get(Device.class); assertNotNull(createdDev); assertNotNull(createdDev.getUuid()); assertEquals(devName, createdDev.getName()); assertEquals(snapshot.getUuid(), createdDev.getParent()); } // Name + size + description { final String devName = "testDevice2"; final String devDescription = "testDescr2"; final MultivaluedMapImpl createDevParams = new MultivaluedMapImpl(); createDevParams.add("name", devName); createDevParams.add("description", devDescription); createDevParams.add("size", 4096); final WebResource createdDevRes = createDevice(snapshotResource, createDevParams); assertNotNull(createdDevRes); final Device createdDev = prebuildRequest(createdDevRes, null).get(Device.class); assertNotNull(createdDev); assertNotNull(createdDev.getUuid()); assertEquals(devName, createdDev.getName()); assertEquals(devDescription, createdDev.getDescription()); assertEquals(snapshot.getUuid(), createdDev.getParent()); } } @Test public final void testNewDeviceWithUuid() throws TimeoutException { final WebResource snapshotResource = getSnapshotResource(); final Snapshot snapshot = prebuildRequest(snapshotResource, null).get(Snapshot.class); assertNotNull(snapshot); // Name + uuid { final String devName = "testDevice1"; final UUID devUuid = UUID.randomUUID(); final MultivaluedMapImpl createDevParams = new MultivaluedMapImpl(); createDevParams.add("name", devName); createDevParams.add("uuid", devUuid); final WebResource createdDevRes = createDevice(snapshotResource, createDevParams); assertNotNull(createdDevRes); final Device createdDev = prebuildRequest(createdDevRes, null).get(Device.class); assertNotNull(createdDev); assertEquals(devUuid.toString(), createdDev.getUuid()); assertEquals(devName, createdDev.getName()); assertEquals(snapshot.getUuid(), createdDev.getParent()); } // Name + description + uuid { final String devName = "testDevice2"; final String devDescription = "testDescr2"; final UUID devUuid = UUID.randomUUID(); final MultivaluedMapImpl createDevParams = new MultivaluedMapImpl(); createDevParams.add("name", devName); createDevParams.add("description", devDescription); createDevParams.add("uuid", devUuid); final WebResource createdDevRes = createDevice(snapshotResource, createDevParams); assertNotNull(createdDevRes); final Device createdDev = prebuildRequest(createdDevRes, null).get(Device.class); assertNotNull(createdDev); assertEquals(devUuid.toString(), createdDev.getUuid()); assertEquals(devName, createdDev.getName()); assertEquals(devDescription, createdDev.getDescription()); assertEquals(snapshot.getUuid(), createdDev.getParent()); } } @Test public final void testNewDeviceWithUuidWithSize() throws TimeoutException { final WebResource snapshotResource = getSnapshotResource(); final Snapshot snapshot = prebuildRequest(snapshotResource, null).get(Snapshot.class); assertNotNull(snapshot); // Name + size + uuid { final String devName = "testDevice1"; final UUID devUuid = UUID.randomUUID(); final MultivaluedMapImpl createDevParams = new MultivaluedMapImpl(); createDevParams.add("name", devName); createDevParams.add("size", 4096); createDevParams.add("uuid", devUuid.toString()); final WebResource createdDevRes = createDevice(snapshotResource, createDevParams); assertNotNull(createdDevRes); final Device createdDev = prebuildRequest(createdDevRes, null).get(Device.class); assertNotNull(createdDev); assertEquals(devUuid.toString(), createdDev.getUuid()); assertEquals(devName, createdDev.getName()); assertEquals(snapshot.getUuid(), createdDev.getParent()); } // Name + description + size + uuid { final String devName = "testDevice2"; final String devDescription = "testDescr2"; final UUID devUuid = UUID.randomUUID(); final MultivaluedMapImpl createDevParams = new MultivaluedMapImpl(); createDevParams.add("name", devName); createDevParams.add("description", devDescription); createDevParams.add("size", 4096); createDevParams.add("uuid", devUuid.toString()); final WebResource createdDevRes = createDevice(snapshotResource, createDevParams); assertNotNull(createdDevRes); final Device createdDev = prebuildRequest(createdDevRes, null).get(Device.class); assertNotNull(createdDev); assertEquals(devUuid.toString(), createdDev.getUuid()); assertEquals(devName, createdDev.getName()); assertEquals(devDescription, createdDev.getDescription()); assertEquals(snapshot.getUuid(), createdDev.getParent()); } } @Test public final void testNewDeviceFailSize() throws TimeoutException { final WebResource snapshotResource = getSnapshotResource(); final Snapshot snapshot = prebuildRequest(snapshotResource, null).get(Snapshot.class); assertNotNull(snapshot); final String devName = "testDevice"; final MultivaluedMapImpl createDevParams = new MultivaluedMapImpl(); createDevParams.add("name", devName); createDevParams.add("size", -1234); final WebResource createDevResource = snapshotResource.path(CREATE_DEVICE_PATH); final ClientResponse createResponse = prebuildRequest(createDevResource, createDevParams).post( ClientResponse.class); assertEquals(Status.FORBIDDEN.getStatusCode(), createResponse.getStatus()); } @Test public final void testNewDeviceFailUuid() throws TimeoutException { final WebResource snapshotResource = getSnapshotResource(); final Snapshot snapshot = prebuildRequest(snapshotResource, null).get(Snapshot.class); assertNotNull(snapshot); final String devName = "testDevice"; final MultivaluedMapImpl createDevParams = new MultivaluedMapImpl(); createDevParams.add("name", devName); createDevParams.add("uuid", "uuid"); final WebResource createDevResource = snapshotResource.path(CREATE_DEVICE_PATH); final ClientResponse createResponse = prebuildRequest(createDevResource, createDevParams).post( ClientResponse.class); assertEquals(Status.BAD_REQUEST.getStatusCode(), createResponse.getStatus()); } @Test public final void testNewDeviceFailName() throws TimeoutException { final WebResource snapshotResource = getSnapshotResource(); final Snapshot snapshot = prebuildRequest(snapshotResource, null).get(Snapshot.class); assertNotNull(snapshot); final MultivaluedMapImpl createDevParams = new MultivaluedMapImpl(); createDevParams.remove("name"); final WebResource createDevResource = snapshotResource.path(CREATE_DEVICE_PATH); final ClientResponse createResponse = prebuildRequest(createDevResource, createDevParams).post( ClientResponse.class); assertEquals(Status.BAD_REQUEST.getStatusCode(), createResponse.getStatus()); } @Test public final void testGetDescendantDevicesNonRec() throws TimeoutException { final WebResource snapshotResource = getSnapshotResource(); final WebResource descDevicesRes = snapshotResource.path("devices"); final MultivaluedMapImpl searchParams = new MultivaluedMapImpl(); searchParams.add("recursive", "false"); final DeviceList descDevList = prebuildRequest(descDevicesRes, searchParams).get(DeviceList.class); assertNotNull(descDevList); final List<Device> descDevices = descDevList.getDevices(); assertNotNull(descDevices); assertEquals(1, descDevices.size()); final MultivaluedMapImpl createDevParams = new MultivaluedMapImpl(); for (int i = 1; i <= 10; i++) { createDevParams.putSingle("name", classNamePrefix + " - child device " + i); final Device newDev = prebuildRequest(createDevice(snapshotResource, createDevParams), null).get( Device.class); final List<Device> modifiedList = prebuildRequest(descDevicesRes, searchParams).get(DeviceList.class) .getDevices(); assertEquals(i + 1, modifiedList.size()); boolean listContainsDev = false; for (final Device currDev : modifiedList) { listContainsDev |= newDev.getUuid().equals(currDev.getUuid()); } assertTrue(listContainsDev); } List<Device> completeList = prebuildRequest(descDevicesRes, searchParams).get(DeviceList.class).getDevices(); final WebResource vvrDevResource = getVvrResource().path("devices"); for (int j = completeList.size() - 1; j >= 0; j--) { final Device target = completeList.get(j); final WebResource devRes = vvrDevResource.path(target.getUuid()); assertNotNull(getResultFromTask(prebuildRequest(devRes, null).delete(ClientResponse.class), TimeUnit.SECONDS, DEFAULT_TASK_TIMEOUT_S)); completeList = prebuildRequest(descDevicesRes, searchParams).get(DeviceList.class).getDevices(); assertEquals(j, completeList.size()); } } @Test public final void testGetChildSnapshots() throws TimeoutException { final WebResource snapshotResource = getSnapshotResource(); final WebResource childSnapshotsRes = snapshotResource.path("snapshots"); final SnapshotList childSnapList = prebuildRequest(childSnapshotsRes, null).get(SnapshotList.class); assertNotNull(childSnapList); final List<Snapshot> childSnapshots = childSnapList.getSnapshots(); assertNotNull(childSnapshots); assertTrue(childSnapshots.isEmpty()); final MultivaluedMapImpl createParams = new MultivaluedMapImpl(); for (int i = 1; i <= 10; i++) { createParams.putSingle("name", classNamePrefix + " - device for child snapshot " + i); final WebResource newDevRes = createDevice(snapshotResource, createParams); createParams.putSingle("name", classNamePrefix + " - child snapshot " + i); final Snapshot newSnap = prebuildRequest(createSnapshot(newDevRes, createParams), null).get(Snapshot.class); final List<Snapshot> modifiedList = prebuildRequest(childSnapshotsRes, null).get(SnapshotList.class) .getSnapshots(); assertEquals(i, modifiedList.size()); boolean listContainsSnap = false; for (final Snapshot currSnap : modifiedList) { listContainsSnap |= newSnap.getUuid().equals(currSnap.getUuid()); } assertTrue(listContainsSnap); } List<Snapshot> completeList = prebuildRequest(childSnapshotsRes, null).get(SnapshotList.class).getSnapshots(); final WebResource vvrSnapResource = getVvrResource().path("snapshots"); for (int j = completeList.size() - 1; j >= 0; j--) { final Snapshot target = completeList.get(j); final WebResource devRes = vvrSnapResource.path(target.getUuid()); assertNotNull(getResultFromTask(prebuildRequest(devRes, null).delete(ClientResponse.class), TimeUnit.SECONDS, DEFAULT_TASK_TIMEOUT_S)); completeList = prebuildRequest(childSnapshotsRes, null).get(SnapshotList.class).getSnapshots(); assertEquals(j, completeList.size()); } } }