Removed version number from testbed file names. Only 1 version permitted at the time.
[nepi.git] / test / testbeds / ns3 / integration.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 import getpass
5 from nepi.core.design import ExperimentDescription, FactoriesProvider
6 from nepi.core.execute import ExperimentController
7 from nepi.util import proxy
8 from nepi.util.constants import DeploymentConfiguration as DC
9 import os
10 import shutil
11 import tempfile
12 import test_util
13 import time
14 import unittest
15
16 class Ns3IntegrationTestCase(unittest.TestCase):
17     def setUp(self):
18         self.root_dir = tempfile.mkdtemp()
19
20     @test_util.skipUnless(test_util.ns3_usable(), 
21            "Test requires working ns-3 bindings")
22     def test_local_if(self):
23         exp_desc = ExperimentDescription()
24         testbed_id = "ns3"
25         ns3_provider = FactoriesProvider(testbed_id)
26         ns3_desc = exp_desc.add_testbed_description(ns3_provider)
27         ns3_desc.set_attribute_value("homeDirectory", self.root_dir)
28
29         node1 = ns3_desc.create("ns3::Node")
30         ipv41 = ns3_desc.create("ns3::Ipv4L3Protocol")
31         arp1  = ns3_desc.create("ns3::ArpL3Protocol")
32         icmp1 = ns3_desc.create("ns3::Icmpv4L4Protocol")
33         node1.connector("protos").connect(ipv41.connector("node"))
34         node1.connector("protos").connect(arp1.connector("node"))
35         node1.connector("protos").connect(icmp1.connector("node"))
36         iface1 = ns3_desc.create("ns3::PointToPointNetDevice")
37         queue1 = ns3_desc.create("ns3::DropTailQueue")
38         node1.connector("devs").connect(iface1.connector("node"))
39         iface1.connector("queue").connect(queue1.connector("dev"))
40         trace1 = iface1.enable_trace("P2PAsciiTrace")
41         ip1 = iface1.add_address()
42         ip1.set_attribute_value("Address", "10.0.0.1")
43
44         node2 = ns3_desc.create("ns3::Node")
45         ipv42 = ns3_desc.create("ns3::Ipv4L3Protocol")
46         arp2  = ns3_desc.create("ns3::ArpL3Protocol")
47         icmp2 = ns3_desc.create("ns3::Icmpv4L4Protocol")
48         node2.connector("protos").connect(ipv42.connector("node"))
49         node2.connector("protos").connect(arp2.connector("node"))
50         node2.connector("protos").connect(icmp2.connector("node"))
51         iface2 = ns3_desc.create("ns3::PointToPointNetDevice")
52         queue2 = ns3_desc.create("ns3::DropTailQueue")
53         node2.connector("devs").connect(iface2.connector("node"))
54         iface2.connector("queue").connect(queue2.connector("dev"))
55         trace2 = iface2.enable_trace("P2PAsciiTrace")
56         ip2 = iface2.add_address()
57         ip2.set_attribute_value("Address", "10.0.0.2")
58
59         chan = ns3_desc.create("ns3::PointToPointChannel")
60         iface1.connector("chan").connect(chan.connector("dev2"))
61         iface2.connector("chan").connect(chan.connector("dev2"))
62
63         app = ns3_desc.create("ns3::V4Ping")
64         app.set_attribute_value("Remote", "10.0.0.2")
65         app.set_attribute_value("StartTime", "0s")
66         app.set_attribute_value("StopTime", "20s")
67         app.connector("node").connect(node1.connector("apps"))
68
69         xml = exp_desc.to_xml()
70         controller = ExperimentController(xml, self.root_dir)
71         controller.start()
72         while not controller.is_finished(app.guid):
73             time.sleep(0.5)
74         ping_result = controller.trace(iface2.guid, "P2PAsciiTrace")
75         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)"
76         if ping_result.find(comp_result) == -1:
77             self.fail("Unexpected trace: %s" % (ping_result,))
78         controller.stop()
79         controller.shutdown()
80
81     @test_util.skipUnless(test_util.ns3_usable(), 
82            "Test requires working ns-3 bindings")
83     def test_all_daemonized_if(self):
84         exp_desc = ExperimentDescription()
85         testbed_id = "ns3"
86         ns3_provider = FactoriesProvider(testbed_id)
87         ns3_desc = exp_desc.add_testbed_description(ns3_provider)
88         ns3_desc.set_attribute_value("homeDirectory", self.root_dir)
89
90         node1 = ns3_desc.create("ns3::Node")
91         ipv41 = ns3_desc.create("ns3::Ipv4L3Protocol")
92         arp1  = ns3_desc.create("ns3::ArpL3Protocol")
93         icmp1 = ns3_desc.create("ns3::Icmpv4L4Protocol")
94         node1.connector("protos").connect(ipv41.connector("node"))
95         node1.connector("protos").connect(arp1.connector("node"))
96         node1.connector("protos").connect(icmp1.connector("node"))
97         iface1 = ns3_desc.create("ns3::PointToPointNetDevice")
98         queue1 = ns3_desc.create("ns3::DropTailQueue")
99         node1.connector("devs").connect(iface1.connector("node"))
100         iface1.connector("queue").connect(queue1.connector("dev"))
101         trace1 = iface1.enable_trace("P2PAsciiTrace")
102         ip1 = iface1.add_address()
103         ip1.set_attribute_value("Address", "10.0.0.1")
104
105         node2 = ns3_desc.create("ns3::Node")
106         ipv42 = ns3_desc.create("ns3::Ipv4L3Protocol")
107         arp2  = ns3_desc.create("ns3::ArpL3Protocol")
108         icmp2 = ns3_desc.create("ns3::Icmpv4L4Protocol")
109         node2.connector("protos").connect(ipv42.connector("node"))
110         node2.connector("protos").connect(arp2.connector("node"))
111         node2.connector("protos").connect(icmp2.connector("node"))
112         iface2 = ns3_desc.create("ns3::PointToPointNetDevice")
113         queue2 = ns3_desc.create("ns3::DropTailQueue")
114         node2.connector("devs").connect(iface2.connector("node"))
115         iface2.connector("queue").connect(queue2.connector("dev"))
116         trace2 = iface2.enable_trace("P2PAsciiTrace")
117         ip2 = iface2.add_address()
118         ip2.set_attribute_value("Address", "10.0.0.2")
119
120         chan = ns3_desc.create("ns3::PointToPointChannel")
121         iface1.connector("chan").connect(chan.connector("dev2"))
122         iface2.connector("chan").connect(chan.connector("dev2"))
123
124         app = ns3_desc.create("ns3::V4Ping")
125         app.set_attribute_value("Remote", "10.0.0.2")
126         app.set_attribute_value("StartTime", "0s")
127         app.set_attribute_value("StopTime", "20s")
128         app.connector("node").connect(node1.connector("apps"))
129
130         ns3_desc.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
131         inst_root_dir = os.path.join(self.root_dir, "instance")
132         os.mkdir(inst_root_dir)
133         ns3_desc.set_attribute_value(DC.ROOT_DIRECTORY, inst_root_dir)
134         ns3_desc.set_attribute_value(DC.LOG_LEVEL, DC.DEBUG_LEVEL)
135
136         xml = exp_desc.to_xml()
137         access_config = proxy.AccessConfiguration()
138         access_config.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
139         access_config.set_attribute_value(DC.ROOT_DIRECTORY, self.root_dir)
140         access_config.set_attribute_value(DC.LOG_LEVEL, DC.DEBUG_LEVEL)
141         controller = proxy.create_experiment_controller(xml, access_config)
142
143         controller.start()
144         while not controller.is_finished(app.guid):
145             time.sleep(0.5)
146           
147         ping_result = controller.trace(iface2.guid, "P2PAsciiTrace")
148         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)"
149         if ping_result.find(comp_result) == -1:
150             self.fail("Unexpected trace: %s" % (ping_result,))
151         controller.stop()
152         controller.shutdown()
153
154     def tearDown(self):
155         try:
156             shutil.rmtree(self.root_dir)
157         except:
158             # retry
159             time.sleep(0.1)
160             shutil.rmtree(self.root_dir)
161
162 if __name__ == '__main__':
163     unittest.main()
164