From 80fe50fa01f4cd1bc4649f87820e5fd352272bc4 Mon Sep 17 00:00:00 2001 From: Alina Quereilhac Date: Mon, 1 Aug 2011 17:05:11 +0200 Subject: [PATCH] Added FdNetDevice test for ns3 integration. --- src/nepi/testbeds/ns3/factories_metadata.py | 14 ++- src/nepi/testbeds/ns3/traces_metadata.py | 4 + test/testbeds/ns3/integration.py | 123 ++++++++++++++++++++ 3 files changed, 140 insertions(+), 1 deletion(-) diff --git a/src/nepi/testbeds/ns3/factories_metadata.py b/src/nepi/testbeds/ns3/factories_metadata.py index 197c152e..adda876a 100644 --- a/src/nepi/testbeds/ns3/factories_metadata.py +++ b/src/nepi/testbeds/ns3/factories_metadata.py @@ -129,6 +129,17 @@ def fdpcap_trace(testbed_instance, guid, trace_id): helper = testbed_instance.ns3.FdNetDeviceHelper() helper.EnablePcap(filepath, element, explicitFilename = True) +def fdascii_trace(testbed_instance, guid, trace_id): + node_guid = _get_node_guid(testbed_instance, guid) + interface_number = _get_dev_number(testbed_instance, guid) + element = testbed_instance._elements[guid] + filename = "trace-fd-node-%d-dev-%d.tr" % (node_guid, interface_number) + filepath = _follow_trace(testbed_instance, guid, trace_id, filename) + helper = testbed_instance.ns3.FdNetDeviceHelper() + asciiHelper = testbed_instance.ns3.AsciiTraceHelper() + stream = asciiHelper.CreateFileStream(filepath) + helper.EnableAscii(stream, element) + def yanswifipcap_trace(testbed_instance, guid, trace_id): dev_guid = testbed_instance.get_connected(guid, "dev", "phy")[0] node_guid = _get_node_guid(testbed_instance, dev_guid) @@ -175,6 +186,7 @@ trace_functions = dict({ "CsmaPcapTrace": csmapcap_trace, "CsmaPcapPromiscTrace": csmapcap_promisc_trace, "FdPcapTrace": fdpcap_trace, + "FdAsciiTrace": fdascii_trace, "YansWifiPhyPcapTrace": yanswifipcap_trace, "WimaxPcapTrace": wimaxpcap_trace, "WimaxAsciiTrace": wimaxascii_trace, @@ -1037,7 +1049,7 @@ factories_info = dict({ "connector_types": ["node", "->fd"], "box_attributes": ["Address", "tun_proto", "tun_addr", "tun_port", "tun_key"], - "traces": ["fdpcap"], + "traces": ["fdpcap", "fdascii"], "tags": [tags.INTERFACE, tags.ALLOW_ADDRESSES], }), "ns3::Nepi::TunChannel": dict({ diff --git a/src/nepi/testbeds/ns3/traces_metadata.py b/src/nepi/testbeds/ns3/traces_metadata.py index 09f286ac..d9a4df57 100644 --- a/src/nepi/testbeds/ns3/traces_metadata.py +++ b/src/nepi/testbeds/ns3/traces_metadata.py @@ -22,6 +22,10 @@ traces = dict({ "name": "FdPcapTrace", "help": "Trace to sniff packets from a file descriptor network device" }), + "fdascii": dict({ + "name": "FdAsciiTrace", + "help": "Ascii trace from a file descriptor network device" + }), "yanswifipcap": dict({ "name": "YansWifiPhyPcapTrace", "help": "Trace to sniff packets from a Wifi network device" diff --git a/test/testbeds/ns3/integration.py b/test/testbeds/ns3/integration.py index 9b615f7e..f14a40ff 100755 --- a/test/testbeds/ns3/integration.py +++ b/test/testbeds/ns3/integration.py @@ -7,6 +7,7 @@ from nepi.core.execute import ExperimentController from nepi.util import proxy from nepi.util.constants import DeploymentConfiguration as DC import os +import re import shutil import tempfile import test_util @@ -17,6 +18,99 @@ class Ns3IntegrationTestCase(unittest.TestCase): def setUp(self): self.root_dir = tempfile.mkdtemp() + def _test_fd_net_device(self, daemonize_testbed, + controller_access_configuration): + exp_desc = ExperimentDescription() + testbed_id = "ns3" + ns3_provider = FactoriesProvider(testbed_id) + ns3_desc1 = exp_desc.add_testbed_description(ns3_provider) + root_dir1 = os.path.join(self.root_dir, "1") + ns3_desc1.set_attribute_value("homeDirectory", root_dir1) + ns3_desc1.set_attribute_value("SimulatorImplementationType", + "ns3::RealtimeSimulatorImpl") + ns3_desc1.set_attribute_value("ChecksumEnabled", True) + ns3_desc2 = exp_desc.add_testbed_description(ns3_provider) + root_dir2 = os.path.join(self.root_dir, "2") + ns3_desc2.set_attribute_value("homeDirectory", root_dir2) + ns3_desc2.set_attribute_value("SimulatorImplementationType", + "ns3::RealtimeSimulatorImpl") + ns3_desc2.set_attribute_value("ChecksumEnabled", True) + + node1 = ns3_desc1.create("ns3::Node") + ipv41 = ns3_desc1.create("ns3::Ipv4L3Protocol") + arp1 = ns3_desc1.create("ns3::ArpL3Protocol") + icmp1 = ns3_desc1.create("ns3::Icmpv4L4Protocol") + node1.connector("protos").connect(ipv41.connector("node")) + node1.connector("protos").connect(arp1.connector("node")) + node1.connector("protos").connect(icmp1.connector("node")) + iface1 = ns3_desc1.create("ns3::FdNetDevice") + node1.connector("devs").connect(iface1.connector("node")) + ip1 = iface1.add_address() + ip1.set_attribute_value("Address", "10.0.0.1") + tc1 = ns3_desc1.create("ns3::Nepi::TunChannel") + tc1.connector("fd->").connect(iface1.connector("->fd")) + + node2 = ns3_desc2.create("ns3::Node") + ipv42 = ns3_desc2.create("ns3::Ipv4L3Protocol") + arp2 = ns3_desc2.create("ns3::ArpL3Protocol") + icmp2 = ns3_desc2.create("ns3::Icmpv4L4Protocol") + node2.connector("protos").connect(ipv42.connector("node")) + node2.connector("protos").connect(arp2.connector("node")) + node2.connector("protos").connect(icmp2.connector("node")) + iface2 = ns3_desc2.create("ns3::FdNetDevice") + iface2.enable_trace("FdAsciiTrace") + node2.connector("devs").connect(iface2.connector("node")) + ip2 = iface2.add_address() + ip2.set_attribute_value("Address", "10.0.0.2") + tc2 = ns3_desc2.create("ns3::Nepi::TunChannel") + tc2.connector("fd->").connect(iface2.connector("->fd")) + + tc2.connector("udp").connect(tc1.connector("udp")) + + app = ns3_desc1.create("ns3::V4Ping") + app.set_attribute_value("Remote", "10.0.0.2") + app.set_attribute_value("StartTime", "0s") + app.set_attribute_value("StopTime", "2s") + app.connector("node").connect(node1.connector("apps")) + + if daemonize_testbed: + ns3_desc1.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON) + inst_root_dir = os.path.join(root_dir1, "instance") + os.makedirs(inst_root_dir) + ns3_desc1.set_attribute_value(DC.ROOT_DIRECTORY, inst_root_dir) + ns3_desc1.set_attribute_value(DC.LOG_LEVEL, DC.DEBUG_LEVEL) + + ns3_desc2.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON) + inst_root_dir = os.path.join(root_dir2, "instance") + os.makedirs(inst_root_dir) + ns3_desc2.set_attribute_value(DC.ROOT_DIRECTORY, inst_root_dir) + ns3_desc2.set_attribute_value(DC.LOG_LEVEL, DC.DEBUG_LEVEL) + + xml = exp_desc.to_xml() + + if controller_access_configuration: + controller = ExperimentController(xml, self.root_dir) + else: + controller = proxy.create_experiment_controller(xml, + controller_access_configuration) + + try: + controller.start() + while not controller.is_finished(app.guid): + time.sleep(0.5) + ping_result = controller.trace(iface2.guid, "FdAsciiTrace") + ping_exp_result = r"""r \d+\.\d+ /NodeList/0/DeviceList/0/\$ns3::FdNetDevice/Rx Payload \(size=42\) +r \d+\.\d+ /NodeList/0/DeviceList/0/\$ns3::FdNetDevice/Rx Payload \(size=98\) +r \d+\.\d+ /NodeList/0/DeviceList/0/\$ns3::FdNetDevice/Rx Payload \(size=42\) +r \d+\.\d+ /NodeList/0/DeviceList/0/\$ns3::FdNetDevice/Rx Payload \(size=98\) +""" + if not re.match(ping_exp_result, ping_result): + self.fail("Unexpected trace: %s" % (ping_result,)) + + finally: + controller.stop() + controller.shutdown() + def _test_if(self, daemonize_testbed, controller_access_configuration): exp_desc = ExperimentDescription() testbed_id = "ns3" @@ -91,6 +185,35 @@ class Ns3IntegrationTestCase(unittest.TestCase): controller.stop() controller.shutdown() + @test_util.skipUnless(test_util.ns3_usable(), + "Test requires working ns-3 bindings") + def test_all_daemonized_fd_net_device(self): + access_config = proxy.AccessConfiguration() + access_config.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON) + access_config.set_attribute_value(DC.ROOT_DIRECTORY, self.root_dir) + access_config.set_attribute_value(DC.LOG_LEVEL, DC.DEBUG_LEVEL) + + self._test_fd_net_device( + daemonize_testbed = True, + controller_access_configuration = access_config) + + @test_util.skipUnless(test_util.ns3_usable(), + "Test requires working ns-3 bindings") + def test_all_ssh_daemonized_fd_net_device(self): + env = test_util.test_environment() + + access_config = proxy.AccessConfiguration() + access_config.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON) + access_config.set_attribute_value(DC.ROOT_DIRECTORY, self.root_dir) + access_config.set_attribute_value(DC.LOG_LEVEL, DC.DEBUG_LEVEL) + access_config.set_attribute_value(DC.DEPLOYMENT_COMMUNICATION, DC.ACCESS_SSH) + access_config.set_attribute_value(DC.DEPLOYMENT_PORT, env.port) + access_config.set_attribute_value(DC.USE_AGENT, True) + + self._test_fd_net_device( + daemonize_testbed = True, + controller_access_configuration = access_config) + @test_util.skipUnless(test_util.ns3_usable(), "Test requires working ns-3 bindings") def test_local_if(self): -- 2.47.0