/* * Copyright (c) 2006-2014 Nuxeo SA (http://nuxeo.com/) and others. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Florent Guillaume */ package org.nuxeo.ecm.core.storage.mem; import static org.junit.Assert.assertNotNull; import static org.nuxeo.ecm.core.api.security.SecurityConstants.ADMINISTRATOR; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.junit.After; import org.junit.Before; import org.nuxeo.ecm.core.api.ClientException; import org.nuxeo.ecm.core.api.CoreInstance; import org.nuxeo.ecm.core.api.CoreSession; import org.nuxeo.ecm.core.api.NuxeoPrincipal; import org.nuxeo.ecm.core.api.repository.Repository; import org.nuxeo.ecm.core.api.repository.RepositoryManager; import org.nuxeo.ecm.core.event.EventService; import org.nuxeo.ecm.core.repository.RepositoryFactory; import org.nuxeo.runtime.api.Framework; import org.nuxeo.runtime.datasource.ConnectionHelper; import org.nuxeo.runtime.test.NXRuntimeTestCase; public class MemRepositoryTestCase extends NXRuntimeTestCase { private static final Log log = LogFactory.getLog(MemRepositoryTestCase.class); protected String repositoryName = "test"; protected CoreSession session; protected int initialOpenSessions; protected int initialSingleConnections; @Override @Before public void setUp() throws Exception { initCheckLeaks(); super.setUp(); deployBundle("org.nuxeo.ecm.core.schema"); deployBundle("org.nuxeo.ecm.core.api"); deployBundle("org.nuxeo.ecm.core"); deployBundle("org.nuxeo.ecm.core.event"); deployBundle("org.nuxeo.ecm.core.storage"); deployContrib("org.nuxeo.ecm.core.storage.mem.tests", "OSGI-INF/test-repo-types.xml"); initRepository(); openSession(); } @Override @After public void tearDown() throws Exception { if (session != null) { session.save(); } waitForAsyncCompletion(); closeSession(); closeRepository(); super.tearDown(); checkLeaks(); } protected void initRepository() throws Exception { RepositoryManager repositoryManager = Framework.getLocalService(RepositoryManager.class); RepositoryFactory repositoryFactory = new MemRepositoryFactory(); repositoryFactory.init(repositoryName); Repository repository = new Repository(repositoryName, repositoryName, null, repositoryFactory); repositoryManager.addRepository(repository); } protected void closeRepository() { RepositoryManager repositoryManager = Framework.getLocalService(RepositoryManager.class); repositoryManager.removeRepository(repositoryName); } protected void initCheckLeaks() { initialOpenSessions = CoreInstance.getInstance().getNumberOfSessions(); initialSingleConnections = ConnectionHelper.countConnectionReferences(); } protected void checkLeaks() { int finalOpenSessions = CoreInstance.getInstance().getNumberOfSessions(); int leakedOpenSessions = finalOpenSessions - initialOpenSessions; if (leakedOpenSessions != 0) { log.error(String.format( "There are %s open session(s) at tear down; it seems " + "the test leaked %s session(s).", Integer.valueOf(finalOpenSessions), Integer.valueOf(leakedOpenSessions))); for (CoreInstance.RegistrationInfo info : CoreInstance.getInstance().getRegistrationInfos()) { log.warn("Leaking session", info); } } int finalSingleConnections = ConnectionHelper.countConnectionReferences(); int leakedSingleConnections = finalSingleConnections - initialSingleConnections; if (leakedSingleConnections > 0) { log.error(String.format( "There are %s single datasource connection(s) open at tear down; " + "the test leaked %s connection(s).", Integer.valueOf(finalSingleConnections), Integer.valueOf(leakedSingleConnections))); } ConnectionHelper.clearConnectionReferences(); } public void waitForAsyncCompletion() { Framework.getLocalService(EventService.class).waitForAsyncCompletion(); } public void waitForFulltextIndexing() { waitForAsyncCompletion(); // DatabaseHelper.DATABASE.sleepForFulltext(); } public void openSession() throws ClientException { if (session != null) { log.warn("Closing session for you"); closeSession(); } session = openSessionAs(ADMINISTRATOR); assertNotNull(session); } public CoreSession openSessionAs(String username) throws ClientException { return CoreInstance.openCoreSession(repositoryName, username); } public CoreSession openSessionAs(NuxeoPrincipal principal) throws ClientException { return CoreInstance.openCoreSession(repositoryName, principal); } public void closeSession() { closeSession(session); session = null; } public void closeSession(CoreSession session) { if (session != null) { session.close(); } } }