/* * Copyright 2006-2014 University of Dundee. All rights reserved. * Use is subject to license terms supplied in LICENSE.txt */ package ome.server.itests; import java.io.File; import java.util.List; import java.util.UUID; import javax.sql.DataSource; import junit.framework.TestCase; import ome.api.IConfig; import ome.api.IContainer; import ome.api.ILdap; import ome.api.IMetadata; import ome.api.IPixels; import ome.api.ISession; import ome.api.local.LocalAdmin; import ome.api.local.LocalQuery; import ome.api.local.LocalUpdate; import ome.formats.MockedOMEROImportFixture; import ome.model.IObject; import ome.model.containers.Dataset; import ome.model.core.Image; import ome.model.core.Pixels; import ome.model.internal.Permissions; import ome.model.internal.Permissions.Right; import ome.model.internal.Permissions.Role; import ome.model.meta.Experimenter; import ome.model.meta.ExperimenterGroup; import ome.model.meta.Session; import ome.parameters.Parameters; import ome.security.SecuritySystem; import ome.security.basic.CurrentDetails; import ome.security.basic.PrincipalHolder; import ome.services.fulltext.FullTextThread; import ome.services.sessions.SessionManager; import ome.services.util.Executor; import ome.system.EventContext; import ome.system.OmeroContext; import ome.system.Principal; import ome.system.Roles; import ome.system.ServiceFactory; import ome.testing.InterceptingServiceFactory; import ome.testing.OMEData; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.jmock.Mock; import org.jmock.core.stub.DefaultResultStub; import org.springframework.aop.interceptor.JamonPerformanceMonitorInterceptor; import org.springframework.aop.target.HotSwappableTargetSource; import org.springframework.ldap.core.LdapTemplate; import org.springframework.mail.MailSender; import org.springframework.orm.hibernate3.HibernateTemplate; import org.springframework.util.ResourceUtils; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @Test(groups = { "integration" }) public class AbstractManagedContextTest extends TestCase { // ========================================================================= protected final Logger log = LoggerFactory.getLogger(getClass()); protected LoginInterceptor loginAop; /** * Factory which provides "wrapped" managed services which handles login as * would take place via ISession */ protected ServiceFactory factory; protected LocalQuery iQuery; protected LocalUpdate iUpdate; protected LocalAdmin iAdmin; protected ILdap iLdap; protected IConfig iConfig; protected IContainer iContainer; protected IMetadata iMetadata; protected IPixels iPixels; protected ISession iSession; protected OMEData data; protected LdapTemplate ldapTemplate; protected HibernateTemplate hibernateTemplate; protected SecuritySystem securitySystem; protected Roles roles; protected PrincipalHolder holder; protected SessionManager sessionManager; protected Executor executor; protected OmeroContext applicationContext; /** * @see org.springframework.test.AbstractDependencyInjectionSpringContextTests#onSetUp() */ @BeforeClass protected final void onSetUp() throws Exception { this.applicationContext = OmeroContext.getManagedServerContext(); applicationContext.refreshAllIfNecessary(); DataSource dataSource = (DataSource) applicationContext .getBean("dataSource"); ldapTemplate = (LdapTemplate) applicationContext .getBean("ldapTemplate"); // data = new OMEData(); // data.setDataSource(dataSource); securitySystem = (SecuritySystem) applicationContext .getBean("securitySystem"); roles = securitySystem.getSecurityRoles(); holder = (PrincipalHolder) applicationContext .getBean("principalHolder"); sessionManager = (SessionManager) applicationContext .getBean("sessionManager"); executor = (Executor) this.applicationContext.getBean("executor"); // Service setup JamonPerformanceMonitorInterceptor jamon = new JamonPerformanceMonitorInterceptor(); loginAop = new LoginInterceptor((CurrentDetails) holder); factory = new ServiceFactory((OmeroContext) applicationContext); factory = new InterceptingServiceFactory(factory, loginAop, jamon); iQuery = (LocalQuery) factory.getQueryService(); iUpdate = (LocalUpdate) factory.getUpdateService(); iAdmin = (LocalAdmin) factory.getAdminService(); iLdap = factory.getLdapService(); iConfig = factory.getConfigService(); iContainer = factory.getContainerService(); iMetadata = factory.getMetadataService(); iPixels = factory.getPixelsService(); iSession = factory.getSessionService(); // Disabling the background indexer. If you want indexing then FullTextThread ftt = applicationContext .getBean("fullTextThread", FullTextThread.class); ftt.stop(); loginRoot(); } @AfterClass protected final void onTearDown() throws Exception { sessionManager.closeAll(); } protected void loginRoot() { loginRoot(roles.getSystemGroupName()); } protected void loginRootKeepGroup() { String name = iAdmin.getEventContext().getCurrentGroupName(); loginRoot(name); } protected void loginRoot(String groupName) { login(roles.getRootName(), groupName, "Test"); } protected Experimenter currentUser() { long gid = iAdmin.getEventContext().getCurrentUserId(); return iAdmin.getExperimenter(gid); } protected ExperimenterGroup currentGroup() { long gid = iAdmin.getEventContext().getCurrentGroupId(); return iAdmin.getGroup(gid); } protected void loginUserKeepGroup(String uname) { String gname = iAdmin.getEventContext().getCurrentGroupName(); loginUser(uname, gname); } protected void loginUserKeepGroup(Experimenter e) { String gname = iAdmin.getEventContext().getCurrentGroupName(); loginUser(e.getOmeName(), gname); } public Experimenter loginNewUser() { return loginNewUser(Permissions.PRIVATE); } public Experimenter loginNewUser(Permissions p) { loginRoot(); String uuid; Experimenter user; String guid = uuid(); ExperimenterGroup group = new ExperimenterGroup(); group.getDetails().setPermissions(p); group.setName(guid); group.setLdap(false); iAdmin.createGroup(group); uuid = uuid(); Experimenter e = new Experimenter(); e.setFirstName("New"); e.setLastName("User"); e.setOmeName(uuid); e.setLdap(false); long uid = iAdmin.createUser(e, guid); user = iQuery.get(Experimenter.class, uid); loginUser(uuid); return user; } public Experimenter loginNewUserInOtherUsersGroup(Experimenter e1) { Experimenter e2 = loginNewUser(); // Here we add the second user to the same // group to make sure s/he can see the image. // If we ever move to private permissions by // default, then we will need to do a chmod // on the whole image graph. loginRoot(); ExperimenterGroup g1 = iAdmin.getDefaultGroup(e1.getId()); iAdmin.addGroups(e2, g1); loginUser(e2.getOmeName(), g1.getName()); // ticket:1434, in same group return e2; } public ExperimenterGroup loginUserInNewGroup(Experimenter e1) { loginRoot(); String name = uuid(); ExperimenterGroup newGroup = new ExperimenterGroup(); newGroup.setName(name); newGroup.setLdap(false); long gid = iAdmin.createGroup(newGroup); iAdmin.addGroups(e1, new ExperimenterGroup(gid, false)); login(e1.getOmeName(), name, "Test"); return iAdmin.lookupGroup(name); } protected void loginUser(String omeName) { loginUser(omeName, roles.getUserGroupName()); } protected void loginUser(String omeName, String groupName) { login(omeName, groupName, "Test"); } protected Principal login(EventContext ec) { return login(ec.getCurrentUserName(), ec.getCurrentGroupName(), ec.getCurrentEventType()); } protected Principal login(String userName, String groupName, String eventType) { Principal p = new Principal(userName, groupName, eventType); Session s = sessionManager.createWithAgent(p, "AbstractManagedContext", "127.0.0.1"); loginAop.p = new Principal(s.getUuid(), groupName, eventType); return loginAop.p; } protected void indexObject(IObject obj) { EventContext ec = iAdmin.getEventContext(); loginRootKeepGroup(); iUpdate.indexObject(obj); login(ec); } protected String uuid() { return uuid("DASH"); } protected String uuid(String dashes) { return UUID.randomUUID().toString().replaceAll("-", dashes); } protected String getOmeroDataDir() { return ((OmeroContext) applicationContext) .getProperty("omero.data.dir"); } protected Image new_Image(String name) { Image i = new Image(); i.setName(name); return i; } protected Pixels makePixels() { try { MockedOMEROImportFixture fixture = new MockedOMEROImportFixture( this.factory, ""); List<omero.model.Pixels> pix = fixture.fullImport(ResourceUtils .getFile("classpath:tinyTest.d3d.dv"), "tinyTest"); if (pix == null) { throw new RuntimeException("No pixels returned."); } if (pix.size() != 1) { throw new RuntimeException("Expected 1, got: " + pix.size()); } return new Pixels(pix.get(0).getId().getValue(), false); } catch (Exception e) { if (e instanceof RuntimeException) { throw (RuntimeException) e; } else { throw new RuntimeException(e); } } } protected Image makeImage(boolean withDataset) throws Exception { return makeImage("classpath:tinyTest.d3d.dv", withDataset); } protected Image makeImage(String path, boolean withDataset) throws Exception { return makeImage(path, withDataset, 1); } protected Image makeImage(String path, boolean withDataset, Integer pixelCount) throws Exception { MockedOMEROImportFixture fixture = new MockedOMEROImportFixture( this.factory, ""); File test = ResourceUtils.getFile(path); List<omero.model.Pixels> pixs = fixture.fullImport(test, "test"); // fullImport calls tearDown if (pixelCount != null) { assertEquals(pixelCount.intValue(), pixs.size()); } omero.model.Pixels p = pixs.get(0); assertNotNull(p); Image i = new Image(p.getImage().getId().getValue(), false); if (withDataset) { Dataset d = new Dataset(); d.setName("test image"); d.linkImage(i); iUpdate.saveObject(d); } i = this.factory.getQueryService().findByQuery( "select i from Image i " + "left outer join fetch i.datasetLinks dil " + "left outer join fetch dil.parent d " + "left outer join fetch d.imageLinks " + "left outer join fetch i.pixels p " + "where p.id = :id", new Parameters().addId(pixs.get(0).getId().getValue())); assertNotNull(i); return i; } protected <T extends IObject> void assertWorldReadable(T t) { Permissions p = t.getDetails().getPermissions(); assertTrue(p.isGranted(Role.GROUP, Right.READ)); assertTrue(p.isGranted(Role.WORLD, Right.READ)); } protected <T extends IObject> void assertWorldReadable(List<T> list) { for (T t : list) { if (t.getId().equals(0L) || t.getId().equals(1L)) { continue; // Skipping root and guest. } assertWorldReadable(t); } } protected MailSender setMailSender(MailSender ms) { HotSwappableTargetSource hsts = applicationContext.getBean("mailSenderTargetSource", HotSwappableTargetSource.class); return (MailSender) hsts.swap(ms); } protected MailSender setNoopMailSender() { MailSender old; final Mock proxy = new Mock(MailSender.class); proxy.setDefaultStub(new DefaultResultStub()); old = setMailSender((MailSender) proxy.proxy()); return old; } }