def start(self):
     try:
         self.R1  = EventRouter("R1")
         self.R2  = EventRouterHTTPS("R2S","localhost",8082)
         self.R3  = EventRouterHTTPS("R3S","localhost",8083)
     except Exception, e:
         print_exc()
         try:
             self.tearDown()
         except Exception:
             pass
         raise e
Exemple #2
0
 def setUp(self):
     self.R1 = EventRouter("R1")
     self.R2 = EventRouter("R2")
     self.R3 = EventRouter("R3")
     # Configure event routers with R1 as hub:
     #
     #      R1
     #     /  \
     #    R2  R3
     #
     # Wildcard event source
     self.R1.routeEventFrom(evtype="R2Events/ev1",router=self.R2)
     self.R1.routeEventFrom(evtype="R3Events/ev1",router=self.R3)
     self.R2.routeEventFrom(evtype="R1Events/ev1",router=self.R1)
     self.R2.routeEventFrom(evtype="R3Events/ev1",router=self.R1)
     self.R3.routeEventFrom(evtype="R1Events/ev1",router=self.R1)
     self.R3.routeEventFrom(evtype="R2Events/ev1",router=self.R1)
     # Wildcard event type
     self.R1.routeEventFrom(source="R2Source/src1",router=self.R2)
     self.R1.routeEventFrom(source="R3Source/src1",router=self.R3)
     self.R2.routeEventFrom(source="R1Source/src1",router=self.R1)
     self.R2.routeEventFrom(source="R3Source/src1",router=self.R1)
     self.R3.routeEventFrom(source="R1Source/src1",router=self.R1)
     self.R3.routeEventFrom(source="R2Source/src1",router=self.R1)
     # Wildcard none
     self.R1.routeEventFrom(evtype="R2Events1/ev1",source="R2Source1/src1",router=self.R2)
     self.R1.routeEventFrom(evtype="R3Events1/ev1",source="R3Source1/src1",router=self.R3)
     self.R2.routeEventFrom(evtype="R1Events1/ev1",source="R1Source1/src1",router=self.R1)
     self.R2.routeEventFrom(evtype="R3Events1/ev1",source="R3Source1/src1",router=self.R1)
     self.R3.routeEventFrom(evtype="R1Events1/ev1",source="R1Source1/src1",router=self.R1)
     self.R3.routeEventFrom(evtype="R2Events1/ev1",source="R2Source1/src1",router=self.R1)
     # Cross routing event
     self.R1.routeEventFrom(evtype="RREvents2/ev1",source="RRSource2/src1",router=self.R2)
     self.R2.routeEventFrom(evtype="RREvents2/ev1",source="RRSource2/src1",router=self.R1)
     # 3-way loop routing event
     self.R1.routeEventFrom(evtype="RREvents3/ev1",source="RRSource3/src1",router=self.R2)
     self.R2.routeEventFrom(evtype="RREvents3/ev1",source="RRSource3/src1",router=self.R3)
     self.R3.routeEventFrom(evtype="RREvents3/ev1",source="RRSource3/src1",router=self.R1)
     return
