/*
* Copyright Ericsson AB 2011-2014. All Rights Reserved.
*
* The contents of this file are subject to the Lesser GNU Public License,
* (the "License"), either version 2.1 of the License, or
* (at your option) any later version.; you may not use this file except in
* compliance with the License. You should have received a copy of the
* License along with this software. If not, it can be
* retrieved online at https://www.gnu.org/licenses/lgpl.html. Moreover
* it could also be requested from Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
* WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
* EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
* OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND,
* EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
* LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE,
* YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
*
* IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
* WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
* REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR
* DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL
* DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY
* (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED
* INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE
* OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH
* HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
*/
package com.ericsson.deviceaccess.spi.event;
import com.ericsson.deviceaccess.api.genericdevice.GDEventListener;
import com.ericsson.deviceaccess.spi.impl.GenericDeviceImpl;
import java.util.HashMap;
import java.util.Timer;
import java.util.TimerTask;
import org.hamcrest.Description;
import org.jmock.Expectations;
import org.jmock.api.Action;
import org.jmock.api.Invocation;
import org.jmock.lib.legacy.ClassImposteriser;
import org.jmock.integration.junit4.JUnit4Mockery;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import static org.junit.Assert.*;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
import org.osgi.framework.Filter;
import org.osgi.framework.FrameworkUtil;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceListener;
import org.osgi.framework.ServiceReference;
/**
* EventManager Tester.
*/
public class EventManagerTest {
static ShutdownEventManager shutdown(EventManager eventManager) {
return new ShutdownEventManager(eventManager);
}
private JUnit4Mockery context = new JUnit4Mockery() {
{
setImposteriser(ClassImposteriser.INSTANCE);
}
};
private EventManager eventManager;
private BundleContext bundleContext;
private GDEventListener listener;
private ServiceReference serviceReference;
private Timer timer;
private void registerDevice(final String id) {
final GenericDeviceImpl device = new GenericDeviceImpl() {
};
device.setId(id);
final ServiceReference deviceReference = context.mock(ServiceReference.class, "deviceReference" + id);
context.checking(new Expectations() {
{
oneOf(bundleContext).getService(deviceReference);
will(returnValue(device));
allowing(listener).notifyGDEvent(with(aNonNull(String.class)), with(any(String.class)), with(new HashMap<String, Object>() {
{
put("device.state", "Ready");
}
}));
}
});
eventManager.addingService(deviceReference);
}
@Before
public void setup() throws Exception {
serviceReference = context.mock(ServiceReference.class, "serviceReference");
bundleContext = context.mock(BundleContext.class);
listener = context.mock(GDEventListener.class);
eventManager = new EventManager();
eventManager.setContext(bundleContext);
timer = new Timer();
timer.schedule(new ShutdownTask(), 3000);
context.checking(new Expectations() {
{
//oneOf(bundleContext).createFilter(with(aNonNull(String.class)));
allowing(bundleContext).addServiceListener(with(any(ServiceListener.class)), with(aNonNull(String.class)));
allowing(bundleContext).removeServiceListener(with(any(ServiceListener.class)));
allowing(bundleContext).getServiceReferences(with(any(Class.class)), with(any(String.class)));
allowing(bundleContext).getServiceReferences(with(any(String.class)), with(any(String.class)));
}
});
registerDevice("zwave32");
registerDevice("zwave31");
registerDevice("dev");
}
@After
public void tearDown() throws Exception {
if (timer != null) {
timer.cancel();
}
eventManager.shutdown();
}
@Ignore
public void testNullFilter() throws InvalidSyntaxException {
final String eventManagerRegfilter = "(" + Constants.OBJECTCLASS + "=" + GDEventListener.class.getName() + ")";
final String listenerFilter = null;
context.checking(new Expectations() {
{
oneOf(bundleContext).getServiceReferences((String) null, eventManagerRegfilter);
will(returnValue(new ServiceReference[]{serviceReference}));
oneOf(bundleContext).getService(serviceReference);
will(returnValue(listener));
oneOf(serviceReference).getProperty(GDEventListener.GENERICDEVICE_FILTER);
will(returnValue(listenerFilter));
oneOf(listener).notifyGDEvent(with("dev"), with("srv"), with(new HashMap<String, Object>() {
{
put("device.online", true);
}
}));
will(shutdown(eventManager));
}
});
eventManager.addPropertyEvent("dev", "srv", new HashMap<String, Object>() {
{
put(GDEventListener.DEVICE_ONLINE, true);
}
});
eventManager.start();
context.assertIsSatisfied();
}
@Ignore
public void test_Filter_specific_device() throws InvalidSyntaxException {
final String eventManagerRegfilter = "(" + Constants.OBJECTCLASS + "=" + GDEventListener.class.getName() + ")";
final String listenerFilter = "(&(device.id=zwave31)(|(temp >= 30)(power <= 100)))";
context.checking(new Expectations() {
{
oneOf(bundleContext).getServiceReferences((String) null, eventManagerRegfilter);
will(returnValue(new ServiceReference[]{serviceReference}));
oneOf(bundleContext).getService(serviceReference);
will(returnValue(listener));
oneOf(serviceReference).getProperty(GDEventListener.GENERICDEVICE_FILTER);
will(returnValue(listenerFilter));
oneOf(listener).notifyGDEvent(with("zwave31"), with("srv"), with(new HashMap<String, Object>() {
{
put("power", 100);
}
}));
oneOf(listener).notifyGDEvent(with("zwave31"), with("srv"), with(new HashMap<String, Object>() {
{
put("temp", 30);
}
}));
will(shutdown(eventManager));
}
});
eventManager.addPropertyEvent("zwave31", "srv", new HashMap<String, Object>() {
{
put("power", 100);
}
});
eventManager.addPropertyEvent("zwave31", "srv", new HashMap<String, Object>() {
{
put("temp", 30);
}
});
eventManager.addPropertyEvent("zwave32", "srv", new HashMap<String, Object>() {
{
put("temp", 30);
}
});
eventManager.addPropertyEvent("zwave31", "srv", new HashMap<String, Object>() {
{
put("temp", 101);
}
});
eventManager.addPropertyEvent("zwave31", "srv", new HashMap<String, Object>() {
{
put("temp", 29);
}
});
eventManager.start();
context.assertIsSatisfied();
}
@Ignore
public void test_Filter_all_devices_and_services() throws InvalidSyntaxException {
final String eventManagerRegfilter = "(" + Constants.OBJECTCLASS + "=" + GDEventListener.class.getName() + ")";
final String listenerFilter = "(|(temp >= 30)(power <= 100))";
context.checking(new Expectations() {
{
oneOf(bundleContext).getServiceReferences((String) null, eventManagerRegfilter);
will(returnValue(new ServiceReference[]{serviceReference}));
oneOf(bundleContext).getService(serviceReference);
will(returnValue(listener));
oneOf(serviceReference).getProperty(GDEventListener.GENERICDEVICE_FILTER);
will(returnValue(listenerFilter));
oneOf(listener).notifyGDEvent(with("zwave31"), with("srv1"), with(new HashMap<String, Object>() {
{
put("power", 100);
}
}));
oneOf(listener).notifyGDEvent(with("zwave32"), with("srv2"), with(new HashMap<String, Object>() {
{
put("temp", 30);
}
}));
will(shutdown(eventManager));
}
});
eventManager.addPropertyEvent("zwave31", "srv1", new HashMap<String, Object>() {
{
put("power", 100);
}
});
eventManager.addPropertyEvent("zwave32", "srv2", new HashMap<String, Object>() {
{
put("temp", 30);
}
});
eventManager.addPropertyEvent("zwave31", "srv1", new HashMap<String, Object>() {
{
put("temp", 101);
}
});
eventManager.addPropertyEvent("zwave32", "srv2", new HashMap<String, Object>() {
{
put("temp", 29);
}
});
eventManager.start();
context.assertIsSatisfied();
}
@Ignore
public void test_Filter_specific_service() throws InvalidSyntaxException {
final String eventManagerRegfilter = "(" + Constants.OBJECTCLASS + "=" + GDEventListener.class.getName() + ")";
final String listenerFilter = "(&(service.name=srv)(|(temp >= 30)(power <= 100)))";
context.checking(new Expectations() {
{
oneOf(bundleContext).getServiceReferences((String) null, eventManagerRegfilter);
will(returnValue(new ServiceReference[]{serviceReference}));
oneOf(bundleContext).getService(serviceReference);
will(returnValue(listener));
oneOf(serviceReference).getProperty(GDEventListener.GENERICDEVICE_FILTER);
will(returnValue(listenerFilter));
oneOf(listener).notifyGDEvent(with("zwave31"), with("srv"), with(new HashMap<String, Object>() {
{
put("power", 100);
}
}));
oneOf(listener).notifyGDEvent(with("zwave32"), with("srv"), with(new HashMap<String, Object>() {
{
put("temp", 30);
}
}));
will(shutdown(eventManager));
}
});
eventManager.addPropertyEvent("zwave31", "srv", new HashMap<String, Object>() {
{
put("power", 100);
}
});
eventManager.addPropertyEvent("zwave32", "srv", new HashMap<String, Object>() {
{
put("temp", 30);
}
});
eventManager.addPropertyEvent("zwave33", "srv5", new HashMap<String, Object>() {
{
put("temp", 30);
}
});
eventManager.addPropertyEvent("zwave34", "srv", new HashMap<String, Object>() {
{
put("temp", 101);
}
});
eventManager.addPropertyEvent("zwave35", "srv", new HashMap<String, Object>() {
{
put("temp", 29);
}
});
eventManager.start();
context.assertIsSatisfied();
}
@Ignore
public void test_Filter_specific_device_and_service() throws InvalidSyntaxException {
final String eventManagerRegfilter = "(" + Constants.OBJECTCLASS + "=" + GDEventListener.class.getName() + ")";
final String listenerFilter = "(&(device.id=zwave31)(service.name=srv)(|(temp >= 30)(power <= 100)))";
context.checking(new Expectations() {
{
oneOf(bundleContext).getServiceReferences((String) null, eventManagerRegfilter);
will(returnValue(new ServiceReference[]{serviceReference}));
oneOf(bundleContext).getService(serviceReference);
will(returnValue(listener));
oneOf(serviceReference).getProperty(GDEventListener.GENERICDEVICE_FILTER);
will(returnValue(listenerFilter));
oneOf(listener).notifyGDEvent(with("zwave31"), with("srv"), with(new HashMap<String, Object>() {
{
put("power", 100);
}
}));
will(shutdown(eventManager));
}
});
eventManager.addPropertyEvent("zwave31", "srv", new HashMap<String, Object>() {
{
put("power", 100);
}
});
eventManager.addPropertyEvent("zwave31", "srv2", new HashMap<String, Object>() {
{
put("temp", 30);
}
});
eventManager.addPropertyEvent("zwave33", "srv5", new HashMap<String, Object>() {
{
put("temp", 30);
}
});
eventManager.addPropertyEvent("zwave34", "srv", new HashMap<String, Object>() {
{
put("temp", 101);
}
});
eventManager.addPropertyEvent("zwave35", "srv", new HashMap<String, Object>() {
{
put("temp", 29);
}
});
eventManager.start();
context.assertIsSatisfied();
}
@Ignore
public void test_Filter_online_device() throws InvalidSyntaxException {
final String eventManagerRegfilter = "(" + Constants.OBJECTCLASS + "=" + GDEventListener.class.getName() + ")";
final String listenerFilter = "(&(device.online=true)(temp =*))";
context.checking(new Expectations() {
{
oneOf(bundleContext).getServiceReferences((String) null, eventManagerRegfilter);
will(returnValue(new ServiceReference[]{serviceReference}));
oneOf(bundleContext).getService(serviceReference);
will(returnValue(listener));
oneOf(serviceReference).getProperty(GDEventListener.GENERICDEVICE_FILTER);
will(returnValue(listenerFilter));
oneOf(listener).notifyGDEvent(with("zwave32"), with("srv2"), with(new HashMap<String, Object>() {
{
put(GDEventListener.DEVICE_ONLINE, true);
put("temp", 30);
}
}));
will(shutdown(eventManager));
}
});
eventManager.addPropertyEvent("zwave31", "srv", new HashMap<String, Object>() {
{
put(GDEventListener.DEVICE_ONLINE, true);
put("power", 100);
}
});
eventManager.addPropertyEvent("zwave32", "srv2", new HashMap<String, Object>() {
{
put(GDEventListener.DEVICE_ONLINE, true);
put("temp", 30);
}
});
eventManager.addPropertyEvent("zwave33", "srv5", new HashMap<String, Object>() {
{
put(GDEventListener.DEVICE_ONLINE, false);
put("temp", 30);
}
});
eventManager.start();
context.assertIsSatisfied();
}
@Ignore
public void test_Filter_protocol_device() throws InvalidSyntaxException {
final String eventManagerRegfilter = "(" + Constants.OBJECTCLASS + "=" + GDEventListener.class.getName() + ")";
final String listenerFilter = "(&(device.protocol=banan)(temp =*))";
context.checking(new Expectations() {
{
oneOf(bundleContext).getServiceReferences((String) null, eventManagerRegfilter);
will(returnValue(new ServiceReference[]{serviceReference}));
oneOf(bundleContext).getService(serviceReference);
will(returnValue(listener));
oneOf(serviceReference).getProperty(GDEventListener.GENERICDEVICE_FILTER);
will(returnValue(listenerFilter));
oneOf(listener).notifyGDEvent(with("zwave32"), with("srv2"), with(new HashMap<String, Object>() {
{
put(GDEventListener.DEVICE_PROTOCOL, "banan");
put("temp", 30);
}
}));
will(shutdown(eventManager));
}
});
eventManager.addPropertyEvent("zwave31", "srv", new HashMap<String, Object>() {
{
put(GDEventListener.DEVICE_PROTOCOL, "banan");
put("power", 100);
}
});
eventManager.addPropertyEvent("zwave32", "srv2", new HashMap<String, Object>() {
{
put(GDEventListener.DEVICE_PROTOCOL, "banan");
put("temp", 30);
}
});
eventManager.addPropertyEvent("zwave33", "srv5", new HashMap<String, Object>() {
{
put(GDEventListener.DEVICE_PROTOCOL, "apa");
put("temp", 30);
}
});
eventManager.start();
context.assertIsSatisfied();
}
@Ignore
public void test_Filter_NoMatch() throws InvalidSyntaxException {
timer.cancel();
timer = new Timer();
timer.schedule(new ShutdownTask(), 1000);
final String eventManagerRegfilter = "(" + Constants.OBJECTCLASS + "=" + GDEventListener.class.getName() + ")";
final String listenerFilter = "(&(device.id=zwave31)(|(temp >= 30)(power <= 100)))";
context.checking(new Expectations() {
{
oneOf(bundleContext).getServiceReferences((String) null, eventManagerRegfilter);
will(returnValue(new ServiceReference[]{serviceReference}));
oneOf(bundleContext).getService(serviceReference);
will(returnValue(listener));
oneOf(serviceReference).getProperty(GDEventListener.GENERICDEVICE_FILTER);
will(returnValue(listenerFilter));
}
});
eventManager.addPropertyEvent("zwave31", "srv", new HashMap<String, Object>() {
{
put("temp", 29);
}
});
eventManager.start();
context.assertIsSatisfied();
}
//Test that the delta filtering works using various datatypes
@Ignore
public void test_Filter_property_delta_float() throws InvalidSyntaxException {
final String eventManagerRegfilter = "(" + Constants.OBJECTCLASS + "=" + GDEventListener.class.getName() + ")";
final String listenerFilter = "(&(device.id=zwave31)(service.name=srv)(power__delta>=2))";
context.checking(new Expectations() {
{
oneOf(bundleContext).getServiceReferences((String) null, eventManagerRegfilter);
will(returnValue(new ServiceReference[]{serviceReference}));
oneOf(bundleContext).getService(serviceReference);
will(returnValue(listener));
oneOf(serviceReference).getProperty(GDEventListener.GENERICDEVICE_FILTER);
will(returnValue(listenerFilter));
oneOf(listener).notifyGDEvent(with("zwave31"), with("srv"), with(new HashMap<String, Object>() {
{
put("power", (float) 104.34);
put("power__delta", (float) 4.24);
}
}));
will(shutdown(eventManager));
}
});
eventManager.addPropertyEvent("zwave31", "srv", new HashMap<String, Object>() {
{
put("power", (float) 100.10);
}
});
eventManager.addPropertyEvent("zwave31", "srv", new HashMap<String, Object>() {
{
put("power", (float) 104.34);
}
});
eventManager.start();
context.assertIsSatisfied();
}
@Ignore
public void test_Filter_property_delta_int() throws InvalidSyntaxException {
final String eventManagerRegfilter = "(" + Constants.OBJECTCLASS + "=" + GDEventListener.class.getName() + ")";
final String listenerFilter = "(&(device.id=zwave31)(service.name=srv)(power__delta>=2))";
context.checking(new Expectations() {
{
oneOf(bundleContext).getServiceReferences((String) null, eventManagerRegfilter);
will(returnValue(new ServiceReference[]{serviceReference}));
oneOf(bundleContext).getService(serviceReference);
will(returnValue(listener));
oneOf(serviceReference).getProperty(GDEventListener.GENERICDEVICE_FILTER);
will(returnValue(listenerFilter));
oneOf(listener).notifyGDEvent(with("zwave31"), with("srv"), with(new HashMap<String, Object>() {
{
put("power", 100);
put("power__delta", 4);
}
}));
will(shutdown(eventManager));
}
});
eventManager.addPropertyEvent("zwave31", "srv", new HashMap<String, Object>() {
{
put("power", 96);
}
});
eventManager.addPropertyEvent("zwave31", "srv", new HashMap<String, Object>() {
{
put("power", 100);
}
});
eventManager.start();
context.assertIsSatisfied();
}
@Test
public void testFiltering() throws InvalidSyntaxException {
Filter filter = FrameworkUtil.createFilter("(&(device.id=zwave31)(|(temp >= 30)(power <= 100)))");
assertTrue(filter.matches(new HashMap<String, Object>() {
{
put("device.id", "zwave31");
put("service.id", "banan");
put("temp", 31);
}
}));
assertTrue(filter.matches(new HashMap<String, Object>() {
{
put("device.id", "zwave31");
put("service.id", "apple");
put("power", 99);
}
}));
assertFalse(filter.matches(new HashMap<String, Object>() {
{
put("device.id", "zwave31");
put("service.id", "apple");
put("temp", 29);
put("power", 101);
}
}));
filter = FrameworkUtil.createFilter("(&(device.id=32))");
assertTrue(filter.matches(new HashMap<String, Object>() {
{
put("device.id", 32);
put("service.id", "banan");
put("p2", "NONE");
}
}));
filter = FrameworkUtil.createFilter("(&(device.id=32)(p1 >= 20))");
assertTrue(filter.matches(new HashMap<String, Object>() {
{
put("device.id", 32);
put("p1", 22);
put("p2", "NONE");
}
}));
filter = FrameworkUtil.createFilter("(&(device.online=true)(|(CurrentPower=*)(CurrentTemperature=*)))");
assertTrue(filter.matches(new HashMap<String, Object>() {
{
put("device.online", true);
put("CurrentPower", 22);
}
}));
assertFalse(filter.matches(new HashMap<String, Object>() {
{
put("device.online", false);
put("CurrentPower", 22);
}
}));
eventManager.start();
context.assertIsSatisfied();
}
static class ShutdownEventManager implements Action {
private EventManager eventManager;
ShutdownEventManager(EventManager eventManager) {
this.eventManager = eventManager;
}
@Override
public void describeTo(Description description) {
description.appendText("Shutdown the event manager");
}
@Override
public Object invoke(Invocation invocation) throws Throwable {
eventManager.shutdown();
return null;
}
}
private class ShutdownTask extends TimerTask {
@Override
public void run() {
System.out.println("Shutdown");
eventManager.shutdown();
}
}
}