package uk.ac.diamond.gwt.rf.queue.client.core;
import java.util.List;
import com.google.gwt.junit.client.GWTTestCase;
import com.google.web.bindery.requestfactory.shared.testing.FakeRequestContext;
/**
* Test Qos.
*/
public class GwtTestQos extends GWTTestCase {
private final FakeHandler handler = new FakeHandler();
private final QosManager manager = new QosManager();
QosQueue pipe = new QosQueue();
@Override
public void gwtSetUp() {
pipe.setTarget(manager);
manager.addQosEventHandler(handler);
}
public void testForEditorUsage() throws Exception {
QosManager manager = new QosManager();
QosQueue qForEditor = new QosQueue();
qForEditor.setTarget(manager);
QosQueue qForForeground = new QosQueue(); // XXX want to set don't
qForForeground.setTarget(qForEditor);
QosQueue qForBackground = new QosQueue();
qForBackground.addModifier(new KeepLatest());
qForBackground.addModifier(new Priority(0.1f));
qForBackground.setTarget(qForEditor);
FakeRequestContext userClick = new FakeRequestContext();
qForForeground.add(userClick);
FakeRequestContext validation0 = new FakeRequestContext();
qForBackground.add(validation0);
FakeRequestContext validation1 = new FakeRequestContext();
qForBackground.add(validation1);
{
List<QosEntry> list = manager.getList();
assertEquals(2, list.size());
assertTrue(userClick == ((RequestContextEntry) list.get(0)).getRequestContext());
assertTrue(validation1 == ((RequestContextEntry) list.get(1)).getRequestContext());
}
NonAtomicBatch batch = new NonAtomicBatch();
batch.add(new FakeRequestContext());
batch.add(new FakeRequestContext());
qForForeground.add(batch);
{
List<QosEntry> list = manager.getList();
assertEquals(3, list.size());
assertTrue(batch == list.get(1));
}
}
public void testDelayOnTransportFailure() throws Exception {
FakeEntry fakeEntry = new FakeEntry();
pipe.add(fakeEntry);
manager.fireReady();
assertEquals(1, fakeEntry.getFiredCount());
fakeEntry.setState(QosEntry.State.FAILED);
manager.fireReady();
assertEquals(1, fakeEntry.getFiredCount());
manager.tick();
assertEquals(2, fakeEntry.getFiredCount());
// should be there marked FAIL but not execute again
}
public void testClearRetryImmediatelyOnStateChange() {
FakeEntry e0 = new FakeEntry();
pipe.add(e0);
e0.setState(QosEntry.State.FAILED);
manager.tick();
assertEquals(1, handler.getLast().getRetryCount());
e0.setState(QosEntry.State.DONE);
assertEquals(0, handler.getLast().getRetryCount());
}
public void testRetryNotClearedIfAllPending() {
FakeEntry fakeEntry = new FakeEntry();
pipe.add(fakeEntry);
fakeEntry.setState(QosEntry.State.FAILED);
manager.tick();
fakeEntry.setState(QosEntry.State.PENDING);
manager.tick();
assertEquals(1, handler.getLast().getRetryCount());
}
public void testBackOff() throws Exception {
FakeEntry fakeEntry = new FakeEntry();
pipe.add(fakeEntry);
manager.fireReady(); // make sync
assertEquals(1, fakeEntry.getFiredCount());
fakeEntry.setState(QosEntry.State.FAILED);
manager.tick(); // 1st retry 1
assertEquals(2, fakeEntry.getFiredCount());
fakeEntry.setState(QosEntry.State.FAILED);
manager.tick(); // 2nd retry 1/2
assertEquals(2, fakeEntry.getFiredCount());
manager.tick(); // 2nd retry 2/2
assertEquals(3, fakeEntry.getFiredCount());
fakeEntry.setState(QosEntry.State.FAILED);
manager.tick(); // 3rd retry 1/4
assertEquals(3, fakeEntry.getFiredCount());
manager.tick(); // 3rd retry 2/4
assertEquals(3, fakeEntry.getFiredCount());
manager.tick(); // 3rd retry 3/4
assertEquals(3, fakeEntry.getFiredCount());
manager.tick(); // 3rd retry 4/4
assertEquals(4, fakeEntry.getFiredCount());
fakeEntry.setState(QosEntry.State.FAILED);
}
@Override
public String getModuleName() {
return "uk.ac.diamond.gwt.rf.queue.GwtRfQueue";
}
}