def setUp(self): self.vnet = VirtualNetwork(vni=0xF0F1F2, macttl=self.MAC_TTL, mactablesize=100)
class VirtualNetworkTestCase(unittest.TestCase): MAC_TABLE_SIZE = 100 MAC_TTL = 0.1 def setUp(self): self.vnet = VirtualNetwork(vni=0xF0F1F2, macttl=self.MAC_TTL, mactablesize=100) def test_learn_mac(self): mac1 = "00:01:02:03:04:05" vtep1 = IP("127.0.0.1") mac2 = "05:04:03:02:01:00" vtep2 = IP("::1") self.assertTrue(self.vnet.learn(mac1, vtep1)) self.assertTrue(self.vnet.learn(mac2, vtep2)) self.assertEqual(self.vnet.lookup(mac1), vtep1) self.assertEqual(self.vnet.lookup(mac2), vtep2) def test_lookup_unknown_mac(self): mac1 = "00:01:02:0A:0B:0C" self.assertIsNone(self.vnet.lookup(mac1)) def test_lookup_expired_mac(self): mac1 = "00:01:02:03:04:05" vtep1 = IP("127.0.0.1") self.assertTrue(self.vnet.learn(mac1, vtep1)) self.assertEqual(self.vnet.lookup(mac1), vtep1) time.sleep(self.vnet.macttl) self.assertIsNone(self.vnet.lookup(mac1)) def test_relearn_mac_updates_ttl(self): mac1 = "00:01:02:03:04:05" vtep1 = IP("127.0.0.1") vtep2 = IP("127.0.0.2") self.assertTrue(self.vnet.learn(mac1, vtep1)) # Sleep just until the mac entry is about to expire time.sleep(self.vnet.macttl - 0.01) self.assertEqual(self.vnet.lookup(mac1), vtep1) self.assertFalse(self.vnet.learn(mac1, vtep2)) # Make sure the ttl timer gets updated time.sleep(self.vnet.macttl - 0.01) self.assertEqual(self.vnet.lookup(mac1), vtep2) def _fill_mac_table(self, prefix, cnt): # Fill the MAC table so it's ready to overflow cur = len(self.vnet._macs) self.assertLessEqual(cur, cnt) for i in xrange(0, cnt - cur): m = "%s:%02X" % (prefix, i) self.assertTrue(self.vnet.learn(m, IP("127.0.0.1"))) self.assertEqual(len(self.vnet._macs), cnt) def test_hit_mac_count_limit(self): """Test mac table detects overflow when size limit is reached""" self._fill_mac_table("DE:AD:BA:BE:00", self.MAC_TABLE_SIZE) m = "DE:AD:BA:BE:00:%02X" % (self.MAC_TABLE_SIZE + 1) self.assertRaises(MemoryError, self.vnet.learn, m, IP("127.0.0.1")) # Wait for the entries to expire time.sleep(self.vnet.macttl) self.assertTrue(self.vnet.learn(m, IP("127.0.0.1"))) def test_gc(self): """Test gc only collects stale entries""" # Fill half the table self._fill_mac_table("DE:AD:BA:BE:00", self.MAC_TABLE_SIZE / 2) time.sleep(self.vnet.macttl - 0.01) # Make sure the entries are not collected self.vnet.gc() self.assertEqual(len(self.vnet._macs), self.MAC_TABLE_SIZE / 2) # Fill up table completely, and wait for the first half to expire self._fill_mac_table("DE:AD:BA:BE:01", self.MAC_TABLE_SIZE) time.sleep(self.vnet.macttl - 0.01) self.vnet.gc() self.assertEqual(len(self.vnet._macs), self.MAC_TABLE_SIZE / 2) # Then wait for the remaining entries to expire time.sleep(0.01) self.vnet.gc() self.assertFalse(len(self.vnet._macs))