/* * $Id$ * * Copyright 2013 University of Dundee. All rights reserved. * Use is subject to license terms supplied in LICENSE.txt */ package integration; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertTrue; import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import omero.ValidationException; import omero.api.IProjectionPrx; import omero.constants.projection.ProjectionType; import omero.model.Image; import omero.model.Pixels; import omero.model.PixelsType; import omero.sys.EventContext; import omero.sys.ParametersI; import org.springframework.util.ResourceUtils; import org.testng.annotations.Test; /** * Test the projection of an image by different users in all groups type. * Test also methods by passing invalid parameters. * * @author Jean-Marie Burel      <a * href="mailto:j.burel@dundee.ac.uk">j.burel@dundee.ac.uk</a> * @since 4.4.9 */ public class ProjectionServiceTest extends AbstractServerTest { /** * Imports the small dv. * The image has 5 z-sections, 6 timepoints, 1 channel, signed 16-bit. * * @return The id of the pixels set. * @throws Exception Thrown if an error occurred. */ private Pixels importImage() throws Exception { File srcFile = ResourceUtils.getFile("classpath:tinyTest.d3d.dv"); List<Pixels> pixels = null; try { pixels = importFile(srcFile, "dv"); } catch (Throwable e) { throw new Exception("cannot import image", e); } return pixels.get(0); } /** * Creates an image and projects it either by the owner or by another * member of the group. * * @param perms The permissions of the group. * @param role The role of the other group member projecting the image or * <code>-1</code> if the owner projects the image. * @throws Exception Thrown if an error occurred. */ private void projectImage(String perms, int memberRole) throws Exception { EventContext ctx = newUserAndGroup(perms); long ownerID = ctx.userId; if (memberRole > 0) { //create a second user in the group. EventContext ctx2 = newUserInGroup(ctx); switch (memberRole) { case AbstractServerTest.ADMIN: logRootIntoGroup(ctx2); break; case AbstractServerTest.GROUP_OWNER: makeGroupOwner(); } ctx2 = iAdmin.getEventContext(); ownerID = ctx2.userId; } Pixels pixels = importImage(); List<Integer> channels = Arrays.asList(0); Image img = projectImage(pixels, 0, pixels.getSizeT().getValue()-1, 0, pixels.getSizeZ().getValue()-1, 1, ProjectionType.MAXIMUMINTENSITY, null, channels); assertEquals(ownerID, img.getDetails().getOwner().getId().getValue()); } /** * Projects the image. * * @param pixels The pixels set. * @param startT The lower bound of the timepoint interval. * @param endT The upper bound of the timepoint interval. * @param startZ The lower bound of the z-section interval. * @param endZ The upper bound of the z-section interval. * @param stepping The stepping. * @param prjType The type of projection to perform. * @param pixelsType The type of pixels to generate. * @param channels The list of channels' indexes. * @return The projected image. * @throws Exception Thrown if an error occurred. */ private Image projectImage(Pixels pixels, int startT, int endT, int startZ, int endZ, int stepping, ProjectionType prjType, PixelsType pixelsType, List<Integer> channels) throws Exception { IProjectionPrx svc = factory.getProjectionService(); long imageID = svc.projectPixels(pixels.getId().getValue(), pixelsType, prjType, startT, endT, channels, stepping, startZ, endZ, "projectedImage"); assertTrue(imageID > 0); List<Image> images = factory.getContainerService().getImages(Image.class.getName(), Arrays.asList(imageID), new ParametersI()); assertEquals(images.size(), 1); Pixels p = images.get(0).getPixels(0); assertEquals(p.getSizeC().getValue(), channels.size()); assertEquals(p.getSizeT().getValue(), Math.abs(startT-endT)+1); assertEquals(p.getSizeZ().getValue(), 1); if (pixelsType == null) pixelsType = pixels.getPixelsType(); assertEquals(p.getPixelsType().getValue().getValue(), pixelsType.getValue().getValue()); return images.get(0); } /** * Projects the image. * * @param pixelsID The id of the pixels set. * @param timepoint The selected timepoint. * @param startZ The lower bound of the z-section interval. * @param endZ The upper bound of the z-section interval. * @param stepping The stepping. * @param prjType The type of projection to perform. * @param pixelsType The type of pixels to generate. * @param channelIndex The channel's index. * @throws Exception Thrown if an error occurred. */ private void projectStackImage(long pixelsID, int timepoint, int startZ, int endZ, int stepping, ProjectionType prjType, PixelsType pixelsType, int channelIndex) throws Exception { IProjectionPrx svc = factory.getProjectionService(); byte[] value = svc.projectStack(pixelsID, pixelsType, prjType, timepoint, channelIndex, stepping, startZ, endZ); assertTrue(value.length > 0); //TODO: more check to be added } /** * Test the possible projection type. * * @throws Exception Thrown if an error occurred. */ @Test public void testProjectionMeanIntensity() throws Exception { Pixels pixels = importImage(); List<Integer> channels = Arrays.asList(0); projectImage(pixels, 0, pixels.getSizeT().getValue()-1, 0, pixels.getSizeZ().getValue()-1, 1, ProjectionType.MEANINTENSITY, null, channels); } /** * Test the possible projection type. * * @throws Exception Thrown if an error occurred. */ @Test public void testProjectionSumIntensity() throws Exception { Pixels pixels = importImage(); List<Integer> channels = Arrays.asList(0); projectImage(pixels, 0, 0, 0, pixels.getSizeZ().getValue()-1, 1, ProjectionType.SUMINTENSITY, null, channels); } /** * Test the possible projection type. * * @throws Exception Thrown if an error occurred. */ @Test public void testProjectionMaxIntensity() throws Exception { Pixels pixels = importImage(); List<Integer> channels = Arrays.asList(0); projectImage(pixels, 0, pixels.getSizeT().getValue()-1, 0, pixels.getSizeZ().getValue()-1, 1, ProjectionType.MAXIMUMINTENSITY, null, channels); } /** * Test the projection with an invalid timepoint range. * * @throws Exception Thrown if an error occurred. */ @Test(expectedExceptions = ValidationException.class) public void testWrongTimepointIntervalUpperBound() throws Exception { Pixels pixels = importImage(); List<Integer> channels = Arrays.asList(0); projectImage(pixels, 0, pixels.getSizeT().getValue(), 0, pixels.getSizeZ().getValue()-1, 1, ProjectionType.MAXIMUMINTENSITY, null, channels); } /** * Test the projection with an invalid timepoint range. * * @throws Exception Thrown if an error occurred. */ @Test(expectedExceptions = ValidationException.class) public void testWrongTimepointIntervalLowerBound() throws Exception { Pixels pixels = importImage(); List<Integer> channels = Arrays.asList(0); projectImage(pixels, -1, pixels.getSizeT().getValue()-1, 0, pixels.getSizeZ().getValue()-1, 1, ProjectionType.MAXIMUMINTENSITY, null, channels); } /** * Test the projection with a timepoint range with lower bound = upper bound * * @throws Exception Thrown if an error occurred. */ @Test public void testSameTimepointInterval() throws Exception { Pixels pixels = importImage(); List<Integer> channels = Arrays.asList(0); projectImage(pixels, 0, 0, 0, pixels.getSizeZ().getValue()-1, 1, ProjectionType.MAXIMUMINTENSITY, null, channels); } /** * Test the projection with an invalid timepoint range. * * @throws Exception Thrown if an error occurred. */ @Test(expectedExceptions = ValidationException.class) public void testWrongTimepointInterval() throws Exception { Pixels pixels = importImage(); List<Integer> channels = Arrays.asList(0); projectImage(pixels, 6, 7, 0, pixels.getSizeZ().getValue()-1, 1, ProjectionType.MAXIMUMINTENSITY, null, channels); } /** * Test the projection with no channels specified. * * @throws Exception Thrown if an error occurred. */ @Test(expectedExceptions = ValidationException.class) public void testNoChannels() throws Exception { Pixels pixels = importImage(); List<Integer> channels = new ArrayList<Integer>(); projectImage(pixels, 0, pixels.getSizeT().getValue()-1, 0, pixels.getSizeZ().getValue(), 1, ProjectionType.MAXIMUMINTENSITY, null, channels); } /** * Test the projection with <code>null</code> channels list. * * @throws Exception Thrown if an error occurred. */ @Test(expectedExceptions = ValidationException.class) public void testNullChannels() throws Exception { Pixels pixels = importImage(); projectImage(pixels, 0, pixels.getSizeT().getValue()-1, 0, pixels.getSizeZ().getValue(), 1, ProjectionType.MAXIMUMINTENSITY, null, null); } /** * Test the projection with an invalid channel index * * @throws Exception Thrown if an error occurred. */ @Test(expectedExceptions = ValidationException.class) public void testWrongChannels() throws Exception { Pixels pixels = importImage(); List<Integer> channels = Arrays.asList(1); projectImage(pixels, 0, pixels.getSizeT().getValue()-1, 0, pixels.getSizeZ().getValue(), 1, ProjectionType.MAXIMUMINTENSITY, null, channels); } /** * Test the projection with an invalid z-section range. * * @throws Exception Thrown if an error occurred. */ @Test(expectedExceptions = ValidationException.class) public void testWrongZSectionIntervalUpperBound() throws Exception { Pixels pixels = importImage(); List<Integer> channels = Arrays.asList(0); projectImage(pixels, 0, pixels.getSizeT().getValue()-1, 0, pixels.getSizeZ().getValue(), 1, ProjectionType.MAXIMUMINTENSITY, null, channels); } /** * Test the projection with a z-sections range with same value. * * @throws Exception Thrown if an error occurred. */ @Test public void testSameZSectionInterval() throws Exception { Pixels pixels = importImage(); List<Integer> channels = Arrays.asList(0); projectImage(pixels, 0, pixels.getSizeT().getValue()-1, 0, 1, 1, ProjectionType.MAXIMUMINTENSITY, null, channels); } /** * Test the projection with an invalid timepoint range. * * @throws Exception Thrown if an error occurred. */ @Test(expectedExceptions = ValidationException.class) public void testWrongZSectionIntervalLowerBound() throws Exception { Pixels pixels = importImage(); List<Integer> channels = Arrays.asList(0); projectImage(pixels, 0, pixels.getSizeT().getValue()-1, -1, pixels.getSizeZ().getValue()-1, 1, ProjectionType.MAXIMUMINTENSITY, null, channels); } /** * Test the projection with a negative stepping * * @throws Exception Thrown if an error occurred. */ @Test(expectedExceptions = ValidationException.class) public void testNegativeStepping() throws Exception { Pixels pixels = importImage(); List<Integer> channels = Arrays.asList(0); projectImage(pixels, 0, pixels.getSizeT().getValue()-1, 0, pixels.getSizeZ().getValue()-1, -10, ProjectionType.MAXIMUMINTENSITY, null, channels); } /** * Test the projection with 2 steps * * @throws Exception Thrown if an error occurred. */ public void testTwoSteps() throws Exception { Pixels pixels = importImage(); List<Integer> channels = Arrays.asList(0); projectImage(pixels, 0, pixels.getSizeT().getValue()-1, 0, pixels.getSizeZ().getValue()-1, 2, ProjectionType.MAXIMUMINTENSITY, null, channels); } /** * Test the projection with 0 step * * @throws Exception Thrown if an error occurred. */ @Test(expectedExceptions = ValidationException.class) public void testZeroStep() throws Exception { Pixels pixels = importImage(); List<Integer> channels = Arrays.asList(0); projectImage(pixels, 0, pixels.getSizeT().getValue()-1, 0, pixels.getSizeZ().getValue()-1, 0, ProjectionType.MAXIMUMINTENSITY, null, channels); } /** * Test the projection of stack with a negative stepping * * @throws Exception Thrown if an error occurred. */ @Test(expectedExceptions = ValidationException.class) public void testProjectStackNegativeStepping() throws Exception { Pixels pixels = importImage(); projectStackImage(pixels.getId().getValue(), 0, 0, pixels.getSizeZ().getValue()-1, -10, ProjectionType.MAXIMUMINTENSITY, null, 0); } /** * Test the projection of stack with a zero stepping * * @throws Exception Thrown if an error occurred. */ @Test(expectedExceptions = ValidationException.class) public void testProjectStackZero() throws Exception { Pixels pixels = importImage(); projectStackImage(pixels.getId().getValue(), 0, 0, pixels.getSizeZ().getValue()-1, 0, ProjectionType.MAXIMUMINTENSITY, null, 0); } //Permissions testing. /** * Test the projection of the image by the owner of the data in a * RW---- group. * * @throws Exception Thrown if an error occurred. */ @Test public void testProjectImageByOwnerRW() throws Exception { projectImage("rw----", -1); } /** * Test the projection of the image by the owner of the data in a * RWR--- group. * * @throws Exception Thrown if an error occurred. */ @Test public void testProjectImageByOwnerRWR() throws Exception { projectImage("rwr---", -1); } /** * Test the projection of the image by the owner of the data in a * RWRA-- group. * * @throws Exception Thrown if an error occurred. */ @Test public void testProjectImageByOwnerRWRA() throws Exception { projectImage("rwra--", -1); } /** * Test the projection of the image by the owner of the data in a * RWR--- group. * * @throws Exception Thrown if an error occurred. */ @Test public void testProjectImageByOwnerRWRW() throws Exception { projectImage("rwrw--", -1); } /** * Test the projection of the image by the member of the group * in a RW---- group. * * @throws Exception Thrown if an error occurred. */ @Test public void testProjectImageByMemberRW() throws Exception { projectImage("rw----", AbstractServerTest.MEMBER); } /** * Test the projection of the image by the group owner of the group * in a RW---- group. * * @throws Exception Thrown if an error occurred. */ @Test public void testProjectImageByGroupOwnerRW() throws Exception { projectImage("rw----", AbstractServerTest.GROUP_OWNER); } /** * Test the projection of the image by an administrator. * in a RW---- group. * * @throws Exception Thrown if an error occurred. */ @Test public void testProjectImageByAdminRW() throws Exception { projectImage("rw----", AbstractServerTest.ADMIN); } /** * Test the projection of the image by a member of the group * in a RWR--- group. * * @throws Exception Thrown if an error occurred. */ @Test public void testProjectImageByGroupMemberRWR() throws Exception { projectImage("rwr---", AbstractServerTest.MEMBER); } /** * Test the projection of the image by the group owner of the group * in a RWR--- group. * * @throws Exception Thrown if an error occurred. */ @Test public void testProjectImageByGroupOwnerRWR() throws Exception { projectImage("rwr---", AbstractServerTest.GROUP_OWNER); } /** * Test the projection of the image by an administrator. * in a RWR--- group. * * @throws Exception Thrown if an error occurred. */ @Test public void testProjectImageByAdminRWR() throws Exception { projectImage("rwr---", AbstractServerTest.ADMIN); } /** * Test the projection of the image by a member of the group * in a RWRA-- group. * * @throws Exception Thrown if an error occurred. */ @Test public void testProjectImageByGroupMemberRWRA() throws Exception { projectImage("rwra--", AbstractServerTest.MEMBER); } /** * Test the projection of the image by the group owner of the group * in a RWRA-- group. * * @throws Exception Thrown if an error occurred. */ @Test public void testProjectImageByGroupOwnerRWRA() throws Exception { projectImage("rwra--", AbstractServerTest.GROUP_OWNER); } /** * Test the projection of the image by an administrator. * in a RWRA-- group. * * @throws Exception Thrown if an error occurred. */ @Test public void testProjectImageByAdminRWRA() throws Exception { projectImage("rwra--", AbstractServerTest.ADMIN); } /** * Test the projection of the image by a member of the group * in a RWRW-- group. * * @throws Exception Thrown if an error occurred. */ @Test public void testProjectImageByGroupMemberRWRW() throws Exception { projectImage("rwrw--", AbstractServerTest.MEMBER); } /** * Test the projection of the image by the group owner of the group * in a RWRW-- group. * * @throws Exception Thrown if an error occurred. */ @Test public void testProjectImageByGroupOwnerRWRW() throws Exception { projectImage("rwrw--", AbstractServerTest.GROUP_OWNER); } /** * Test the projection of the image by an administrator. * in a RWRW-- group. * * @throws Exception Thrown if an error occurred. */ @Test public void testProjectImageByAdminRWRW() throws Exception { projectImage("rwrw--", AbstractServerTest.ADMIN); } }