package org.oddjob.framework;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import junit.framework.TestCase;
import org.oddjob.arooa.life.ComponentPersistException;
import org.oddjob.images.IconHelper;
import org.oddjob.images.StateIcons;
import org.oddjob.persist.Persistable;
import org.oddjob.state.IsAnyState;
import org.oddjob.state.IsStoppable;
import org.oddjob.state.JobState;
import org.oddjob.state.JobStateChanger;
import org.oddjob.state.JobStateHandler;
import org.oddjob.state.StateListener;
import org.oddjob.state.State;
import org.oddjob.state.StateChanger;
import org.oddjob.state.StateEvent;
import org.oddjob.state.StateHandler;
public class BasePrimaryTest extends TestCase {
private class OurComp extends BasePrimary {
final CountDownLatch latch = new CountDownLatch(1);
private final JobStateHandler stateHandler = new JobStateHandler(this);
IconHelper iconHelper = new IconHelper(this,
StateIcons.iconFor(stateHandler.getState()));
private final JobStateChanger stateChanger;
protected OurComp() {
stateChanger = new JobStateChanger(stateHandler, iconHelper,
new Persistable() {
@Override
public void persist() throws ComponentPersistException {
save();
}
});
}
@Override
protected StateHandler<?> stateHandler() {
return stateHandler;
}
@Override
protected IconHelper iconHelper() {
return iconHelper;
}
protected StateChanger<JobState> getStateChanger() {
return stateChanger;
}
synchronized void work() {
stateHandler.waitToWhen(new IsAnyState(), new Runnable() {
@Override
public void run() {
getStateChanger().setState(JobState.EXECUTING);
latch.countDown();
try {
stateHandler.sleep(0);
} catch (InterruptedException e) {
throw new RuntimeException("Unexpected");
}
getStateChanger().setState(JobState.COMPLETE);
}
});
}
void wakeUp() {
try {
latch.await();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
stateHandler.waitToWhen(new IsStoppable(), new Runnable() {
@Override
public void run() {
stateHandler.wake();
}
});
}
@Override
protected void fireDestroyedState() {
throw new RuntimeException("Unexpected");
}
}
public void testSleep() throws InterruptedException {
final OurComp test = new OurComp();
final List<State> events = new ArrayList<State>();
StateListener listener = new StateListener() {
@Override
public void jobStateChange(StateEvent event) {
events.add(event.getState());
}
};
test.addStateListener(listener);
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
test.work();
}
});
Thread t2 = new Thread() {
@Override
public void run() {
test.wakeUp();
}
};
t1.start();
t2.start();
t1.join();
t2.join();
assertEquals(JobState.READY, events.get(0));
assertEquals(JobState.EXECUTING, events.get(1));
assertEquals(JobState.COMPLETE, events.get(2));
assertEquals(3, events.size());
}
}