5eec42bb187791e4f8119f5d45001d491f84bbd8
[nepi.git] / test / testbeds / ns3 / execute.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 from nepi.util.constants import ApplicationStatus as AS
5 from nepi.testbeds import ns3
6 import os
7 import shutil
8 import tempfile
9 import test_util
10 import time
11 import unittest
12
13 class Ns3ExecuteTestCase(unittest.TestCase):
14     def setUp(self):
15         self.root_dir = tempfile.mkdtemp()
16
17     @test_util.skipUnless(test_util.ns3_usable(), 
18            "Test requires working ns-3 bindings")
19     def test_run_ping_if(self):
20         instance = ns3.TestbedController()
21         instance.defer_configure("homeDirectory", self.root_dir)
22         instance.defer_create(2, "ns3::Node")
23         instance.defer_create(3, "ns3::Ipv4L3Protocol")
24         instance.defer_create(4, "ns3::ArpL3Protocol")
25         instance.defer_create(5, "ns3::Icmpv4L4Protocol")
26         instance.defer_create(6, "ns3::UdpL4Protocol")
27         instance.defer_connect(2, "protos", 3, "node")
28         instance.defer_connect(2, "protos", 4, "node")
29         instance.defer_connect(2, "protos", 5, "node")
30         instance.defer_connect(2, "protos", 6, "node")
31         instance.defer_create(7, "ns3::PointToPointNetDevice")
32         instance.defer_create(8, "ns3::DropTailQueue")
33         instance.defer_connect(2, "devs", 7, "node")
34         instance.defer_connect(7, "queue", 8, "dev")
35         instance.defer_add_trace(7, "P2PAsciiTrace")
36         instance.defer_add_address(7, "10.0.0.1", 24, None)
37
38         instance.defer_create(9, "ns3::Node")
39         instance.defer_create(10, "ns3::Ipv4L3Protocol")
40         instance.defer_create(11, "ns3::ArpL3Protocol")
41         instance.defer_create(12, "ns3::Icmpv4L4Protocol")
42         instance.defer_create(13, "ns3::UdpL4Protocol")
43         instance.defer_connect(9, "protos", 10, "node")
44         instance.defer_connect(9, "protos", 11, "node")
45         instance.defer_connect(9, "protos", 12, "node")
46         instance.defer_connect(9, "protos", 13, "node")
47         instance.defer_create(14, "ns3::PointToPointNetDevice")
48         instance.defer_create(15, "ns3::DropTailQueue")
49         instance.defer_connect(9, "devs", 14, "node")
50         instance.defer_connect(14, "queue", 15, "dev")
51         instance.defer_add_trace(14, "P2PAsciiTrace")
52         instance.defer_add_address(14, "10.0.0.2", 24, None)
53
54         instance.defer_create(16, "ns3::PointToPointChannel")
55         instance.defer_connect(7, "chan", 16, "dev2")
56         instance.defer_connect(14, "chan", 16, "dev2")
57
58         instance.defer_create(17, "ns3::V4Ping")
59         instance.defer_create_set(17, "Remote", "10.0.0.2")
60         instance.defer_create_set(17, "StartTime", "0s")
61         instance.defer_create_set(17, "StopTime", "10s")
62         instance.defer_add_trace(17, "Rtt")
63         instance.defer_connect(17, "node", 2, "apps")
64
65         instance.do_setup()
66         instance.do_create()
67         instance.do_connect_init()
68         instance.do_connect_compl()
69         instance.do_preconfigure()
70         instance.do_configure()
71         instance.do_prestart()
72         instance.start()
73         while instance.status(17) != AS.STATUS_FINISHED:
74             time.sleep(0.1)
75         ping_result = instance.trace(14, "P2PAsciiTrace")
76         ping_rtt = instance.trace(17, "Rtt")
77         comp_result = "- 9.021 /NodeList/1/DeviceList/0/$ns3::PointToPointNetDevice/TxQueue/Dequeue ns3::PppHeader (Point-to-Point Protocol: IP (0x0021)) ns3::Ipv4Header (tos 0x0 ttl 64 id 9 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=9)"
78         comp_rtt_result = """+41992186.0ns\t+41992186.0ns
79 +1041992186.0ns\t+41992186.0ns
80 +2041992186.0ns\t+41992186.0ns
81 +3041992186.0ns\t+41992186.0ns
82 +4041992186.0ns\t+41992186.0ns
83 +5041992186.0ns\t+41992186.0ns
84 +6041992186.0ns\t+41992186.0ns
85 +7041992186.0ns\t+41992186.0ns
86 +8041992186.0ns\t+41992186.0ns
87 +9041992186.0ns\t+41992186.0ns"""
88         self.assertNotEqual(ping_result.find(comp_result), -1)
89         self.assertEqual(ping_rtt.strip(), comp_rtt_result.strip())
90         instance.stop()
91         instance.shutdown()
92
93     def tearDown(self):
94         try:
95             shutil.rmtree(self.root_dir)
96         except:
97             # retry
98             time.sleep(0.1)
99             shutil.rmtree(self.root_dir)
100
101 if __name__ == '__main__':
102     unittest.main()
103