Exemple #3
0
class TestEventRouter(unittest.TestCase):

    def setUp(self):
        self.R1 = EventRouter("R1")
        self.R2 = EventRouter("R2")
        self.R3 = EventRouter("R3")
        # Configure event routers with R1 as hub:
        #
        #      R1
        #     /  \
        #    R2  R3
        #
        # Wildcard event source
        self.R1.routeEventFrom(evtype="R2Events/ev1",router=self.R2)
        self.R1.routeEventFrom(evtype="R3Events/ev1",router=self.R3)
        self.R2.routeEventFrom(evtype="R1Events/ev1",router=self.R1)
        self.R2.routeEventFrom(evtype="R3Events/ev1",router=self.R1)
        self.R3.routeEventFrom(evtype="R1Events/ev1",router=self.R1)
        self.R3.routeEventFrom(evtype="R2Events/ev1",router=self.R1)
        # Wildcard event type
        self.R1.routeEventFrom(source="R2Source/src1",router=self.R2)
        self.R1.routeEventFrom(source="R3Source/src1",router=self.R3)
        self.R2.routeEventFrom(source="R1Source/src1",router=self.R1)
        self.R2.routeEventFrom(source="R3Source/src1",router=self.R1)
        self.R3.routeEventFrom(source="R1Source/src1",router=self.R1)
        self.R3.routeEventFrom(source="R2Source/src1",router=self.R1)
        # Wildcard none
        self.R1.routeEventFrom(evtype="R2Events1/ev1",source="R2Source1/src1",router=self.R2)
        self.R1.routeEventFrom(evtype="R3Events1/ev1",source="R3Source1/src1",router=self.R3)
        self.R2.routeEventFrom(evtype="R1Events1/ev1",source="R1Source1/src1",router=self.R1)
        self.R2.routeEventFrom(evtype="R3Events1/ev1",source="R3Source1/src1",router=self.R1)
        self.R3.routeEventFrom(evtype="R1Events1/ev1",source="R1Source1/src1",router=self.R1)
        self.R3.routeEventFrom(evtype="R2Events1/ev1",source="R2Source1/src1",router=self.R1)
        # Cross routing event
        self.R1.routeEventFrom(evtype="RREvents2/ev1",source="RRSource2/src1",router=self.R2)
        self.R2.routeEventFrom(evtype="RREvents2/ev1",source="RRSource2/src1",router=self.R1)
        # 3-way loop routing event
        self.R1.routeEventFrom(evtype="RREvents3/ev1",source="RRSource3/src1",router=self.R2)
        self.R2.routeEventFrom(evtype="RREvents3/ev1",source="RRSource3/src1",router=self.R3)
        self.R3.routeEventFrom(evtype="RREvents3/ev1",source="RRSource3/src1",router=self.R1)
        return

    def tearDown(self):
        return

    # Test cases
    # Basic publish-subscribe tests are performed by TestEventRouter
    # The following tests are intended to exercise routing functions

    # Check the routing tables are as expected
    def testSubscriptionRouteTable(self):
        r1f = [ ("R2Events1/ev1", "R2Source1/src1", self.R2)
              , ("R3Events1/ev1", "R3Source1/src1", self.R3)
              , ("R2Events/ev1",  None,             self.R2)
              , ("R3Events/ev1",  None,             self.R3)
              , (None,            "R2Source/src1",  self.R2)
              , (None,            "R3Source/src1",  self.R3)
              , ("RREvents2/ev1", "RRSource2/src1", self.R2)
              , ("RREvents3/ev1", "RRSource3/src1", self.R2)
              ]
        r1cmp = compareLists(self.R1.getRouteTable(),r1f)
        assert r1cmp == None, str(r1cmp)
        r2f = [ ("R1Events/ev1",  None,             self.R1)
              , ("R3Events/ev1",  None,             self.R1)
              , (None,            "R1Source/src1",  self.R1)
              , (None,            "R3Source/src1",  self.R1)
              , ("R1Events1/ev1", "R1Source1/src1", self.R1)
              , ("R3Events1/ev1", "R3Source1/src1", self.R1)
              , ("RREvents2/ev1", "RRSource2/src1", self.R1)
              , ("RREvents3/ev1", "RRSource3/src1", self.R3)
              ]
        r2cmp = compareLists(self.R2.getRouteTable(),r2f)
        assert r2cmp == None, str(r2cmp)
        r3f = [ ("R1Events/ev1",  None,             self.R1)
              , ("R2Events/ev1",  None,             self.R1)
              , (None,            "R1Source/src1",  self.R1)
              , (None,            "R2Source/src1",  self.R1)
              , ("R1Events1/ev1", "R1Source1/src1", self.R1)
              , ("R2Events1/ev1", "R2Source1/src1", self.R1)
              , ("RREvents3/ev1", "RRSource3/src1", self.R1)
              ]
        r3cmp = compareLists(self.R3.getRouteTable(),r3f)
        assert r3cmp == None, str(r3cmp)
        return

    # Helper function for subscription forwarding tests
    #   r1      router for initial subscription
    #   r2      fouter for forwarded subscription
    #   evtype  event type to subscribe, or None
    #   source  event source to subscribe, or None
    #   evmatch event matching subscription
    #   evmatch event not matching subscription
    #   r1fwd   forwarding count for r1 (usually 0, or 1 if at end of loop)
    #   rvia    a router via which the subscription is routed
    #   r1rtr   routing/forwarding node for r1, if diufferent from r1.
    #   r2rtr   routing/forwarding node for r2, if diufferent from r2.
    #   delay   seconds (real value) to delay for event to be delivered
    #   
    def doSubscriptionForwarding(self, r1, r2, evtype, source, evmatch, evdrop, 
                                 r1fwd=0, rvia=None, r1rtr=None, r2rtr=None, delay=0.0):
        R1es = makeEventAgent(uri="R1es")
        R1eh = makeEventHandler(
                uri="R1eh", handler=eventHandler, 
                initSubscription=subHandler, endSubscription=unsubHandler)
        R1eh.subcount = 0
        R1eh.evcount  = 0
        r1rtr = r1rtr or r1
        r2rtr = r2rtr or r2
        # Initial tests
        self.assertEqual(r1.getSubscriptionCount(), 0)
        self.assertEqual(r2.getSubscriptionCount(), 0)
        # subscribe
        sts = r1.subscribe(60, R1eh, evtype=evtype, source=source)
        self.assertEqual(sts.syncValue(), StatusVal.SUBSCRIBED)
        time.sleep(delay)
        self.assertEqual(R1eh.dosub, StatusVal.SUBSCRIBED)
        self.assertEqual(R1eh.subcount, 1)
        self.assertEqual(R1eh.evcount, 0)       # Was subscribe event caught?
        self.assertEqual(r1.getSubscriptionCount(), 1)
        self.assertEqual(r1rtr.getForwardCount(), r1fwd)
        self.assertEqual(r2.getSubscriptionCount(), 0)
        self.assertEqual(r2rtr.getForwardCount(), 1)
        if rvia:
            self.assertEqual(rvia.getSubscriptionCount(), 0)
            self.assertEqual(rvia.getForwardCount(), 1)
        # publish matching event
        sts = r2.publish(R1es, evmatch)
        self.assertEqual(sts.syncValue(), StatusVal.OK)
        time.sleep(delay)
        self.assertEqual(R1eh.event.getType(), evmatch.getType())
        self.assertEqual(R1eh.event.getSource(), evmatch.getSource())
        self.assertEqual(R1eh.evcount, 1)
        # publish non-matching event
        sts = r2.publish(R1es, evdrop)
        self.assertEqual(sts.syncValue(), StatusVal.OK)
        self.assertEqual(R1eh.event.getType(), evmatch.getType())
        self.assertEqual(R1eh.event.getSource(), evmatch.getSource())
        self.assertEqual(R1eh.evcount, 1)
        # publish matching event
        sts = r2.publish(R1es, evmatch)
        self.assertEqual(sts.syncValue(), StatusVal.OK)
        time.sleep(delay)
        self.assertEqual(R1eh.event.getType(), evmatch.getType())
        self.assertEqual(R1eh.event.getSource(), evmatch.getSource())
        self.assertEqual(R1eh.evcount, 2)
        # unsubscribe
        sts = r1.unsubscribe(R1eh, evtype=evtype, source=source)
        self.assertEqual(str(sts.syncValue()), str(StatusVal.UNSUBSCRIBED))
        self.assertEqual(R1eh.unsub, StatusVal.UNSUBSCRIBED)
        self.assertEqual(R1eh.subcount, 0)
        self.assertEqual(r1.getSubscriptionCount(), 0)
        self.assertEqual(r2.getSubscriptionCount(), 0)
        if rvia:
            self.assertEqual(rvia.getSubscriptionCount(), 0)
        return

    # One-hop routing test: R1 -> R2
    def doSubscriptionForwardingR1R2(self, evtype, source, evmatch, evdrop, r1fwd=0):
        self.doSubscriptionForwarding(self.R1, self.R2, evtype, source, evmatch, evdrop, r1fwd=r1fwd)
        return

    # Two-hop routing test: R2 -> R3 (via R3 - see method setUp)
    def doSubscriptionForwardingR2R3(self, evtype, source, evmatch, evdrop, r1fwd=0):
        self.doSubscriptionForwarding(self.R2, self.R3, evtype, source, evmatch, evdrop, 
            r1fwd=r1fwd, rvia=self.R1)
        return

    # Test simple subscription forwarding based on event type matching
    def testSubscriptionForwarding1(self):
        evmatch = makeEvent(evtype="R2Events/ev1",source="R2Source/src1")
        evdrop  = makeEvent(evtype="R2Events/ev2",source="R2Source/src2")
        self.doSubscriptionForwardingR1R2("R2Events/ev1", None, evmatch, evdrop)
        return

    # Test simple subscription forwarding based on event source matching
    def testSubscriptionForwarding2(self):
        evmatch = makeEvent(evtype="R2Events/ev1",source="R2Source/src1")
        evdrop  = makeEvent(evtype="R2Events/ev2",source="R2Source/src2")
        self.doSubscriptionForwardingR1R2(None, "R2Source/src1", evmatch, evdrop)
        return

    # Test simple subscription forwarding based on event type and source matching
    def testSubscriptionForwarding3(self):
        evmatch = makeEvent(evtype="R2Events1/ev1",source="R2Source1/src1")
        evdrop  = makeEvent(evtype="R2Events1/ev2",source="R2Source1/src2")
        self.doSubscriptionForwardingR1R2("R2Events1/ev1", "R2Source1/src1", evmatch, evdrop)
        return

    # Test cross-subscription doesn't cause subscription routing loop
    def testSubscriptionForwarding4(self):
        evmatch = makeEvent(evtype="RREvents2/ev1",source="RRSource2/src1")
        evdrop  = makeEvent(evtype="RREvents2/ev2",source="RRSource2/src2")
        self.doSubscriptionForwardingR1R2("RREvents2/ev1", "RRSource2/src1", evmatch, evdrop, r1fwd=1)
        return

    # Test 2-hop routing based on event type matching
    def testSubscriptionForwarding5(self):
        evmatch = makeEvent(evtype="R3Events/ev1",source="R3Source/src1")
        evdrop  = makeEvent(evtype="R3Events/ev2",source="R3Source/src2")
        self.doSubscriptionForwardingR2R3("R3Events/ev1", None, evmatch, evdrop)
        return

    # Test 2-hop routing based on event source matching
    def testSubscriptionForwarding6(self):
        evmatch = makeEvent(evtype="R3Events/ev1",source="R3Source/src1")
        evdrop  = makeEvent(evtype="R3Events/ev2",source="R3Source/src2")
        self.doSubscriptionForwardingR2R3(None, "R3Source/src1", evmatch, evdrop)
        return

    # Test 2-hop routing based on event type and source matching
    def testSubscriptionForwarding7(self):
        evmatch = makeEvent(evtype="R3Events1/ev1",source="R3Source1/src1")
        evdrop  = makeEvent(evtype="R3Events1/ev2",source="R3Source1/src2")
        self.doSubscriptionForwardingR2R3("R3Events1/ev1", "R3Source1/src1", evmatch, evdrop)
        return

    # Test 2-hop subscription loop doesn't cause routing loop
    def testSubscriptionForwarding8(self):
        evmatch = makeEvent(evtype="RREvents3/ev1",source="RRSource3/src1")
        evdrop  = makeEvent(evtype="RREvents3/ev2",source="RRSource3/src2")
        self.doSubscriptionForwardingR2R3("RREvents3/ev1", "RRSource3/src1", evmatch, evdrop, r1fwd=1)
        return

    # Test 2-hop watch
    def testWatchForwarding1(self):
        # watch R2 for subscription to R2Events/ev1
        Weh = makeEventHandler(uri="Weh", handler=eventHandler)
        Weh.subcount = 0
        Weh.evcount  = 0
        sts = self.R2.watch(60, Weh, evtype="R2Events/ev1")
        self.assertEqual(str(sts.syncValue()), str(StatusVal.SUBSCRIBED))
        # subscribe R3 to R2Events/ev1
        Seh = makeEventHandler(uri="Seh", handler=eventHandler)
        Seh.subcount = 0
        Seh.evcount  = 0
        sts = self.R3.subscribe(60, Seh, evtype="R2Events/ev1")
        self.assertEqual(sts.syncValue(), StatusVal.SUBSCRIBED)
        # Check watch event was delivered
        self.assertEqual(Weh.evcount, 1)
        # unsubscribe R3 from R2Events/ev1
        sts = self.R3.unsubscribe(Seh, evtype="R2Events/ev1")
        self.assertEqual(sts.syncValue(), StatusVal.UNSUBSCRIBED)
        # Check event was delivered to watcher
        self.assertEqual(Weh.evcount, 2)
        return

    def testUnits(self):
        assert (True)

    def testComponents(self):
        assert (True)

    def testIntegration(self):
        assert (True)