{
Metaclass serviceClass = getMetadata().getMetaclass(Metadata.SERVICE_CLASS_NAME);
Metaclass schedulerClass = getMetadata().getMetaclass("TestSysWorkflowSchedulerBatchJob");
TransferObject tobj = new TransferObject();
TransferObject result;
Instance instance, assignment;
InstanceList assignmentList;
// Set scheduler time outside of the queue time window
schedulerClass.setValue("time", Primitive.toTimestamp(Primitive.createInteger(15000)));
// Test: no exception
tobj.setValue("trace", "");
tobj.setValue("throwOuterEx", Boolean.FALSE);
tobj.setValue("throwUncaughtEx", Boolean.FALSE);
instance = (Instance)serviceClass.invoke("invoke", new Object[]{"Semaphore", tobj, null});
assertEquals(Boolean.FALSE, instance.invoke("done"));
assertEquals("BEFORE;", tobj.getValue("trace"));
assignmentList = (InstanceList)instance.getValue("assignments");
assertEquals(1, assignmentList.size());
assignment = assignmentList.getInstance(0);
assertEquals(Boolean.TRUE, assignment.getValue("semaphore"));
assertEquals(Primitive.ZERO_INTEGER, assignment.getValue("status"));
commit();
assignment.invoke("schedulerRun");
assertEquals(Boolean.TRUE, instance.invoke("done"));
assertEquals(Instance.DELETED, assignment.getState());
result = (TransferObject)instance.invoke("result");
assertEquals("BEFORE;EXECUTE_SEMAPHORE;END_SEMAPHORE;AFTER;", result.getValue("trace"));
instance.delete();
commit();
// Test: caught exception
tobj.setValue("trace", "");
tobj.setValue("throwOuterEx", Boolean.TRUE);
tobj.setValue("throwUncaughtEx", Boolean.FALSE);
instance = (Instance)serviceClass.invoke("invoke", new Object[]{"Semaphore", tobj, null});
assertEquals(Boolean.FALSE, instance.invoke("done"));
assertEquals("BEFORE;", tobj.getValue("trace"));
assignmentList = (InstanceList)instance.getValue("assignments");
assertEquals(1, assignmentList.size());
assignment = assignmentList.getInstance(0);
assertEquals(Boolean.TRUE, assignment.getValue("semaphore"));
assertEquals(Primitive.ZERO_INTEGER, assignment.getValue("status"));
commit();
assignment.invoke("schedulerRun");
assertEquals(Boolean.TRUE, instance.invoke("done"));
assertEquals(Instance.DELETED, assignment.getState());
assertEquals(Primitive.createInteger(2), assignment.getValue("status"));
result = (TransferObject)instance.invoke("result");
assertEquals("BEFORE;EXECUTE_SEMAPHORE;CAUGHT_OUTER;", result.getValue("trace"));
instance.delete();
commit();
// Test: uncaught exception
tobj.setValue("trace", "");
tobj.setValue("throwOuterEx", Boolean.FALSE);
tobj.setValue("throwUncaughtEx", Boolean.TRUE);
instance = (Instance)serviceClass.invoke("invoke", new Object[]{"Semaphore", tobj, null});
assertEquals(Boolean.FALSE, instance.invoke("done"));
assertEquals("BEFORE;", tobj.getValue("trace"));
assignmentList = (InstanceList)instance.getValue("assignments");
assertEquals(1, assignmentList.size());
assignment = assignmentList.getInstance(0);
assertEquals(Boolean.TRUE, assignment.getValue("semaphore"));
assertEquals(Primitive.ZERO_INTEGER, assignment.getValue("status"));
commit();
try
{
assignment.invoke("schedulerRun");
fail();
}
catch (ScriptingException ex)
{
assertEquals(Boolean.TRUE, instance.invoke("done"));
assertEquals(Instance.DELETED, assignment.getState());
assertEquals(Primitive.createInteger(2), assignment.getValue("status"));
result = (TransferObject)instance.invoke("result");
assertEquals("BEFORE;EXECUTE_SEMAPHORE;", result.getValue("trace"));
instance.delete();
commit();
}
}