package org.limewire.lifecycle;
import junit.framework.Test;
import org.limewire.util.BaseTestCase;
public class ServiceRegistryImplTest extends BaseTestCase {
private int count = 0;
public ServiceRegistryImplTest(String name) {
super(name);
}
public static Test suite() {
return buildTestSuite(ServiceRegistryImplTest.class);
}
public void testServices() {
ServiceStub a1 = new ServiceStub(1);
ServiceStub a2 = new ServiceStub(2);
ServiceStub a3 = new ServiceStub(3);
ServiceStub a4 = new ServiceStub(4);
ServiceStub a5 = new ServiceStub(5);
ServiceStub a6 = new ServiceStub(6);
ServiceStub a7 = new ServiceStub(7);
ServiceStub a8 = new ServiceStub(8);
ServiceStub a9 = new ServiceStub(9);
ServiceStub a10 = new ServiceStub(10);
ServiceStub a11 = new ServiceStub(11);
ServiceRegistry registry = new ServiceRegistryImpl();
registry.register(a8);
registry.register(a7);
registry.register(a6).in(ServiceStage.EARLY);
registry.register(a5).in(ServiceStage.EARLY);
registry.register(a4).in(ServiceStage.LATE);
registry.register(a3).in(ServiceStage.LATE);
registry.register(a2).in(ServiceStage.NORMAL);
registry.register(a1).in(ServiceStage.NORMAL);
registry.register(a9).in("SuperEarly");
registry.register(a10).in("LittleLater");
registry.register(a11).in("LittleLater");
// Start @ 0.
checkInit(0, 0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);
checkStart(0, 0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);
checkStop(0, 0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);
// Initializes everything.
registry.initialize();
checkInit(0, 1, a6, a5, a8, a7, a2, a1, a4, a3, a9, a10, a11);
checkStart(0, 0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);
checkStop(0, 0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);
// Starts all things in stages (and unstaged)
registry.start();
checkInit(0, 1, a6, a5, a8, a7, a2, a1, a4, a3, a9, a10, a11);
checkStart(11, 1, a6, a5, a8, a7, a2, a1, a4, a3);
checkStart(0, 0, a9, a10, a11);
checkStop(0, 0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);
// Starts only SuperEarly, nothing else.
registry.start("SuperEarly");
checkInit(0, 1, a6, a5, a8, a7, a2, a1, a4, a3, a9, a10, a11);
checkStart(11, 1, a6, a5, a8, a7, a2, a1, a4, a3);
checkStart(19, 0, a9);
checkStart(0, 0, a10, a11);
checkStop(0, 0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);
// Stop everything that started, but not the LittleLaters.
registry.stop();
checkInit(0, 1, a6, a5, a8, a7, a2, a1, a4, a3);
checkStart(11, 1, a6, a5, a8, a7, a2, a1, a4, a3);
checkStart(19, 0, a9);
checkStart(0, 0, a10, a11);
checkStop(20, 0, a9);
checkStop(21, 1, a3, a4, a1, a2, a7, a8, a5, a6);
checkStop(0, 0, a10, a11);
// No change in init
registry.initialize();
checkInit(0, 1, a6, a5, a8, a7, a2, a1, a4, a3, a9, a10, a11);
// Start only the LittleLaters
registry.start("LittleLater");
checkInit(0, 1, a6, a5, a8, a7, a2, a1, a4, a3);
checkStart(11, 1, a6, a5, a8, a7, a2, a1, a4, a3);
checkStart(19, 0, a9);
checkStart(29, 1, a10, a11);
checkStop(20, 0, a9);
checkStop(21, 1, a3, a4, a1, a2, a7, a8, a5, a6);
checkStop(0, 0, a10, a11);
// Stop only the LittleLater ones that just started.
registry.stop();
checkInit(0, 1, a6, a5, a8, a7, a2, a1, a4, a3);
checkStart(11, 1, a6, a5, a8, a7, a2, a1, a4, a3);
checkStart(19, 0, a9);
checkStart(29, 1, a10, a11);
checkStop(20, 0, a9);
checkStop(21, 1, a3, a4, a1, a2, a7, a8, a5, a6);
checkStop(31, 1, a11, a10);
// Expect no change.
registry.start();
registry.start("LittleLater");
registry.start("SuperEarly");
checkInit(0, 1, a6, a5, a8, a7, a2, a1, a4, a3);
checkStart(11, 1, a6, a5, a8, a7, a2, a1, a4, a3);
checkStart(19, 0, a9);
checkStart(29, 1, a10, a11);
checkStop(20, 0, a9);
checkStop(21, 1, a3, a4, a1, a2, a7, a8, a5, a6);
checkStop(31, 1, a11, a10);
}
public void testAsyncStop() {
ASynchStopServiceStub a1 = new ASynchStopServiceStub(1, 5000);
ServiceRegistry registry = new ServiceRegistryImpl();
registry.register(a1);
registry.initialize();
registry.start();
long beforeStop = System.currentTimeMillis();
registry.stop();
assertGreaterThanOrEquals(5000, System.currentTimeMillis() - beforeStop);
}
private void checkInit(int expected, int increment, ServiceStub... services) {
for(ServiceStub stub : services) {
assertEquals(stub.toString(), expected, stub.initCount);
expected += increment;
}
}
private void checkStart(int expected, int increment, ServiceStub... services) {
for(ServiceStub stub : services) {
assertEquals(stub.toString(), expected, stub.startCount);
expected += increment;
}
}
private void checkStop(int expected, int increment, ServiceStub... services) {
for(ServiceStub stub : services) {
assertEquals(stub.toString(), expected, stub.stopCount);
expected += increment;
}
}
private class ServiceStub implements Service {
private int initCount;
private int startCount;
private int stopCount;
private final int ID;
ServiceStub(int id) {
this.ID = id;
}
@Override
public String toString() {
return "stub id: " + ID;
}
public void initialize() {
initCount = count++;
}
public void start() {
startCount = count++;
}
public void stop() {
stopCount = count++;
}
public String getServiceName() {
// TODO Auto-generated method stub
return null;
}
}
private class ASynchStopServiceStub extends ServiceStub {
private final long timeToSleep;
ASynchStopServiceStub(int id, long timeToSleep) {
super(id);
this.timeToSleep = timeToSleep;
}
@Override
@Asynchronous
public void stop() {
super.stop();
try {
// simulate long running task
Thread.sleep(timeToSleep);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}