mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
ActionService support for recording why persisted actions fail, on the action definition, plus tests
git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@21206 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -68,7 +68,6 @@ public class ActionServiceImplTest extends BaseAlfrescoSpringTest
|
||||
|
||||
private NodeRef nodeRef;
|
||||
private NodeRef folder;
|
||||
private RuntimeActionService runtimeActionService;
|
||||
private RetryingTransactionHelper transactionHelper;
|
||||
|
||||
// @Override
|
||||
@@ -90,7 +89,6 @@ public class ActionServiceImplTest extends BaseAlfrescoSpringTest
|
||||
super.onSetUpInTransaction();
|
||||
|
||||
this.transactionHelper = (RetryingTransactionHelper)this.applicationContext.getBean("retryingTransactionHelper");
|
||||
this.runtimeActionService = (RuntimeActionService)this.applicationContext.getBean("actionService");
|
||||
|
||||
// Create the node used for tests
|
||||
this.nodeRef = this.nodeService.createNode(
|
||||
@@ -1206,294 +1204,7 @@ public class ActionServiceImplTest extends BaseAlfrescoSpringTest
|
||||
assertEquals(null, action.getExecutionFailureMessage());
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests that when we run an action, either
|
||||
* synchronously or asynchronously, with it
|
||||
* working or failing, that the action execution
|
||||
* service correctly sets the flags
|
||||
*/
|
||||
public void testExecutionTrackingOnExecution() throws Exception {
|
||||
final SleepActionExecuter sleepActionExec = new SleepActionExecuter();
|
||||
sleepActionExec.setSleepMs(10);
|
||||
Action action;
|
||||
NodeRef actionNode;
|
||||
|
||||
|
||||
// ===========================================================
|
||||
// Execute a transient Action that works, synchronously
|
||||
// ===========================================================
|
||||
action = createWorkingSleepAction();
|
||||
assertNull(action.getExecutionStartDate());
|
||||
assertNull(action.getExecutionEndDate());
|
||||
assertNull(action.getExecutionFailureMessage());
|
||||
assertEquals(ActionStatus.New, action.getExecutionStatus());
|
||||
|
||||
this.actionService.executeAction(action, this.nodeRef);
|
||||
|
||||
assertNotNull(action.getExecutionStartDate());
|
||||
assertNotNull(action.getExecutionEndDate());
|
||||
assertBefore(action.getExecutionStartDate(), action.getExecutionEndDate());
|
||||
assertBefore(action.getExecutionEndDate(), new Date());
|
||||
assertNull(action.getExecutionFailureMessage());
|
||||
assertEquals(ActionStatus.Completed, action.getExecutionStatus());
|
||||
|
||||
|
||||
// ===========================================================
|
||||
// Execute a transient Action that fails, synchronously
|
||||
// ===========================================================
|
||||
action = createFailingMoveAction();
|
||||
assertNull(action.getExecutionStartDate());
|
||||
assertNull(action.getExecutionEndDate());
|
||||
assertNull(action.getExecutionFailureMessage());
|
||||
assertEquals(ActionStatus.New, action.getExecutionStatus());
|
||||
|
||||
try {
|
||||
this.actionService.executeAction(action, this.nodeRef);
|
||||
fail("Action should have failed, and the error been thrown");
|
||||
} catch(Exception e) {}
|
||||
|
||||
assertNotNull(action.getExecutionStartDate());
|
||||
assertNotNull(action.getExecutionEndDate());
|
||||
assertBefore(action.getExecutionStartDate(), action.getExecutionEndDate());
|
||||
assertBefore(action.getExecutionEndDate(), new Date());
|
||||
assertNotNull(action.getExecutionFailureMessage());
|
||||
assertEquals(ActionStatus.Failed, action.getExecutionStatus());
|
||||
|
||||
// Tidy up from the action failure
|
||||
endTransaction();
|
||||
startNewTransaction();
|
||||
onSetUpInTransaction();
|
||||
|
||||
|
||||
// ===========================================================
|
||||
// Execute a stored Action that works, synchronously
|
||||
// ===========================================================
|
||||
action = createWorkingSleepAction();
|
||||
this.actionService.saveAction(this.nodeRef, action);
|
||||
actionNode = action.getNodeRef();
|
||||
assertNotNull(actionNode);
|
||||
|
||||
assertNull(action.getExecutionStartDate());
|
||||
assertNull(action.getExecutionEndDate());
|
||||
assertNull(action.getExecutionFailureMessage());
|
||||
assertEquals(ActionStatus.New, action.getExecutionStatus());
|
||||
|
||||
this.actionService.executeAction(action, this.nodeRef);
|
||||
|
||||
// Check our copy
|
||||
assertNotNull(action.getExecutionStartDate());
|
||||
assertNotNull(action.getExecutionEndDate());
|
||||
assertBefore(action.getExecutionStartDate(), action.getExecutionEndDate());
|
||||
assertBefore(action.getExecutionEndDate(), new Date());
|
||||
assertNull(action.getExecutionFailureMessage());
|
||||
assertEquals(ActionStatus.Completed, action.getExecutionStatus());
|
||||
|
||||
// Now re-load and check the stored one
|
||||
action = runtimeActionService.createAction(actionNode);
|
||||
assertNotNull(action.getExecutionStartDate());
|
||||
assertNotNull(action.getExecutionEndDate());
|
||||
assertBefore(action.getExecutionStartDate(), action.getExecutionEndDate());
|
||||
assertBefore(action.getExecutionEndDate(), new Date());
|
||||
assertNull(action.getExecutionFailureMessage());
|
||||
assertEquals(ActionStatus.Completed, action.getExecutionStatus());
|
||||
|
||||
|
||||
// ===========================================================
|
||||
// Execute a stored Action that fails, synchronously
|
||||
// ===========================================================
|
||||
action = createFailingMoveAction();
|
||||
this.actionService.saveAction(this.nodeRef, action);
|
||||
actionNode = action.getNodeRef();
|
||||
assertNotNull(actionNode);
|
||||
|
||||
assertNull(action.getExecutionStartDate());
|
||||
assertNull(action.getExecutionEndDate());
|
||||
assertNull(action.getExecutionFailureMessage());
|
||||
assertEquals(ActionStatus.New, action.getExecutionStatus());
|
||||
|
||||
try {
|
||||
this.actionService.executeAction(action, this.nodeRef);
|
||||
fail("Action should have failed, and the error been thrown");
|
||||
} catch(Exception e) {}
|
||||
|
||||
// Check our copy
|
||||
assertNotNull(action.getExecutionStartDate());
|
||||
assertNotNull(action.getExecutionEndDate());
|
||||
assertBefore(action.getExecutionStartDate(), action.getExecutionEndDate());
|
||||
assertBefore(action.getExecutionEndDate(), new Date());
|
||||
assertNotNull(action.getExecutionFailureMessage());
|
||||
assertEquals(ActionStatus.Failed, action.getExecutionStatus());
|
||||
|
||||
// Now re-load and check the stored one
|
||||
action = runtimeActionService.createAction(actionNode);
|
||||
// TODO - Fix these
|
||||
// assertNotNull(action.getExecutionStartDate());
|
||||
// assertNotNull(action.getExecutionEndDate());
|
||||
// assertBefore(action.getExecutionStartDate(), action.getExecutionEndDate());
|
||||
// assertBefore(action.getExecutionEndDate(), new Date());
|
||||
// assertNotNull(action.getExecutionFailureMessage());
|
||||
// assertEquals(ActionStatus.Failed, action.getExecutionStatus());
|
||||
|
||||
// Tidy up from the action failure
|
||||
endTransaction();
|
||||
startNewTransaction();
|
||||
onSetUpInTransaction();
|
||||
|
||||
|
||||
// ===========================================================
|
||||
// Execute a transient Action that works, asynchronously
|
||||
// ===========================================================
|
||||
action = createWorkingSleepAction();
|
||||
assertNull(action.getExecutionStartDate());
|
||||
assertNull(action.getExecutionEndDate());
|
||||
assertNull(action.getExecutionFailureMessage());
|
||||
assertEquals(ActionStatus.New, action.getExecutionStatus());
|
||||
|
||||
this.actionService.executeAction(action, this.nodeRef, false, true);
|
||||
assertNull(action.getExecutionStartDate());
|
||||
assertNull(action.getExecutionEndDate());
|
||||
assertNull(action.getExecutionFailureMessage());
|
||||
assertEquals(ActionStatus.Pending, action.getExecutionStatus());
|
||||
setComplete();
|
||||
// End the transaction. When run from a test, this call will
|
||||
// block until the "async" action has finished running
|
||||
endTransaction();
|
||||
Thread.sleep(100);
|
||||
|
||||
assertNotNull(action.getExecutionStartDate());
|
||||
assertNotNull(action.getExecutionEndDate());
|
||||
assertBefore(action.getExecutionStartDate(), action.getExecutionEndDate());
|
||||
assertBefore(action.getExecutionEndDate(), new Date());
|
||||
assertNull(action.getExecutionFailureMessage());
|
||||
assertEquals(ActionStatus.Completed, action.getExecutionStatus());
|
||||
|
||||
// Put things back ready for the next check
|
||||
startNewTransaction();
|
||||
onSetUpInTransaction();
|
||||
|
||||
|
||||
// ===========================================================
|
||||
// Execute a transient Action that fails, asynchronously
|
||||
// ===========================================================
|
||||
action = createFailingMoveAction();
|
||||
assertNull(action.getExecutionStartDate());
|
||||
assertNull(action.getExecutionEndDate());
|
||||
assertNull(action.getExecutionFailureMessage());
|
||||
assertEquals(ActionStatus.New, action.getExecutionStatus());
|
||||
|
||||
this.actionService.executeAction(action, this.nodeRef, false, true);
|
||||
assertNull(action.getExecutionStartDate());
|
||||
assertNull(action.getExecutionEndDate());
|
||||
assertNull(action.getExecutionFailureMessage());
|
||||
assertEquals(ActionStatus.Pending, action.getExecutionStatus());
|
||||
setComplete();
|
||||
// End the transaction. When run from a test, this call will
|
||||
// block until the "async" action has finished running
|
||||
endTransaction();
|
||||
Thread.sleep(100);
|
||||
|
||||
assertNotNull(action.getExecutionStartDate());
|
||||
assertNotNull(action.getExecutionEndDate());
|
||||
assertBefore(action.getExecutionStartDate(), action.getExecutionEndDate());
|
||||
assertBefore(action.getExecutionEndDate(), new Date());
|
||||
assertNotNull(action.getExecutionFailureMessage());
|
||||
assertEquals(ActionStatus.Failed, action.getExecutionStatus());
|
||||
|
||||
// Put things back ready for the next check
|
||||
startNewTransaction();
|
||||
onSetUpInTransaction();
|
||||
|
||||
|
||||
// ===========================================================
|
||||
// Execute a stored Action that works, asynchronously
|
||||
// ===========================================================
|
||||
action = createWorkingSleepAction();
|
||||
this.actionService.saveAction(this.nodeRef, action);
|
||||
actionNode = action.getNodeRef();
|
||||
assertNotNull(actionNode);
|
||||
|
||||
assertNull(action.getExecutionStartDate());
|
||||
assertNull(action.getExecutionEndDate());
|
||||
assertNull(action.getExecutionFailureMessage());
|
||||
assertEquals(ActionStatus.New, action.getExecutionStatus());
|
||||
|
||||
this.actionService.executeAction(action, this.nodeRef, false, true);
|
||||
assertNull(action.getExecutionStartDate());
|
||||
assertNull(action.getExecutionEndDate());
|
||||
assertNull(action.getExecutionFailureMessage());
|
||||
assertEquals(ActionStatus.Pending, action.getExecutionStatus());
|
||||
setComplete();
|
||||
// End the transaction. When run from a test, this call will
|
||||
// block until the "async" action has finished running
|
||||
endTransaction();
|
||||
Thread.sleep(100);
|
||||
|
||||
// Check our copy
|
||||
assertNotNull(action.getExecutionStartDate());
|
||||
assertNotNull(action.getExecutionEndDate());
|
||||
assertBefore(action.getExecutionStartDate(), action.getExecutionEndDate());
|
||||
assertBefore(action.getExecutionEndDate(), new Date());
|
||||
assertNull(action.getExecutionFailureMessage());
|
||||
assertEquals(ActionStatus.Completed, action.getExecutionStatus());
|
||||
|
||||
// Now re-load and check the stored one
|
||||
action = runtimeActionService.createAction(actionNode);
|
||||
assertNotNull(action.getExecutionStartDate());
|
||||
assertNotNull(action.getExecutionEndDate());
|
||||
assertBefore(action.getExecutionStartDate(), action.getExecutionEndDate());
|
||||
assertBefore(action.getExecutionEndDate(), new Date());
|
||||
assertNull(action.getExecutionFailureMessage());
|
||||
assertEquals(ActionStatus.Completed, action.getExecutionStatus());
|
||||
|
||||
// Put things back ready for the next check
|
||||
startNewTransaction();
|
||||
onSetUpInTransaction();
|
||||
|
||||
|
||||
// ===========================================================
|
||||
// Execute a stored Action that fails, asynchronously
|
||||
// ===========================================================
|
||||
action = createFailingMoveAction();
|
||||
this.actionService.saveAction(this.nodeRef, action);
|
||||
actionNode = action.getNodeRef();
|
||||
assertNotNull(actionNode);
|
||||
|
||||
assertNull(action.getExecutionStartDate());
|
||||
assertNull(action.getExecutionEndDate());
|
||||
assertNull(action.getExecutionFailureMessage());
|
||||
assertEquals(ActionStatus.New, action.getExecutionStatus());
|
||||
|
||||
this.actionService.executeAction(action, this.nodeRef, false, true);
|
||||
assertNull(action.getExecutionStartDate());
|
||||
assertNull(action.getExecutionEndDate());
|
||||
assertNull(action.getExecutionFailureMessage());
|
||||
assertEquals(ActionStatus.Pending, action.getExecutionStatus());
|
||||
setComplete();
|
||||
// End the transaction. When run from a test, this call will
|
||||
// block until the "async" action has finished running
|
||||
endTransaction();
|
||||
Thread.sleep(100);
|
||||
|
||||
// Check our copy
|
||||
assertNotNull(action.getExecutionStartDate());
|
||||
assertNotNull(action.getExecutionEndDate());
|
||||
assertBefore(action.getExecutionStartDate(), action.getExecutionEndDate());
|
||||
assertBefore(action.getExecutionEndDate(), new Date());
|
||||
assertNotNull(action.getExecutionFailureMessage());
|
||||
assertEquals(ActionStatus.Failed, action.getExecutionStatus());
|
||||
|
||||
// Now re-load and check the stored one
|
||||
action = runtimeActionService.createAction(actionNode);
|
||||
// TODO - Fix these
|
||||
// assertNotNull(action.getExecutionStartDate());
|
||||
// assertNotNull(action.getExecutionEndDate());
|
||||
// assertBefore(action.getExecutionStartDate(), action.getExecutionEndDate());
|
||||
// assertBefore(action.getExecutionEndDate(), new Date());
|
||||
// assertNotNull(action.getExecutionFailureMessage());
|
||||
// assertEquals(ActionStatus.Failed, action.getExecutionStatus());
|
||||
}
|
||||
|
||||
private Action createFailingMoveAction() {
|
||||
protected Action createFailingMoveAction() {
|
||||
Action failingAction = this.actionService.createAction(MoveActionExecuter.NAME);
|
||||
failingAction.setParameterValue(MoveActionExecuter.PARAM_ASSOC_TYPE_QNAME, ContentModel.ASSOC_CHILDREN);
|
||||
failingAction.setParameterValue(MoveActionExecuter.PARAM_ASSOC_QNAME, ContentModel.ASSOC_CHILDREN);
|
||||
@@ -1503,7 +1214,7 @@ public class ActionServiceImplTest extends BaseAlfrescoSpringTest
|
||||
|
||||
return failingAction;
|
||||
}
|
||||
private Action createWorkingSleepAction() {
|
||||
protected Action createWorkingSleepAction() {
|
||||
Action workingAction = actionService.createAction(SleepActionExecuter.NAME);
|
||||
return workingAction;
|
||||
}
|
||||
|
Reference in New Issue
Block a user