Added FdNetDevice test for ns3 integration.
authorAlina Quereilhac <alina.quereilhac@inria.fr>
Mon, 1 Aug 2011 15:05:11 +0000 (17:05 +0200)
committerAlina Quereilhac <alina.quereilhac@inria.fr>
Mon, 1 Aug 2011 15:05:11 +0000 (17:05 +0200)
src/nepi/testbeds/ns3/factories_metadata.py
src/nepi/testbeds/ns3/traces_metadata.py
test/testbeds/ns3/integration.py

index 197c152..adda876 100644 (file)
@@ -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({
index 09f286a..d9a4df5 100644 (file)
@@ -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"
index 9b615f7..f14a40f 100755 (executable)
@@ -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):