/* * 2012-3 Red Hat Inc. and/or its affiliates and other contributors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.overlord.rtgov.epn.embedded; import static org.junit.Assert.*; import java.io.Serializable; import org.junit.Test; import org.overlord.rtgov.epn.EventList; import org.overlord.rtgov.epn.Network; import org.overlord.rtgov.epn.Node; import org.overlord.rtgov.epn.Subscription; import org.overlord.rtgov.epn.embedded.EmbeddedEPNManager; import org.overlord.rtgov.epn.embedded.EmbeddedEPNManager.EmbeddedChannel; public class EmbeddedEPNManagerTest { private static final int MAX_RETRIES = 4; private static final String N1 = "N1"; private static final String N2 = "N2"; private static final String TEST_NETWORK = "TestNetwork"; private static final String TEST_SUBJECT = "TestSubject"; private static final String TEST_NETWORK2 = "TestNetwork2"; private static final String TEST_SUBJECT2 = "TestSubject2"; private static final String VER1 = "1"; private static final String VER2 = "2"; @Test public void testEventTransformedForChild() { Network net=new Network(); net.setName(TEST_NETWORK); net.setVersion(VER1); Subscription sub=new Subscription(); sub.setSubject(TEST_SUBJECT); sub.setNodeName(N1); net.getSubscriptions().add(sub); Node n1=new Node(); n1.setName(N1); n1.setPredicate(new TestPredicate1()); n1.setEventProcessor(new TestEventProcessorB()); net.getNodes().add(n1); Node n2=new Node(); n2.setPredicate(new TestPredicate2()); TestEventProcessorA tea=new TestEventProcessorA(); n2.setName(N2); n2.setEventProcessor(tea); n2.getSourceNodes().add(N1); net.getNodes().add( n2); EmbeddedEPNManager mgr=new EmbeddedEPNManager(); try { mgr.register(net); java.util.List<Serializable> eventsList=new java.util.ArrayList<Serializable>(); EventList events=new EventList(eventsList); TestEvent1 te1=new TestEvent1(25); eventsList.add(te1); mgr.publish(TEST_SUBJECT, events); // Need to delay awaiting processing via other threads Thread.sleep(1000); if (tea.getEvents().size() != 1) { fail("Expecting 1 event to be processed: "+tea.getEvents().size()); } if (tea.getEvents().get(0) instanceof TestEvent2) { TestEvent2 te2=(TestEvent2)tea.getEvents().get(0); if (te2.getValue() != 25) { fail("Value is not correct: "+te2.getValue()); } } else { fail("Incorrect event type: "+tea.getEvents().get(0).getClass()); } } catch(Exception e) { e.printStackTrace(); fail("Test failed: "+e); } } @Test public void testEventRetries() { Network net=new Network(); net.setName(TEST_NETWORK); net.setVersion(VER1); Subscription sub=new Subscription(); sub.setSubject(TEST_SUBJECT); sub.setNodeName(N1); net.getSubscriptions().add(sub); Node n1=new Node(); n1.setName(N1); n1.setPredicate(new TestPredicate1()); n1.setEventProcessor(new TestEventProcessorB()); net.getNodes().add(n1); Node n2=new Node(); n2.setName(N2); n2.setPredicate(new TestPredicate2()); n2.setMaxRetries(MAX_RETRIES); n2.getSourceNodes().add(N1); TestEventProcessorC tea=new TestEventProcessorC(); n2.setEventProcessor(tea); net.getNodes().add(n2); EmbeddedEPNManager mgr=new EmbeddedEPNManager(); try { mgr.register(net); java.util.List<Serializable> eventsList=new java.util.ArrayList<Serializable>(); EventList events=new EventList(eventsList); TestEvent1 te1=new TestEvent1(25); eventsList.add(te1); mgr.publish(TEST_SUBJECT, events); // Need to delay awaiting processing via other threads Thread.sleep(1000); if (tea._retryCount != MAX_RETRIES+1) { fail("Expecting "+(MAX_RETRIES+1)+" retries: "+tea._retryCount); } } catch(Exception e) { fail("Test failed: "+e); } } @Test public void testMultipleEntryPointsForSameSubject() { Network net1=new Network(); net1.setName(TEST_NETWORK); net1.setVersion(VER1); Subscription sub1=new Subscription(); sub1.setSubject(TEST_SUBJECT); sub1.setNodeName(N1); net1.getSubscriptions().add(sub1); Node n1=new Node(); n1.setName(N1); n1.setPredicate(new TestPredicate1()); n1.setEventProcessor(new TestEventProcessorB()); net1.getNodes().add(n1); Network net2=new Network(); net2.setName(TEST_NETWORK2); net2.setVersion(VER1); Subscription sub2=new Subscription(); sub2.setSubject(TEST_SUBJECT); sub2.setNodeName(N2); net2.getSubscriptions().add(sub2); Node n2=new Node(); n2.setName(N2); n2.setPredicate(new TestPredicate2()); n2.setMaxRetries(MAX_RETRIES); TestEventProcessorC tea=new TestEventProcessorC(); n2.setEventProcessor(tea); net2.getNodes().add(n2); EmbeddedEPNManager mgr=new EmbeddedEPNManager(); try { mgr.register(net1); java.util.List<EmbeddedChannel> ch1=mgr.getEntryPoints().get(TEST_SUBJECT); if (ch1 == null) { fail("Failed to get channels for test subject"); } else if (ch1.size() != 1) { fail("Number of channels for test subject should be 1: "+ch1.size()); } mgr.register(net2); if (ch1.size() != 2) { fail("Number of channels for test subject should now be 2: "+ch1.size()); } } catch(Exception e) { fail("Test failed: "+e); } } @Test public void testEntryPointsForDifferentSubjects() { Network net1=new Network(); net1.setName(TEST_NETWORK); net1.setVersion(VER1); Subscription sub1=new Subscription(); sub1.setSubject(TEST_SUBJECT); sub1.setNodeName(N1); net1.getSubscriptions().add(sub1); Node n1=new Node(); n1.setName(N1); n1.setPredicate(new TestPredicate1()); n1.setEventProcessor(new TestEventProcessorB()); net1.getNodes().add(n1); Network net2=new Network(); net2.setName(TEST_NETWORK2); net2.setVersion(VER1); Subscription sub2=new Subscription(); sub2.setSubject(TEST_SUBJECT2); sub2.setNodeName(N2); net2.getSubscriptions().add(sub2); Node n2=new Node(); n2.setName(N2); n2.setPredicate(new TestPredicate2()); n2.setMaxRetries(MAX_RETRIES); TestEventProcessorC tea=new TestEventProcessorC(); n2.setEventProcessor(tea); net2.getNodes().add(n2); EmbeddedEPNManager mgr=new EmbeddedEPNManager(); try { mgr.register(net1); mgr.register(net2); java.util.List<EmbeddedChannel> ch1=mgr.getEntryPoints().get(TEST_SUBJECT); if (ch1 == null) { fail("Failed to get channels for test subject"); } else if (ch1.size() != 1) { fail("Number of channels for test subject should be 1: "+ch1.size()); } java.util.List<EmbeddedChannel> ch2=mgr.getEntryPoints().get(TEST_SUBJECT2); if (ch2 == null) { fail("Failed to get channels for test subject2"); } else if (ch2.size() != 1) { fail("Number of channels for test subject2 should be 1: "+ch2.size()); } } catch(Exception e) { fail("Test failed: "+e); } } @Test public void testMultipleEntryPointsForSameSubjectRemoved() { Network net1=new Network(); net1.setName(TEST_NETWORK); net1.setVersion(VER1); Subscription sub1=new Subscription(); sub1.setSubject(TEST_SUBJECT); sub1.setNodeName(N1); net1.getSubscriptions().add(sub1); Node n1=new Node(); n1.setName(N1); n1.setPredicate(new TestPredicate1()); n1.setEventProcessor(new TestEventProcessorB()); net1.getNodes().add(n1); Network net2=new Network(); net2.setName(TEST_NETWORK2); net2.setVersion(VER1); Subscription sub2=new Subscription(); sub2.setSubject(TEST_SUBJECT); sub2.setNodeName(N2); net2.getSubscriptions().add(sub2); Node n2=new Node(); n2.setName(N2); n2.setPredicate(new TestPredicate2()); n2.setMaxRetries(MAX_RETRIES); TestEventProcessorC tea=new TestEventProcessorC(); n2.setEventProcessor(tea); net2.getNodes().add(n2); EmbeddedEPNManager mgr=new EmbeddedEPNManager(); try { mgr.register(net1); mgr.register(net2); mgr.unregister(TEST_NETWORK, null); java.util.List<EmbeddedChannel> ch1=mgr.getEntryPoints().get(TEST_SUBJECT); if (ch1 == null) { fail("Failed to get channels for test subject"); } else if (ch1.size() != 1) { fail("Number of channels for test subject should be 1: "+ch1.size()); } mgr.unregister(TEST_NETWORK2, null); java.util.List<EmbeddedChannel> ch2=mgr.getEntryPoints().get(TEST_SUBJECT); if (ch2 != null) { fail("No channels should exist for test subject"); } } catch(Exception e) { fail("Test failed: "+e); } } @Test public void testMultipleVersionEntryPoints1() { Network net1=new Network(); net1.setName(TEST_NETWORK); net1.setVersion(VER1); Subscription sub1=new Subscription(); sub1.setSubject(TEST_SUBJECT); sub1.setNodeName(N1); net1.getSubscriptions().add(sub1); Node n1=new Node(); n1.setName(N1); n1.setPredicate(new TestPredicate1()); n1.setEventProcessor(new TestEventProcessorB()); net1.getNodes().add(n1); Network net2=new Network(); net2.setName(TEST_NETWORK); net2.setVersion(VER2); Subscription sub2=new Subscription(); sub2.setSubject(TEST_SUBJECT); sub2.setNodeName(N2); net2.getSubscriptions().add(sub2); Node n2=new Node(); n2.setName(N2); n2.setPredicate(new TestPredicate2()); n2.setMaxRetries(MAX_RETRIES); TestEventProcessorC tea=new TestEventProcessorC(); n2.setEventProcessor(tea); net2.getNodes().add(n2); EmbeddedEPNManager mgr=new EmbeddedEPNManager(); try { mgr.register(net1); java.util.List<EmbeddedChannel> ch1=mgr.getEntryPoints().get(TEST_SUBJECT); if (ch1 == null) { fail("Failed to get channels for test subject"); } else if (ch1.size() != 1) { fail("Number of channels for test subject should be 1: "+ch1.size()); } if (!ch1.get(0).getNodeName().equals(N1)) { fail("Expected N1"); } mgr.register(net2); java.util.List<EmbeddedChannel> ch2=mgr.getEntryPoints().get(TEST_SUBJECT); if (ch2 == null) { fail("Failed to get channels(2) for test subject"); } else if (ch2.size() != 1) { fail("Number of channels(2) for test subject should be 1: "+ch2.size()); } if (!ch2.get(0).getNodeName().equals(N2)) { fail("Expected N2"); } // This should revert the entry point back to N1 mgr.unregister(TEST_NETWORK, null); java.util.List<EmbeddedChannel> ch3=mgr.getEntryPoints().get(TEST_SUBJECT); if (ch3 == null) { fail("Failed to get channels(3) for test subject"); } else if (ch3.size() != 1) { fail("Number of channels(3) for test subject should be 1: "+ch3.size()); } if (!ch3.get(0).getNodeName().equals(N1)) { fail("Expected N1 again"); } // This should revert the entry point back to N2 mgr.unregister(TEST_NETWORK, null); java.util.List<EmbeddedChannel> ch4=mgr.getEntryPoints().get(TEST_SUBJECT); if (ch4 != null) { fail("Should be no channels for subject"); } } catch(Exception e) { fail("Test failed: "+e); } } @Test public void testMultipleVersionEntryPoints2() { Network net1=new Network(); net1.setName(TEST_NETWORK); net1.setVersion(VER1); Subscription sub1=new Subscription(); sub1.setSubject(TEST_SUBJECT); sub1.setNodeName(N1); net1.getSubscriptions().add(sub1); Node n1=new Node(); n1.setName(N1); n1.setPredicate(new TestPredicate1()); n1.setEventProcessor(new TestEventProcessorB()); net1.getNodes().add(n1); Network net2=new Network(); net2.setName(TEST_NETWORK); net2.setVersion(VER2); Subscription sub2=new Subscription(); sub2.setSubject(TEST_SUBJECT); sub2.setNodeName(N2); net2.getSubscriptions().add(sub2); Node n2=new Node(); n2.setName(N2); n2.setPredicate(new TestPredicate2()); n2.setMaxRetries(MAX_RETRIES); TestEventProcessorC tea=new TestEventProcessorC(); n2.setEventProcessor(tea); net2.getNodes().add(n2); EmbeddedEPNManager mgr=new EmbeddedEPNManager(); try { mgr.register(net1); java.util.List<EmbeddedChannel> ch1=mgr.getEntryPoints().get(TEST_SUBJECT); if (ch1 == null) { fail("Failed to get channels for test subject"); } else if (ch1.size() != 1) { fail("Number of channels for test subject should be 1: "+ch1.size()); } if (!ch1.get(0).getNodeName().equals(N1)) { fail("Expected N1"); } mgr.register(net2); java.util.List<EmbeddedChannel> ch2=mgr.getEntryPoints().get(TEST_SUBJECT); if (ch2 == null) { fail("Failed to get channels(2) for test subject"); } else if (ch2.size() != 1) { fail("Number of channels(2) for test subject should be 1: "+ch2.size()); } if (!ch2.get(0).getNodeName().equals(N2)) { fail("Expected N2"); } // This should NOT revert the entry point back to N1 mgr.unregister(TEST_NETWORK, VER1); java.util.List<EmbeddedChannel> ch3=mgr.getEntryPoints().get(TEST_SUBJECT); if (ch3 == null) { fail("Failed to get channels(3) for test subject"); } else if (ch3.size() != 1) { fail("Number of channels(3) for test subject should be 1: "+ch3.size()); } if (!ch3.get(0).getNodeName().equals(N2)) { fail("Expected N2 still"); } } catch(Exception e) { fail("Test failed: "+e); } } }