package org.ovirt.engine.api.restapi.resource.gluster; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.util.List; 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.Cluster; import org.ovirt.engine.api.model.Fault; import org.ovirt.engine.api.model.GlusterBrick; import org.ovirt.engine.api.model.GlusterBricks; import org.ovirt.engine.api.model.GlusterVolume; import org.ovirt.engine.api.resource.ClusterResource; import org.ovirt.engine.api.restapi.resource.AbstractBackendCollectionResourceTest; import org.ovirt.engine.api.restapi.resource.BackendResource; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.action.gluster.CreateGlusterVolumeParameters; import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity; import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeType; import org.ovirt.engine.core.common.interfaces.SearchType; 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 BackendGlusterVolumesResourceTest extends AbstractBackendCollectionResourceTest<GlusterVolume, GlusterVolumeEntity, BackendGlusterVolumesResource> { private static final Guid clusterId = GUIDS[0]; private static final Guid volumeId = GUIDS[1]; private static final Guid serverId = GUIDS[2]; private static final String defaultClusterName = "Default"; private static final String defaultQuery = "cluster = " + defaultClusterName; private static final String volumesQueryPrefix = "Volumes : "; private static ClusterResource parentMock; public BackendGlusterVolumesResourceTest() { super(new BackendGlusterVolumesResource(parentMock, clusterId.toString()), SearchType.GlusterVolume, volumesQueryPrefix); } /** * Override init to perform additional mocking required * for the "list" method of the collection resource. */ @Override protected void init() { super.init(); setupListExpectations(); } /** * Overridden to set query expectations for the default query (cluster = Default), * as the gluster volumes collection resource always fetches volumes of a given * cluster (it is not a root level collection). */ @Override public void testList() throws Exception { collection.setUriInfo(setUpUriExpectations(null)); setUpQueryExpectations(defaultQuery); collection.setParent(parentMock); verifyCollection(getCollection()); } @Override public void testQuery() throws Exception { collection.setUriInfo(setUpUriExpectations(QUERY)); setUpQueryExpectations(QUERY); collection.setParent(parentMock); verifyCollection(getCollection()); } /** * Refer comments on {@link #testList()} */ @Override public void testListCrash() throws Exception { UriInfo uriInfo = setUpUriExpectations(null); collection.setUriInfo(uriInfo); Throwable t = new RuntimeException(FAILURE); setUpQueryExpectations(defaultQuery, t); collection.setParent(parentMock); try { getCollection(); fail("expected WebApplicationException"); } catch (WebApplicationException wae) { verifyFault(wae, BACKEND_FAILED_SERVER_LOCALE, t); } } /** * Refer comments on {@link #testList()} */ @Override public void testListCrashClientLocale() throws Exception { collection.setUriInfo(setUpUriExpectations(null)); locales.add(CLIENT_LOCALE); Throwable t = new RuntimeException(FAILURE); setUpQueryExpectations(defaultQuery, t); collection.setParent(parentMock); try { getCollection(); fail("expected WebApplicationException"); } catch (WebApplicationException wae) { verifyFault(wae, BACKEND_FAILED_CLIENT_LOCALE, t); } finally { locales.clear(); } } /** * Refer comments on {@link #testList()} */ @Override public void testListFailure() throws Exception { collection.setUriInfo(setUpUriExpectations(null)); setUpQueryExpectations(defaultQuery, FAILURE); collection.setParent(parentMock); try { getCollection(); fail("expected WebApplicationException"); } catch (WebApplicationException wae) { assertTrue(wae.getResponse().getEntity() instanceof Fault); assertEquals(mockl10n(FAILURE), ((Fault) wae.getResponse().getEntity()).getDetail()); } } @Override protected List<GlusterVolume> getCollection() { return collection.list().getGlusterVolumes(); } @Override protected GlusterVolumeEntity getEntity(int index) { return setUpEntityExpectations( mock(GlusterVolumeEntity.class), index); } @Test public void testAdd() { setUriInfo(setUpBasicUriExpectations()); setUpVolumeCreationExpectations(false); collection.setParent(parentMock); Response response = collection.add(createModel()); assertEquals(201, response.getStatus()); assertTrue(response.getEntity() instanceof GlusterVolume); verifyModel((GlusterVolume) response.getEntity(), 1); } @Test public void testAddForce() { UriInfo uriInfo = setUpBasicUriExpectations(); setUriInfo(setUpGetMatrixConstraintsExpectations( BackendResource.FORCE_CONSTRAINT, true, "true", uriInfo )); setUpVolumeCreationExpectations(true); collection.setParent(parentMock); Response response = collection.add(createModel()); assertEquals(201, response.getStatus()); assertTrue(response.getEntity() instanceof GlusterVolume); verifyModel((GlusterVolume) response.getEntity(), 1); } @Test public void testAddForceFalse() { UriInfo uriInfo = setUpBasicUriExpectations(); setUriInfo(setUpGetMatrixConstraintsExpectations( BackendResource.FORCE_CONSTRAINT, false, "false", uriInfo )); setUpVolumeCreationExpectations(false); collection.setParent(parentMock); Response response = collection.add(createModel()); assertEquals(201, response.getStatus()); assertTrue(response.getEntity() instanceof GlusterVolume); verifyModel((GlusterVolume) response.getEntity(), 1); } private void setUpVolumeCreationExpectations(boolean force) { setUpCreationExpectations(VdcActionType.CreateGlusterVolume, CreateGlusterVolumeParameters.class, new String[] { "Volume.Name", "Volume.VolumeType", "Force" }, new Object[] { "testVol1", GlusterVolumeType.DISTRIBUTE, force }, true, true, volumeId, VdcQueryType.GetGlusterVolumeById, IdQueryParameters.class, new String[] { "Id" }, new Object[] { volumeId }, getEntity(1)); } /** * Overridden as {@link GlusterVolumeEntity} does not have description field */ @Override protected void verifyModel(GlusterVolume model, int index) { assertEquals(GUIDS[index].toString(), model.getId()); assertEquals(NAMES[index], model.getName()); assertEquals(org.ovirt.engine.api.model.GlusterVolumeType.DISTRIBUTE, model.getVolumeType()); assertEquals(clusterId.toString(), model.getCluster().getId()); verifyLinks(model); } private GlusterVolume createModel() { GlusterVolume volume = new GlusterVolume(); volume.setName("testVol1"); volume.setCluster(new Cluster()); volume.getCluster().setId(clusterId.toString()); volume.setVolumeType(org.ovirt.engine.api.model.GlusterVolumeType.DISTRIBUTE); volume.setBricks(new GlusterBricks()); volume.getBricks().getGlusterBricks().add(createBrick("/export/vol1/brick1")); return volume; } private GlusterBrick createBrick(String brickDir) { GlusterBrick brick = new GlusterBrick(); brick.setServerId(serverId.toString()); brick.setBrickDir(brickDir); return brick; } static GlusterVolumeEntity setUpEntityExpectations( GlusterVolumeEntity entity, int index) { when(entity.getId()).thenReturn(GUIDS[index]); when(entity.getName()).thenReturn(NAMES[index]); when(entity.getClusterId()).thenReturn(GUIDS[2]); when(entity.getVolumeType()).thenReturn(GlusterVolumeType.DISTRIBUTE); return entity; } /** * The method {@link BackendGlusterVolumesResource#list()} internally * invokes {@link ClusterResource#get()} to fetch the cluster object, * and then invokes the query including the default constraint on cluster name. * This method mocks the cluster resource in such a way that the cluster * name will be returned as "Default" */ private void setupListExpectations() { Cluster cluster = new Cluster(); cluster.setName(defaultClusterName); cluster.setId(clusterId.toString()); parentMock = mock(ClusterResource.class); when(parentMock.get()).thenReturn(cluster); } }