/* * (C) Copyright 2012 Nuxeo SA (http://nuxeo.com/) and contributors. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser General Public License * (LGPL) version 2.1 which accompanies this distribution, and is available at * http://www.gnu.org/licenses/lgpl.html * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * Contributors: * Florent Guillaume */ package org.nuxeo.ecm.core.work; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.nuxeo.ecm.core.work.api.Work.State.CANCELED; import static org.nuxeo.ecm.core.work.api.Work.State.COMPLETED; import static org.nuxeo.ecm.core.work.api.Work.State.RUNNING; import static org.nuxeo.ecm.core.work.api.Work.State.SCHEDULED; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.nuxeo.ecm.core.work.api.WorkManager; import org.nuxeo.runtime.api.Framework; import org.nuxeo.runtime.test.NXRuntimeTestCase; import org.nuxeo.runtime.transaction.TransactionHelper; public class WorkManagerTXTest extends NXRuntimeTestCase { protected static final String CATEGORY = "SleepWork"; protected static final String QUEUE = "SleepWork"; protected WorkManager service; protected boolean dontClearCompletedWork; @Override @Before public void setUp() throws Exception { super.setUp(); deployBundle("org.nuxeo.runtime.jtajca"); deployBundle("org.nuxeo.ecm.core.event"); deployContrib("org.nuxeo.ecm.core.event.test", "test-workmanager-config.xml"); fireFrameworkStarted(); service = Framework.getLocalService(WorkManager.class); assertNotNull(service); service.clearCompletedWork(0); assertEquals(0, service.getQueueSize(QUEUE, COMPLETED)); assertEquals(0, service.getQueueSize(QUEUE, RUNNING)); assertEquals(0, service.getQueueSize(QUEUE, SCHEDULED)); TransactionHelper.startTransaction(); } @Override @After public void tearDown() throws Exception { if (!dontClearCompletedWork) { service.clearCompletedWork(0); } if (TransactionHelper.isTransactionActiveOrMarkedRollback()) { TransactionHelper.setTransactionRollbackOnly(); TransactionHelper.commitOrRollbackTransaction(); } super.tearDown(); } @Test public void testWorkManagerPostCommit() throws Exception { int duration = 1000; // 1s assertEquals(0, service.getQueueSize(QUEUE, SCHEDULED)); assertEquals(0, service.getQueueSize(QUEUE, COMPLETED)); SleepWork work = new SleepWork(duration, false); service.schedule(work, true); assertEquals(0, service.getQueueSize(QUEUE, SCHEDULED)); assertEquals(0, service.getQueueSize(QUEUE, COMPLETED)); TransactionHelper.commitOrRollbackTransaction(); Thread.sleep(duration + 1000); assertEquals(0, service.getQueueSize(QUEUE, SCHEDULED)); assertEquals(1, service.getQueueSize(QUEUE, COMPLETED)); // tx commit triggered a release of the scheduled work assertEquals(COMPLETED, work.getWorkInstanceState()); } @Test public void testWorkManagerRollback() throws Exception { Assert.assertTrue(TransactionHelper.isTransactionActive()); int duration = 1000; // 1s assertEquals(0, service.getQueueSize(QUEUE, SCHEDULED)); assertEquals(0, service.getQueueSize(QUEUE, COMPLETED)); SleepWork work = new SleepWork(duration, false); service.schedule(work, true); assertEquals(0, service.getQueueSize(QUEUE, SCHEDULED)); assertEquals(0, service.getQueueSize(QUEUE, COMPLETED)); TransactionHelper.setTransactionRollbackOnly(); TransactionHelper.commitOrRollbackTransaction(); // tx rollback cancels the task and removes it assertEquals(0, service.getQueueSize(QUEUE, SCHEDULED)); assertEquals(0, service.getQueueSize(QUEUE, COMPLETED)); assertEquals(CANCELED, work.getWorkInstanceState()); } }