def testPrefixAdvertisement(self): """Testing simple topology without filters (Check that all routers have at least one path)""" #SimBGP.runConfigFile("../../config/plain_bgp_base_topo.cfg") SimBGP.runConfigFile("plain_bgp_base_topo.cfg") for router in SimBGP._router_list: self.assertEqual(len(SimBGP._router_list[router].loc_rib["2.0/8"]), 1)
def testASPaths(self): """Testing that the AS path is correctly handled""" for mode in self.bgp_modes: SimBGP.init() #SimBGP.readConfigFile("../../config/topo-as-paths.cfg") SimBGP.readConfigFile("topo-as-paths.cfg") SimBGP.BGPModeAllRouters(mode) SimBGP.computeIGP() SimBGP.run() self.assertEqual(len(SimBGP._router_list["1.1"].loc_rib["1.0/8"]), 1) path = SimBGP._router_list["1.1"].loc_rib["1.0/8"][0] self.assertEqual(path.aspath, []) self.assertEqual(len(SimBGP._router_list["2.1"].loc_rib["1.0/8"]), 1) path = SimBGP._router_list["2.1"].loc_rib["1.0/8"][0] self.assertEqual(path.aspath, [1]) self.assertEqual(len(SimBGP._router_list["3.1"].loc_rib["1.0/8"]), 1) path = SimBGP._router_list["3.1"].loc_rib["1.0/8"][0] self.assertEqual(path.aspath, [2, 1]) self.assertEqual(len(SimBGP._router_list["4.1"].loc_rib["1.0/8"]), 1) path = SimBGP._router_list["4.1"].loc_rib["1.0/8"][0] self.assertEqual(path.aspath, [3, 2, 1])
def testFilters(self): """Testing that filters are applied in all modes. Classical business relationships are used""" for mode in self.bgp_modes: SimBGP.init() #SimBGP.readConfigFile("../../config/topo-business-rel.cfg") SimBGP.readConfigFile("topo-business-rel.cfg") SimBGP.BGPModeAllRouters(mode) SimBGP.computeIGP() SimBGP.run() #Check that everyone receives the customer prefix for router in SimBGP._router_list: try: self.assertEqual( len(SimBGP._router_list[router].loc_rib["4.0/8"]), 1) except: print(("Pbm with router %s\n" % router)) raise #Check that peer and provider prefixes are only known by AS 1 and AS4 self.assertEqual( len(SimBGP._router_list["1.0.0.1"].loc_rib["2.0/8"]), 1) self.assertEqual( len(SimBGP._router_list["1.0.0.2"].loc_rib["2.0/8"]), 1) self.assertEqual( len(SimBGP._router_list["1.0.0.3"].loc_rib["2.0/8"]), 1) self.assertEqual( len(SimBGP._router_list["4.0.0.1"].loc_rib["2.0/8"]), 1) self.assertEqual( len(SimBGP._router_list["1.0.0.1"].loc_rib["3.0/8"]), 1) self.assertEqual( len(SimBGP._router_list["1.0.0.2"].loc_rib["3.0/8"]), 1) self.assertEqual( len(SimBGP._router_list["1.0.0.3"].loc_rib["3.0/8"]), 1) self.assertEqual( len(SimBGP._router_list["4.0.0.1"].loc_rib["3.0/8"]), 1) #Check that customer prefixes are prefered over others for router in SimBGP._router_list: if SimBGP._router_list[router].asn == "1": aspath = SimBGP._router_list[router].loc_rib["1.0/8"][ 0].aspath self.assertEqual(aspath[0], "4") #Check that peer prefixes are prefered over provider's for router in SimBGP._router_list: #Local AS and customer : prefix is known if SimBGP._router_list[ router].asn == "1" or SimBGP._router_list[ router].asn == "4": self.assertEqual( len(SimBGP._router_list[router].loc_rib["5.0/8"]), 1) aspath = SimBGP._router_list[router].loc_rib["1.0/8"][ 0].aspath self.assertEqual(aspath[-1], "3") #Peer and Provider : No pref in locrib (peer because pref is local) if SimBGP._router_list[ router].asn == "2" or SimBGP._router_list[ router].asn == "3": self.assertEqual( len(SimBGP._router_list[router].loc_rib["5.0/8"]), 0)
def testPrefixWithdrawal(self): """Testing that prefix are unreachable by all routers after prefix withdrawal""" #Same as above. Withdraw prefix after some time, and check that no one has a path #SimBGP.runConfigFile("../../config/plain_bgp_base_topo.cfg") SimBGP.runConfigFile("plain_bgp_base_topo.cfg") SimBGP._event_Scheduler.add( SimBGP.CEvent(SimBGP._systime, ["2.1", "2.0/8"], SimBGP.EVENT_WITHDRAW_PREFIX)) SimBGP.run() for router in SimBGP._router_list: self.assertEqual(len(SimBGP._router_list[router].loc_rib["2.0/8"]), 0)
def testPrefixAdvertisement(self): """Testing simple topology without filters (Check that all routers have at least one path)""" for mode in self.bgp_modes: SimBGP.init() #SimBGP.readConfigFile("../../config/plain_bgp_base_topo.cfg") SimBGP.readConfigFile("plain_bgp_base_topo.cfg") SimBGP.BGPModeAllRouters(mode) SimBGP.computeIGP() SimBGP.run() for router in SimBGP._router_list: self.assertNotEqual( len(SimBGP._router_list[router].loc_rib["2.0/8"]), 0)
def testDomainIsolation(self): #Create two connected domains myNet = SimBGP.CIGPNetwork() myNet.addRouter("1", 1) myNet.addRouter("2", 1) myNet.addRouter("3", 2) myNet.addRouter("4", 2) myNet.addIGPLink("1", "2", 1500) myNet.addIGPLink("3", "4") myNet.addIGPLink("2", "3") myNet.compute() self.assertFalse(myNet.isReachableFrom("1", "4")) self.assertFalse(myNet.isReachableFrom("4", "1")) #1 can join 3 because 3 is ASBR self.assertTrue(myNet.isReachableFrom("1", "3")) #3 cannot join 1 because 1 is not ASBR of AS1 self.assertFalse(myNet.isReachableFrom("3", "1")) #2 ASBR => must be reachable self.assertTrue(myNet.isReachableFrom("2", "3")) #4 is not ASBR => not joignable from outside self.assertFalse(myNet.isReachableFrom("2", "4")) #2 is an ASBR self.assertTrue(myNet.isReachableFrom("4", "2")) #Reg link self.assertTrue(myNet.isReachableFrom("3", "2")) self.assertTrue(myNet.isReachableFrom("2", "3")) #Inside domains self.assertTrue(myNet.isReachableFrom("1", "2")) self.assertTrue(myNet.isReachableFrom("3", "4")) self.assertTrue(myNet.isReachableFrom("2", "1")) self.assertTrue(myNet.isReachableFrom("4", "3"))
def testIGPConfig(self): #SimBGP.runConfigFile("../../config/igp_config.cfg") SimBGP.runConfigFile("igp_config.cfg") self.assertEqual(SimBGP._igp_graph.getIGPLink("3", "1").cost, 500) self.assertEqual(SimBGP._igp_graph.getIGPLink("3", "2").cost, 500) self.assertEqual(SimBGP._igp_graph.getIGPLink("1", "2").cost, 1500) self.assertEqual(SimBGP._igp_graph.getShortestPathLength("1", "2"), 1000) self.assertEqual(SimBGP._igp_graph.getShortestPathLength("1", "3"), 500) self.assertEqual(SimBGP._igp_graph.getShortestPathLength("3", "1"), 500) self.assertEqual(SimBGP._igp_graph.getShortestPathLength("3", "2"), 500) self.assertEqual( SimBGP._igp_graph.getPathTransmissionDelay("1", "2", 100000000), 2 * 1000000 * (5.0 / 3000.0 + 0.5))
def testNotBestExternal(self): """Check that best external is not activated in normal mode""" SimBGP.init() #SimBGP.readConfigFile("../../config/best_external.cfg") SimBGP.readConfigFile("best_external.cfg") SimBGP.BGPModeAllRouters("BGP_NORMAL") SimBGP.computeIGP() SimBGP.run() # print SimBGP._router_list["1.1"].loc_rib["2.0/8"][0] # print SimBGP._router_list["1.1"].loc_rib["2.0/8"][1] if SimBGP._router_list["1.3"].peers["1.1"].rib_in.has_key("2.0/8"): self.assertEqual( len(SimBGP._router_list["1.3"].peers["1.1"].rib_in["2.0/8"]), 0)
def testeBGPoveriBGP(self): for mode in self.bgp_modes: SimBGP.init() #SimBGP.readConfigFile("../../config/plain_bgp_eBGP_over_iBGP.cfg") SimBGP.readConfigFile("plain_bgp_eBGP_over_iBGP.cfg") SimBGP.BGPModeAllRouters(mode) SimBGP.computeIGP() SimBGP.run() #Check that both routers prefers the path via AS2 self.assertEqual( SimBGP._router_list["0.0.0.1"].loc_rib["2.0/8"][0].src_pid, "0.2.0.0") self.assertEqual( SimBGP._router_list["0.0.0.0"].loc_rib["2.0/8"][0].src_pid, "0.2.0.0")
def testImportFilter(self): """Testing path importation""" #Loop detection from AS Path self.myPath = SimBGP.CPath() self.myPath.aspath = [1, 2] self.assertFalse( self.myRouter1.importFilter("2.0.0.0", "1.0/8", self.myPath)) self.myPath.aspath = [3, 2] self.assertTrue( self.myRouter1.importFilter("2.0.0.0", "1.0/8", self.myPath))
def testGetLink(self): myNet = SimBGP.CIGPNetwork() myNet.addRouter("1", 1) myNet.addRouter("2", 1) myNet.addRouter("3", 1) myNet.addIGPLink("1", "2", 1500) myNet.addIGPLink("2", "3") myNet.addIGPLink("1", "3") myNet.compute() self.assertEqual(myNet.getIGPLink("3", "1").cost, 500) self.assertEqual(myNet.getIGPLink("3", "2").cost, 500) self.assertEqual(myNet.getIGPLink("1", "2").cost, 1500)
def testDelayBetweenRouters(self): myNet = SimBGP.CIGPNetwork() myNet.addRouter("1", 1) myNet.addRouter("2", 1) myNet.addRouter("3", 1) myNet.addIGPLink("1", "2", 1500) myNet.addIGPLink("2", "3") myNet.addIGPLink("3", "1") myNet.compute() #Link delay must be twice the default delay with a cost of 1 # See class IGP Link test self.assertEqual(myNet.getPathTransmissionDelay("1", "2", 100000000), 2 * 1000000 * (5.0 / 3000.0 + 1.0))
def testUnreachability(self): #Create unconnected network myNet = SimBGP.CIGPNetwork() myNet.addRouter("1", 1) myNet.addRouter("2", 1) myNet.addRouter("4", 1) myNet.addRouter("5", 1) myNet.addIGPLink("1", "2", 1500) myNet.addIGPLink("4", "5") myNet.compute() self.assertFalse(myNet.isReachableFrom("1", "5")) self.assertFalse(myNet.isReachableFrom("5", "1")) self.assertEquals(myNet.getShortestPathLength("1", "5"), None)
def testLinkDown(self): #SimBGP.runConfigFile("../../config/igp_config.cfg") SimBGP.runConfigFile("igp_config.cfg") SimBGP._event_Scheduler.add( SimBGP.CEvent(SimBGP.toSystemTime(100.0), ["3", "2"], SimBGP.EVENT_LINK_DOWN)) SimBGP.run() self.assertEqual(SimBGP._igp_graph.getShortestPathLength("3", "2"), 2000)
def testIGPShortestPath(self): myNet = SimBGP.CIGPNetwork() myNet.addRouter("1", 1) myNet.addRouter("2", 1) myNet.addRouter("3", 1) myNet.addIGPLink("1", "2", 1500) myNet.addIGPLink("2", "3", 500) myNet.addIGPLink("3", "1", 500) myNet.compute() self.assertEqual(myNet.getShortestPathLength("1", "2"), myNet.getShortestPathLength("2", "1")) self.assertEqual(myNet.getShortestPathLength("1", "2"), myNet.getShortestPathLength("2", "1")) self.assertEqual(myNet.getShortestPathLength("1", "2"), 1000) self.assertEqual(myNet.getShortestPathLength("1", "3"), 500) self.assertEqual(myNet.getShortestPathLength("3", "1"), 500) self.assertEqual(myNet.getShortestPathLength("3", "2"), 500)
def testPreferLocalPath(self): """Check that the locally originated path is preferred""" for mode in self.bgp_modes: SimBGP.init() #SimBGP.readConfigFile("../../config/plain_local.cfg") SimBGP.readConfigFile("plain_local.cfg") SimBGP.BGPModeAllRouters(mode) SimBGP.computeIGP() SimBGP.run() #Check that each router prefers path via itself self.assertEqual( SimBGP._router_list["0.0.0.0"].loc_rib["1.0/8"][0].src_pid, None) self.assertEqual( SimBGP._router_list["0.0.0.1"].loc_rib["1.0/8"][0].src_pid, None) #Check that path is received from other peer self.assertEqual( len(SimBGP._router_list["0.0.0.0"].peers["0.0.0.1"]. rib_in["1.0/8"]), 1) self.assertEqual( len(SimBGP._router_list["0.0.0.1"].peers["0.0.0.0"]. rib_in["1.0/8"]), 1)
def testHotPotato(self): for mode in self.bgp_modes: SimBGP.init() #SimBGP.readConfigFile("../../config/plain_hot_potato.cfg") SimBGP.readConfigFile("plain_hot_potato.cfg") SimBGP.BGPModeAllRouters(mode) SimBGP.computeIGP() SimBGP.run() #Check that each router closest nexthop #print('SimBGP._router_list["0.0.0.2"].loc_rib["1.0/8"][0].src_pid is %s\n' %SimBGP._router_list["0.0.0.2"].loc_rib["1.0/8"][0].src_pid) self.assertEqual( SimBGP._router_list["0.0.0.2"].loc_rib["1.0/8"][0].src_pid, "0.0.0.0") self.assertEqual( SimBGP._router_list["0.0.0.1"].loc_rib["1.0/8"][0].src_pid, "0.0.0.0") #Check that each receiving router prefers eBGP path self.assertEqual( SimBGP._router_list["0.0.0.3"].loc_rib["1.0/8"][0].src_pid, "1.0.0.0") self.assertEqual( SimBGP._router_list["0.0.0.0"].loc_rib["1.0/8"][0].src_pid, "2.0.0.0")
def setUp(self): #Configuring topology #SimBGP.runConfigFile("../../config/best_external.cfg") SimBGP.runConfigFile("best_external.cfg")
def tearDown(self): SimBGP.init()
def setUp(self): SimBGP.init()
def testPrefixWithdrawal(self): """Testing that prefix are unreachable by all routers after prefix withdrawal""" #Same as above. Withdraw prefix after some time, and check that no one has a path for mode in self.bgp_modes: SimBGP.init() #SimBGP.readConfigFile("../../config/plain_bgp_base_topo.cfg") SimBGP.readConfigFile("plain_bgp_base_topo.cfg") SimBGP.BGPModeAllRouters(mode) SimBGP.computeIGP() SimBGP.run() for router in SimBGP._router_list: self.assertNotEqual( len(SimBGP._router_list[router].loc_rib["2.0/8"]), 0) SimBGP._event_Scheduler.add( SimBGP.CEvent(SimBGP._systime, ["2.1", "2.0/8"], SimBGP.EVENT_WITHDRAW_PREFIX)) SimBGP.run() for router in SimBGP._router_list: try: self.assertEqual( len(SimBGP._router_list[router].loc_rib["2.0/8"]), 0) except: print("Assertion failed with router", router, "in mode", mode) raise
def testLinkDown(self): """Checking behaviour when an IGP link is down""" for mode in self.bgp_modes: SimBGP.init() #SimBGP.readConfigFile("../../config/plain_hot_potato.cfg") SimBGP.readConfigFile("plain_hot_potato.cfg") SimBGP.BGPModeAllRouters(mode) SimBGP.computeIGP() SimBGP.run() self.assertEqual( SimBGP.getRouterLink("0.0.0.1", "0.0.0.2").reach, SimBGP.PEER_REACH) #Check that each router prefers path via itself self.assertEqual( SimBGP._router_list["0.0.0.2"].loc_rib["1.0/8"][0].src_pid, "0.0.0.0") self.assertEqual( SimBGP._router_list["0.0.0.1"].loc_rib["1.0/8"][0].src_pid, "0.0.0.0") #Check that each receiving router prefers eBGP path self.assertEqual( SimBGP._router_list["0.0.0.3"].loc_rib["1.0/8"][0].src_pid, "1.0.0.0") self.assertEqual( SimBGP._router_list["0.0.0.0"].loc_rib["1.0/8"][0].src_pid, "2.0.0.0") #Link down SimBGP._event_Scheduler.add( SimBGP.CEvent(SimBGP.toSystemTime(10.0), ["0.0.0.1", "0.0.0.2"], SimBGP.EVENT_LINK_DOWN)) SimBGP.run() self.assertEqual( SimBGP.getRouterLink("0.0.0.1", "0.0.0.2").reach, SimBGP.PEER_UNREACH) self.assertEqual( SimBGP._router_list["0.0.0.2"].loc_rib["1.0/8"][0].src_pid, "0.0.0.3") self.assertEqual( SimBGP._router_list["0.0.0.1"].loc_rib["1.0/8"][0].src_pid, "0.0.0.0") #Check that each receiving router prefers eBGP path self.assertEqual( SimBGP._router_list["0.0.0.3"].loc_rib["1.0/8"][0].src_pid, "1.0.0.0") self.assertEqual( SimBGP._router_list["0.0.0.0"].loc_rib["1.0/8"][0].src_pid, "2.0.0.0") #Check Link Up SimBGP._event_Scheduler.add( SimBGP.CEvent(SimBGP.toSystemTime(11.0), ["0.0.0.1", "0.0.0.2"], SimBGP.EVENT_LINK_UP)) SimBGP.run() self.assertTrue( SimBGP._igp_graph.isReachableFrom("0.0.0.1", "0.0.0.2")) self.assertEqual( SimBGP.getRouterLink("0.0.0.1", "0.0.0.2").reach, SimBGP.PEER_REACH) self.assertEqual( SimBGP._router_list["0.0.0.2"].loc_rib["1.0/8"][0].src_pid, "0.0.0.0") self.assertEqual( SimBGP._router_list["0.0.0.1"].loc_rib["1.0/8"][0].src_pid, "0.0.0.0")
def tearDown(self): #Clean all SimBGP data SimBGP.init()
def setUp(self): SimBGP.init() #Configuring simple triangle topology self.myRouter1 = SimBGP.CRouter(1, "1.0.0.0") self.myRouter2 = SimBGP.CRouter(2, "2.0.0.0") self.myRouter3 = SimBGP.CRouter(2, "2.0.0.1") SimBGP._router_list["1.0.0.0"] = self.myRouter1 SimBGP._router_list["2.0.0.0"] = self.myRouter2 SimBGP._router_list["2.0.0.1"] = self.myRouter3 self.myLink1 = self.myRouter1.getPeerLink("2.0.0.0") self.myLink2 = self.myRouter2.getPeerLink("1.0.0.0") self.myLink3 = self.myRouter3.getPeerLink("2.0.0.0") self.myLink4 = self.myRouter3.getPeerLink("1.0.0.0") self.myRouter1.peers["2.0.0.0"] = SimBGP.CPeer("2.0.0.0", self.myLink1) self.myRouter1.peers["2.0.0.1"] = SimBGP.CPeer("2.0.0.1", self.myLink4) self.myRouter2.peers["1.0.0.0"] = SimBGP.CPeer("1.0.0.0", self.myLink2) self.myRouter2.peers["2.0.0.1"] = SimBGP.CPeer("2.0.0.1", self.myLink3) self.myRouter3.peers["1.0.0.0"] = SimBGP.CPeer("1.0.0.0", self.myLink4) self.myRouter3.peers["2.0.0.0"] = SimBGP.CPeer("2.0.0.0", self.myLink3)
def tearDown(self): SimBGP.init() SimBGP.BEST_EXTERNAL = False SimBGP.MAX_PATH_NUMBER = 1