blob: 151dcdec36deba5f4ed4a8141248b07d6c318b5a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2014, 2015 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
* Lars Vogel <Lars.Vogel@vogella.com> - Bug 474274
*******************************************************************************/
package org.eclipse.e4.core.internal.tests.di.extensions;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.Dictionary;
import java.util.Hashtable;
import javax.annotation.PreDestroy;
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.EventTopic;
import org.eclipse.e4.core.di.suppliers.ExtendedObjectSupplier;
import org.eclipse.e4.core.di.suppliers.IObjectDescriptor;
import org.eclipse.e4.core.di.suppliers.IRequestor;
import org.eclipse.e4.core.internal.di.osgi.ProviderHelper;
import org.eclipse.e4.core.internal.tests.di.extensions.InjectionEventTest.EventAdminHelper;
import org.junit.Before;
import org.junit.Test;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
import org.osgi.framework.FrameworkUtil;
import org.osgi.framework.ServiceRegistration;
public class ExtendedSupplierInjectionTests {
static final String TOPIC = "org/eclipse/e4/core/tests/di/extensions/ExtendedSupplierInjectionTests";
static final String TOPIC_430041 = "org/eclipse/e4/core/tests/di/extensions/ExtendedSupplierInjectionTests430041";
static class EventTestObject {
static int count = 0;
Object injectedObject;
@Inject
@Optional
void dontExecute(@EventTopic(TOPIC) Object x) {
count++;
injectedObject = x;
}
}
static class EventTestObject_430041 {
static int count = 0;
Object injectedObject;
private boolean destroyed;
@Inject
@Optional
void dontExecute(@EventTopic(TOPIC_430041) Object x) {
count++;
injectedObject = x;
}
@PreDestroy
void goDown() {
this.destroyed = true;
}
}
private EventAdminHelper helper;
@Before
public void setUp() {
InjectionEventTest.ensureEventAdminStarted();
BundleContext bundleContext = FrameworkUtil.getBundle(getClass())
.getBundleContext();
IEclipseContext localContext = EclipseContextFactory
.getServiceContext(bundleContext);
helper = ContextInjectionFactory.make(
EventAdminHelper.class, localContext);
}
/* Ensure extended suppliers are looked up first */
@Test
public void testBug398728() {
IEclipseContext context = EclipseContextFactory.create();
context.set(Object.class, new Object());
assertEquals(0, EventTestObject.count);
EventTestObject target = ContextInjectionFactory.make(
EventTestObject.class, context);
// should be 0 since we haven't posted an event with this topic yet
assertEquals(0, EventTestObject.count);
helper.sendEvent(TOPIC, "event1data");
assertEquals(1, EventTestObject.count);
assertEquals("event1data", target.injectedObject);
}
@Test
public void testBug430041() {
IEclipseContext context = EclipseContextFactory.create();
context.set(Object.class, new Object());
assertEquals(0, EventTestObject_430041.count);
EventTestObject_430041 target = ContextInjectionFactory.make(
EventTestObject_430041.class, context);
context.set(EventTestObject_430041.class, target);
// should be 0 since we haven't posted an event with this topic yet
assertEquals(0, EventTestObject_430041.count);
helper.sendEvent(TOPIC_430041, "event1data");
assertEquals(1, EventTestObject_430041.count);
assertEquals("event1data", target.injectedObject);
context.dispose();
assertTrue(target.destroyed);
helper.sendEvent(TOPIC_430041, "event1data_disposed");
assertEquals(1, EventTestObject_430041.count);
assertEquals("event1data", target.injectedObject);
}
/** bug 428837: ensure suppliers are ranked by service.ranking */
@Test
public void testSupplierOrdering() {
BundleContext bc = FrameworkUtil.getBundle(getClass())
.getBundleContext();
ExtendedObjectSupplier supplier = new ExtendedObjectSupplier() {
@Override
public Object get(IObjectDescriptor descriptor,
IRequestor requestor, boolean track, boolean group) {
// TODO Auto-generated method stub
return null;
}
};
Dictionary<String, Object> properties = new Hashtable<>();
properties.put(ExtendedObjectSupplier.SERVICE_CONTEXT_KEY,
EventTopic.class.getName());
properties.put(Constants.SERVICE_RANKING, 100);
ServiceRegistration<?> sr = bc.registerService(
ExtendedObjectSupplier.SERVICE_NAME, supplier, properties);
try {
assertEquals(supplier, ProviderHelper.findProvider(
EventTopic.class.getName(), null));
} finally {
sr.unregister();
}
}
}