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()
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)
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")
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")
59 chan = ns3_desc.create("ns3::PointToPointChannel")
60 iface1.connector("chan").connect(chan.connector("dev2"))
61 iface2.connector("chan").connect(chan.connector("dev2"))
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"))
69 xml = exp_desc.to_xml()
70 controller = ExperimentController(xml, self.root_dir)
72 while not controller.is_finished(app.guid):
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,))
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()
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)
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")
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")
120 chan = ns3_desc.create("ns3::PointToPointChannel")
121 iface1.connector("chan").connect(chan.connector("dev2"))
122 iface2.connector("chan").connect(chan.connector("dev2"))
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"))
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)
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)
144 while not controller.is_finished(app.guid):
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,))
152 controller.shutdown()
156 shutil.rmtree(self.root_dir)
160 shutil.rmtree(self.root_dir)
162 if __name__ == '__main__':