/*
* Copyright 2007 Glencoe Software, Inc. All rights reserved.
* Use is subject to license terms supplied in LICENSE.txt
*/
package ome.server.itests;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import ome.api.IPixels;
import ome.api.ThumbnailStore;
import ome.model.IObject;
import ome.model.core.Pixels;
import ome.model.display.RenderingDef;
import ome.model.enums.RenderingModel;
import ome.model.internal.Permissions;
import ome.model.meta.Experimenter;
import ome.model.meta.ExperimenterGroup;
import ome.system.ServiceFactory;
import omeis.providers.re.RenderingEngine;
import org.testng.annotations.Test;
/**
*
* @author Josh Moore, josh at glencoesoftware.com
*
*/
public class ThumbnailServiceTest extends AbstractManagedContextTest {
class Fixture {
Pixels pixels;
long pixelsID;
long userID;
RenderingEngine re;
public Fixture() {
pixels = makePixels();
pixelsID = pixels.getId();
userID = iAdmin.getEventContext().getCurrentUserId();
re = factory.createRenderingEngine();
re.lookupPixels(pixelsID);
if (!(re.lookupRenderingDef(pixelsID))) {
re.resetDefaultSettings(true);
re.lookupRenderingDef(pixelsID);
}
re.load();
}
}
//
// XXX: Many other *basic* thumbnail tests are in RenderingSessionTest
//
@Test(groups = {"ticket:2075"})
public void testUserViewsOwnUpdatedThumbnailsByLongestSideSet()
throws Exception {
loginNewUser();
Pixels pix1 = makePixels();
Pixels pix2 = makePixels();
Pixels pix3 = makePixels();
Set<Long> pixelsIds = new HashSet<Long>();
pixelsIds.add(pix1.getId());
pixelsIds.add(pix2.getId());
pixelsIds.add(pix3.getId());
final ServiceFactory sf = this.factory;
RenderingEngine re = sf.createRenderingEngine();
ThumbnailStore tb = sf.createThumbnailService();
Map<Long, byte[]> before =
tb.getThumbnailByLongestSideSet(96, pixelsIds);
// Retrieve RGB rendering model
List<RenderingModel> models = re.getAvailableModels();
RenderingModel rgbModel = getModel(models, "rgb");
// Make pix1 red
re.lookupPixels(pix1.getId());
re.lookupRenderingDef(pix1.getId());
re.load();
re.setModel(rgbModel);
re.setRGBA(0, 255, 0, 0, 255);
re.saveCurrentSettings();
// Make pix2 green
re.lookupPixels(pix2.getId());
re.lookupRenderingDef(pix2.getId());
re.load();
re.setModel(rgbModel);
re.setRGBA(0, 0, 255, 0, 255);
re.saveCurrentSettings();
// Make pix3 blue
re.lookupPixels(pix3.getId());
re.lookupRenderingDef(pix3.getId());
re.load();
re.setModel(rgbModel);
re.setRGBA(0, 0, 0, 255, 255);
re.saveCurrentSettings();
Map<Long, byte[]> after =
tb.getThumbnailByLongestSideSet(96, pixelsIds);
assertEquals(before.size(), after.size());
assertTrue(before.keySet().equals(after.keySet()));
Set<Integer> afterThumbnailLengths = new HashSet<Integer>();
for (Long pixelsId : before.keySet()) {
byte[] beforeThumbnail = before.get(pixelsId);
byte[] afterThumbnail = after.get(pixelsId);
assertTrue(beforeThumbnail.length != afterThumbnail.length);
assertTrue(afterThumbnailLengths.add(afterThumbnail.length));
}
}
@Test(groups = {"ticket:2075"})
public void testUserViewsOwnUpdatedThumbnailByLongestSideSet()
throws Exception {
loginNewUser();
Pixels pix = makePixels();
final ServiceFactory sf = this.factory;
RenderingEngine re = sf.createRenderingEngine();
ThumbnailStore tb = sf.createThumbnailService();
re.lookupPixels(pix.getId());
assertTrue(re.lookupRenderingDef(pix.getId()));
re.load();
List<RenderingModel> models = re.getAvailableModels();
RenderingModel rgbModel = getModel(models, "rgb");
RenderingModel greyscaleModel = getModel(models, "greyscale");
assertEquals(greyscaleModel.getId(), re.getModel().getId());
Map<Long, byte[]> thumbnails = tb.getThumbnailByLongestSideSet(
96, Collections.singleton(pix.getId()));
assertEquals(1, thumbnails.size());
byte[] before = thumbnails.get(pix.getId());
assertNotNull(before);
re.setModel(rgbModel);
assertEquals(rgbModel.getId(), re.getModel().getId());
re.saveCurrentSettings();
thumbnails = tb.getThumbnailByLongestSideSet(
96, Collections.singleton(pix.getId()));
assertEquals(1, thumbnails.size());
byte[] after = thumbnails.get(pix.getId());
assertNotNull(after);
assertTrue(before.length != after.length);
}
@Test(groups = {"ticket:2075"})
public void testUserViewsOwnUpdatedThumbnailSet()
throws Exception {
loginNewUser();
Pixels pix = makePixels();
final ServiceFactory sf = this.factory;
RenderingEngine re = sf.createRenderingEngine();
ThumbnailStore tb = sf.createThumbnailService();
re.lookupPixels(pix.getId());
assertTrue(re.lookupRenderingDef(pix.getId()));
re.load();
List<RenderingModel> models = re.getAvailableModels();
RenderingModel rgbModel = getModel(models, "rgb");
RenderingModel greyscaleModel = getModel(models, "greyscale");
assertEquals(greyscaleModel.getId(), re.getModel().getId());
Map<Long, byte[]> thumbnails = tb.getThumbnailSet(
96, 96, Collections.singleton(pix.getId()));
assertEquals(1, thumbnails.size());
byte[] before = thumbnails.get(pix.getId());
assertNotNull(before);
re.setModel(rgbModel);
assertEquals(rgbModel.getId(), re.getModel().getId());
re.saveCurrentSettings();
thumbnails = tb.getThumbnailSet(
96, 96, Collections.singleton(pix.getId()));
assertEquals(1, thumbnails.size());
byte[] after = thumbnails.get(pix.getId());
assertNotNull(after);
assertTrue(before.length != after.length);
}
@Test(groups = {"ticket:3161"})
public void testTicket3161ThreeUserView() throws Exception {
Experimenter e1 = loginNewUser();
final ServiceFactory sf = this.factory;// new InternalServiceFactory();
Pixels pix = makePixels();
loginRoot();
makeDefaultGroupReadWrite(e1);
// Experimenter1's interactions
loginUser(e1.getOmeName());
ThumbnailStore ts = sf.createThumbnailService();
IPixels ps = sf.getPixelsService();
ts.setPixelsId(pix.getId());
byte[] thumbExp1 = ts.getThumbnail(5, 5);
assertNotNull(thumbExp1);
List<IObject> settingsList =
ps.retrieveAllRndSettings(pix.getId(), -1);
RenderingDef settings0 = (RenderingDef) settingsList.get(0);
assertEquals(1, settingsList.size());
assertEquals(1, settings0.getVersion().intValue());
// Experimenter2's interactions
Experimenter e2 = loginNewUserInOtherUsersGroup(e1);
RenderingEngine re = sf.createRenderingEngine();
ts = sf.createThumbnailService();
re.lookupPixels(pix.getId());
if (!re.lookupRenderingDef(pix.getId())) {
re.resetDefaultSettings(true);
re.lookupRenderingDef(pix.getId());
}
re.load();
ts.setPixelsId(pix.getId());
List<RenderingModel> models = re.getAvailableModels();
re.setModel(getModel(models, "rgb"));
re.saveCurrentSettings();
byte[] thumbExp2 = ts.getThumbnail(5, 5);
assertNotNull(thumbExp2);
settingsList = ps.retrieveAllRndSettings(pix.getId(), -1);
assertEquals(2, settingsList.size());
settings0 = (RenderingDef) settingsList.get(0);
RenderingDef settings1 = (RenderingDef) settingsList.get(1);
assertEquals(1, settings0.getVersion().intValue());
assertEquals(2, settings1.getVersion().intValue());
byte[][] thumbnails = retrieveAllThumbnailsBySettings(
settingsList, ts);
assertEquals(2, thumbnails.length);
// Experimenter3's interactions
Experimenter e3 = loginNewUserInOtherUsersGroup(e1);
ts = sf.createThumbnailService();
ts.setPixelsId(pix.getId());
ts.resetDefaults();
ts.setPixelsId(pix.getId());
byte[] thumbExp3 = ts.getThumbnail(5, 5);
assertNotNull(thumbExp3);
settingsList =
ps.retrieveAllRndSettings(pix.getId(), -1);
settings0 = (RenderingDef) settingsList.get(0);
settings1 = (RenderingDef) settingsList.get(1);
RenderingDef settings2 = (RenderingDef) settingsList.get(2);
assertEquals(3, settingsList.size());
assertEquals(1, settings0.getVersion().intValue());
assertEquals(2, settings1.getVersion().intValue());
assertEquals(1, settings2.getVersion().intValue());
thumbnails = retrieveAllThumbnailsBySettings(
settingsList, ts);
assertEquals(3, thumbnails.length);
}
@Test(groups = {"ticket:3161"})
public void testTicket3161SecurityViolation() throws Exception {
Experimenter e1 = loginNewUser();
final ServiceFactory sf = this.factory;// new InternalServiceFactory();
Pixels pix = makePixels();
loginRoot();
makeDefaultGroupReadWrite(e1);
// Experimenter1's services
loginUser(e1.getOmeName());
RenderingEngine re = sf.createRenderingEngine();
ThumbnailStore ts = sf.createThumbnailService();
IPixels psExp1 = sf.getPixelsService();
re.lookupPixels(pix.getId());
if (!re.lookupRenderingDef(pix.getId())) {
re.resetDefaultSettings(true);
re.lookupRenderingDef(pix.getId());
}
re.load();
List<RenderingModel> models = re.getAvailableModels();
RenderingModel modelExp1 = re.getModel();
ts.setPixelsId(pix.getId());
byte[] thumbExp1 = ts.getThumbnail(5, 5);
assertNotNull(thumbExp1);
// Experimenter2's services
Experimenter e2 = loginNewUserInOtherUsersGroup(e1);
re = sf.createRenderingEngine();
ts = sf.createThumbnailService();
re.lookupPixels(pix.getId());
if (!re.lookupRenderingDef(pix.getId())) {
re.resetDefaultSettings(true);
re.lookupRenderingDef(pix.getId());
}
re.load();
RenderingModel modelExp2 = re.getModel();
ts.setPixelsId(pix.getId());
byte[] thumbExp2A = ts.getThumbnail(5, 5);
assertNotNull(thumbExp2A);
// Check rendering models are the same
assertEquals(modelExp1.getId(), modelExp2.getId());
// Check that the rendering settings count is two
List<IObject> settingsList =
psExp1.retrieveAllRndSettings(pix.getId(), -1);
assertEquals(2, settingsList.size());
byte[][] thumbnails = retrieveAllThumbnailsBySettings(
settingsList, ts);
assertEquals(2, thumbnails.length);
// Switch rendering model to check the settings
re.setModel(getModel(models, "rgb"));
re.saveCurrentSettings();
settingsList =
psExp1.retrieveAllRndSettings(pix.getId(), -1);
loginUser(e1.getOmeName());
thumbnails = retrieveAllThumbnailsBySettings(
settingsList, ts);
assertEquals(2, thumbnails.length);
}
private byte[][] retrieveAllThumbnailsBySettings(
List<IObject> settingsList, ThumbnailStore ts) {
byte[][] toReturn = new byte[settingsList.size()][];
int i = 0;
for (IObject o : settingsList) {
ts.setRenderingDefId(o.getId());
toReturn[i] = ts.getThumbnail(5, 5);
i++;
}
return toReturn;
}
private RenderingModel getModel(List<RenderingModel> models, String value) {
for (RenderingModel model : models) {
if (model.getValue().equals(value)) {
return model;
}
}
throw new RuntimeException("Could not find model: " + value);
}
private void makeDefaultGroupReadWrite(Experimenter experimenter)
{
ExperimenterGroup group = iAdmin.getDefaultGroup(experimenter.getId());
group.getDetails().setPermissions(Permissions.GROUP_WRITEABLE);
iAdmin.updateGroup(group);
}
private void makeDefaultGroupReadOnly(Experimenter experimenter)
{
ExperimenterGroup group = iAdmin.getDefaultGroup(experimenter.getId());
group.getDetails().setPermissions(Permissions.GROUP_READABLE);
iAdmin.updateGroup(group);
}
}