d4a7a4cdcd4d419724d4e3d5f8828769a19f02fb
[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_version = "3_9_RC3"
25         testbed_id = "ns3"
26         ns3_provider = FactoriesProvider(testbed_id, testbed_version)
27         ns3_desc = exp_desc.add_testbed_description(ns3_provider)
28         ns3_desc.set_attribute_value("homeDirectory", self.root_dir)
29
30         node1 = ns3_desc.create("ns3::Node")
31         ipv41 = ns3_desc.create("ns3::Ipv4L3Protocol")
32         arp1  = ns3_desc.create("ns3::ArpL3Protocol")
33         icmp1 = ns3_desc.create("ns3::Icmpv4L4Protocol")
34         node1.connector("protos").connect(ipv41.connector("node"))
35         node1.connector("protos").connect(arp1.connector("node"))
36         node1.connector("protos").connect(icmp1.connector("node"))
37         iface1 = ns3_desc.create("ns3::PointToPointNetDevice")
38         queue1 = ns3_desc.create("ns3::DropTailQueue")
39         node1.connector("devs").connect(iface1.connector("node"))
40         iface1.connector("queue").connect(queue1.connector("dev"))
41         trace1 = iface1.enable_trace("P2PAsciiTrace")
42         ip1 = iface1.add_address()
43         ip1.set_attribute_value("Address", "10.0.0.1")
44
45         node2 = ns3_desc.create("ns3::Node")
46         ipv42 = ns3_desc.create("ns3::Ipv4L3Protocol")
47         arp2  = ns3_desc.create("ns3::ArpL3Protocol")
48         icmp2 = ns3_desc.create("ns3::Icmpv4L4Protocol")
49         node2.connector("protos").connect(ipv42.connector("node"))
50         node2.connector("protos").connect(arp2.connector("node"))
51         node2.connector("protos").connect(icmp2.connector("node"))
52         iface2 = ns3_desc.create("ns3::PointToPointNetDevice")
53         queue2 = ns3_desc.create("ns3::DropTailQueue")
54         node2.connector("devs").connect(iface2.connector("node"))
55         iface2.connector("queue").connect(queue2.connector("dev"))
56         trace2 = iface2.enable_trace("P2PAsciiTrace")
57         ip2 = iface2.add_address()
58         ip2.set_attribute_value("Address", "10.0.0.2")
59
60         chan = ns3_desc.create("ns3::PointToPointChannel")
61         iface1.connector("chan").connect(chan.connector("dev2"))
62         iface2.connector("chan").connect(chan.connector("dev2"))
63
64         app = ns3_desc.create("ns3::V4Ping")
65         app.set_attribute_value("Remote", "10.0.0.2")
66         app.set_attribute_value("StartTime", "0s")
67         app.set_attribute_value("StopTime", "20s")
68         app.connector("node").connect(node1.connector("apps"))
69
70         xml = exp_desc.to_xml()
71         controller = ExperimentController(xml, self.root_dir)
72         controller.start()
73         while not controller.is_finished(app.guid):
74             time.sleep(0.5)
75         ping_result = controller.trace(ns3_desc.guid, iface2.guid, "P2PAsciiTrace")
76         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)"
77         if ping_result.find(comp_result) == -1:
78             self.fail("Unexpected trace: %s" % (ping_result,))
79         controller.stop()
80         controller.shutdown()
81
82     @test_util.skipUnless(test_util.ns3_usable(), 
83            "Test requires working ns-3 bindings")
84     def test_all_daemonized_if(self):
85         exp_desc = ExperimentDescription()
86         testbed_version = "3_9_RC3"
87         testbed_id = "ns3"
88         ns3_provider = FactoriesProvider(testbed_id, testbed_version)
89         ns3_desc = exp_desc.add_testbed_description(ns3_provider)
90         ns3_desc.set_attribute_value("homeDirectory", self.root_dir)
91
92         node1 = ns3_desc.create("ns3::Node")
93         ipv41 = ns3_desc.create("ns3::Ipv4L3Protocol")
94         arp1  = ns3_desc.create("ns3::ArpL3Protocol")
95         icmp1 = ns3_desc.create("ns3::Icmpv4L4Protocol")
96         node1.connector("protos").connect(ipv41.connector("node"))
97         node1.connector("protos").connect(arp1.connector("node"))
98         node1.connector("protos").connect(icmp1.connector("node"))
99         iface1 = ns3_desc.create("ns3::PointToPointNetDevice")
100         queue1 = ns3_desc.create("ns3::DropTailQueue")
101         node1.connector("devs").connect(iface1.connector("node"))
102         iface1.connector("queue").connect(queue1.connector("dev"))
103         trace1 = iface1.enable_trace("P2PAsciiTrace")
104         ip1 = iface1.add_address()
105         ip1.set_attribute_value("Address", "10.0.0.1")
106
107         node2 = ns3_desc.create("ns3::Node")
108         ipv42 = ns3_desc.create("ns3::Ipv4L3Protocol")
109         arp2  = ns3_desc.create("ns3::ArpL3Protocol")
110         icmp2 = ns3_desc.create("ns3::Icmpv4L4Protocol")
111         node2.connector("protos").connect(ipv42.connector("node"))
112         node2.connector("protos").connect(arp2.connector("node"))
113         node2.connector("protos").connect(icmp2.connector("node"))
114         iface2 = ns3_desc.create("ns3::PointToPointNetDevice")
115         queue2 = ns3_desc.create("ns3::DropTailQueue")
116         node2.connector("devs").connect(iface2.connector("node"))
117         iface2.connector("queue").connect(queue2.connector("dev"))
118         trace2 = iface2.enable_trace("P2PAsciiTrace")
119         ip2 = iface2.add_address()
120         ip2.set_attribute_value("Address", "10.0.0.2")
121
122         chan = ns3_desc.create("ns3::PointToPointChannel")
123         iface1.connector("chan").connect(chan.connector("dev2"))
124         iface2.connector("chan").connect(chan.connector("dev2"))
125
126         app = ns3_desc.create("ns3::V4Ping")
127         app.set_attribute_value("Remote", "10.0.0.2")
128         app.set_attribute_value("StartTime", "0s")
129         app.set_attribute_value("StopTime", "20s")
130         app.connector("node").connect(node1.connector("apps"))
131
132         ns3_desc.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
133         inst_root_dir = os.path.join(self.root_dir, "instance")
134         os.mkdir(inst_root_dir)
135         ns3_desc.set_attribute_value(DC.ROOT_DIRECTORY, inst_root_dir)
136         ns3_desc.set_attribute_value(DC.LOG_LEVEL, DC.DEBUG_LEVEL)
137
138         xml = exp_desc.to_xml()
139         access_config = proxy.AccessConfiguration()
140         access_config.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
141         access_config.set_attribute_value(DC.ROOT_DIRECTORY, self.root_dir)
142         access_config.set_attribute_value(DC.LOG_LEVEL, DC.DEBUG_LEVEL)
143         controller = proxy.create_controller(xml, access_config)
144
145         controller.start()
146         while not controller.is_finished(app.guid):
147             time.sleep(0.5)
148           
149         ping_result = controller.trace(ns3_desc.guid, iface2.guid, "P2PAsciiTrace")
150         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)"
151         if ping_result.find(comp_result) == -1:
152             self.fail("Unexpected trace: %s" % (ping_result,))
153         controller.stop()
154         controller.shutdown()
155
156     def tearDown(self):
157         try:
158             shutil.rmtree(self.root_dir)
159         except:
160             # retry
161             time.sleep(0.1)
162             shutil.rmtree(self.root_dir)
163
164 if __name__ == '__main__':
165     unittest.main()
166