package org.marketcetera.module;
import org.marketcetera.marketdata.MockMarketDataFeedModuleFactory;
import org.marketcetera.util.misc.ClassVersion;
import org.junit.Test;
import org.junit.After;
import static org.junit.Assert.*;
import java.util.regex.Pattern;
import java.util.ServiceConfigurationError;
import java.io.IOException;
/* $License$ */
/**
* Tests module factory loading, refreshes and errors.
*
* @author anshul@marketcetera.com
*/
@ClassVersion("$Id: ProviderLoadTest.java 16154 2012-07-14 16:34:05Z colin $")
public class ProviderLoadTest extends ModuleTestBase {
@After
public void cleanup() throws Exception {
mManager.stop();
}
/**
* Tests various failures in {@link ModuleManager#init()} &
* {@link ModuleManager#refresh()}
* and their expected behavior.
*
* @throws Exception if there were errors
*/
@Test
public void loading() throws Exception {
//Initialize the testing classloader that helps us
//create various failures.
ModuleTestClassLoader loader = new ModuleTestClassLoader(
LifecycleTest.class.getClassLoader());
loader.setFailResources(Pattern.compile("META-INF/services/.*"));
mManager = new ModuleManager(loader);
new ExpectedFailure<ModuleNotFoundException>(
Messages.MODULE_NOT_FOUND,
SinkModuleFactory.INSTANCE_URN.toString()){
protected void run() throws Exception {
mManager.init();
}
};
assertEquals(0, mManager.getProviders().size());
//Let the resources be found but do not let single module factory to be loaded
loader.setFailResources(null);
loader.setFailClasses(Pattern.compile(".*SingleModuleFactory.*"));
mManager = new ModuleManager(loader);
assertTrue(new ExpectedFailure<ModuleException>(
Messages.MODULE_CONFIGURATION_ERROR){
protected void run() throws Exception {
mManager.init();
}
}.getException().getCause() instanceof ServiceConfigurationError);
loader.setFailClasses(null);
loader.setFilterResources(Pattern.compile(".*test.*"));
mManager = new ModuleManager(loader);
mManager.init();
assertEquals(1, mManager.getProviders().size());
assertEquals(SinkModuleFactory.PROVIDER_URN,mManager.getProviders().get(0));
assertEquals(1, mManager.getModuleInstances(null).size());
assertEquals(SinkModuleFactory.INSTANCE_URN,
mManager.getModuleInstances(null).get(0));
//try refresh and verify nothing changes
mManager.refresh();
assertEquals(1, mManager.getProviders().size());
assertEquals(SinkModuleFactory.PROVIDER_URN,mManager.getProviders().get(0));
assertEquals(1, mManager.getModuleInstances(null).size());
assertEquals(SinkModuleFactory.INSTANCE_URN,
mManager.getModuleInstances(null).get(0));
//Now setup the manager with a refresh listener
final Refresher refresher = new Refresher();
mManager.setRefreshListener(refresher);
//verify that another attempt to setup refresh listener fails
new ExpectedFailure<ModuleException>(
Messages.REFRESH_LISTENER_ALREADY_SETUP,
refresher.getClass().getName()){
protected void run() throws Exception {
mManager.setRefreshListener(refresher);
}
};
//setup the refresh listener to let module manager refresh itself
refresher.setup(true);
assertFalse(refresher.isInvoked());
//now remove the filter but setup a classloading failure
loader.setFilterResources(null);
loader.setFailClasses(Pattern.compile(".*ModuleFactory.*"));
//Refresh should fail
assertTrue(new ExpectedFailure<ModuleException>(Messages.MODULE_CONFIGURATION_ERROR){
protected void run() throws Exception {
mManager.refresh();
}
}.getException().getCause() instanceof ServiceConfigurationError);
//Nothing should've changed.
assertEquals(1, mManager.getProviders().size());
assertEquals(SinkModuleFactory.PROVIDER_URN,mManager.getProviders().get(0));
assertEquals(1, mManager.getModuleInstances(null).size());
assertEquals(SinkModuleFactory.INSTANCE_URN,
mManager.getModuleInstances(null).get(0));
//verify refresher was invoked
assertTrue(refresher.isInvoked());
//Setup the refresher to not let module manager refresh itself
refresher.setup(false);
assertFalse(refresher.isInvoked());
//verify that refresh doesn't fail as module manager doesn't refresh
mManager.refresh();
//verify refresher was invoked
assertTrue(refresher.isInvoked());
//Verify nothing changed.
assertEquals(1, mManager.getProviders().size());
assertEquals(SinkModuleFactory.PROVIDER_URN,mManager.getProviders().get(0));
assertEquals(1, mManager.getModuleInstances(null).size());
assertEquals(SinkModuleFactory.INSTANCE_URN,
mManager.getModuleInstances(null).get(0));
//now change the refresher to throw an exception
refresher.setThrowException(true);
//refresh should fail
new ExpectedFailure<ModuleException>(Messages.ERROR_REFRESH){
protected void run() throws Exception {
mManager.refresh();
}
};
assertTrue(refresher.isInvoked());
//change the refresher to allow module manager to refresh itself
refresher.setup(true);
refresher.setThrowException(false);
//Now unset the class pattern and retry refresh
loader.setFailClasses(null);
mManager.refresh();
//Should see all the providers now
ModuleTestBase.checkAllProviders(mManager.getProviders());
assertEquals(5, mManager.getModuleInstances(null).size());
assertContains(mManager.getModuleInstances(null),new ModuleURN[]{
SinkModuleFactory.INSTANCE_URN,
EmitterModuleFactory.INSTANCE_URN,
SingleModuleFactory.INSTANCE_URN,
CopierModuleFactory.INSTANCE_URN,
MockMarketDataFeedModuleFactory.INSTANCE_URN});
}
private ModuleManager mManager;
private static class Refresher implements RefreshListener {
public void setup(boolean inReturnValue) {
mReturnValue = inReturnValue;
mInvoked = false;
}
public void setThrowException(boolean inThrowException) {
mThrowException = inThrowException;
mInvoked = false;
}
public boolean isInvoked() {
return mInvoked;
}
public boolean refresh() throws IOException {
mInvoked = true;
if(mThrowException) {
throw new IOException();
}
return mReturnValue;
}
private boolean mInvoked;
private boolean mReturnValue;
private boolean mThrowException;
}
}