/**
* tests for when child process finished before wait() is called
*/
public void test_wait() throws IOException {
final ScriptProcess p = datastore.newProcess(TEST_USER, "wait.js", false, "", "owner", TransportType.Dummy);
p.save();
ScriptAction r = p.call();
assertTrue("Forked correctly", r instanceof Fork);
final ThreadLocal<Boolean> executedParentPostFork = new ThreadLocal<Boolean>();
final ThreadLocal<Boolean> executedParentPostWait = new ThreadLocal<Boolean>();
final ThreadLocal<Boolean> executedChild = new ThreadLocal<Boolean>();
ScriptusFacade testFacade = new ScriptusFacade(datastore, c, m, conf) {
private UUID childPid;
@Override
public void execute(UUID pid) {
if( ! pid.equals(p.getPid())) {
executedChild.set(Boolean.TRUE);
childPid = pid;
super.execute(pid);
return;
}
if(pid.equals(p.getPid())) {
if(Boolean.TRUE.equals(executedParentPostFork.get())) {
executedParentPostWait.set(Boolean.TRUE);
ScriptAction enfin = datastore.getProcess(pid).call();
assertTrue("script finished", enfin instanceof Termination);
assertEquals("script result OK", "waitedfoo"+childPid, ((Termination)enfin).getResult());
} else {
executedParentPostFork.set(Boolean.TRUE);
ScriptProcess p2 = datastore.getProcess(pid);
ScriptAction r2 = p2.call();
p2.save();
assertTrue("Waited correctly", r2 instanceof Wait);
//pause thread until child has termination