ns3 integration tests added. 1 test fails.
authorAlina Quereilhac <alina.quereilhac@inria.fr>
Thu, 7 Apr 2011 15:54:45 +0000 (17:54 +0200)
committerAlina Quereilhac <alina.quereilhac@inria.fr>
Thu, 7 Apr 2011 15:54:45 +0000 (17:54 +0200)
src/nepi/core/execute.py
src/nepi/testbeds/ns3/factories_metadata_v3_9_RC3.py
src/nepi/util/proxy.py
test/testbeds/ns3/execute.py
test/testbeds/ns3/execute2.py [new file with mode: 0755]
test/testbeds/ns3/integration.py [new file with mode: 0755]

index c37c6d3..857ebb5 100644 (file)
@@ -223,10 +223,10 @@ class TestbedInstance(object):
         elements are done"""
         raise NotImplementedError
 
-    def start(self, time):
+    def start(self):
         raise NotImplementedError
 
-    def stop(self, time):
+    def stop(self):
         raise NotImplementedError
 
     def set(self, time, guid, name, value):
index bf9d0a4..45696cc 100644 (file)
@@ -30,12 +30,13 @@ def _get_node_guid(testbed_instance, guid):
     return node_guid
 
 def _get_dev_number(testbed_instance, guid):
-    dev_guids = testbed_instance.get_connected(guid, "devs", "node")
+    node_guid = _get_node_guid(testbed_instance, guid)
+    dev_guids = testbed_instance.get_connected(node_guid, "devs", "node")
     interface_number = 0
     for guid_ in dev_guids:
         if guid_ == guid:
             break
-        inteface_number += 1
+        interface_number += 1
     return interface_number
 
 ### create traces functions ###
index 3f4e219..784bf53 100644 (file)
@@ -61,8 +61,8 @@ controller_messages = dict({
 # TESTBED INSTANCE PROTOCOL MESSAGES
 testbed_messages = dict({
     TRACE:  "%d|%s" % (TRACE, "%d|%s"),
-    START:  "%d|%s" % (START, "%s"),
-    STOP:    "%d|%s" % (STOP, "%s"),
+    START:  "%d" % START,
+    STOP:   "%d" % STOP,
     SHUTDOWN:   "%d" % SHUTDOWN,
     CONFIGURE: "%d|%s" % (CONFIGURE, "%s|%s|%d"),
     CREATE: "%d|%s" % (CREATE, "%d|%s"),
@@ -159,8 +159,6 @@ def launch_ssh_daemon_client(root_dir, python_code, host, port, user, agent):
     # launch daemon
     proc = server.popen_ssh_subprocess(python_code, host = host,
         port = port, user = user, agent = agent)
-    #while not proc.poll():
-    #    time.sleep(0.5)
     if proc.poll():
         err = proc.stderr.read()
         raise RuntimeError("Client could not be executed: %s" % \
@@ -265,7 +263,7 @@ def create_testbed_instance(testbed_id, testbed_version, access_config):
     elif mode == AccessConfiguration.MODE_DAEMON:
         (root_dir, log_level, user, host, port, agent) = \
                 get_access_config_params(access_config)
-        return TestbedIntanceProxy(root_dir, log_level, testbed_id = testbed_id, 
+        return TestbedInstanceProxy(root_dir, log_level, testbed_id = testbed_id, 
                 testbed_version = testbed_version, host = host, port = port,
                 user = user, agent = agent)
     raise RuntimeError("Unsupported access configuration 'mode'" % mode)
@@ -371,13 +369,11 @@ class TestbedInstanceServer(server.Server):
         return "%d|%s" % (OK, result)
 
     def start(self, params):
-        time = params[1]
-        self._testbed.start(time)
+        self._testbed.start()
         return "%d|%s" % (OK, "")
 
     def stop(self, params):
-        time = params[1]
-        self._testbed.stop(time)
+        self._testbed.stop()
         return "%d|%s" % (OK, "")
 
     def shutdown(self, params):
@@ -600,7 +596,7 @@ class ExperimentControllerServer(server.Server):
         self._controller.shutdown()
         return "%d|%s" % (OK, "")
 
-class TestbedIntanceProxy(object):
+class TestbedInstanceProxy(object):
     def __init__(self, root_dir, log_level, testbed_id = None, 
             testbed_version = None, launch = True, host = None, 
             port = None, user = None, agent = None):
@@ -804,7 +800,6 @@ class TestbedIntanceProxy(object):
 
     def start(self, time = TIME_NOW):
         msg = testbed_messages[START]
-        msg = msg % (time)
         self._client.send_msg(msg)
         reply = self._client.read_reply()
         result = reply.split("|")
@@ -815,7 +810,6 @@ class TestbedIntanceProxy(object):
 
     def stop(self, time = TIME_NOW):
         msg = testbed_messages[STOP]
-        msg = msg % (time)
         self._client.send_msg(msg)
         reply = self._client.read_reply()
         result = reply.split("|")
index b8f02f7..d7a2a63 100755 (executable)
@@ -16,7 +16,7 @@ class Ns3ExecuteTestCase(unittest.TestCase):
 
     @test_util.skipUnless(test_util.ns3_usable(), 
            "Test requires working ns-3 bindings")
-    def ptest_run_ping_if(self):
+    def test_run_ping_if(self):
         testbed_version = "3_9_RC3"
         instance = ns3.TestbedInstance(testbed_version)
         instance.configure("homeDirectory", self.root_dir)
@@ -69,99 +69,8 @@ class Ns3ExecuteTestCase(unittest.TestCase):
         instance.start()
         while instance.status(17) != STATUS_FINISHED:
             time.sleep(0.1)
-        comp_result = "- 9.021 /NodeList/1/DeviceList/0/$ns3::PointToPointNetDevice/TxQueue/Dequeue ns3::PppHeader (Point-to-Point Protocol: IP (0x0021)) ns3::Ipv4Header (tos 0x0 ttl 64 id 9 protocol 1 offset 0 flags [none] length: 84 10.0.0.2 > 10.0.0.1) ns3::Icmpv4Header (type=0, code=0) ns3::Icmpv4Echo (identifier=0, sequence=9)"
         ping_result = instance.trace(14, "P2PAsciiTrace")
-        self.assertNotEqual(ping_result.find(comp_result), -1)
-        instance.stop()
-        instance.shutdown()
-
-    @test_util.skipUnless(test_util.ns3_usable(),
-            "Test requires working ns-3 bindings")
-    def test_run_ping_routing(self):
-        testbed_version = "3_9_RC3"
-        instance = ns3.TestbedInstance(testbed_version)
-        instance.configure("homeDirectory", self.root_dir)
-        instance.create(2, "ns3::Node")
-        instance.create(3, "ns3::Ipv4L3Protocol")
-        instance.create(4, "ns3::ArpL3Protocol")
-        instance.create(5, "ns3::Icmpv4L4Protocol")
-        instance.create(6, "ns3::UdpL4Protocol")
-        instance.connect(2, "protos", 3, "node")
-        instance.connect(2, "protos", 4, "node")
-        instance.connect(2, "protos", 5, "node")
-        instance.connect(2, "protos", 6, "node")
-        instance.create(7, "ns3::PointToPointNetDevice")
-        instance.create(8, "ns3::DropTailQueue")
-        instance.connect(2, "devs", 7, "node")
-        instance.connect(7, "queue", 8, "dev")
-        instance.add_trace(7, "P2PAsciiTrace")
-        instance.add_address(7, "10.0.0.1", 24, None)
-
-        instance.create(9, "ns3::Node")
-        instance.create(10, "ns3::Ipv4L3Protocol")
-        instance.create(11, "ns3::ArpL3Protocol")
-        instance.create(12, "ns3::Icmpv4L4Protocol")
-        instance.create(13, "ns3::UdpL4Protocol")
-        instance.connect(9, "protos", 10, "node")
-        instance.connect(9, "protos", 11, "node")
-        instance.connect(9, "protos", 12, "node")
-        instance.connect(9, "protos", 13, "node")
-        instance.create(14, "ns3::PointToPointNetDevice")
-        instance.create(15, "ns3::DropTailQueue")
-        instance.connect(9, "devs", 14, "node")
-        instance.connect(14, "queue", 15, "dev")
-        instance.add_trace(14, "P2PAsciiTrace")
-        instance.add_address(14, "10.0.0.2", 24, None)
-
-        instance.create(16, "ns3::PointToPointChannel")
-        instance.connect(7, "chan", 16, "dev2")
-        instance.connect(14, "chan", 16, "dev2")
-
-        instance.create(17, "ns3::PointToPointNetDevice")
-        instance.create(18, "ns3::DropTailQueue")
-        instance.connect(9, "devs", 17, "node")
-        instance.connect(17, "queue", 18, "dev")
-        instance.add_trace(17, "P2PAsciiTrace")
-        instance.add_address(17, "10.0.1.1", 24, None)
-
-        instance.create(19, "ns3::Node")
-        instance.create(20, "ns3::Ipv4L3Protocol")
-        instance.create(21, "ns3::ArpL3Protocol")
-        instance.create(22, "ns3::Icmpv4L4Protocol")
-        instance.create(23, "ns3::UdpL4Protocol")
-        instance.connect(19, "protos", 20, "node")
-        instance.connect(19, "protos", 21, "node")
-        instance.connect(19, "protos", 22, "node")
-        instance.connect(19, "protos", 23, "node")
-        instance.create(24, "ns3::PointToPointNetDevice")
-        instance.create(25, "ns3::DropTailQueue")
-        instance.connect(19, "devs", 24, "node")
-        instance.connect(24, "queue", 25, "dev")
-        instance.add_trace(24, "P2PAsciiTrace")
-        instance.add_address(24, "10.0.1.2", 24, None)
-
-        instance.create(26, "ns3::PointToPointChannel")
-        instance.connect(17, "chan", 26, "dev2")
-        instance.connect(24, "chan", 26, "dev2")
-
-        instance.create(27, "ns3::V4Ping")
-        instance.create_set(27, "Remote", "10.0.1.2")
-        instance.create_set(27, "StartTime", "0s")
-        instance.create_set(27, "StopTime", "10s")
-        instance.connect(27, "node", 2, "apps")
-
-        instance.add_route(2, "10.0.1.0", 24, "10.0.0.2")
-        instance.add_route(19, "10.0.0.0", 24, "10.0.1.1")
-
-        instance.do_setup()
-        instance.do_create()
-        instance.do_connect()
-        instance.do_configure()
-        instance.start()
-        while instance.status(27) != STATUS_FINISHED:
-            time.sleep(0.1)
-        comp_result = "- 9.04199 /NodeList/2/DeviceList/0/$ns3::PointToPointNetDevice/TxQueue/Dequeue ns3::PppHeader (Point-to-Point Protocol: IP (0x0021)) ns3::Ipv4Header (tos 0x0 ttl 64 id 9 protocol 1 offset 0 flags [none] length: 84 10.0.1.2 > 10.0.0.1) ns3::Icmpv4Header (type=0, code=0) ns3::Icmpv4Echo (identifier=0, sequence=9)"
-        ping_result = instance.trace(24, "P2PAsciiTrace")
+        comp_result = "- 9.021 /NodeList/1/DeviceList/0/$ns3::PointToPointNetDevice/TxQueue/Dequeue ns3::PppHeader (Point-to-Point Protocol: IP (0x0021)) ns3::Ipv4Header (tos 0x0 ttl 64 id 9 protocol 1 offset 0 flags [none] length: 84 10.0.0.2 > 10.0.0.1) ns3::Icmpv4Header (type=0, code=0) ns3::Icmpv4Echo (identifier=0, sequence=9)"
         self.assertNotEqual(ping_result.find(comp_result), -1)
         instance.stop()
         instance.shutdown()
diff --git a/test/testbeds/ns3/execute2.py b/test/testbeds/ns3/execute2.py
new file mode 100755 (executable)
index 0000000..ae5f18a
--- /dev/null
@@ -0,0 +1,119 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+from nepi.util.constants import STATUS_FINISHED
+from nepi.testbeds import ns3
+import os
+import shutil
+import tempfile
+import test_util
+import time
+import unittest
+
+# The reason execute tests are run in separate scripts for ns3, is that the 
+# same ns3 Simulator will be loaded only once per process, resulting in a 
+# dirty state of the Simulator after the first test is executed.
+# As it is not possible to reset the state of the Simulator to the original
+# one, different tests should be executed in different processes (different 
+# unittest instance)
+class Ns3ExecuteTestCase(unittest.TestCase):
+    def setUp(self):
+        self.root_dir = tempfile.mkdtemp()
+
+    @test_util.skipUnless(test_util.ns3_usable(),
+            "Test requires working ns-3 bindings")
+    def test_run_ping_routing(self):
+        testbed_version = "3_9_RC3"
+        instance = ns3.TestbedInstance(testbed_version)
+        instance.configure("homeDirectory", self.root_dir)
+        instance.create(2, "ns3::Node")
+        instance.create(3, "ns3::Ipv4L3Protocol")
+        instance.create(4, "ns3::ArpL3Protocol")
+        instance.create(5, "ns3::Icmpv4L4Protocol")
+        instance.create(6, "ns3::UdpL4Protocol")
+        instance.connect(2, "protos", 3, "node")
+        instance.connect(2, "protos", 4, "node")
+        instance.connect(2, "protos", 5, "node")
+        instance.connect(2, "protos", 6, "node")
+        instance.create(7, "ns3::PointToPointNetDevice")
+        instance.create(8, "ns3::DropTailQueue")
+        instance.connect(2, "devs", 7, "node")
+        instance.connect(7, "queue", 8, "dev")
+        instance.add_trace(7, "P2PAsciiTrace")
+        instance.add_address(7, "10.0.0.1", 24, None)
+
+        instance.create(9, "ns3::Node")
+        instance.create(10, "ns3::Ipv4L3Protocol")
+        instance.create(11, "ns3::ArpL3Protocol")
+        instance.create(12, "ns3::Icmpv4L4Protocol")
+        instance.create(13, "ns3::UdpL4Protocol")
+        instance.connect(9, "protos", 10, "node")
+        instance.connect(9, "protos", 11, "node")
+        instance.connect(9, "protos", 12, "node")
+        instance.connect(9, "protos", 13, "node")
+        instance.create(14, "ns3::PointToPointNetDevice")
+        instance.create(15, "ns3::DropTailQueue")
+        instance.connect(9, "devs", 14, "node")
+        instance.connect(14, "queue", 15, "dev")
+        instance.add_trace(14, "P2PAsciiTrace")
+        instance.add_address(14, "10.0.0.2", 24, None)
+
+        instance.create(16, "ns3::PointToPointChannel")
+        instance.connect(7, "chan", 16, "dev2")
+        instance.connect(14, "chan", 16, "dev2")
+
+        instance.create(17, "ns3::PointToPointNetDevice")
+        instance.create(18, "ns3::DropTailQueue")
+        instance.connect(9, "devs", 17, "node")
+        instance.connect(17, "queue", 18, "dev")
+        instance.add_trace(17, "P2PAsciiTrace")
+        instance.add_address(17, "10.0.1.1", 24, None)
+
+        instance.create(19, "ns3::Node")
+        instance.create(20, "ns3::Ipv4L3Protocol")
+        instance.create(21, "ns3::ArpL3Protocol")
+        instance.create(22, "ns3::Icmpv4L4Protocol")
+        instance.create(23, "ns3::UdpL4Protocol")
+        instance.connect(19, "protos", 20, "node")
+        instance.connect(19, "protos", 21, "node")
+        instance.connect(19, "protos", 22, "node")
+        instance.connect(19, "protos", 23, "node")
+        instance.create(24, "ns3::PointToPointNetDevice")
+        instance.create(25, "ns3::DropTailQueue")
+        instance.connect(19, "devs", 24, "node")
+        instance.connect(24, "queue", 25, "dev")
+        instance.add_trace(24, "P2PAsciiTrace")
+        instance.add_address(24, "10.0.1.2", 24, None)
+
+        instance.create(26, "ns3::PointToPointChannel")
+        instance.connect(17, "chan", 26, "dev2")
+        instance.connect(24, "chan", 26, "dev2")
+
+        instance.create(27, "ns3::V4Ping")
+        instance.create_set(27, "Remote", "10.0.1.2")
+        instance.create_set(27, "StartTime", "0s")
+        instance.create_set(27, "StopTime", "10s")
+        instance.connect(27, "node", 2, "apps")
+
+        instance.add_route(2, "10.0.1.0", 24, "10.0.0.2")
+        instance.add_route(19, "10.0.0.0", 24, "10.0.1.1")
+
+        instance.do_setup()
+        instance.do_create()
+        instance.do_connect()
+        instance.do_configure()
+        instance.start()
+        while instance.status(27) != STATUS_FINISHED:
+            time.sleep(0.1)
+        ping_result = instance.trace(24, "P2PAsciiTrace")
+        comp_result = "- 9.04199 /NodeList/2/DeviceList/0/$ns3::PointToPointNetDevice/TxQueue/Dequeue ns3::PppHeader (Point-to-Point Protocol: IP (0x0021)) ns3::Ipv4Header (tos 0x0 ttl 64 id 9 protocol 1 offset 0 flags [none] length: 84 10.0.1.2 > 10.0.0.1) ns3::Icmpv4Header (type=0, code=0) ns3::Icmpv4Echo (identifier=0, sequence=9)"
+        self.assertNotEqual(ping_result.find(comp_result), -1)
+        instance.stop()
+        instance.shutdown()
+
+    def tearDown(self):
+        shutil.rmtree(self.root_dir)
+
+if __name__ == '__main__':
+    unittest.main()
+
diff --git a/test/testbeds/ns3/integration.py b/test/testbeds/ns3/integration.py
new file mode 100755 (executable)
index 0000000..88bd79c
--- /dev/null
@@ -0,0 +1,164 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+import getpass
+from nepi.core.design import ExperimentDescription, FactoriesProvider
+from nepi.core.execute import ExperimentController
+from nepi.util import proxy
+import os
+import shutil
+import tempfile
+import test_util
+import time
+import unittest
+
+class Ns3IntegrationTestCase(unittest.TestCase):
+    def setUp(self):
+        self.root_dir = tempfile.mkdtemp()
+
+    @test_util.skipUnless(test_util.ns3_usable(), 
+           "Test requires working ns-3 bindings")
+    def test_local_if(self):
+        exp_desc = ExperimentDescription()
+        testbed_version = "3_9_RC3"
+        testbed_id = "ns3"
+        ns3_provider = FactoriesProvider(testbed_id, testbed_version)
+        ns3_desc = exp_desc.add_testbed_description(ns3_provider)
+        ns3_desc.set_attribute_value("homeDirectory", self.root_dir)
+
+        node1 = ns3_desc.create("ns3::Node")
+        ipv41 = ns3_desc.create("ns3::Ipv4L3Protocol")
+        arp1  = ns3_desc.create("ns3::ArpL3Protocol")
+        icmp1 = ns3_desc.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_desc.create("ns3::PointToPointNetDevice")
+        queue1 = ns3_desc.create("ns3::DropTailQueue")
+        node1.connector("devs").connect(iface1.connector("node"))
+        iface1.connector("queue").connect(queue1.connector("dev"))
+        trace1 = iface1.enable_trace("P2PAsciiTrace")
+        ip1 = iface1.add_address()
+        ip1.set_attribute_value("Address", "10.0.0.1")
+
+        node2 = ns3_desc.create("ns3::Node")
+        ipv42 = ns3_desc.create("ns3::Ipv4L3Protocol")
+        arp2  = ns3_desc.create("ns3::ArpL3Protocol")
+        icmp2 = ns3_desc.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_desc.create("ns3::PointToPointNetDevice")
+        queue2 = ns3_desc.create("ns3::DropTailQueue")
+        node2.connector("devs").connect(iface2.connector("node"))
+        iface2.connector("queue").connect(queue2.connector("dev"))
+        trace2 = iface2.enable_trace("P2PAsciiTrace")
+        ip2 = iface2.add_address()
+        ip2.set_attribute_value("Address", "10.0.0.2")
+
+        chan = ns3_desc.create("ns3::PointToPointChannel")
+        iface1.connector("chan").connect(chan.connector("dev2"))
+        iface2.connector("chan").connect(chan.connector("dev2"))
+
+        app = ns3_desc.create("ns3::V4Ping")
+        app.set_attribute_value("Remote", "10.0.0.2")
+        app.set_attribute_value("StartTime", "0s")
+        app.set_attribute_value("StopTime", "20s")
+        app.connector("node").connect(node1.connector("apps"))
+
+        xml = exp_desc.to_xml()
+        controller = ExperimentController(xml)
+        controller.start()
+        while not controller.is_finished(app.guid):
+            time.sleep(0.5)
+        ping_result = controller.trace(ns3_desc.guid, iface2.guid, "P2PAsciiTrace")
+        comp_result = "- 19.021 /NodeList/1/DeviceList/0/$ns3::PointToPointNetDevice/TxQueue/Dequeue ns3::PppHeader (Point-to-Point Protocol: IP (0x0021)) ns3::Ipv4Header (tos 0x0 ttl 64 id 19 protocol 1 offset 0 flags [none] length: 84 10.0.0.2 > 10.0.0.1) ns3::Icmpv4Header (type=0, code=0) ns3::Icmpv4Echo (identifier=0, sequence=19)"
+        self.assertNotEqual(ping_result.find(comp_result), -1)
+        controller.stop()
+        controller.shutdown()
+
+    @test_util.skipUnless(test_util.ns3_usable(), 
+           "Test requires working ns-3 bindings")
+    def test_all_daemonized_if(self):
+        exp_desc = ExperimentDescription()
+        testbed_version = "3_9_RC3"
+        testbed_id = "ns3"
+        ns3_provider = FactoriesProvider(testbed_id, testbed_version)
+        ns3_desc = exp_desc.add_testbed_description(ns3_provider)
+        ns3_desc.set_attribute_value("homeDirectory", self.root_dir)
+
+        node1 = ns3_desc.create("ns3::Node")
+        ipv41 = ns3_desc.create("ns3::Ipv4L3Protocol")
+        arp1  = ns3_desc.create("ns3::ArpL3Protocol")
+        icmp1 = ns3_desc.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_desc.create("ns3::PointToPointNetDevice")
+        queue1 = ns3_desc.create("ns3::DropTailQueue")
+        node1.connector("devs").connect(iface1.connector("node"))
+        iface1.connector("queue").connect(queue1.connector("dev"))
+        trace1 = iface1.enable_trace("P2PAsciiTrace")
+        ip1 = iface1.add_address()
+        ip1.set_attribute_value("Address", "10.0.0.1")
+
+        node2 = ns3_desc.create("ns3::Node")
+        ipv42 = ns3_desc.create("ns3::Ipv4L3Protocol")
+        arp2  = ns3_desc.create("ns3::ArpL3Protocol")
+        icmp2 = ns3_desc.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_desc.create("ns3::PointToPointNetDevice")
+        queue2 = ns3_desc.create("ns3::DropTailQueue")
+        node2.connector("devs").connect(iface2.connector("node"))
+        iface2.connector("queue").connect(queue2.connector("dev"))
+        trace2 = iface2.enable_trace("P2PAsciiTrace")
+        ip2 = iface2.add_address()
+        ip2.set_attribute_value("Address", "10.0.0.2")
+
+        chan = ns3_desc.create("ns3::PointToPointChannel")
+        iface1.connector("chan").connect(chan.connector("dev2"))
+        iface2.connector("chan").connect(chan.connector("dev2"))
+
+        app = ns3_desc.create("ns3::V4Ping")
+        app.set_attribute_value("Remote", "10.0.0.2")
+        app.set_attribute_value("StartTime", "0s")
+        app.set_attribute_value("StopTime", "20s")
+        app.connector("node").connect(node1.connector("apps"))
+
+        xml = exp_desc.to_xml()
+        access_config = proxy.AccessConfiguration()
+        access_config.set_attribute_value("mode", 
+                proxy.AccessConfiguration.MODE_DAEMON)
+        access_config.set_attribute_value("rootDirectory", self.root_dir)
+        access_config.set_attribute_value("logLevel", 
+                proxy.AccessConfiguration.DEBUG_LEVEL)
+        controller = proxy.create_controller(xml, access_config)
+
+        access_config2 = proxy.AccessConfiguration()
+        access_config2.set_attribute_value("mode", 
+                proxy.AccessConfiguration.MODE_DAEMON)
+        inst_root_dir = os.path.join(self.root_dir, "instance")
+        os.mkdir(inst_root_dir)
+        access_config2.set_attribute_value("rootDirectory", inst_root_dir)
+        access_config2.set_attribute_value("logLevel", 
+                proxy.AccessConfiguration.DEBUG_LEVEL)
+        controller.set_access_configuration(ns3_desc.guid, access_config2)
+
+        controller.start()
+        while not controller.is_finished(app.guid):
+            time.sleep(0.5)
+          
+        ping_result = controller.trace(ns3_desc.guid, iface2.guid, "P2PAsciiTrace")
+        comp_result = "- 19.021 /NodeList/1/DeviceList/0/$ns3::PointToPointNetDevice/TxQueue/Dequeue ns3::PppHeader (Point-to-Point Protocol: IP (0x0021)) ns3::Ipv4Header (tos 0x0 ttl 64 id 19 protocol 1 offset 0 flags [none] length: 84 10.0.0.2 > 10.0.0.1) ns3::Icmpv4Header (type=0, code=0) ns3::Icmpv4Echo (identifier=0, sequence=19)"
+        self.assertNotEqual(ping_result.find(comp_result), -1)
+        controller.stop()
+        controller.shutdown()
+
+    def tearDown(self):
+        shutil.rmtree(self.root_dir)
+
+if __name__ == '__main__':
+    unittest.main()
+