/* * 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 java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import net.sf.ehcache.Ehcache; import net.sf.ehcache.Element; import ome.logic.HardWiredInterceptor; import ome.services.blitz.impl.ServiceFactoryI; import ome.services.sessions.SessionManager; import ome.services.util.Executor; import ome.system.OmeroContext; import ome.system.Principal; import omero.api.IAdminPrxHelper; import omero.api._IAdminTie; import omero.constants.CLIENTUUID; import org.aopalliance.intercept.MethodInvocation; import org.jmock.Mock; import org.jmock.MockObjectTestCase; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import Ice.OperationMode; public class ServiceFactoryServiceCreationDestructionTest extends MockObjectTestCase { protected Executor executor = new Executor.Impl(null, null, null, null) { @Override public Object execute(Principal p, Work work) { return work.doWork(null, null); } }; Ice.Current curr; Mock mockCache, mockAdapter, mockManager; Ehcache cache; Ice.ObjectAdapter adapter; SessionManager manager; ServiceFactoryI sf; Map<String, Ice.Object> map; Ice.Current current = new Ice.Current(); { current.ctx = new HashMap<String, String>(); current.ctx.put(CLIENTUUID.value, "clientuuid"); } // FIXME OmeroContext should be an interface! // OmeroContext context = new OmeroContext(new String[]{ // "classpath:ome.services.blitz.test.utests/ServiceFactoryTest.xml", // "classpath:ome/services/blitz-servantDefinitions.xml"}); // OmeroContext context; String adminServiceId = "sessionuuid/omero.api.IAdmin"; String reServiceId = "sessionuuid/uuid-omero.api.RenderingEngine"; @Override @AfterMethod protected void tearDown() throws Exception { sf = null; } @Override @BeforeMethod protected void setUp() throws Exception { context = OmeroContext.getInstance("OMERO.blitz.test"); context.refresh(); // Repairing from other methods map = new HashMap<String, Ice.Object>(); mockCache = mock(Ehcache.class); cache = (Ehcache) mockCache.proxy(); mockAdapter = mock(Ice.ObjectAdapter.class); adapter = (Ice.ObjectAdapter) mockAdapter.proxy(); mockManager = mock(SessionManager.class); manager = (SessionManager) mockManager.proxy(); mockManager.expects(once()).method("inMemoryCache").will( returnValue(cache)); mockCache.expects(once()).method("isKeyInCache") .will(returnValue(true)); mockCache.expects(once()).method("get").will( returnValue(new Element("activeServants", map))); curr = new Ice.Current(); curr.adapter = adapter; curr.id = Ice.Util.stringToIdentity("username/sessionuuid"); List<HardWiredInterceptor> hwi = new ArrayList<HardWiredInterceptor>(); hwi.add(new HardWiredInterceptor() { public Object invoke(MethodInvocation arg0) throws Throwable { return arg0.proceed(); } }); Principal p = new Principal("session", "group", "type"); sf = new ServiceFactoryI(current, new omero.util.ServantHolder("session"), null, context, manager, executor, p, hwi, null, null); }; @Test public void testDoStatelessAddsServantToServantListCacheAndAdapter() throws Exception { IAdminPrxHelper admin = IAdminPrxHelperFactory.create(); callsActiveServices(Collections.singletonList(adminServiceId)); map.put(adminServiceId, new _IAdminTie()); mockAdapter.expects(once()).method("add").will(returnValue(null)); mockAdapter.expects(once()).method("find").will(returnValue(null)); mockAdapter.expects(once()).method("createDirectProxy").will( returnValue(admin)); sf.getAdminService(curr); List<String> ids = sf.activeServices(curr); assertTrue(ids.toString(), ids.size() == 1); assertTrue(ids.toString(), ids.get(0).endsWith("Admin")); } @Test public void testDoStatefulAddsServantToServantListCacheAndAdapter() throws Exception { callsActiveServices(Collections.singletonList(reServiceId)); mockAdapter.expects(once()).method("add").will(returnValue(null)); mockAdapter.expects(once()).method("createDirectProxy").will( returnValue(null)); mockAdapter.expects(once()).method("find").will(returnValue(null)); mockAdapter.expects(once()).method("find").will(returnValue(null)); sf.createRenderingEngine(curr); List<String> ids = sf.activeServices(curr); assertTrue(ids.toString(), ids.size() == 1); assertTrue(ids.toString(), ids.get(0).endsWith("RenderingEngine")); } @Test void testCallingCloseOnSessionClosesAllProxies() throws Exception { testDoStatefulAddsServantToServantListCacheAndAdapter(); Mock closeMock = mock(omero.api.RenderingEngine.class); omero.api.RenderingEngine close = (omero.api.RenderingEngine) closeMock .proxy(); mockAdapter.expects(once()).method("find").will(returnValue(close)); mockAdapter.expects(once()).method("remove").will(returnValue(close)); callsActiveServices(Collections.singletonList(reServiceId)); Ice.Current curr = new Ice.Current(); curr.id = Ice.Util.stringToIdentity("username/sessionuuid"); curr.adapter = adapter; curr.mode = OperationMode.Idempotent; // FIXME Due to Ice bug sf.close(curr); } @Test void testUnregisterEventCallsClose() throws Exception { testDoStatefulAddsServantToServantListCacheAndAdapter(); Mock closeMock = mock(omero.api.RenderingEngine.class); omero.api.RenderingEngine close = (omero.api.RenderingEngine) closeMock .proxy(); mockAdapter.expects(once()).method("remove").will(returnValue(close)); callsActiveServices(Collections.singletonList(reServiceId)); String id = sf.activeServices(curr).get(0).toString(); // Events now called by SessionManagerI sf.unregisterServant(Ice.Util.stringToIdentity(id)); } private void callsActiveServices(List<String> idList) { } }