package org.nuxeo.ecm.core.test; import junit.framework.Assert; import org.apache.log4j.Level; import org.apache.log4j.spi.LoggingEvent; import org.junit.Test; import org.junit.runner.RunWith; import org.nuxeo.ecm.core.api.ClientException; import org.nuxeo.ecm.core.api.CoreSession; import org.nuxeo.ecm.core.api.IterableQueryResult; import org.nuxeo.ecm.core.api.UnrestrictedSessionRunner; import org.nuxeo.ecm.core.storage.sql.ra.ConnectionImpl; import org.nuxeo.ecm.core.test.annotations.RepositoryConfig; import org.nuxeo.runtime.test.runner.Features; import org.nuxeo.runtime.test.runner.FeaturesRunner; import org.nuxeo.runtime.test.runner.LogCaptureFeature; import org.nuxeo.runtime.transaction.TransactionHelper; import com.google.inject.Inject; @RunWith(FeaturesRunner.class) @Features({ TransactionalFeature.class, CoreFeature.class, LogCaptureFeature.class }) @RepositoryConfig(init = DefaultRepositoryInit.class) @LogCaptureFeature.FilterWith(QueryResultsAreAutomaticallyClosedTest.LogFilter.class) public class QueryResultsAreAutomaticallyClosedTest { public static class LogFilter implements LogCaptureFeature.Filter { @Override public boolean accept(LoggingEvent event) { if (!Level.WARN.equals(event.getLevel())) { return false; } if (!ConnectionImpl.class.getName().equals(event.getLoggerName())) { return false; } if (!ConnectionImpl.QueryResultContextException.class.isAssignableFrom(event.getThrowableInformation().getThrowable().getClass())) { return false; } return true; } } @Inject protected RepositorySettings settings; @Inject protected LogCaptureFeature.Result logCaptureResults; @Test public void testWithoutTransaction() throws Exception { TransactionHelper.commitOrRollbackTransaction(); IterableQueryResult results; try (CoreSession session = settings.openSessionAsSystemUser()) { results = session.queryAndFetch("SELECT * from Document", "NXQL"); } TransactionHelper.startTransaction(); Assert.assertFalse(results.isLife()); logCaptureResults.assertHasEvent(); } // needs a JCA connection for this to work @Test public void testTransactional() throws Exception { try (CoreSession session = settings.openSessionAsSystemUser()) { IterableQueryResult results = session.queryAndFetch( "SELECT * from Document", "NXQL"); TransactionHelper.commitOrRollbackTransaction(); TransactionHelper.startTransaction(); logCaptureResults.assertHasEvent(); Assert.assertFalse(results.isLife()); } } protected static class NestedQueryRunner extends UnrestrictedSessionRunner { public NestedQueryRunner(String reponame) { super(reponame); } protected IterableQueryResult result; @Override public void run() throws ClientException { result = session.queryAndFetch("SELECT * from Document", "NXQL"); } } @Test public void testNested() throws Exception { IterableQueryResult mainResults; try (CoreSession main = settings.openSessionAsSystemUser()) { NestedQueryRunner runner = new NestedQueryRunner( settings.repositoryName); mainResults = main.queryAndFetch( "SELECT * from Document", "NXQL"); runner.runUnrestricted(); Assert.assertFalse(runner.result.isLife()); Assert.assertTrue(mainResults.isLife()); logCaptureResults.assertHasEvent(); logCaptureResults.clear(); } TransactionHelper.commitOrRollbackTransaction(); TransactionHelper.startTransaction(); logCaptureResults.assertHasEvent(); Assert.assertFalse(mainResults.isLife()); } }