/*
* Copyright 2006 University of Dundee. All rights reserved.
* Use is subject to license terms supplied in LICENSE.txt
*/
package ome.services.blitz.test.utests;
import static omero.rtypes.rbool;
import static omero.rtypes.rdouble;
import static omero.rtypes.rint;
import static omero.rtypes.rinternal;
import static omero.rtypes.rlist;
import static omero.rtypes.rlong;
import static omero.rtypes.rmap;
import static omero.rtypes.rstring;
import static omero.rtypes.rtime;
import java.math.BigDecimal;
import java.sql.Timestamp;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import ome.api.IAdmin;
import ome.api.IConfig;
import ome.api.IContainer;
import ome.api.IMetadata;
import ome.api.IQuery;
import ome.api.ISession;
import ome.api.IShare;
import ome.api.ITypes;
import ome.api.IUpdate;
import ome.api.RawFileStore;
import ome.api.RawPixelsStore;
import ome.api.Search;
import ome.api.ServiceInterface;
import ome.api.ThumbnailStore;
import ome.conditions.SecurityViolation;
import ome.model.IObject;
import ome.model.acquisition.Objective;
import ome.model.enums.Family;
import ome.model.enums.FilterType;
import ome.model.internal.Permissions;
import ome.model.meta.ExperimenterGroup;
import ome.model.roi.Roi;
import ome.parameters.Parameters;
import ome.parameters.QueryParameter;
import ome.services.blitz.impl.RoiI;
import ome.services.blitz.util.ConvertToBlitzExceptionMessage;
import ome.services.blitz.util.IceMethodInvoker;
import ome.services.messages.GlobalMulticaster;
import ome.system.EventContext;
import ome.system.OmeroContext;
import ome.system.Roles;
import omeis.providers.re.RGBBuffer;
import omeis.providers.re.RenderingEngine;
import omero.RMap;
import omero.RString;
import omero.RType;
import omero.UnloadedCollectionException;
import omero.api.RoiResult;
import omero.model.Experimenter;
import omero.model.ExperimenterGroupI;
import omero.model.ExperimenterI;
import omero.model.Image;
import omero.model.ImageI;
import omero.model.TagAnnotationI;
import omero.romio.XY;
import omero.rtypes.Conversion;
import omero.sys.Filter;
import omero.sys.ParametersI;
import omero.util.IceMap;
import omero.util.IceMapper;
import org.jmock.Mock;
import org.jmock.MockObjectTestCase;
import org.jmock.builder.ArgumentsMatchBuilder;
import org.jmock.core.Constraint;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
@Test
public class IceMethodInvokerUnitTest extends MockObjectTestCase {
IceMethodInvoker invoker;
Mock tbMock;
Destroyable tb;
IceMapper mapper;
Ice.Current current;
OmeroContext ctx;
GlobalMulticaster multicaster;
@Override
@BeforeMethod
protected void setUp() throws Exception {
new GlobalMulticaster().removeAllListeners(); // Static singleton.
tb = new Destroyable();
ctx = new OmeroContext("classpath:ome/services/messaging.xml");
multicaster = (GlobalMulticaster) ctx
.getBean("applicationEventMulticaster");
invoker = new IceMethodInvoker(ThumbnailStore.class, ctx);
mapper = new IceMapper();
current = new Ice.Current();
current.operation = "close";
current.id = Ice.Util.stringToIdentity("test");
}
@Test(groups = "ticket:880")
void testDetailsAreMappedToOmero() throws Exception {
ome.model.core.Image i = new ome.model.core.Image();
assertNotNull(i.getDetails());
Object o = mapper.handleOutput(ome.model.core.Image.class, i);
Image rv = (Image) o;
assertNotNull(rv.getDetails());
}
@Test(groups = "ticket:880")
void testDetailsAreMappedFromOmero() throws Exception {
Image i = new ImageI();
Object o = mapper.handleInput(ome.model.core.Image.class, i);
ome.model.core.Image rv = (ome.model.core.Image) o;
assertNotNull(rv.getDetails());
}
/**
* See the note in {#link {@link IceMethodInvoker#callorClose(...)} for info
* on why tb.closed == 0.
*/
@Test
void testAllCallsOnCloseAlsoCallDestroy() throws Exception {
invoker.invoke(tb, current, mapper);
assertTrue(tb.toString(), tb.closed == 1);
}
public static class Destroyable implements ThumbnailStore {
@Override
public String toString() {
return String.format("%d closes", closed);
}
int closed = 0;
public void activate() {
}
public void passivate() {
}
public void close() {
closed++;
}
public void createThumbnail(Integer sizeX, Integer sizeY) {
}
public void createThumbnails() {
}
public void createThumbnailsByLongestSideSet(Integer size,
Set<Long> pixelsIds) {
}
public byte[] getThumbnail(Integer sizeX, Integer sizeY) {
return null;
}
public byte[] getThumbnailByLongestSide(Integer size) {
return null;
}
public byte[] getThumbnailByLongestSideDirect(Integer size) {
return null;
}
public byte[] getThumbnailDirect(Integer sizeX, Integer sizeY) {
return null;
}
public Map<Long, byte[]> getThumbnailSet(Integer sizeX, Integer sizeY,
Set<Long> pixelsIds) {
return null;
}
public Map<Long, byte[]> getThumbnailByLongestSideSet(Integer size,
Set<Long> pixelsIds) {
return null;
}
public void resetDefaults() {
}
public boolean setPixelsId(long pixelsId) {
return false;
}
public boolean isInProgress() {
return false;
}
public void setRenderingDefId(Long renderingDefId) {
}
public boolean thumbnailExists(Integer sizeX, Integer sizeY) {
return false;
}
public EventContext getCurrentEventContext() {
return null;
}
public byte[] getThumbnailForSectionByLongestSideDirect(int theZ,
int theT, Integer size) {
return null;
}
public byte[] getThumbnailForSectionDirect(int theZ, int theT,
Integer sizeX, Integer sizeY) {
return null;
}
public void setRenderingDefId(long renderingDefId) {
}
public long getRenderingDefId() {
return -1;
}
}
//
// Copying ome.services.blitz.test.utests.IceMethodInvokerTest
//
Class<? extends ServiceInterface> c = null;
ServiceInterface srv = null;
Mock mock;
protected Object invoke(Object... args) throws Ice.UserException {
Object rv = invoker.invoke(srv, current, mapper, args);
return rv;
}
protected void init(Class<? extends ServiceInterface> c, String op) {
this.c = c;
mock = mock(this.c);
srv = (ServiceInterface) mock.proxy();
current.operation = op;
current.id = Ice.Util.stringToIdentity("test");
invoker = new IceMethodInvoker(this.c, ctx);
mapper = new IceMapper();
}
@Test(expectedExceptions = NullPointerException.class)
public void testObjectCtorCanThrowNPE() throws Exception {
new IceMethodInvoker((ServiceInterface) null, ctx);
}
@Test(expectedExceptions = NullPointerException.class)
public void testClassCtorCanThrowNPE() throws Exception {
new IceMethodInvoker((Class<ServiceInterface>) null, ctx);
}
@Test
public void testClassCtorStoresTheMethodsAndOtherInfo() throws Exception {
c = IAdmin.class;
IceMethodInvoker imi = new IceMethodInvoker(c, ctx);
assertNotNull(imi.getMethod("changePassword"));
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testInvokeChecksNumberOfArguments() throws Exception {
c = IAdmin.class;
current.operation = "changePassword";
IceMethodInvoker imi = new IceMethodInvoker(c, ctx);
imi.invoke(null, current, new IceMapper());
}
@Test
public void testInvokeMatchesStringArguments() throws Exception {
init(IAdmin.class, "changePassword");
method();
Object rv = invoke("foo");
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testInvokeThrowsIllegalArgumentExceptionOnUnknownMethod()
throws Exception {
c = IAdmin.class;
Mock mockA = mock(c);
IAdmin prx = (IAdmin) mockA.proxy();
current.operation = "XXXXXXXXXXXXXXXXXXXXXXXX";
IceMethodInvoker imi = new IceMethodInvoker(c, ctx);
imi.invoke(prx, current, new IceMapper(), (java.lang.Object[]) null);
}
@Test
public void testInvokeInvokesOnProxy() throws Exception {
c = IAdmin.class;
Mock mockA = mock(c);
mockA.expects(once()).method("changePassword");
IAdmin prx = (IAdmin) mockA.proxy();
current.operation = "changePassword";
IceMethodInvoker imi = new IceMethodInvoker(c, ctx);
imi.invoke(prx, current, new IceMapper(), "foo");
}
@Test(expectedExceptions = omero.SecurityViolation.class)
public void testInvokeHandlesExceptionMapping() throws Exception {
c = IAdmin.class;
SecurityViolation sv = new SecurityViolation("foo");
Experimenter exp = new ExperimenterI();
Mock mockA = mock(c);
mockA.expects(once()).method("createUser").will(throwException(sv));
IAdmin prx = (IAdmin) mockA.proxy();
current.operation = "createUser";
IceMethodInvoker imi = new IceMethodInvoker(c, ctx);
imi.invoke(prx, current, new IceMapper(), exp, "default");
}
@Test
public void testInvokeProperlyMapsIObject() throws Exception {
Image i = new ImageI();
i.setName(rstring("foo"));
init(IUpdate.class, "saveObject");
mock.expects(once()).method(current.operation).with(new Constraint() {
public boolean eval(Object o) {
if (o instanceof ome.model.core.Image) {
ome.model.core.Image test = (ome.model.core.Image) o;
return "foo".equals(test.getName());
}
return false;
}
public StringBuffer describeTo(StringBuffer buffer) {
return buffer.append("name equal foo");
}
});
Object rv = invoker.invoke(srv, current, mapper, i);
assertNull(rv);
}
// Session
@Test
public void testSessionsWorks() throws Exception {
ISession s;
init(ISession.class, "getInput");
method().will(returnValue(rint(1)));
Object rv = invoke("a", "a");
assertNotNull(rv);
init(ISession.class, "setInput");
method();
rv = invoke("a", "a", rint(2));
init(ISession.class, "getOutput");
method().will(returnValue(new omero.Point()));
rv = invoke("a", "a");
init(ISession.class, "setOutput");
method();
rv = invoke("a", "a", rinternal(new omero.grid.JobParams()));
}
@Test(groups = "ticket:1036")
public void testSessionsGetInputString() throws Exception {
ISession s;
String sess = new String("sess");
String key = new String("key");
RString value = rstring("value");
init(ISession.class, "setInput");
method();
Object rv = invoke(sess, key, value);
init(ISession.class, "getInput");
method().will(returnValue("value"));
rv = invoke(sess, key);
assertNotNull(rv);
// This is how the invoker previously broke. Should be true.
assertFalse(rv instanceof RString);
// Now using the #mapReturnValue method
init(ISession.class, "getInput");
method().will(returnValue("value"));
// Convert string to rstring
mapper = new IceMapper(IceMapper.STRING_TO_RSTRING);
rv = invoke(sess, key);
assertNotNull(rv);
assertTrue(rv instanceof RString);
}
@Test(groups = "ticket:1321")
public void testSessionsGetInputs() throws Exception {
ISession s;
RString val = rstring("value");
init(ISession.class, "setInput");
method().with(eq("sess"), eq("key"), eq("value"));
invoke("sess", "key", rstring("value"));
Map map = new HashMap();
map.put("key", "value");
init(ISession.class, "getInputs");
method().will(returnValue(map));
Object rv = invoke("sess");
}
@Test
public void testRMapRecursion() throws Exception {
RMap map = rmap();
map.getValue().put("m", map);
Conversion c = (Conversion) map;
c.convert(new IceMapper());
init(ISession.class, "getInput");
map.put("recurse", map);
method().will(returnValue(map));
invoke("sess", "recursive");
}
@Test
public void testSessionEnvironment() throws Exception {
// Used by InteractiveProcessorI
Map m = new HashMap();
m.put("string", new ome.model.core.Image());
mapper.toRType(1);
mapper.toRType(rint(1));
mapper.toRType(m);
mapper.toRType(new ome.model.core.Image());
mapper.toRType(Arrays.asList(m));
}
// Share
@Test
public void testShareWorks() throws Exception {
IShare s;
init(IShare.class, "createShare");
method().will(returnValue(1L));
Object rv = invoke("d", null, null, null, null, true);
assertNotNull(rv);
}
// Admin
@Test
public void testAdminWorks() throws Exception {
IAdmin a;
init(IAdmin.class, "getSecurityRoles");
method().will(returnValue(new Roles()));
Object rv = invoke();
assertNotNull(rv);
assertEquals(new Roles().getRootName(), ((omero.sys.Roles) rv).rootName);
init(IAdmin.class, "getEventContext");
method().will(returnValue(new EventContext() {
public Long getCurrentShareId() {
return null;
}
public Long getCurrentSessionId() {
return 1L;
}
public String getCurrentSessionUuid() {
return "uuid";
}
public Long getCurrentEventId() {
return 1L;
}
public String getCurrentEventType() {
return "type";
}
public Long getCurrentGroupId() {
return 2L;
}
public String getCurrentGroupName() {
return "group";
}
public Long getCurrentUserId() {
return 3L;
}
public String getCurrentUserName() {
return "user";
}
public List<Long> getLeaderOfGroupsList() {
return Arrays.asList(4L);
}
public List<Long> getMemberOfGroupsList() {
return Arrays.asList(5L);
}
public boolean isCurrentUserAdmin() {
return true;
}
public boolean isReadOnly() {
return false;
}
public Permissions getCurrentUmask() {
return null;
}
public Permissions getCurrentGroupPermissions() {
return null;
}
}));
rv = invoke();
omero.sys.EventContext ec = (omero.sys.EventContext) rv;
assertTrue(ec.eventType.equals("type"));
assertTrue(ec.groupName.equals("group"));
assertTrue(ec.userName.equals("user"));
}
@Test
public void testAdminCanReturnArrays() throws Exception {
IAdmin a;
init(IAdmin.class, "containedGroups");
method()
.will(
returnValue(new ExperimenterGroup[] { new ExperimenterGroup() }));
Object rv = invoke(1L);
assertNotNull(rv);
assertTrue("is list", List.class.isAssignableFrom(rv.getClass()));
List l = (List) rv;
assertTrue("with group", omero.model.ExperimenterGroup.class
.isAssignableFrom(l.get(0).getClass()));
}
@Test
public void testAdminNullAndEmptyArraysShouldWorkToo() throws Exception {
IAdmin a;
init(IAdmin.class, "containedGroups");
method().will(returnValue(null));
Object rv = invoke(1L);
assertTrue("is null", rv == null);
method().will(returnValue(new ExperimenterGroup[] {}));
rv = invoke(1L);
List l = (List) rv;
assertTrue("is empty", l.size() == 0);
}
@Test(groups = "ticket:1775")
public void testPermissionsMapToNull() throws Exception {
ExperimenterGroupI in = new ExperimenterGroupI();
assertNull(in.getDetails().getPermissions());
IceMapper mapper = new IceMapper();
ExperimenterGroup out = (ExperimenterGroup)
mapper.handleInput(ExperimenterGroup.class, in);
assertNull(out.getDetails().getPermissions());
}
// Types
@Test( groups = {"ticket:1436","broken"} )
public void testTypesWorks() throws Exception {
ITypes t;
init(ITypes.class, "getEnumerationTypes");
method().will(returnValue(Arrays.asList(FilterType.class)));
Object rv = invoke();
assertNotNull(rv);
}
// Query
@Test
public void testQueryWorks() throws Exception {
IQuery q;
init(IQuery.class, "findAllByQuery");
method().will(returnValue(Arrays.asList(new ome.model.core.Image())));
Object rv = invoke("my query", new omero.sys.Parameters());
assertNotNull(rv);
init(IQuery.class, "findAll");
method().will(
returnValue(Arrays.asList(new ome.model.meta.Experimenter())));
rv = invoke("Experimenter", new omero.sys.Filter());
List l = (List) rv;
rv = l.get(0);
assertTrue(rv.getClass().getName(),
rv instanceof omero.model.Experimenter);
}
@Test
public void testQueryReceivesProperQueryParameters() throws Exception {
IQuery q;
init(IQuery.class, "findAllByQuery");
method().with(eq("my query"), new Constraint() {
public StringBuffer describeTo(StringBuffer buffer) {
buffer.append(" propery quer parameters ");
return buffer;
}
public boolean eval(Object o) {
if (o instanceof ome.parameters.Parameters) {
ome.parameters.Parameters p = (ome.parameters.Parameters) o;
if (!Long.valueOf(p.owner()).equals(2L)) {
return false;
}
QueryParameter qp;
qp = p.get("S");
if (!qp.name.equals("S") || !qp.value.equals("S")
|| !qp.type.equals(String.class)) {
return false;
}
qp = p.get("Time");
if (!qp.name.equals("Time")
|| !Long.valueOf(((Timestamp) qp.value).getTime())
.equals(10L)) {
return false;
}
return true;
}
return false;
}
}).will(returnValue(Arrays.asList(new ome.model.core.Image())));
omero.sys.Parameters p = new omero.sys.Parameters();
p.theFilter = new Filter();
p.theFilter.ownerId = rlong(2L);
p.map = new HashMap<String, RType>();
p.map.put("S", rstring("S"));
p.map.put("List", rlist(rlong(1L), rlong(2L)));
p.map.put("Time", rtime(10L));
// p.map.put("Array",new JArray(new JString("A")));
// FIXME: Not supported. Array class needed for query parameters.
Object rv = invoke("my query", p);
assertNotNull(rv);
}
// Update
@Test
public void testUpdateHanlesArraysProperly() throws Exception {
init(IUpdate.class, "saveArray");
method(); // void
Object rv = invoke(Arrays.asList(new omero.model.ImageI()));
init(IUpdate.class, "saveAndReturnArray");
method()
.will(
returnValue(new ome.model.core.Image[] { new ome.model.core.Image() }));
rv = invoke(Arrays.asList(new omero.model.ImageI()));
List l = (List) rv;
assertTrue(l.size() == 1);
}
@Test
public void testUpdateHanlesCollectionsProperly() throws Exception {
init(IUpdate.class, "saveCollection");
method(); // void
Object rv = invoke(Arrays.asList(new omero.model.ImageI()));
}
// RawFileStore
@Test
public void testFileStoreWorks() throws Exception {
RawFileStore fs;
init(RawFileStore.class, "write");
method();
Object rv = invoke(new byte[] { 1, 2, 3 }, 1L, 1);
assertNull(rv);
}
// RawPixelsStore
@Test
public void testPixelsStoreWorks() throws Exception {
RawPixelsStore ps;
init(RawPixelsStore.class, "getRegion");
method().will(returnValue(new byte[] { 1, 2, 3 }));
Object rv = invoke(1, 1L);
assertTrue(1 == ((byte[]) rv)[0]);
init(RawPixelsStore.class, "getTimepointSize");
method().will(returnValue(Long.valueOf(1)));
rv = invoke();
assertTrue(1 == (Long) rv);
}
// RenderingEngine
@Test
public void testRenderingEngineWorks() throws Exception {
RenderingEngine re;
Family m1 = new Family();
Family m2 = new Family();
List l = Arrays.asList(m1, m2);
init(RenderingEngine.class, "getAvailableFamilies");
mock.expects(once()).method(current.operation).will(returnValue(l));
Object rv = invoke();
assertTrue(((List) rv).size() == 2);
init(RenderingEngine.class, "getChannelFamily");
mock.expects(once()).method(current.operation).will(returnValue(m1));
rv = invoke(1);
assertTrue(rv instanceof omero.model.Family);
init(RenderingEngine.class, "setActive");
method();
rv = invoke(1, true);
RGBBuffer buffer = new RGBBuffer(10, 10);
omero.romio.PlaneDef def = new omero.romio.PlaneDef();
def.slice = XY.value;
def.t = 0;
def.z = 1;
init(RenderingEngine.class, "render");
method().will(returnValue(buffer));
rv = invoke(def);
init(RenderingEngine.class, "renderAsPackedInt");
method().will(returnValue(new int[] { 1, 2, 3, 4 }));
rv = invoke(def);
}
// ThumbnailStore
@Test
public void testGetThumbnailSet() throws Exception {
ThumbnailStore ts;
assertNotNull(IceMap.OMEtoOMERO.get(Family.Details.class));
byte[] b = new byte[] { 1, 2, 3 };
Set<byte[]> set = new HashSet<byte[]>();
set.add(b);
assertTrue("Arrays don't work this way", set.contains(b));
Map<Long, byte[]> map = new HashMap<Long, byte[]>();
map.put(1L, new byte[] { 1, 2, 3 });
init(ThumbnailStore.class, "getThumbnailSet");
method().will(returnValue(map));
Object rv = invoke(32, 32, Collections.singleton(1L));
byte[] results = ((Map<Long, byte[]>) rv).get(1L);
assertNotNull(results);
assertTrue(Arrays.equals(b, results));
}
// Config
@Test
public void testConfigWorks() throws Exception {
IConfig cfg;
init(IConfig.class, "getServerTime");
method().will(returnValue(new Timestamp(System.currentTimeMillis())));
Object rv = invoke();
assertNotNull(rv);
}
// Container
@Test
public void testContainerWorks() throws Exception {
IContainer p;
Map<String, RType> paramMap = new HashMap<String, RType>();
paramMap.put("foo", rstring("bar"));
ParametersI param = new ParametersI(paramMap);
init(IContainer.class, "loadContainerHierarchy");
method().will(returnValue(new HashSet()));
Object rv = invoke("Project", Arrays.asList(1L), param);
}
// Moved in 4.0
@Test
public void testContainerCanFindAnnotations() throws Exception {
IMetadata p;
Map<String, RType> paramMap = new HashMap<String, RType>();
paramMap.put("foo", rbool(true));
ParametersI param = new ParametersI(paramMap);
Map<Long, Set<? extends IObject>> retVal = new HashMap<Long, Set<? extends IObject>>();
init(IMetadata.class, "loadAnnotations");
method().will(returnValue(retVal));
Object rv = invoke("Image", Arrays.asList(1L, 2L),
Arrays.asList("CommentAnnotation"),
Arrays.asList(1L, 2L), param);
Map map = (Map) rv;
assertNotNull(map);
}
@Test
public void testContainerReceivesProperPojoOptions() throws Exception {
IContainer p;
ParametersI params = new ParametersI();
params.leaves();
params.exp(rlong(1));
init(IContainer.class, "loadContainerHierarchy");
method().with(ANYTHING, ANYTHING, new Constraint() {
public StringBuffer describeTo(StringBuffer buffer) {
buffer.append(" proper PojoOptions ");
return buffer;
}
public boolean eval(Object o) {
if (o instanceof Parameters) {
Parameters po = (Parameters) o;
if (!po.isLeaves()) {
return false;
}
if (!po.isExperimenter()) {
return false;
}
if (!po.getExperimenter().equals(1L)) {
return false;
}
}
return true;
}
}).will(returnValue(new HashSet()));
Object rv = invoke("Image", Arrays.asList(1L, 2L), params);
}
@Test
public void testContainerHandlesArraysProperly() throws Exception {
init(IContainer.class, "createDataObjects");
method().will(returnValue(null));
Object rv = invoke(null, null);
assertNull(rv);
method().will(returnValue(new ome.model.core.Image[] {}));
rv = invoke(Collections.EMPTY_LIST, null);
assertTrue(((List) rv).size() == 0);
method()
.will(
returnValue(new ome.model.core.Image[] { new ome.model.core.Image() }));
rv = invoke(Collections.EMPTY_LIST, null);
assertTrue(((List) rv).size() == 1);
init(IContainer.class, "updateDataObjects");
method().will(returnValue(null));
rv = invoke(null, null);
assertNull(rv);
method().will(returnValue(new ome.model.IObject[] {}));
rv = invoke(Collections.EMPTY_LIST, null);
assertTrue(((List) rv).size() == 0);
method()
.will(
returnValue(new ome.model.core.Image[] { new ome.model.core.Image() }));
rv = invoke(Collections.EMPTY_LIST, null);
assertTrue(((List) rv).size() == 1);
init(IContainer.class, "link");
method()
.will(
returnValue(new ome.model.containers.ProjectDatasetLink[] { new ome.model.containers.ProjectDatasetLink() }));
rv = invoke(Arrays.asList(new omero.model.ProjectDatasetLinkI()), null);
assertTrue(((List) rv).size() == 1);
}
// what happens if sth returns a prx
// what happens
// Invokers could use inheritance for special things (PlaneDef, e.g.)
// method with: int, double, float, boolean, arrays, lists, etc.
// input values:
// long, int, double, Long, Integer, String, RString,
// arrags
// Search
@Test
public void testSearchWorks() throws Exception {
Search s;
init(Search.class, "next");
method().will(returnValue(new ome.model.core.Image()));
Object rv = invoke();
Image img = (Image) rv;
assertNotNull(img);
init(Search.class, "onlyOwnedBy");
method();
rv = invoke(new omero.model.DetailsI());
init(Search.class, "onlyIds");
method();
rv = invoke((Object) new Long[] { 1L, 2L });
init(Search.class, "onlyIds");
method();
rv = invoke((Object) new Long[] { 1L });
init(Search.class, "byAnnotatedWith");
method();
rv = invoke(Arrays.asList(new TagAnnotationI()));
init(Search.class, "fetchAlso");
method();
rv = invoke(Arrays.asList("a", "b"));
init(Search.class, "fetchAnnotations");
method();
rv = invoke(Arrays.asList("Image", "Project"));
init(Search.class, "currentMetadataList");
method().will(returnValue(Collections.singletonList(new HashMap())));
rv = invoke();
}
// ~ Exceptions
// =========================================================================
public void testExceptionsDirect() throws Exception {
omero.ServerError se = new omero.ServerError();
Throwable t = mapper.handleException(se, ctx);
assertEquals(t, se);
t = mapper.handleException(new java.lang.IllegalThreadStateException(),
ctx);
assertTrue(t instanceof omero.InternalException);
}
public void testExceptionsWithHandler() throws Exception {
// addApplicationListener currently does not work
// instead we've subclassed OmeroContext to make
// addListener public
multicaster.addApplicationListener(new ApplicationListener() {
public void onApplicationEvent(ApplicationEvent arg0) {
int i = 0;
i++;
if (arg0 instanceof ConvertToBlitzExceptionMessage) {
ConvertToBlitzExceptionMessage msg = (ConvertToBlitzExceptionMessage) arg0;
if (msg.from instanceof NullPointerException) {
msg.to = new omero.ApiUsageException();
}
}
}
});
Throwable t = mapper.handleException(new NullPointerException(), ctx);
assertTrue(t.getClass().toString(),
t instanceof omero.ApiUsageException);
}
public void testByteArraysAsMaValues() {
}
@Test(groups = "ticket:1150")
public void testRFloatDoesNotGetRounded() throws Exception {
Objective o = new Objective();
o.setLensNA(new Double(1.4));
omero.model.Objective o2 = (omero.model.Objective) mapper.handleOutput(
Objective.class, o);
assertEquals(o.getLensNA().doubleValue(), o2.getLensNA().getValue());
}
@Test(groups = "ticket:1150")
public void testFloatDoesNotGetRounded() throws Exception {
float f = 1.4f;
// These fail
double dbl1 = rdouble(f).getValue();
assertFalse("1.4".equals(Double.toString(dbl1)));
double dbl2 = f;
assertFalse("1.4".equals(Double.toString(dbl2)));
double dbl3 = rdouble(dbl2).getValue();
assertFalse("1.4".equals(Double.toString(dbl3)));
double dbl4 = BigDecimal.valueOf(f).doubleValue();
assertFalse("1.4".equals(Double.toString(dbl4)));
// These work
double dbl5 = new BigDecimal("" + f).doubleValue();
assertTrue("1.4".equals(Double.toString(dbl5)));
double dbl6 = Double.parseDouble(String.valueOf(f));
assertTrue("1.4".equals(Double.toString(dbl6)));
}
@Test
public void testNullFromGetPrimaryPixels() throws Exception {
ome.model.core.Image i = new ome.model.core.Image();
i.putAt(ome.model.core.Image.PIXELS, null);
assertEquals(-1, i.sizeOfPixels());
Image mapped = (Image) mapper.map(i);
assertEquals(-1, mapped.sizeOfPixels());
try {
mapped.getPrimaryPixels();
fail("must throw");
} catch (UnloadedCollectionException uce) {
// good
}
try {
mapped.copyPixels();
fail("must throw");
} catch (UnloadedCollectionException uce) {
// good
}
}
// ~ RoiResults
// =========================================================================
@Test
public void testRoiResultMaps() throws Exception {
Map<Long, List<Roi>> rois = new HashMap<Long, List<Roi>>();
rois.put(1L, Collections.singletonList(new Roi()));
IceMapper mapper = new IceMapper();
Map<Long, RoiResult> rrs = (Map<Long, RoiResult>)
new RoiI.RoiResultMapReturnMapper(null).mapReturnValue(mapper, rois);
RoiResult rr = rrs.get(1L);
assertNotNull(rr);
}
// ~ Helpers
// =========================================================================
protected ArgumentsMatchBuilder method() {
return mock.expects(once()).method(current.operation);
}
}