/*******************************************************************************
* Copyright (c) 2012, 2015 Brian de Alwis and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Brian de Alwis (MTI) - initial API and implementation
******************************************************************************/
package org.eclipse.e4.ui.tests.application;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.util.concurrent.atomic.AtomicInteger;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.core.services.events.IEventBroker;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.osgi.service.event.Event;
import org.osgi.service.event.EventHandler;
/**
* Simple tests of the event broker
*/
public class EventBrokerTest extends UITest {
private static final String TEST_TOPIC = "test/EventBrokerTest";
private AtomicInteger seen;
private IEclipseContext context;
@Before
@Override
public void setUp() throws Exception {
super.setUp();
seen = new AtomicInteger(0);
context = application.getContext().createChild(getClass().getName());
}
@After
@Override
public void tearDown() throws Exception {
super.tearDown();
context.dispose();
}
@Test
public void testPublish() {
IEventBroker eb = context.get(IEventBroker.class);
assertNotNull(eb);
eb.subscribe(TEST_TOPIC, new EventHandler() {
@Override
public void handleEvent(Event event) {
if (TEST_TOPIC.equals(event.getTopic())) {
seen.incrementAndGet();
}
}
});
eb.send(TEST_TOPIC, new Object());
assertEquals(1, seen.get());
}
/**
* ensure handlers are automatically unsubscribed when a broker is disposed
*/
@Test
public void testUnsubscribeOnDispose() {
// create two IEBs: the parent to publish the event, the child to
// receive
IEventBroker publisher = context.get(IEventBroker.class);
assertNotNull(publisher);
IEclipseContext child = context.createChild();
IEventBroker subscriber = child.get(IEventBroker.class);
assertNotNull(subscriber);
subscriber.subscribe(TEST_TOPIC, new EventHandler() {
@Override
public void handleEvent(Event event) {
if (TEST_TOPIC.equals(event.getTopic())) {
seen.incrementAndGet();
}
}
});
publisher.send(TEST_TOPIC, new Object());
assertEquals(1, seen.get());
child.dispose(); // subscriber should unsubscribe from notifications
publisher.send(TEST_TOPIC, new Object());
assertEquals("event broker did not properly unsubscribe on dispose", 1,
seen.get());
}
@Test
public void testMultipleSubscriptions() {
IEventBroker eb = context.get(IEventBroker.class);
assertNotNull(eb);
EventHandler handler = new EventHandler() {
@Override
public void handleEvent(Event event) {
if (TEST_TOPIC.equals(event.getTopic())) {
seen.incrementAndGet();
}
}
};
eb.subscribe(TEST_TOPIC, handler);
eb.subscribe("*", handler);
eb.send(TEST_TOPIC, new Object());
assertEquals(2, seen.get());
eb.unsubscribe(handler);
eb.send(TEST_TOPIC, new Object());
assertEquals("subscription was not removed", 2, seen.get());
}
}