def test_route(self): """ Test routing of a message. """ component1 = XmlPipe() component2 = XmlPipe() router = component.Router() router.addRoute('component1.example.org', component1.sink) router.addRoute('component2.example.org', component2.sink) outgoing = [] component2.source.addObserver('/*', lambda element: outgoing.append(element)) stanza = domish.Element((None, 'presence')) stanza['from'] = 'component1.example.org' stanza['to'] = 'component2.example.org' component1.source.send(stanza) self.assertEquals([stanza], outgoing)
def test_routeDefault(self): """ Test routing of a message using the default route. The default route is the one with C{None} as its key in the routing table. It is taken when there is no more specific route in the routing table that matches the stanza's destination. """ component1 = XmlPipe() s2s = XmlPipe() router = component.Router() router.addRoute('component1.example.org', component1.sink) router.addRoute(None, s2s.sink) outgoing = [] s2s.source.addObserver('/*', lambda element: outgoing.append(element)) stanza = domish.Element((None, 'presence')) stanza['from'] = 'component1.example.org' stanza['to'] = 'example.com' component1.source.send(stanza) self.assertEquals([stanza], outgoing)
def startService(self): """ Create a XML pipe, connect to the router and setup handlers. """ service.Service.startService(self) self._pipe = XmlPipe() self.xmlstream = self._pipe.source for domain in self.domains: self._router.addRoute(domain, self._pipe.sink) for e in self: e.makeConnection(self.xmlstream) e.connectionInitialized()
def test_addRoute(self): """ Test route registration and routing on incoming stanzas. """ router = component.Router() routed = [] router.route = lambda element: routed.append(element) pipe = XmlPipe() router.addRoute('example.org', pipe.sink) self.assertEquals(1, len(router.routes)) self.assertEquals(pipe.sink, router.routes['example.org']) element = domish.Element(('testns', 'test')) pipe.source.send(element) self.assertEquals([element], routed)
def __init__(self, router, domain=None, secret=None): self.router = router self.defaultDomain = domain self.domains = set() if self.defaultDomain: self.domains.add(self.defaultDomain) if secret is not None: self.secret = secret else: self.secret = randbytes.secureRandom(16).encode('hex') self._outgoingStreams = {} self._outgoingQueues = {} self._outgoingConnecting = set() self.serial = 0 pipe = XmlPipe() self.xmlstream = pipe.source self.router.addRoute(None, pipe.sink) self.xmlstream.addObserver('/*', self.send)