package org.limewire.xmpp.client.impl;
import java.lang.annotation.Annotation;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ScheduledExecutorService;
import org.limewire.common.LimeWireCommonModule;
import org.limewire.concurrent.AbstractLazySingletonProvider;
import org.limewire.concurrent.ScheduledListeningExecutorService;
import org.limewire.concurrent.SimpleTimer;
import org.limewire.friend.api.LimeWireFriendModule;
import org.limewire.friend.impl.LimeWireFriendImplModule;
import org.limewire.http.auth.LimeWireHttpAuthModule;
import org.limewire.inject.AbstractModule;
import org.limewire.inject.GuiceUtils;
import org.limewire.lifecycle.ServiceRegistry;
import org.limewire.listener.ListenerSupport;
import org.limewire.net.LimeWireNetTestModule;
import org.limewire.net.address.AddressEvent;
import org.limewire.util.BaseTestCase;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Key;
import com.google.inject.Module;
import com.google.inject.Singleton;
import com.google.inject.Stage;
import com.google.inject.TypeLiteral;
import com.google.inject.name.Names;
/**
* Base class for all tests xmpp
*/
public abstract class XmppBaseTestCase extends BaseTestCase {
protected static final String SERVICE = "gmail.com";
protected static final int SLEEP = 5000; // Milliseconds
private ServiceRegistry[] registries;
protected XMPPConnectionFactoryImpl[] factories;
protected Injector[] injectors;
public XmppBaseTestCase(String name) {
super(name);
}
@Override
protected void setUp() throws Exception {
super.setUp();
injectors = new Injector[] { createInjector(getModules()), createInjector(getModules()) };
registries = new ServiceRegistry[] { injectors[0].getInstance(ServiceRegistry.class), injectors[1].getInstance(ServiceRegistry.class) };
for (ServiceRegistry registry : registries) {
registry.initialize();
registry.start();
}
factories = new XMPPConnectionFactoryImpl[] { injectors[0].getInstance(XMPPConnectionFactoryImpl.class), injectors[1].getInstance(XMPPConnectionFactoryImpl.class) };
}
protected Injector createInjector(Module... modules) {
Injector injector = Guice.createInjector(Stage.DEVELOPMENT, modules);
GuiceUtils.loadEagerSingletons(injector);
return injector;
}
protected Module[] getModules() {
List<Module> modules = new ArrayList<Module>();
modules.add(new LimeWireCommonModule());
modules.add(new LimeWireHttpAuthModule());
modules.add(new LimeWireFriendModule());
modules.add(new LimeWireFriendImplModule());
modules.addAll(getServiceModules());
return modules.toArray(new Module[modules.size()]);
}
protected AddressEventTestBroadcaster getAddressBroadcaster(Injector injector) {
return (AddressEventTestBroadcaster) injector.getInstance(Key.get(new TypeLiteral<ListenerSupport<AddressEvent>>(){}));
}
protected List<Module> getServiceModules() {
Module xmppModule = new LimeWireXMPPTestModule();
Module m = new AbstractModule() {
@Override
protected void configure() {
bind(new TypeLiteral<ListenerSupport<AddressEvent>>(){}).toInstance(new AddressEventTestBroadcaster());
bind(XMPPConnectionListenerMock.class);
Annotation execAnn = Names.named("backgroundExecutor");
Key<ScheduledListeningExecutorService> mainKey =
Key.get(ScheduledListeningExecutorService.class, execAnn);
bind(mainKey).toProvider(BackgroundTimerProvider.class);
bind(ScheduledExecutorService.class).annotatedWith(execAnn).to(mainKey);
bind(Executor.class).annotatedWith(execAnn).to(mainKey);
bind(ExecutorService.class).annotatedWith(execAnn).to(mainKey);
}
};
return Arrays.asList(xmppModule, m, new LimeWireNetTestModule());
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
for (XMPPConnectionFactoryImpl factory : factories) {
factory.stop();
}
for (ServiceRegistry registry : registries) {
registry.stop();
}
Thread.sleep(SLEEP);
}
@Singleton
private static class BackgroundTimerProvider extends AbstractLazySingletonProvider<ScheduledListeningExecutorService> {
@Override
protected ScheduledListeningExecutorService createObject() {
return new SimpleTimer(true);
}
}
}