2 # -*- coding: utf-8 -*-
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
16 class Ns3IntegrationTestCase(unittest.TestCase):
18 self.root_dir = tempfile.mkdtemp()
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"
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)
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")
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")
60 chan = ns3_desc.create("ns3::PointToPointChannel")
61 iface1.connector("chan").connect(chan.connector("dev2"))
62 iface2.connector("chan").connect(chan.connector("dev2"))
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"))
70 xml = exp_desc.to_xml()
71 controller = ExperimentController(xml, self.root_dir)
73 while not controller.is_finished(app.guid):
75 ping_result = controller.trace(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,))
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"
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)
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")
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")
122 chan = ns3_desc.create("ns3::PointToPointChannel")
123 iface1.connector("chan").connect(chan.connector("dev2"))
124 iface2.connector("chan").connect(chan.connector("dev2"))
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"))
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)
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)
146 while not controller.is_finished(app.guid):
149 ping_result = controller.trace(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,))
154 controller.shutdown()
158 shutil.rmtree(self.root_dir)
162 shutil.rmtree(self.root_dir)
164 if __name__ == '__main__':