/* * Copyright (c) 2013 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.persistence; import java.util.Properties; import javax.persistence.EntityManager; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.nuxeo.ecm.core.storage.sql.DatabaseHelper; import org.nuxeo.runtime.api.Framework; import org.nuxeo.runtime.datasource.ConnectionHelper; import org.nuxeo.runtime.test.NXRuntimeTestCase; import org.nuxeo.runtime.transaction.TransactionHelper; public class TestPersistenceProvider extends NXRuntimeTestCase { protected PersistenceProvider persistenceProvider; // subclass to test single-datasource mode has this returning true protected boolean useSingleDataSource() { return false; } @Before @Override public void setUp() throws Exception { super.setUp(); final Properties properties = Framework.getProperties(); DatabaseHelper.DATABASE.setUp(); if (useSingleDataSource()) { // the name doesn't actually matter, as code in // ConnectionHelper.getDataSource ignores it and uses // nuxeo.test.vcs.url etc. for connections in test mode properties.put(ConnectionHelper.SINGLE_DS, "jdbc/NuxeoTestDS"); } else { properties.remove(ConnectionHelper.SINGLE_DS); } deployBundle("org.nuxeo.runtime.jtajca"); deployBundle("org.nuxeo.runtime.datasource"); deployBundle("org.nuxeo.ecm.core.persistence"); deployContrib("org.nuxeo.ecm.core.persistence.test", "OSGI-INF/test-persistence-config.xml"); fireFrameworkStarted(); TransactionHelper.startTransaction(); activatePersistenceProvider(); } @After @Override public void tearDown() throws Exception { deactivatePersistenceProvider(); if (TransactionHelper.isTransactionActiveOrMarkedRollback()) { TransactionHelper.setTransactionRollbackOnly(); TransactionHelper.commitOrRollbackTransaction(); } super.tearDown(); } protected void activatePersistenceProvider() { ClassLoader last = Thread.currentThread().getContextClassLoader(); try { // needs context classloader for Hibernate to find the // META-INF/persistence.xml file Thread.currentThread().setContextClassLoader( getClass().getClassLoader()); PersistenceProviderFactory persistenceProviderFactory = Framework.getLocalService(PersistenceProviderFactory.class); persistenceProvider = persistenceProviderFactory.newProvider("nxtest"); persistenceProvider.openPersistenceUnit(); } finally { Thread.currentThread().setContextClassLoader(last); } } protected void deactivatePersistenceProvider() { if (persistenceProvider != null) { persistenceProvider.closePersistenceUnit(); persistenceProvider = null; } } @Test public void testBase() throws Exception { EntityManager em = persistenceProvider.acquireEntityManager(); DummyEntity entity = new DummyEntity("1"); em.persist(entity); em.flush(); em.clear(); em.close(); } @Test public void testAcquireTwiceInSameTx() throws Exception { EntityManager em; em = persistenceProvider.acquireEntityManager(); em.persist(new DummyEntity("1")); em.flush(); em.clear(); em.close(); em = persistenceProvider.acquireEntityManager(); em.persist(new DummyEntity("2")); em.flush(); em.clear(); em.close(); } }