package org.swellrt.server.box.events;
import junit.framework.TestCase;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class EventDispatcherImplTest extends TestCase {
protected void setUp() throws Exception {
super.setUp();
}
protected EventDispatcherImpl getDispatcher() {
EventDispatcherImpl dispatcher = new EventDispatcherImpl(new EventQueue() {
@Override
public void registerListener(EventQueueListener listener) {
}
@Override
public void registerConfigurator(EventQueueConfigurator configurator) {
}
@Override
public boolean hasEventsFor(String app, String dataType) {
return false;
}
@Override
public Set<String> getExpressionPaths(String app, String dataType) {
return null;
}
@Override
public void add(Event event) {
}
});
return dispatcher;
}
protected EventDispatcherImpl initialize(EventDispatcherImpl dispatcher)
throws UnsupportedEncodingException {
InputStreamReader reader =
new InputStreamReader(
this.getClass().getResourceAsStream("EventDispatcherImplTest_Rules.json"),"UTF-8");
Collection<EventRule> rules = EventRule.fromReader(reader);
dispatcher.setRules(rules);
dispatcher.subscribe(new EventDispatcherTarget() {
@Override
public String getName() {
return "test_dispatcher";
}
@Override
public void dispatch(EventRule rule, Event event, String payload) {
}
}, "test_dispatcher");
return dispatcher;
}
/**
* Test EventDispatcherImpl.initialize(...)
*
* @throws UnsupportedEncodingException
*/
public void testInitialize() throws UnsupportedEncodingException {
EventDispatcherImpl dispatcher = initialize(getDispatcher());
Set<EventRuleClass> ruleClasses = dispatcher.getEventRuleClasses();
assertEquals(3, ruleClasses.size());
assert (ruleClasses.contains(EventRuleClass.of("APP_01", "DATATYPE_01")));
assert (ruleClasses.contains(EventRuleClass.of("APP_01", "DATATYPE_02")));
assert (ruleClasses.contains(EventRuleClass.of("APP_02", "DATATYPE_01")));
}
/**
* Test EventRule.match() and EventDispatcherImpl.onEvent() logic
*
* @throws UnsupportedEncodingException
*/
public void testOnEvent() throws UnsupportedEncodingException {
final ArrayList<Event> dispatchedEvents = new ArrayList<Event>();
EventDispatcherImpl dispatcher = initialize(getDispatcher());
dispatcher.getTargets().put("test_dispatcher", new EventDispatcherTarget() {
@Override
public String getName() {
return "test_dispatcher";
}
@Override
public void dispatch(EventRule rule, Event event, String payload) {
dispatchedEvents.add(event);
}
});
// EVENT 01
Map<String, String> eventContextData = new HashMap<String, String>();
eventContextData.put("root.condition_one", "pickme");
eventContextData.put("root.condition_two", "pickme");
eventContextData.put("root.data.fieldtwo", "AAAA");
eventContextData.put("root.data.fieldthree", "BBBB");
Event.Builder builder = new Event.Builder();
builder.app("APP_01").dataType("DATATYPE_01").contextData(eventContextData);
Event event01 = builder.build(Event.Type.MAP_ENTRY_UPDATED, "root.data.map.value");
dispatcher.onEvent(event01);
assertEquals(1, dispatchedEvents.size());
assertEquals(event01, dispatchedEvents.get(0));
// EVENT 02
eventContextData = new HashMap<String, String>();
eventContextData.put("root.condition_one", "pickme");
eventContextData.put("root.condition_two", "pickme");
eventContextData.put("root.info.fieldtwo", "AAAA");
eventContextData.put("root.info.fieldthree", "BBBB");
eventContextData.put("root.data.fieldtwo", "CCCC");
eventContextData.put("root.data.fieldthree", "DDDD");
builder = new Event.Builder();
builder.app("APP_01").dataType("DATATYPE_01").contextData(eventContextData);
Event event02 = builder.build(Event.Type.LIST_ITEM_ADDED, "root.data.list");
dispatcher.onEvent(event02);
assertEquals(2, dispatchedEvents.size());
assertEquals(event02, dispatchedEvents.get(1));
// EVENT 03
eventContextData = new HashMap<String, String>();
eventContextData.put("root.condition_one", "pickme");
eventContextData.put("root.condition_two", "pickme");
eventContextData.put("root.info.fieldtwo", "AAAA");
eventContextData.put("root.info.fieldthree", "BBBB");
eventContextData.put("root.data.fieldtwo", "CCCC");
eventContextData.put("root.data.fieldthree", "DDDD");
builder = new Event.Builder();
builder.app("APP_01").dataType("DATATYPE_02").contextData(eventContextData);
Event event03 = builder.build(Event.Type.MAP_ENTRY_UPDATED, "root.data.map.value");
dispatcher.onEvent(event03);
assertEquals(3, dispatchedEvents.size());
assertEquals(event03, dispatchedEvents.get(2));
// EVENT 04
eventContextData = new HashMap<String, String>();
eventContextData.put("root.condition_one", "pickme");
eventContextData.put("root.condition_two", "pickme");
eventContextData.put("root.info.fieldtwo", "AAAA");
eventContextData.put("root.info.fieldthree", "BBBB");
eventContextData.put("root.data.fieldtwo", "CCCC");
eventContextData.put("root.data.fieldthree", "DDDD");
builder = new Event.Builder();
builder.app("APP_02").dataType("DATATYPE_01").contextData(eventContextData);
Event event04 = builder.build(Event.Type.LIST_ITEM_ADDED, "root.data.list");
dispatcher.onEvent(event04);
assertEquals(4, dispatchedEvents.size());
assertEquals(event04, dispatchedEvents.get(3));
// EVENT 05
eventContextData = new HashMap<String, String>();
eventContextData.put("root.condition_one", "pickme");
eventContextData.put("root.condition_two", "pickme");
eventContextData.put("root.info.fieldtwo", "AAAA");
eventContextData.put("root.info.fieldthree", "BBBB");
eventContextData.put("root.data.fieldtwo", "CCCC");
eventContextData.put("root.data.fieldthree", "DDDD");
builder = new Event.Builder();
builder.app("APP_01").dataType("DATATYPE_01").contextData(eventContextData);
Event event05 = builder.build(Event.Type.LIST_ITEM_ADDED, "root.data.list.3.list");
dispatcher.onEvent(event05);
assertEquals(5, dispatchedEvents.size());
assertEquals(event05, dispatchedEvents.get(4));
int total_dispatched_events = 5;
// EVENT 01 - Conditions doesn't match
eventContextData = new HashMap<String, String>();
eventContextData.put("root.condition_one", "pickme");
eventContextData.put("root.condition_two", "NO");
eventContextData.put("root.info.fieldtwo", "AAAA");
eventContextData.put("root.info.fieldthree", "BBBB");
eventContextData.put("root.data.fieldtwo", "CCCC");
eventContextData.put("root.data.fieldthree", "DDDD");
builder = new Event.Builder();
builder.app("APP_02").dataType("DATATYPE_01").contextData(eventContextData);
Event event01bad = builder.build(Event.Type.LIST_ITEM_ADDED, "root.data.list");
dispatcher.onEvent(event01bad);
assertEquals(total_dispatched_events, dispatchedEvents.size());
// EVENT 02- App doesn't match
eventContextData = new HashMap<String, String>();
eventContextData.put("root.condition_one", "pickme");
eventContextData.put("root.condition_two", "NO");
eventContextData.put("root.info.fieldtwo", "AAAA");
eventContextData.put("root.info.fieldthree", "BBBB");
eventContextData.put("root.data.fieldtwo", "CCCC");
eventContextData.put("root.data.fieldthree", "DDDD");
builder = new Event.Builder();
builder.app("APP_XX").dataType("DATATYPE_01").contextData(eventContextData);
Event event02bad = builder.build(Event.Type.LIST_ITEM_ADDED, "root.data.list");
dispatcher.onEvent(event02bad);
assertEquals(total_dispatched_events, dispatchedEvents.size());
// EVENT 03- DataType doesn't match
eventContextData = new HashMap<String, String>();
eventContextData.put("root.condition_one", "pickme");
eventContextData.put("root.condition_two", "NO");
eventContextData.put("root.info.fieldtwo", "AAAA");
eventContextData.put("root.info.fieldthree", "BBBB");
eventContextData.put("root.data.fieldtwo", "CCCC");
eventContextData.put("root.data.fieldthree", "DDDD");
builder = new Event.Builder();
builder.app("APP_01").dataType("DATATYPE_XX").contextData(eventContextData);
Event event03bad = builder.build(Event.Type.LIST_ITEM_ADDED, "root.data.list");
dispatcher.onEvent(event03bad);
assertEquals(total_dispatched_events, dispatchedEvents.size());
}
}