def test_hopping_repo(self): for n in self.nodes.values(): n.start_forwarder() chunks: List[str] = [] for i, edge in [(1, 11), (2, 12), (3, 13), (4, 21), (5, 22), (6, 23), (7, 31), (8, 32), (9, 33)]: # Instead of moving a single repo from one node to the next, it's far easier to simply create a new one, and # it SHOULDN'T make a difference. repo = ICNDataRepository('/tmp/test_hopping_repo', Name('/hoppingrepo'), 0, encoder=NdnTlvEncoder(), autoconfig=True, autoconfig_routed=True) repo.autoconfiglayer._broadcast_port = self.ports[edge] repo.start_repo() sleep(10) # Start a fetch client which sends its interests to the core00 node fetch = Fetch('127.0.0.1', self.ports[00], encoder=NdnTlvEncoder()) for _ in range(5): try: chunks.append( fetch.fetch_data(Name(f'/edge/hoppingrepo/c{i}'), timeout=4.0)) break except queue.Empty: pass fetch.stop_fetch() repo.stop_repo() expected: List[str] = [] for c in [1, 2, 3, 4, 5, 6, 7, 8, 9]: expected.append(f'This is test chunk {c}!') self.assertEqual(expected, chunks)
def repo_hop(): global repo, edge_index, lock, running if repo is not None: repo.linklayer.sock.close() dumpster.append(repo) with lock: if not running: return repo = ICNDataRepository(None, Name('/hoppingrepo'), 0, encoder=NdnTlvEncoder(), autoconfig=True, autoconfig_routed=True) repo.repolayer._repository = imr edge_index = (edge_index + 1) % len(edgeports) repo.autoconfiglayer._broadcast_port = edgeports[edge_index] repo.start_repo() threading.Timer(hopping_interval, repo_hop).start()
def main(args): prefix = Name(args.icnprefix) log_level = logging.DEBUG if args.format == "ndntlv": encoder = NdnTlvEncoder() else: encoder = SimpleStringEncoder(log_level=log_level) repo = ICNDataRepository(args.datapath, prefix, args.port, log_level, encoder=encoder, autoconfig=args.autoconfig) repo.start_repo() repo.linklayer.process.join()
class Initiation(unittest.TestCase): """Simulate a Map Reduce Scenario where timeout prevention is required.""" @abc.abstractmethod def get_encoder(self) -> BasicEncoder: return SimpleStringEncoder def setUp(self): self.encoder_type = self.get_encoder() self.simulation_bus = SimulationBus(packetencoder=self.encoder_type()) self.fetch_tool1 = Fetch( "distributor", None, 255, self.encoder_type(), interfaces=[self.simulation_bus.add_interface("fetchtool1")]) self.distributor = NFNForwarder( port=0, encoder=self.encoder_type(), interfaces=[self.simulation_bus.add_interface("distributor")], log_level=255, ageing_interval=3) self.nfn1 = NFNForwarder( port=0, encoder=self.encoder_type(), interfaces=[self.simulation_bus.add_interface("nfn1")], log_level=255, ageing_interval=3) self.nfn2 = NFNForwarder( port=0, encoder=self.encoder_type(), interfaces=[self.simulation_bus.add_interface("nfn2")], log_level=255, ageing_interval=3) self.nfn3 = NFNForwarder( port=0, encoder=self.encoder_type(), interfaces=[self.simulation_bus.add_interface("nfn3")], log_level=255, ageing_interval=3) self.nfn4 = NFNForwarder( port=0, encoder=self.encoder_type(), interfaces=[self.simulation_bus.add_interface("nfn4")], log_level=255, ageing_interval=3) self.repo1 = ICNDataRepository( "/tmp/repo1", Name("/repo/r1"), 0, 255, self.encoder_type(), False, False, [self.simulation_bus.add_interface("repo1")]) self.repo2 = ICNDataRepository( "/tmp/repo2", Name("/repo/r2"), 0, 255, self.encoder_type(), False, False, [self.simulation_bus.add_interface("repo2")]) self.repo3 = ICNDataRepository( "/tmp/repo3", Name("/repo/r3"), 0, 255, self.encoder_type(), False, False, [self.simulation_bus.add_interface("repo3")]) self.repo4 = ICNDataRepository( "/tmp/repo4", Name("/repo/r4"), 0, 255, self.encoder_type(), False, False, [self.simulation_bus.add_interface("repo4")]) self.nfn1.icnlayer.pit.set_pit_timeout(50) self.nfn1.icnlayer.cs.set_cs_timeout(0) self.nfn2.icnlayer.pit.set_pit_timeout(50) self.nfn2.icnlayer.cs.set_cs_timeout(0) self.nfn3.icnlayer.pit.set_pit_timeout(50) self.nfn3.icnlayer.cs.set_cs_timeout(0) self.nfn4.icnlayer.pit.set_pit_timeout(50) self.nfn4.icnlayer.cs.set_cs_timeout(0) self.mgmt_client0 = MgmtClient( self.distributor.mgmt.mgmt_sock.getsockname()[1]) self.mgmt_client1 = MgmtClient( self.nfn1.mgmt.mgmt_sock.getsockname()[1]) self.mgmt_client2 = MgmtClient( self.nfn2.mgmt.mgmt_sock.getsockname()[1]) self.mgmt_client3 = MgmtClient( self.nfn3.mgmt.mgmt_sock.getsockname()[1]) self.mgmt_client4 = MgmtClient( self.nfn4.mgmt.mgmt_sock.getsockname()[1]) def tearDown(self): self.distributor.stop_forwarder() self.nfn1.stop_forwarder() self.nfn2.stop_forwarder() self.nfn3.stop_forwarder() self.nfn4.stop_forwarder() self.repo1.stop_repo() self.repo2.stop_repo() self.repo3.stop_repo() self.repo4.stop_repo() self.fetch_tool1.stop_fetch() self.simulation_bus.stop_process() self.tearDown_repo() def setup_faces_and_connections(self): self.distributor.start_forwarder() self.nfn1.start_forwarder() self.nfn2.start_forwarder() self.nfn3.start_forwarder() self.nfn4.start_forwarder() self.repo1.start_repo() self.repo2.start_repo() self.repo3.start_repo() self.repo4.start_repo() self.simulation_bus.start_process() time.sleep(3) # setup forwarding rules self.mgmt_client0.add_face("nfn1", None, 0) self.mgmt_client0.add_forwarding_rule(Name("/lib"), [0]) self.mgmt_client0.add_face("nfn2", None, 0) self.mgmt_client0.add_forwarding_rule(Name("/lib"), [1]) self.mgmt_client0.add_face("nfn3", None, 0) self.mgmt_client0.add_forwarding_rule(Name("/lib"), [2]) self.mgmt_client0.add_face("nfn4", None, 0) self.mgmt_client0.add_forwarding_rule(Name("/lib4/func4"), [3]) self.mgmt_client1.add_face("repo1", None, 0) self.mgmt_client1.add_forwarding_rule(Name("/repo/r1"), [0]) self.mgmt_client2.add_face("repo2", None, 0) self.mgmt_client2.add_forwarding_rule(Name("/repo/r2"), [0]) self.mgmt_client3.add_face("repo3", None, 0) self.mgmt_client3.add_forwarding_rule(Name("/repo/r3"), [0]) self.mgmt_client4.add_face("repo4", None, 0) self.mgmt_client4.add_forwarding_rule(Name("/repo/r4"), [0]) self.mgmt_client1.add_face("nfn0", None, 0) self.mgmt_client1.add_forwarding_rule(Name("/lib"), [1]) self.mgmt_client2.add_face("nfn0", None, 0) self.mgmt_client2.add_forwarding_rule(Name("/lib"), [1]) self.mgmt_client3.add_face("nfn0", None, 0) self.mgmt_client3.add_forwarding_rule(Name("/lib"), [1]) self.mgmt_client4.add_face("nfn0", None, 0) self.mgmt_client4.add_forwarding_rule(Name("/lib4/func4"), [1]) #setup function code #self.mgmt_client1.add_new_content(Name("/lib/func1"),"PYTHON\nf\ndef f(n):\n return n") self.mgmt_client1.add_new_content( Name("/lib/func1"), "PYTHON\nf\ndef f():\n result =[]\n x,y =0,1\n while x<n:\n result.append(x)\n x,y = y, y+x\n return result" ) self.mgmt_client2.add_new_content( Name("/lib/func1"), "PYTHON\nf\ndef f(n):\n result =[]\n x,y =0,1\n while x<n:\n result.append(x)\n x,y = y, y+x\n return result" ) # self.mgmt_client2.add_new_content(Name("/lib/func2"),"func2") self.mgmt_client3.add_new_content( Name("/lib/func1"), "PYTHON\nf\ndef f(n):\n result =[]\n x,y =0,1\n while x<n:\n result.append(x)\n x,y = y, y+x\n return result" ) self.mgmt_client4.add_new_content(Name("/lib4/func4"), "func4") # self.mgmt_client1.add_new_content(Name("/lib/func1"), # "PYTHON\nf\ndef f():\n for i in range(0,100000000):\n a.upper()\n return a.upper()") # self.mgmt_client2.add_new_content(Name("/lib/func2"), # "PYTHON\nf\ndef f(a):\n for i in range(0,100000000):\n a.upper()\n return a.upper()") # self.mgmt_client3.add_new_content(Name("/lib/func3"), # "PYTHON\nf\ndef f(a):\n for i in range(0,100000000):\n a.upper()\n return a.upper()") # self.mgmt_client4.add_new_content(Name("/lib/func4"), # "PYTHON\nf\ndef f(a):\n for i in range(0,100000000):\n a.upper()\n return a.upper()") # def setup_repo(self): for i in range(1, 5): self.path = "/tmp/repo" + str(i) try: os.stat(self.path) except: os.mkdir(self.path) with open(self.path + "/data" + str(i), 'w+') as content_file: content_file.write("data" + str(i)) def tearDown_repo(self): try: shutil.rmtree(self.path) os.remove("/tmp/repo") except: pass def test_simple_Fs(self): self.setup_repo() self.setup_faces_and_connections() name1 = Name("/lib/func1") name1 += '_()' name1 += "NFN" name2 = Name("/lib/func1") name2 += '_(500000)' name2 += "NFN" name3 = Name("/lib/func1") name3 += '_(5000)' name3 += "NFN" name4 = Name("/lib/func1") name4 += '_(900000000000000000)' name4 += "NFN" name5 = Name("/lib/func1") name5 += '_(68899455874)' name5 += "NFN" t1 = Fs_thread(name1, fetch_tool=self.fetch_tool1) t2 = Fs_thread(name2, fetch_tool=self.fetch_tool1) t3 = Fs_thread(name3, fetch_tool=self.fetch_tool1) t4 = Fs_thread(name4, fetch_tool=self.fetch_tool1) t5 = Fs_thread(name5, fetch_tool=self.fetch_tool1) t1.start() t2.start() t3.start() t4.start() t5.start() t1.join() t2.join() t3.join() t4.join() t5.join()
class StreamingSimulation(unittest.TestCase): """Simulate a Streaming Scenario.""" def ageing(self): return def setUp(self): self.simulation_bus = SimulationBus(packetencoder=NdnTlvEncoder()) self.fetch_tool1 = Fetch( "nfn0", None, 255, NdnTlvEncoder(), interfaces=[self.simulation_bus.add_interface("fetchtoo11")]) self.nfn0 = NFNForwarder( port=0, encoder=NdnTlvEncoder(), interfaces=[self.simulation_bus.add_interface("nfn0")], log_level=255, executors={"PYTHONSTREAM": NFNPythonExecutorStreaming()}, ageing_interval=1) self.nfn0.executors["PYTHONSTREAM"].initialize_executor( self.nfn0.nfnlayer.queue_to_lower, self.nfn0.nfnlayer.queue_from_lower, self.nfn0.nfnlayer.cs, False) self.nfn0.icnlayer.pit.ageing = self.ageing self.nfn0.timeoutpreventionlayer.ageing = self.ageing self.nfn1 = NFNForwarder( port=0, encoder=NdnTlvEncoder(), interfaces=[self.simulation_bus.add_interface("nfn1")], log_level=255, executors={"PYTHONSTREAM": NFNPythonExecutorStreaming()}, ageing_interval=1) self.nfn1.executors["PYTHONSTREAM"].initialize_executor( self.nfn1.nfnlayer.queue_to_lower, self.nfn1.nfnlayer.queue_from_lower, self.nfn1.nfnlayer.cs, False) self.nfn1.icnlayer.pit.ageing = self.ageing self.nfn1.timeoutpreventionlayer.ageing = self.ageing self.nfn12 = NFNForwarder( port=0, encoder=NdnTlvEncoder(), interfaces=[self.simulation_bus.add_interface("nfn12")], log_level=255, executors={"PYTHONSTREAM": NFNPythonExecutorStreaming()}, ageing_interval=1) self.nfn12.executors["PYTHONSTREAM"].initialize_executor( self.nfn12.nfnlayer.queue_to_lower, self.nfn12.nfnlayer.queue_from_lower, self.nfn12.nfnlayer.cs, False) self.nfn12.icnlayer.pit.ageing = self.ageing self.nfn12.timeoutpreventionlayer.ageing = self.ageing self.repo1 = ICNDataRepository( "/tmp/repo1", Name("/repo/r1"), 0, 255, NdnTlvEncoder(), False, False, interfaces=[self.simulation_bus.add_interface("repo1")]) self.mgmt_client0 = MgmtClient( self.nfn0.mgmt.mgmt_sock.getsockname()[1]) self.mgmt_client1 = MgmtClient( self.nfn1.mgmt.mgmt_sock.getsockname()[1]) self.mgmt_client01 = MgmtClient( self.nfn12.mgmt.mgmt_sock.getsockname()[1]) def tearDown(self): self.nfn0.stop_forwarder() self.nfn1.stop_forwarder() self.nfn12.stop_forwarder() self.repo1.stop_repo() self.fetch_tool1.stop_fetch() self.simulation_bus.stop_process() self.tearDown_repo() def setup_faces_and_connections(self): self.nfn0.start_forwarder() self.nfn1.start_forwarder() self.nfn12.start_forwarder() self.repo1.start_repo() self.simulation_bus.start_process() time.sleep(3) #setup forwarding rules self.mgmt_client0.add_face("nfn1", None, 0) self.mgmt_client0.add_forwarding_rule(Name("/lib0"), [0]) self.mgmt_client0.add_face("nfn12", None, 0) self.mgmt_client0.add_forwarding_rule(Name("/lib1"), [1]) self.mgmt_client01.add_face("nfn1", None, 0) self.mgmt_client01.add_forwarding_rule(Name("/lib1"), [0]) self.mgmt_client1.add_face("repo1", None, 0) self.mgmt_client1.add_forwarding_rule(Name("/repo/r1"), [0]) self.mgmt_client1.add_face("nfn0", None, 0) self.mgmt_client1.add_forwarding_rule(Name("/lib0"), [1]) #setup function code #multi name self.mgmt_client1.add_new_content( Name("/lib0/multiname"), "PYTHONSTREAM\nmultiname\ndef multiname(arg):\n a = get_next(arg)\n a = a.upper()\n b = get_next(arg)\n b = b.upper()\n c = get_next(arg)\n c = c.upper()\n d = get_next(arg)\n d = d.upper()\n e = get_next(arg)\n e = e.upper()\n f = get_next(arg)\n f = f.upper()\n g = get_next(arg)\n g = g.upper()\n h = get_next(arg)\n h = h.upper()\n i = get_next(arg)\n i = i.upper()\n j = get_next(arg)\n j = j.upper()\n return a + b + c + d + e + f + g + h + i + j" ) #single name - two layer self.mgmt_client0.add_new_content( Name("/lib0/node0"), "PYTHONSTREAM\ngetnext_on_writeout\ndef getnext_on_writeout(arg):\n print('Start äussere')\n a = get_next(arg)\n a = a.upper()\n b = get_next(arg)\n b = b.upper()\n c = get_next(arg)\n c = c.upper()\n d = get_next(arg)\n d = d.upper()\n e = get_next(arg)\n e = e.upper()\n f = get_next(arg)\n f = f.upper()\n g = get_next(arg)\n g = g.upper()\n h = get_next(arg)\n h = h.upper()\n i = get_next(arg)\n i = i.upper()\n j = get_next(arg)\n j = j.upper()\n print('Ende äussere')\n return a + b + c + d + e + f + g + h + i + j" ) self.mgmt_client1.add_new_content( Name("/lib0/node1"), "PYTHONSTREAM\nwriteout_on_getnext\ndef writeout_on_getnext(arg):\n print('Start innere')\n write_out_on_get_next(arg)\n return print('Ende innere')\n" ) #single name - three layer self.mgmt_client0.add_new_content( Name("/lib1/node0"), "PYTHONSTREAM\ngetnext_on_writeout\ndef getnext_on_writeout(arg):\n print('Start äussere')\n a = get_next(arg)\n a = a.upper()\n b = get_next(arg)\n b = b.upper()\n c = get_next(arg)\n c = c.upper()\n d = get_next(arg)\n d = d.upper()\n e = get_next(arg)\n e = e.upper()\n f = get_next(arg)\n f = f.upper()\n g = get_next(arg)\n g = g.upper()\n h = get_next(arg)\n h = h.upper()\n i = get_next(arg)\n i = i.upper()\n j = get_next(arg)\n j = j.upper()\n print('Ende äussere')\n return a + b + c + d + e + f + g + h + i + j" ) self.mgmt_client01.add_new_content( Name("/lib1/node1"), "PYTHONSTREAM\nwriteout_on_getnext\ndef writeout_on_getnext(arg):\n print('Start mittlere')\n write_out_on_get_next(arg)\n return print('Ende mittlere')\n" ) self.mgmt_client1.add_new_content( Name("/lib1/node2"), "PYTHONSTREAM\nwriteout_on_getnext\ndef writeout_on_getnext(arg):\n print('Start innere')\n write_out_on_get_next(arg)\n return print('Ende innere')\n" ) def generate_name_files(self, path: str, number: int): with open(path + "/name" + str(number), "w") as f: f.write("Content of name" + str(number) + ". ") f.close() def setup_repo(self): self.path = "/tmp/repo1" try: os.stat(self.path) except: os.mkdir(self.path) with open(self.path + "/data1", 'w+') as content_file: content_file.write("sdo:\n") for i in range(1, 11): content_file.write("/repo/r1/name" + str(i) + "\n") self.generate_name_files(self.path, i) content_file.write("sdo:endstreaming\n") def tearDown_repo(self): try: shutil.rmtree(self.path) os.remove("/tmp/repo") except: pass def test_multiname(self): """Multiname test with input data from repo""" self.setup_repo() self.setup_faces_and_connections() name = Name("/lib0/multiname") name += '_(/repo/r1/data1)' name += "NFN" res = self.fetch_tool1.fetch_data(name, timeout=40) print(res) self.assertEqual( "CONTENT OF NAME1. CONTENT OF NAME2. CONTENT OF NAME3. CONTENT OF NAME4. CONTENT OF NAME5. CONTENT OF NAME6. CONTENT OF NAME7. CONTENT OF NAME8. CONTENT OF NAME9. CONTENT OF NAME10. ", res) def test_twolayer(self): """Singlename test over two layers with input data from repo""" self.setup_repo() self.setup_faces_and_connections() scenario_node_1 = Name("/lib0/node1") scenario_node_1 += "#(=/repo/r1/data1=)" scenario_node_1 += "NFN" scenario_node_0 = Name("/lib0/node0") scenario_node_0 += '_("' + str(scenario_node_1) + '")' scenario_node_0 += "NFN" res = self.fetch_tool1.fetch_data(scenario_node_0, timeout=40) print(res) self.assertEqual( "CONTENT OF NAME1. CONTENT OF NAME2. CONTENT OF NAME3. CONTENT OF NAME4. CONTENT OF NAME5. CONTENT OF NAME6. CONTENT OF NAME7. CONTENT OF NAME8. CONTENT OF NAME9. CONTENT OF NAME10. ", res) def test_threelayer(self): """Singlename test over three layers with input data from repo""" self.setup_repo() self.setup_faces_and_connections() scenario_node_2 = Name("/lib1/node2") scenario_node_2 += "#(=/repo/r1/data1=)" scenario_node_2 += "NFN" scenario_node_1 = Name("/lib1/node1") scenario_node_1 += "#(=" + str(scenario_node_2) + "=)" scenario_node_1 += "NFN" scenario_node_0 = Name("/lib1/node0") scenario_node_0 += '_("' + str(scenario_node_1) + '")' scenario_node_0 += "NFN" res = self.fetch_tool1.fetch_data(scenario_node_0, timeout=40) print(res) self.assertEqual( "CONTENT OF NAME1. CONTENT OF NAME2. CONTENT OF NAME3. CONTENT OF NAME4. CONTENT OF NAME5. CONTENT OF NAME6. CONTENT OF NAME7. CONTENT OF NAME8. CONTENT OF NAME9. CONTENT OF NAME10. ", res)
class ICNSessionSimulation(unittest.TestCase): """Simulate a Scenario where timeout prevention is required""" def setUp(self): self.simulation_bus = SimulationBus( log_level=0) # Use BasicStringEncoder self.icn_repo0 = ICNDataRepository( port=0, prefix=Name('/test/t1'), foldername=None, interfaces=[self.simulation_bus.add_interface('repo0')], log_level=255) # Initialize repository 0 self.icn_repo1 = ICNDataRepositorySession( port=0, prefix=Name('/test/t2'), foldername=None, interfaces=[self.simulation_bus.add_interface('repo1')], log_level=0) # Initialize repository 1 (this one has sessions) self.icn_forwarder0 = ICNForwarder( port=0, log_level=255, interfaces=[self.simulation_bus.add_interface('fw0') ]) # Initialize forwarder 0 self.icn_forwarder1 = ICNForwarder( port=0, log_level=255, interfaces=[self.simulation_bus.add_interface('fw1') ]) # Initialize forwarder 1 self.mgmt_client0 = MgmtClient( self.icn_repo0.mgmt.mgmt_sock.getsockname() [1]) # Mgmt client for repository 0 self.mgmt_client1 = MgmtClient( self.icn_repo1.mgmt.mgmt_sock.getsockname() [1]) # Mgmt client for repository 1 self.mgmt_client2 = MgmtClient( self.icn_forwarder0.mgmt.mgmt_sock.getsockname() [1]) # Mgmt client for forwarder 0 self.mgmt_client3 = MgmtClient( self.icn_forwarder1.mgmt.mgmt_sock.getsockname() [1]) # Mgmt client for forwarder 1 # This is unintuitive. Why does the fetch tool add its own face, but the other components don't? self.fetch0 = Fetch('fw0', None, log_level=255, interfaces=[ self.simulation_bus.add_interface('fetcht0') ]) # Initialize a client (fetch tool) self.fetch1 = FetchSessions( 'fw0', None, log_level=255, interfaces=[self.simulation_bus.add_interface('fetcht1')]) self.icn_repo0.start_repo() self.icn_repo1.start_repo() self.icn_forwarder0.start_forwarder() self.icn_forwarder1.start_forwarder() self.simulation_bus.start_process() time.sleep(1) # Be safe and wait for all processes to start self.mgmt_client2.add_face( 'repo0', None, 0) # Add new interface to forwarder 0, index has to be 0. self.mgmt_client2.add_face( 'fw1', None, 0) # # Add new interface to forwarder 0, index has to be 0. self.mgmt_client2.add_forwarding_rule( Name('/test/t1'), [0]) # Add a forward-rule this prefix to interface with index 0. self.mgmt_client2.add_forwarding_rule( Name('/test/t2'), [1]) # Add a forward-rule this prefix to interface with index 1. self.mgmt_client3.add_face( 'repo1', None, 0) # Add new interface to forwarder 1, index has to be 0. self.mgmt_client3.add_forwarding_rule( Name('/test/t2'), [0]) # Add a forward-rule this prefix to interface with index 0. # Repositories do not need a forwarding rule or an interface. All done in constructor. self.test_content = 'This is just a test for repo0.' self.icn_repo0.repo.add_content( Name('/test/t1/content_object'), self.test_content ) # TODO: Create add_new_content command for DataRepository in ManagementClient print(self.icn_forwarder0.icnlayer.fib) print(self.icn_forwarder1.icnlayer.fib) def tearDown(self): time.sleep( 1 ) # Be safe and wait for all messages to trickle in before shutting down everything self.icn_forwarder0.stop_forwarder() self.icn_forwarder1.stop_forwarder() self.fetch0.stop_fetch() self.fetch1.stop_fetch() self.simulation_bus.stop_process() self.mgmt_client0.shutdown() self.mgmt_client1.shutdown() self.mgmt_client2.shutdown() self.mgmt_client3.shutdown() def test_simple_interest(self): interest = Name( '/test/t1/content_object') # Test routing, no new features. res = self.fetch0.fetch_data(interest, timeout=20) print(f"Return value: {res}") self.assertEqual(self.test_content, res, 'The content matches.') def test_simple_session_initiation(self): interest = Name( "/test/t2/session_connector" ) # Test session connection string. This should return 16bits res = self.fetch1.fetch_data(interest, timeout=20) print(f"Return value : {res}") self.assertEqual(self.icn_repo1.repolayer._pending_sessions[0], self.fetch1._session_keys[0], 'The session keys match.')
def simulation(classic, amount_of_parts): generateExampleFiles("../InputFiles/exampleInputFile", amount_of_parts) simulation_bus = SimulationBus(packetencoder=NdnTlvEncoder()) nfn_fwd0 = NFNForwarder( port=0, encoder=NdnTlvEncoder(), interfaces=[simulation_bus.add_interface("nfn0")], log_level=255, executors={"PYTHONSTREAM": NFNPythonExecutorStreaming()}, ageing_interval=1) nfn_fwd0.executors["PYTHONSTREAM"].initialize_executor( nfn_fwd0.nfnlayer.queue_to_lower, nfn_fwd0.nfnlayer.queue_from_lower, nfn_fwd0.nfnlayer.cs, classic) nfn_fwd0.icnlayer.pit.ageing = ageing nfn_fwd0.timeoutpreventionlayer.ageing = ageing nfn_fwd1 = NFNForwarder( port=0, encoder=NdnTlvEncoder(), interfaces=[simulation_bus.add_interface("nfn1")], log_level=255, executors={"PYTHONSTREAM": NFNPythonExecutorStreaming()}, ageing_interval=1) nfn_fwd1.executors["PYTHONSTREAM"].initialize_executor( nfn_fwd1.nfnlayer.queue_to_lower, nfn_fwd1.nfnlayer.queue_from_lower, nfn_fwd1.nfnlayer.cs, classic) nfn_fwd1.icnlayer.pit.ageing = ageing nfn_fwd1.timeoutpreventionlayer.ageing = ageing nfn_fwd2 = NFNForwarder( port=0, encoder=NdnTlvEncoder(), interfaces=[simulation_bus.add_interface("nfn2")], log_level=255, executors={"PYTHONSTREAM": NFNPythonExecutorStreaming()}, ageing_interval=1) nfn_fwd2.executors["PYTHONSTREAM"].initialize_executor( nfn_fwd2.nfnlayer.queue_to_lower, nfn_fwd2.nfnlayer.queue_from_lower, nfn_fwd2.nfnlayer.cs, classic) nfn_fwd2.icnlayer.pit.ageing = ageing nfn_fwd2.timeoutpreventionlayer.ageing = ageing repo = ICNDataRepository("../InputFiles", Name("/repo/r1"), 0, 255, NdnTlvEncoder(), False, False, interfaces=[simulation_bus.add_interface("repo")]) repo.start_repo() mgmt_client0 = MgmtClient(nfn_fwd0.mgmt.mgmt_sock.getsockname()[1]) mgmt_client1 = MgmtClient(nfn_fwd1.mgmt.mgmt_sock.getsockname()[1]) mgmt_client2 = MgmtClient(nfn_fwd2.mgmt.mgmt_sock.getsockname()[1]) fetch_tool = Fetch("nfn0", None, 255, NdnTlvEncoder(), interfaces=[simulation_bus.add_interface("fetchtoo1")]) nfn_fwd0.start_forwarder() nfn_fwd1.start_forwarder() nfn_fwd2.start_forwarder() simulation_bus.start_process() mgmt_client0.add_face("nfn1", None, 0) mgmt_client0.add_forwarding_rule(Name("/lib"), [0]) mgmt_client1.add_face("nfn2", None, 0) mgmt_client1.add_forwarding_rule(Name("/lib"), [0]) mgmt_client2.add_face("repo", None, 0) mgmt_client2.add_forwarding_rule(Name("/repo/r1"), [0]) mgmt_client0.add_new_content( Name("/lib/node0"), "PYTHONSTREAM\ngetnext_on_writeout\ndef getnext_on_writeout(arg):\n print('Start dritte')\n res = ''\n a = get_next(arg)\n while a != None:\n res = res + a\n a = get_next(arg)\n print('Ende dritte')\n return res" ) mgmt_client1.add_new_content( Name("/lib/node1"), "PYTHONSTREAM\nwriteout_on_getnext\ndef writeout_on_getnext(arg):\n print('Start zweite')\n a = get_next(arg)\n while a and check_end_streaming(a) is False:\n a = a.upper()\n sleep(1)\n write_out(a)\n a = get_next(arg)\n last_write_out()\n return print('Ende zweite')\n" ) mgmt_client2.add_new_content( Name("/lib/node2"), "PYTHONSTREAM\nwriteout_on_getnext\ndef writeout_on_getnext(arg):\n print('Start erste')\n write_out_on_get_next(arg)\n return print('Ende erste')\n" ) scenario_node_2 = Name("/lib/node2") scenario_node_2 += "#(=/repo/r1/exampleInputFile=)" scenario_node_2 += "NFN" scenario_node_1 = Name("/lib/node1") scenario_node_1 += "#(=" + str(scenario_node_2) + "=)" scenario_node_1 += "NFN" scenario_node_0 = Name("/lib/node0") scenario_node_0 += '_("' + str(scenario_node_1) + '")' scenario_node_0 += "NFN" start_time = time.perf_counter() res = fetch_tool.fetch_data(scenario_node_0, timeout=60) end_time = time.perf_counter() time_needed = end_time - start_time if res.startswith("CONTENT OF NAME"): print("Time:", time_needed, res) return time_needed else: print("Something went wrong") None
fw1.mgmt.mgmt_sock.getsockname()[1]) # Mgmt client for forwarder 1 # This is unintuitive. Why does the fetch tool add its own face, but the other components don't? fetch0 = Fetch('fw0', None, log_level=255, interfaces=[simulation_bus.add_interface('fetcht0')], name='fetch0') fetch1 = FetchSessions( 'fw1', None, log_level=0, interfaces=[simulation_bus.add_interface('fetcht1')], name='fetch1') repo0.start_repo() repo1.start_repo() fw0.start_forwarder() fw1.start_forwarder() simulation_bus.start_process() # time.sleep(1) # Be safe and wait for all processes to start mgmt_fw0.add_face( 'repo0', None, 0) # Add new interface to forwarder 0, index has to be 0. mgmt_fw0.add_face( 'fw1', None, 0) # Add new interface to forwarder 0, index has to be 0. mgmt_fw0.add_forwarding_rule( Name('/test/t1'), [0]) # Add a forward-rule this prefix to interface with index 0.
class MapReduceSimulation(unittest.TestCase): """Simulate a Map Reduce Scenario where timeout prevention is required.""" @abc.abstractmethod def get_encoder(self) -> BasicEncoder: return SimpleStringEncoder def setUp(self): self.encoder_type = self.get_encoder() self.simulation_bus = SimulationBus(packetencoder=self.encoder_type()) self.fetch_tool1 = Fetch( "nfn0", None, 255, self.encoder_type(), interfaces=[self.simulation_bus.add_interface("fetchtool1")]) self.nfn0 = NFNForwarder( port=0, encoder=self.encoder_type(), interfaces=[self.simulation_bus.add_interface("nfn0")], log_level=255, ageing_interval=1) self.nfn1 = NFNForwarder( port=0, encoder=self.encoder_type(), interfaces=[self.simulation_bus.add_interface("nfn1")], log_level=255, ageing_interval=1) self.nfn2 = NFNForwarder( port=0, encoder=self.encoder_type(), interfaces=[self.simulation_bus.add_interface("nfn2")], log_level=255, ageing_interval=1) self.nfn3 = NFNForwarder( port=0, encoder=self.encoder_type(), interfaces=[self.simulation_bus.add_interface("nfn3")], log_level=255, ageing_interval=1) self.nfn4 = NFNForwarder( port=0, encoder=self.encoder_type(), interfaces=[self.simulation_bus.add_interface("nfn4")], log_level=255, ageing_interval=1) self.repo1 = ICNDataRepository( "/tmp/repo1", Name("/repo/r1"), 0, 255, self.encoder_type(), False, False, [self.simulation_bus.add_interface("repo1")]) self.repo2 = ICNDataRepository( "/tmp/repo2", Name("/repo/r2"), 0, 255, self.encoder_type(), False, False, [self.simulation_bus.add_interface("repo2")]) self.repo3 = ICNDataRepository( "/tmp/repo3", Name("/repo/r3"), 0, 255, self.encoder_type(), False, False, [self.simulation_bus.add_interface("repo3")]) self.repo4 = ICNDataRepository( "/tmp/repo4", Name("/repo/r4"), 0, 255, self.encoder_type(), False, False, [self.simulation_bus.add_interface("repo4")]) self.nfn1.icnlayer.pit.set_pit_timeout(0) self.nfn1.icnlayer.cs.set_cs_timeout(30) self.nfn2.icnlayer.pit.set_pit_timeout(0) self.nfn2.icnlayer.cs.set_cs_timeout(30) self.nfn3.icnlayer.pit.set_pit_timeout(0) self.nfn3.icnlayer.cs.set_cs_timeout(30) self.nfn4.icnlayer.pit.set_pit_timeout(0) self.nfn4.icnlayer.cs.set_cs_timeout(30) self.nfn0.nfnlayer.optimizer = MapReduceOptimizer( self.nfn0.icnlayer.cs, self.nfn0.icnlayer.fib, self.nfn0.icnlayer.pit, self.nfn0.linklayer.faceidtable) self.nfn1.nfnlayer.optimizer = MapReduceOptimizer( self.nfn1.icnlayer.cs, self.nfn1.icnlayer.fib, self.nfn1.icnlayer.pit, self.nfn1.linklayer.faceidtable) self.nfn2.nfnlayer.optimizer = MapReduceOptimizer( self.nfn2.icnlayer.cs, self.nfn2.icnlayer.fib, self.nfn2.icnlayer.pit, self.nfn2.linklayer.faceidtable) self.nfn3.nfnlayer.optimizer = MapReduceOptimizer( self.nfn3.icnlayer.cs, self.nfn3.icnlayer.fib, self.nfn3.icnlayer.pit, self.nfn3.linklayer.faceidtable) self.nfn4.nfnlayer.optimizer = MapReduceOptimizer( self.nfn4.icnlayer.cs, self.nfn4.icnlayer.fib, self.nfn4.icnlayer.pit, self.nfn4.linklayer.faceidtable) self.mgmt_client0 = MgmtClient( self.nfn0.mgmt.mgmt_sock.getsockname()[1]) self.mgmt_client1 = MgmtClient( self.nfn1.mgmt.mgmt_sock.getsockname()[1]) self.mgmt_client2 = MgmtClient( self.nfn2.mgmt.mgmt_sock.getsockname()[1]) self.mgmt_client3 = MgmtClient( self.nfn3.mgmt.mgmt_sock.getsockname()[1]) self.mgmt_client4 = MgmtClient( self.nfn4.mgmt.mgmt_sock.getsockname()[1]) def tearDown(self): self.nfn0.stop_forwarder() self.nfn1.stop_forwarder() self.nfn2.stop_forwarder() self.nfn3.stop_forwarder() self.nfn4.stop_forwarder() self.repo1.stop_repo() self.repo2.stop_repo() self.repo3.stop_repo() self.repo4.stop_repo() self.fetch_tool1.stop_fetch() self.simulation_bus.stop_process() self.tearDown_repo() def setup_faces_and_connections(self): self.nfn0.start_forwarder() self.nfn1.start_forwarder() self.nfn2.start_forwarder() self.nfn3.start_forwarder() self.nfn4.start_forwarder() self.repo1.start_repo() self.repo2.start_repo() self.repo3.start_repo() self.repo4.start_repo() self.simulation_bus.start_process() time.sleep(3) # setup forwarding rules self.mgmt_client0.add_face("nfn1", None, 0) self.mgmt_client0.add_forwarding_rule(Name("/lib/func1"), [0]) self.mgmt_client0.add_face("nfn2", None, 0) self.mgmt_client0.add_forwarding_rule(Name("/lib/func2"), [1]) self.mgmt_client0.add_face("nfn3", None, 0) self.mgmt_client0.add_forwarding_rule(Name("/lib/func3"), [2]) self.mgmt_client0.add_face("nfn4", None, 0) self.mgmt_client0.add_forwarding_rule(Name("/lib/func4"), [3]) self.mgmt_client1.add_face("repo1", None, 0) self.mgmt_client1.add_forwarding_rule(Name("/repo/r1"), [0]) self.mgmt_client2.add_face("repo2", None, 0) self.mgmt_client2.add_forwarding_rule(Name("/repo/r2"), [0]) self.mgmt_client3.add_face("repo3", None, 0) self.mgmt_client3.add_forwarding_rule(Name("/repo/r3"), [0]) self.mgmt_client4.add_face("repo4", None, 0) self.mgmt_client4.add_forwarding_rule(Name("/repo/r4"), [0]) self.mgmt_client1.add_face("nfn0", None, 0) self.mgmt_client1.add_forwarding_rule(Name("/lib"), [1]) #setup function code self.mgmt_client0.add_new_content( Name("/lib/reduce4"), "PYTHON\nreduce4\ndef reduce4(a,b,c,d):\n return a+b+c+d") self.mgmt_client1.add_new_content( Name("/lib/func1"), "PYTHON\nf\ndef f(a):\n for i in range(0,100000000):\n a.upper()\n return a.upper()" ) self.mgmt_client2.add_new_content( Name("/lib/func2"), "PYTHON\nf\ndef f(a):\n for i in range(0,100000000):\n a.upper()\n return a.upper()" ) self.mgmt_client3.add_new_content( Name("/lib/func3"), "PYTHON\nf\ndef f(a):\n for i in range(0,100000000):\n a.upper()\n return a.upper()" ) self.mgmt_client4.add_new_content( Name("/lib/func4"), "PYTHON\nf\ndef f(a):\n for i in range(0,100000000):\n a.upper()\n return a.upper()" ) def setup_repo(self): for i in range(1, 5): self.path = "/tmp/repo" + str(i) try: os.stat(self.path) except: os.mkdir(self.path) with open(self.path + "/data" + str(i), 'w+') as content_file: content_file.write("data" + str(i)) def tearDown_repo(self): try: shutil.rmtree(self.path) os.remove("/tmp/repo") except: pass def test_simple_map_reduce(self): """Simple map reduce test with input data as string parameter""" self.setup_faces_and_connections() name = Name("/lib/reduce4") name += '_(/lib/func1("helloworld1"),/lib/func2("helloworld2"),/lib/func3("helloworld3"),/lib/func4("helloworld4"))' name += "NFN" res = self.fetch_tool1.fetch_data(name, timeout=0) time.sleep(3) print(res) self.assertEqual("HELLOWORLD1HELLOWORLD2HELLOWORLD3HELLOWORLD4", res) def test_simple_map_reduce_data_from_repo(self): """Simple map reduce test with input data from repo""" self.setup_repo() self.setup_faces_and_connections() name = Name("/lib/reduce4") name += '_(/lib/func1(/repo/r1/data1),/lib/func2(/repo/r2/data2),/lib/func3(/repo/r3/data3),/lib/func4(/repo/r4/data4))' name += "NFN" res = self.fetch_tool1.fetch_data(name, timeout=0) time.sleep(3) print(res) self.assertEqual("DATA1DATA2DATA3DATA4", res) def test_simple_map_reduce_data_from_repo_to_data(self): """Simple map reduce test with input data from repo forwarding to data""" self.setup_repo() self.setup_faces_and_connections() name = Name("/repo/r1/data1") name += '/lib/reduce4(/lib/func1(_),/lib/func2(/repo/r2/data2),/lib/func3(/repo/r3/data3),/lib/func4(/repo/r4/data4))' name += "NFN" res = self.fetch_tool1.fetch_data(name, timeout=0) time.sleep(3) print(res) self.assertEqual("DATA1DATA2DATA3DATA4", res)
class cases_Simulation(): """Test the PiCN Simulation System""" @abc.abstractmethod def get_encoder(self) -> BasicEncoder: pass def setUp(self): self.encoder_type = self.get_encoder() self.simulation_bus = SimulationBus(packetencoder=self.encoder_type()) self.fetchiface = self.simulation_bus.add_interface("fetch") self.encoder = self.encoder_type() self.icn_forwarder1 = ICNForwarder(port=0, encoder=self.encoder_type(), interfaces=[self.simulation_bus.add_interface("icnfwd1")], log_level=255) self.icn_forwarder2 = ICNForwarder(port=0, encoder=self.encoder_type(), interfaces=[self.simulation_bus.add_interface("icnfwd2")], log_level=255) #self.simulation_bus.start_process() def tearDown(self): try: self.simulation_bus.stop_process() self.icn_forwarder1.stop_forwarder() self.icn_forwarder2.stop_forwarder() except: self.icn_forwarder2.stop_repo() pass def test_send_single_packet(self): """Test fetching a single content object over the simulation bus""" self.icn_forwarder1.start_forwarder() self.icn_forwarder2.start_forwarder() self.simulation_bus.start_process() fid1 = self.icn_forwarder1.linklayer.faceidtable.get_or_create_faceid(AddressInfo("icnfwd2", 0)) self.icn_forwarder1.icnlayer.fib.add_fib_entry(Name("/test"), [fid1]) self.icn_forwarder2.icnlayer.cs.add_content_object(Content("/test/data", "HelloWorld"), static=True) interest = Interest("/test/data") wire_data = self.encoder.encode(interest) self.fetchiface.send(wire_data, "icnfwd1") res, src = self.fetchiface.receive() self.assertEqual(src, "icnfwd1") c = self.encoder.decode(res) self.assertEqual(c, Content("/test/data", "HelloWorld")) def test_send_single_packet_with_delay(self): """Test fetching a single content object over the simulation bus""" delay_func = lambda packet: 0.5 self.fetchiface = self.simulation_bus.add_interface("fetch", delay_func=delay_func) self.icn_forwarder1 = ICNForwarder(port=0, encoder=self.encoder_type(), interfaces=[self.simulation_bus.add_interface("icnfwd1", delay_func=delay_func)]) self.icn_forwarder2 = ICNForwarder(port=0, encoder=self.encoder_type(), interfaces=[self.simulation_bus.add_interface("icnfwd2", delay_func=delay_func)]) self.simulation_bus.start_process() self.icn_forwarder1.start_forwarder() self.icn_forwarder2.start_forwarder() fid1 = self.icn_forwarder1.linklayer.faceidtable.get_or_create_faceid(AddressInfo("icnfwd2", 0)) self.icn_forwarder1.icnlayer.fib.add_fib_entry(Name("/test"), [fid1]) self.icn_forwarder2.icnlayer.cs.add_content_object(Content("/test/data", "HelloWorld"), static=True) interest = Interest("/test/data") wire_data = self.encoder.encode(interest) self.fetchiface.send(wire_data, "icnfwd1") res, src = self.fetchiface.receive() self.assertEqual(src, "icnfwd1") c = self.encoder.decode(res) self.assertEqual(c, Content("/test/data", "HelloWorld")) def test_send_single_packet_with_packet_loss(self): """Test fetching a single content object over the simulation bus""" packet_loss_func = lambda packet: True self.fetchiface = self.simulation_bus.add_interface("fetch", packet_loss_func=packet_loss_func) self.icn_forwarder1 = ICNForwarder(port=0, encoder=self.encoder_type(), interfaces=[self.simulation_bus.add_interface("icnfwd1", packet_loss_func=packet_loss_func)]) self.icn_forwarder2 = ICNForwarder(port=0, encoder=self.encoder_type(), interfaces=[self.simulation_bus.add_interface("icnfwd2", packet_loss_func=packet_loss_func)]) self.simulation_bus.start_process() self.icn_forwarder1.start_forwarder() self.icn_forwarder2.start_forwarder() fid1 = self.icn_forwarder1.linklayer.faceidtable.get_or_create_faceid(AddressInfo("icnfwd2", 0)) self.icn_forwarder1.icnlayer.fib.add_fib_entry(Name("/test"), [fid1]) self.icn_forwarder2.icnlayer.cs.add_content_object(Content("/test/data", "HelloWorld"), static=True) interest = Interest("/test/data") wire_data = self.encoder.encode(interest) self.fetchiface.send(wire_data, "icnfwd1") try: self.fetchiface.receive(timeout=4) except queue.Empty: pass else: self.fail() def test_creation_of_simulation_face_mgmt(self): """Test the creation of a simulation face using a mgmt client""" self.icn_forwarder1.start_forwarder() self.icn_forwarder2.start_forwarder() self.simulation_bus.start_process() mgmt_client1 = MgmtClient(self.icn_forwarder1.mgmt.mgmt_sock.getsockname()[1]) mgmt_client1.add_face("icnfwd2", None, 0) mgmt_client1.add_forwarding_rule(Name("/test"), [0]) mgmt_client2 = MgmtClient(self.icn_forwarder2.mgmt.mgmt_sock.getsockname()[1]) mgmt_client2.add_new_content(Name("/test/data"), "HelloWorld") interest = Interest("/test/data") wire_data = self.encoder.encode(interest) self.fetchiface.send(wire_data, "icnfwd1") res, src = self.fetchiface.receive() self.assertEqual(src, "icnfwd1") c = self.encoder.decode(res) self.assertEqual(c, Content("/test/data", "HelloWorld")) mgmt_client1.shutdown() mgmt_client2.shutdown() def test_bandwidth_limit(self): #TODO better test here """Simple Test for checking the bandwidth limit""" self.icn_forwarder1 = ICNForwarder(port=0, encoder=self.encoder_type(), interfaces=[ self.simulation_bus.add_interface("icnfwd1", max_bandwidth=1)]) self.icn_forwarder2 = ICNForwarder(port=0, encoder=self.encoder_type(), interfaces=[ self.simulation_bus.add_interface("icnfwd2", max_bandwidth=1)]) self.icn_forwarder1.start_forwarder() self.icn_forwarder2.start_forwarder() self.simulation_bus.start_process() mgmt_client1 = MgmtClient(self.icn_forwarder1.mgmt.mgmt_sock.getsockname()[1]) mgmt_client1.add_face("icnfwd2", None, 0) mgmt_client1.add_forwarding_rule(Name("/test"), [0]) mgmt_client2 = MgmtClient(self.icn_forwarder2.mgmt.mgmt_sock.getsockname()[1]) mgmt_client2.add_new_content(Name("/test/data"), "HelloWorld") interest = Interest("/test/data") wire_data = self.encoder.encode(interest) self.fetchiface.send(wire_data, "icnfwd1") res, src = self.fetchiface.receive() self.assertEqual(src, "icnfwd1") c = self.encoder.decode(res) self.assertEqual(c, Content("/test/data", "HelloWorld")) mgmt_client1.shutdown() mgmt_client2.shutdown() def test_single_nfn_interest(self): """Test simulation with NFN nodes and a single packet """ self.icn_forwarder1 = NFNForwarder(port=0, encoder=self.encoder_type(), interfaces=[self.simulation_bus.add_interface("icnfwd1")]) self.icn_forwarder2 = NFNForwarder(port=0, encoder=self.encoder_type(), interfaces=[self.simulation_bus.add_interface("icnfwd2")]) self.icn_forwarder1.start_forwarder() self.icn_forwarder2.start_forwarder() self.simulation_bus.start_process() mgmt_client1 = MgmtClient(self.icn_forwarder1.mgmt.mgmt_sock.getsockname()[1]) mgmt_client1.add_face("icnfwd2", None, 0) mgmt_client1.add_forwarding_rule(Name("/test"), [0]) mgmt_client1.add_new_content(Name("/func/f1"), "PYTHON\nf\ndef f(a):\n return a.upper()") mgmt_client2 = MgmtClient(self.icn_forwarder2.mgmt.mgmt_sock.getsockname()[1]) mgmt_client2.add_new_content(Name("/test/data"), "HelloWorld") mgmt_client2.add_face("icnfwd1", None, 0) mgmt_client2.add_forwarding_rule(Name("/func"), [0]) interest = Interest("/test/data") interest.name += "/func/f1(_)" interest.name += "NFN" wire_data = self.encoder.encode(interest) self.fetchiface.send(wire_data, "icnfwd1") res, src = self.fetchiface.receive() self.assertEqual(src, "icnfwd1") c = self.encoder.decode(res) self.assertEqual(c, Content(interest.name, "HELLOWORLD")) mgmt_client1.shutdown() mgmt_client2.shutdown() def test_singl_interest_repo(self): """Test simulation by requesting data from a repo""" self.path = "/tmp/repo_unit_test" try: os.stat( self.path) except: os.mkdir( self.path) with open( self.path + "/f1", 'w+') as content_file: content_file.write("A"*20000) self.icn_forwarder2 = ICNDataRepository(self.path, Name("/test/data"), 0, log_level=255, encoder=self.encoder_type(), interfaces=[self.simulation_bus.add_interface("icnfwd2")]) self.icn_forwarder1.start_forwarder() self.icn_forwarder2.start_repo() self.simulation_bus.start_process() mgmt_client1 = MgmtClient(self.icn_forwarder1.mgmt.mgmt_sock.getsockname()[1]) mgmt_client1.add_face("icnfwd2", None, 0) mgmt_client1.add_forwarding_rule(Name("/test"), [0]) interest = Interest("/test/data/f1") wire_data = self.encoder.encode(interest) self.fetchiface.send(wire_data, "icnfwd1") res, src = self.fetchiface.receive() self.assertEqual(src, "icnfwd1") c = self.encoder.decode(res) self.assertEqual(c, Content(interest.name, "mdo:20000:/test/data/f1/c0;/test/data/f1/c1;/test/data/f1/c2;/test/data/f1/c3:/test/data/f1/m1")) mgmt_client1.shutdown() def test_single_interest_repo_fetch(self): """Test simulation by requesting data from a repo using the fetch program lib and chunking""" self.path = "/tmp/repo_unit_test" try: os.stat(self.path) except: os.mkdir(self.path) with open(self.path + "/f1", 'w+') as content_file: content_file.write("A" * 50000) self.icn_forwarder2 = ICNDataRepository(self.path, Name("/test/data"), 0, log_level=255, encoder=self.encoder_type(), interfaces=[self.simulation_bus.add_interface("icnfwd2")]) self.fetchtool = Fetch("icnfwd1", None, 255, encoder=self.encoder_type(), interfaces=[self.simulation_bus.add_interface("fetchtool")]) self.icn_forwarder1.start_forwarder() self.icn_forwarder2.start_repo() self.simulation_bus.start_process() mgmt_client1 = MgmtClient(self.icn_forwarder1.mgmt.mgmt_sock.getsockname()[1]) mgmt_client1.add_face("icnfwd2", None, 0) mgmt_client1.add_forwarding_rule(Name("/test"), [0]) res = self.fetchtool.fetch_data(Name("/test/data/f1"), 3) self.assertEqual("A"*50000, res) mgmt_client1.shutdown() self.fetchtool.stop_fetch()
class test_RoutingLayerFullStack(unittest.TestCase): def setUp(self): self.f9000 = ICNForwarder(9000, encoder=NdnTlvEncoder(), routing=True, peers=[('127.0.0.1', 9001), ('127.0.0.1', 9002), ('127.0.0.1', 9090)]) self.f9001 = ICNForwarder(9001, encoder=NdnTlvEncoder(), routing=True, peers=[('127.0.0.1', 9000), ('127.0.0.1', 9002), ('127.0.0.1', 9003), ('127.0.0.1', 9004)]) self.f9002 = ICNForwarder(9002, encoder=NdnTlvEncoder(), routing=True, peers=[('127.0.0.1', 9000), ('127.0.0.1', 9001), ('127.0.0.1', 9004)]) self.f9003 = ICNForwarder(9003, encoder=NdnTlvEncoder(), routing=True, peers=[('127.0.0.1', 9001), ('127.0.0.1', 9004)]) self.f9004 = ICNForwarder(9004, encoder=NdnTlvEncoder(), routing=True, peers=[('127.0.0.1', 9001), ('127.0.0.1', 9002), ('127.0.0.1', 9003)]) os.makedirs('/tmp/test_repo', exist_ok=True) f = open('/tmp/test_repo/helloworld', 'w') f.write('Hello, World!\n') f.close() self.repo = ICNDataRepository('/tmp/test_repo', Name('/testrepo'), port=9090, encoder=NdnTlvEncoder()) self.fetch = Fetch('127.0.0.1', 9004, encoder=NdnTlvEncoder()) # Create RIB entry for the repository (with Python weirdness) repo_fid: int = self.f9000.linklayer.faceidtable.get_or_create_faceid(AddressInfo(('127.0.0.1', 9090), 0)) rib: BaseRoutingInformationBase = self.f9000.routinglayer.rib rib.insert(Name('/testrepo'), repo_fid, distance=1, timeout=None) def tearDown(self): self.f9000.stop_forwarder() self.f9001.stop_forwarder() self.f9002.stop_forwarder() self.f9003.stop_forwarder() self.f9004.stop_forwarder() self.repo.stop_repo() self.fetch.stop_fetch() shutil.rmtree('/tmp/test_repo') def test_network(self): """ C | F[9004] -- F[9003] / \ / / \ / / \ / F[9002] -- F[9001] \ / \ / \ / F[9000] | R """ self.f9000.start_forwarder() self.f9001.start_forwarder() self.f9002.start_forwarder() self.f9003.start_forwarder() self.f9004.start_forwarder() self.repo.start_repo() hw: str = '' until = datetime.utcnow() + timedelta(seconds=20) while hw != 'Hello, World!\n' and datetime.utcnow() < until: try: hw = self.fetch.fetch_data(Name('/testrepo/helloworld'), timeout=1.0) except queue.Empty: pass self.assertEqual('Hello, World!\n', hw) until = datetime.utcnow() + timedelta(seconds=20) hw = '' start = datetime.utcnow() end = start while hw != 'Hello, World!\n' and datetime.utcnow() < until: try: hw = self.fetch.fetch_data(Name('/testrepo/helloworld'), timeout=1.0) end = datetime.utcnow() except queue.Empty: pass self.assertEqual('Hello, World!\n', hw) self.assertLess(end-start, timedelta(seconds=4))