f0926da939a7439e5a91fa6562c3f0fe18e961ed
[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         self.assertNotEqual(ping_result.find(comp_result), -1)
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_version = "3_9_RC3"
86         testbed_id = "ns3"
87         ns3_provider = FactoriesProvider(testbed_id, testbed_version)
88         ns3_desc = exp_desc.add_testbed_description(ns3_provider)
89         ns3_desc.set_attribute_value("homeDirectory", self.root_dir)
90
91         node1 = ns3_desc.create("ns3::Node")
92         ipv41 = ns3_desc.create("ns3::Ipv4L3Protocol")
93         arp1  = ns3_desc.create("ns3::ArpL3Protocol")
94         icmp1 = ns3_desc.create("ns3::Icmpv4L4Protocol")
95         node1.connector("protos").connect(ipv41.connector("node"))
96         node1.connector("protos").connect(arp1.connector("node"))
97         node1.connector("protos").connect(icmp1.connector("node"))
98         iface1 = ns3_desc.create("ns3::PointToPointNetDevice")
99         queue1 = ns3_desc.create("ns3::DropTailQueue")
100         node1.connector("devs").connect(iface1.connector("node"))
101         iface1.connector("queue").connect(queue1.connector("dev"))
102         trace1 = iface1.enable_trace("P2PAsciiTrace")
103         ip1 = iface1.add_address()
104         ip1.set_attribute_value("Address", "10.0.0.1")
105
106         node2 = ns3_desc.create("ns3::Node")
107         ipv42 = ns3_desc.create("ns3::Ipv4L3Protocol")
108         arp2  = ns3_desc.create("ns3::ArpL3Protocol")
109         icmp2 = ns3_desc.create("ns3::Icmpv4L4Protocol")
110         node2.connector("protos").connect(ipv42.connector("node"))
111         node2.connector("protos").connect(arp2.connector("node"))
112         node2.connector("protos").connect(icmp2.connector("node"))
113         iface2 = ns3_desc.create("ns3::PointToPointNetDevice")
114         queue2 = ns3_desc.create("ns3::DropTailQueue")
115         node2.connector("devs").connect(iface2.connector("node"))
116         iface2.connector("queue").connect(queue2.connector("dev"))
117         trace2 = iface2.enable_trace("P2PAsciiTrace")
118         ip2 = iface2.add_address()
119         ip2.set_attribute_value("Address", "10.0.0.2")
120
121         chan = ns3_desc.create("ns3::PointToPointChannel")
122         iface1.connector("chan").connect(chan.connector("dev2"))
123         iface2.connector("chan").connect(chan.connector("dev2"))
124
125         app = ns3_desc.create("ns3::V4Ping")
126         app.set_attribute_value("Remote", "10.0.0.2")
127         app.set_attribute_value("StartTime", "0s")
128         app.set_attribute_value("StopTime", "20s")
129         app.connector("node").connect(node1.connector("apps"))
130
131         ns3_desc.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
132         inst_root_dir = os.path.join(self.root_dir, "instance")
133         os.mkdir(inst_root_dir)
134         ns3_desc.set_attribute_value(DC.ROOT_DIRECTORY, inst_root_dir)
135         ns3_desc.set_attribute_value(DC.LOG_LEVEL, DC.DEBUG_LEVEL)
136
137         xml = exp_desc.to_xml()
138         access_config = proxy.AccessConfiguration()
139         access_config.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
140         access_config.set_attribute_value(DC.ROOT_DIRECTORY, self.root_dir)
141         access_config.set_attribute_value(DC.LOG_LEVEL, DC.DEBUG_LEVEL)
142         controller = proxy.create_controller(xml, access_config)
143
144         controller.start()
145         while not controller.is_finished(app.guid):
146             time.sleep(0.5)
147           
148         ping_result = controller.trace(ns3_desc.guid, iface2.guid, "P2PAsciiTrace")
149         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)"
150         self.assertNotEqual(ping_result.find(comp_result), -1)
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