Ejemplo n.º 1
0
 def test_unbind_client(self):
     """Unbind a client"""""
     q1 = QoS("100M", "My first QoS")
     i1 = Interface("WAN", "My third interface", {'qos1': q1})
     r = Router("eth0", interfaces={'eth2': i1})
     r.bind("192.168.15.2", "eth2", "qos1")
     r.bind("192.168.15.3", "eth2", "qos1")
     r.unbind("192.168.15.2")
     with self.assertRaises(KeyError):
         r.clients["192.168.15.2"]
     self.assertEqual(len(r.clients), 1)
     r.unbind("192.168.15.2")
     self.assertEqual(len(r.clients), 1)
Ejemplo n.º 2
0
class TestRouterObserver(unittest.TestCase):
    def setUp(self):
        q1 = QoS("100M", "My first QoS")
        q2 = QoS("10M", "My second QoS")
        i1 = Interface("LAN", "My second interface", {'qos1': q1, 'qos2': q2})
        i2 = Interface("WAN", "My third interface", {'qos1': q1})
        self.router = Router("eth0", interfaces={'eth1': i1, 'eth2': i2})

    def test_register_observer(self):
        """Register an observer and receive events"""
        last = {}
        class Observer(object):
            zope.interface.implements(IBinder)
            def notify(self, event, source, **kwargs):
                last['event'] = event
                last['source'] = source
                last['args'] = kwargs
        self.router.register(Observer())
        self.router.bind("192.168.15.2", "eth2", "qos1")
        self.assertEqual(last['event'], 'bind')
        self.assertEqual(last['source'], self.router)
        self.assertEqual(last['args']['client'], '192.168.15.2')
        self.assertEqual(last['args']['interface'], 'eth2')
        self.assertEqual(last['args']['qos'], 'qos1')
        self.router.bind("192.168.15.3", "eth2", "qos1")
        self.assertEqual(last['event'], 'bind')
        self.assertEqual(last['source'], self.router)
        self.assertEqual(last['args']['client'], '192.168.15.3')
        self.assertEqual(last['args']['interface'], 'eth2')
        self.assertEqual(last['args']['qos'], 'qos1')
        self.router.unbind("192.168.15.3")
        self.assertEqual(last['event'], 'unbind')
        self.assertEqual(last['source'], self.router)
        self.assertEqual(last['args']['client'], '192.168.15.3')

    def test_register_not_observer(self):
        """Register something which is not an observer"""
        last = {}
        class Observer(object):
            def notify(self, event, source, **kwargs):
                """Will not be called"""
        with self.assertRaises(ValueError):
            self.router.register(Observer())

    def test_register_several_observers(self):
        """Register several observers"""
        events = {}
        class Observer(object):
            zope.interface.implements(IBinder)
            def notify(self, event, source, **kwargs):
                events[self] = event
        obs1 = Observer()
        obs2 = Observer()
        obs3 = Observer()
        self.router.register(obs1)
        self.router.register(obs2)
        self.router.register(obs3)
        self.router.bind("192.168.15.2", "eth2", "qos1")
        self.assertEqual(events, {obs1: 'bind',
                                  obs2: 'bind',
                                  obs3: 'bind'})

    def test_observer_pickling(self):
        """Check if observers are notified on unpickling"""
        temp = tempfile.mkdtemp()
        try:
            testfile = os.path.join(temp, "testfile.txt")
            self.router.register(PickableObserver(testfile))
            self.router.bind("192.168.15.2", "eth2", "qos1")
            self.assertEqual(file(testfile).read(), "bind\n")
            r = pickle.loads(pickle.dumps(self.router))
            self.assertEqual(self.router, r)
            self.assertEqual(self.router.clients, r.clients)
            self.assertEqual(file(testfile).read(), "bind\nbind\n")
        finally:
            shutil.rmtree(temp)

    def test_stats(self):
        """Register an observer that also implements IStatsProvider"""
        class Observer(object):
            zope.interface.implements(IBinder, IStatsProvider)
            def notify(self, event, source, **kwargs):
                """Do nothing"""
            def stats(self):
                return {'eth1': {'up': 47, 'down': 255},
                        'eth2': {'clients': 2, 'details': {'172.14.15.16': {'up': 1, 'down': 2}}}}
        self.assertEqual(self.router.stats,
                         {'eth1': {'clients': 0, 'details': {}},
                          'eth2': {'clients': 0, 'details': {}}})
        self.router.register(Observer())
        self.assertEqual(self.router.stats,
                         {'eth1': {'clients': 0, 'up': 47, 'down': 255, 'details': {}},
                          'eth2': {'clients': 0, 'details': {}}})