blob: 00d6733b85c89e508b1acafc2b500c647254298c [file] [log] [blame]
package org.eclipse.e4.core.internal.tests.di.extensions;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import javax.inject.Inject;
import org.eclipse.e4.core.contexts.ContextInjectionFactory;
import org.eclipse.e4.core.contexts.EclipseContextFactory;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.core.di.annotations.Optional;
import org.eclipse.e4.core.di.extensions.Service;
import org.junit.After;
import org.junit.Test;
import org.osgi.framework.BundleContext;
import org.osgi.framework.FrameworkUtil;
import org.osgi.framework.ServiceReference;
import org.osgi.framework.ServiceRegistration;
public class ServiceSupplierTestCase {
public static class TestBean {
TestService service;
List<TestService> serviceList;
int serviceInjectionCount;
int serviceListInjectionCount;
@Inject
public void setService(@Service TestService service) {
this.service = service;
this.serviceInjectionCount++;
}
@Inject
public void setServiceList(@Service List<TestService> serviceList) {
this.serviceList = serviceList;
this.serviceListInjectionCount++;
}
}
public static class TestStaticFilterBean {
TestService service;
List<TestService> serviceList;
int serviceInjectionCount;
int serviceListInjectionCount;
@Inject
public void setService(@Service(filterExpression="(filtervalue=Test)") TestService service) {
this.service = service;
this.serviceInjectionCount++;
}
@Inject
public void setServiceList(@Service(filterExpression="(filtervalue=Test)") List<TestService> serviceList) {
this.serviceList = serviceList;
this.serviceListInjectionCount++;
}
}
public static class TestDisabledBean {
@Inject
@Optional
@Service(filterExpression = "(component=disabled)")
TestService disabledService;
@Inject
@Service(filterExpression = "(component=disabled)")
List<TestService> services;
}
private List<ServiceRegistration<?>> registrations = new ArrayList<>();
@After
public void cleanup() {
this.registrations.forEach( r -> r.unregister());
}
@Test
public void testInitialInject() {
IEclipseContext serviceContext = EclipseContextFactory.getServiceContext(FrameworkUtil.getBundle(getClass()).getBundleContext());
TestBean bean = ContextInjectionFactory.make(TestBean.class, serviceContext);
assertNotNull(bean.service);
assertNotNull(bean.serviceList);
assertSame(SampleServiceA.class, bean.service.getClass());
assertEquals(1, bean.serviceInjectionCount);
assertEquals(4, bean.serviceList.size());
assertEquals(1, bean.serviceListInjectionCount);
assertSame(SampleServiceA.class, bean.serviceList.get(0).getClass());
assertSame(SampleServiceB.class, bean.serviceList.get(1).getClass());
}
@Test
public void testStaticFilter() {
IEclipseContext serviceContext = EclipseContextFactory.getServiceContext(FrameworkUtil.getBundle(getClass()).getBundleContext());
TestStaticFilterBean bean = ContextInjectionFactory.make(TestStaticFilterBean.class, serviceContext);
assertNotNull(bean.service);
assertNotNull(bean.serviceList);
assertSame(FilterServiceA.class, bean.service.getClass());
assertEquals(1, bean.serviceInjectionCount);
assertEquals(2, bean.serviceList.size());
assertEquals(1, bean.serviceListInjectionCount);
assertSame(FilterServiceA.class, bean.serviceList.get(0).getClass());
assertSame(FilterServiceB.class, bean.serviceList.get(1).getClass());
}
@Test
public void testDynamicAdd() {
BundleContext context = FrameworkUtil.getBundle(getClass()).getBundleContext();
IEclipseContext serviceContext = EclipseContextFactory.getServiceContext(context);
TestBean bean = ContextInjectionFactory.make(TestBean.class, serviceContext);
assertEquals(1, bean.serviceInjectionCount);
assertEquals(1, bean.serviceListInjectionCount);
TestService t = new TestService() {
// nothing todo
};
Hashtable<String, Object> properties = new Hashtable<>();
properties.put("service.ranking", 100); //$NON-NLS-1$
this.registrations.add(context.registerService(TestService.class, t, properties));
assertSame(t, bean.service);
assertEquals(2, bean.serviceInjectionCount);
assertEquals(2, bean.serviceListInjectionCount);
assertEquals(5, bean.serviceList.size());
assertSame(t, bean.serviceList.get(0));
TestService t2 = new TestService() {
// nothing todo
};
properties = new Hashtable<>();
properties.put("service.ranking", Integer.valueOf(-1)); //$NON-NLS-1$
this.registrations.add(context.registerService(TestService.class, t2, properties));
assertSame(t, bean.service);
assertEquals(3, bean.serviceInjectionCount);
assertEquals(3, bean.serviceListInjectionCount);
assertEquals(6, bean.serviceList.size());
assertSame(t, bean.serviceList.get(0));
}
@Test
public void testDynamicAddRemove() {
BundleContext context = FrameworkUtil.getBundle(getClass()).getBundleContext();
IEclipseContext serviceContext = EclipseContextFactory.getServiceContext(context);
TestBean bean = ContextInjectionFactory.make(TestBean.class, serviceContext);
assertEquals(1, bean.serviceInjectionCount);
assertEquals(1, bean.serviceListInjectionCount);
TestService t = new TestService() {
// nothing todo
};
Hashtable<String, Object> properties = new Hashtable<>();
properties.put("service.ranking", 52); //$NON-NLS-1$
this.registrations.add(context.registerService(TestService.class, t, properties));
assertSame(t, bean.service);
assertEquals(2, bean.serviceInjectionCount);
assertEquals(2, bean.serviceListInjectionCount);
assertEquals(5, bean.serviceList.size());
assertSame(t, bean.serviceList.get(0));
ServiceRegistration<?> registration = this.registrations.get(0);
registration.unregister();
this.registrations.remove(registration);
assertEquals(3, bean.serviceInjectionCount);
assertEquals(3, bean.serviceListInjectionCount);
assertSame(SampleServiceA.class, bean.service.getClass());
assertEquals(4, bean.serviceList.size());
assertSame(SampleServiceA.class, bean.serviceList.get(0).getClass());
assertSame(SampleServiceB.class, bean.serviceList.get(1).getClass());
}
@Test
public void testCleanup() {
BundleContext context = FrameworkUtil.getBundle(getClass()).getBundleContext();
IEclipseContext iec = EclipseContextFactory.getServiceContext(context).createChild();
TestBean bean = ContextInjectionFactory.make(TestBean.class, iec);
iec.dispose();
TestService t = new TestService() {
// nothing todo
};
Hashtable<String, Object> properties = new Hashtable<>();
properties.put("service.ranking", 2); //$NON-NLS-1$
this.registrations.add(context.registerService(TestService.class, t, properties));
assertSame(SampleServiceA.class, bean.service.getClass());
}
@Test
public void testOptionalReferences() throws InterruptedException {
BundleContext context = FrameworkUtil.getBundle(getClass()).getBundleContext();
IEclipseContext serviceContext = EclipseContextFactory.getServiceContext(context);
TestDisabledBean bean = ContextInjectionFactory.make(TestDisabledBean.class, serviceContext);
assertNull(bean.disabledService);
assertEquals(0, bean.services.size());
ServiceReference<ComponentEnabler> ref = context.getServiceReference(ComponentEnabler.class);
ComponentEnabler enabler = context.getService(ref);
try {
enabler.enableDisabledServiceA();
// give the service registry and the injection some time
Thread.sleep(100);
assertNotNull(bean.disabledService);
assertEquals(1, bean.services.size());
assertSame(DisabledServiceA.class, bean.disabledService.getClass());
enabler.enableDisabledServiceB();
// give the service registry and the injection some time
Thread.sleep(100);
assertNotNull(bean.disabledService);
assertEquals(2, bean.services.size());
assertSame(DisabledServiceB.class, bean.disabledService.getClass());
enabler.disableDisabledServiceB();
// give the service registry and the injection some time
Thread.sleep(100);
assertNotNull(bean.disabledService);
assertEquals(1, bean.services.size());
assertSame(DisabledServiceA.class, bean.disabledService.getClass());
enabler.disableDisabledServiceA();
// give the service registry and the injection some time
Thread.sleep(100);
assertNull(bean.disabledService);
assertEquals(0, bean.services.size());
} finally {
enabler.disableDisabledServiceA();
enabler.disableDisabledServiceB();
// give the service registry and the injection some time to ensure
// clear state after this test
Thread.sleep(100);
}
}
}