NS3 Wrapper test
[nepi.git] / test / resources / ns3 / ns3wrapper.py
1 #!/usr/bin/env python
2 #
3 #    NEPI, a framework to manage network experiments
4 #    Copyright (C) 2013 INRIA
5 #
6 #    This program is free software: you can redistribute it and/or modify
7 #    it under the terms of the GNU General Public License as published by
8 #    the Free Software Foundation, either version 3 of the License, or
9 #    (at your option) any later version.
10 #
11 #    This program is distributed in the hope that it will be useful,
12 #    but WITHOUT ANY WARRANTY; without even the implied warranty of
13 #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 #    GNU General Public License for more details.
15 #
16 #    You should have received a copy of the GNU General Public License
17 #    along with this program.  If not, see <http://www.gnu.org/licenses/>.
18 #
19 # Author: Alina Quereilhac <alina.quereilhac@inria.fr>
20
21
22 # Test based on ns-3 csma/examples/csma-ping.cc file
23 #
24 # Network topology
25 #
26 #       n0    n1   n2   n3
27 #       |     |    |    |
28 #       -----------------
29 #
30 #  node n0 sends IGMP traffic to node n3
31
32
33 from nepi.resources.ns3.ns3wrapper import NS3Wrapper
34
35 import os.path
36 import time
37 import tempfile
38 import unittest
39
40 class NS3WrapperTest(unittest.TestCase):
41     def setUp(self):
42         pass
43
44     def test_csma_ping(self):
45         wrapper = NS3Wrapper()
46
47         ### create 4  nodes
48         # NodeContainer c;
49         c = wrapper.create("NodeContainer")
50
51         # c.Create (4);
52         wrapper.invoke(c, "Create", 4)
53
54         ### connect the nodes to a shared channel
55         # CsmaHelper csma;
56         csma = wrapper.create("CsmaHelper")
57
58         # csma.SetChannelAttribute ("DataRate", DataRateValue (DataRate (5000000)));
59         dr = wrapper.create("DataRate", 5000000)
60         drv = wrapper.create("DataRateValue", dr)
61         wrapper.invoke(csma, "SetChannelAttribute", "DataRate", drv)
62
63         # csma.SetChannelAttribute ("Delay", TimeValue (MilliSeconds (2)));
64         ms = wrapper.create("MilliSeconds", 2)
65         delay = wrapper.create("TimeValue", ms)
66         wrapper.invoke(csma, "SetChannelAttribute", "Delay", delay)
67
68         # csma.SetDeviceAttribute ("EncapsulationMode", StringValue ("Llc"));
69         encap = wrapper.create("StringValue", "Llc")
70         wrapper.invoke(csma, "SetDeviceAttribute", "EncapsulationMode", encap)
71
72         # NetDeviceContainer devs = csma.Install (c);
73         devs = wrapper.invoke(csma, "Install", c)
74
75         ### add IP stack to all nodes
76         # InternetStackHelper ipStack;
77         ipStack = wrapper.create("InternetStackHelper")
78         
79         # ipStack.Install (c);
80         wrapper.invoke(ipStack, "Install", c)
81
82         ### assign ip addresses
83         #Ipv4AddressHelper ip;
84         ip = wrapper.create("Ipv4AddressHelper")
85
86         # ip.SetBase ("192.168.1.0", "255.255.255.0");
87         ip4 = wrapper.create("Ipv4Address", "192.168.1.0")
88         mask4 = wrapper.create("Ipv4Mask", "255.255.255.0")
89         wrapper.invoke(ip, "SetBase", ip4, mask4)
90
91         # Ipv4InterfaceContainer addresses = ip.Assign (devs);
92         addresses = wrapper.invoke(ip, "Assign", devs)
93
94         ### Create source
95         config = wrapper.singleton("Config")
96         
97         # Config::SetDefault ("ns3::Ipv4RawSocketImpl::Protocol", StringValue ("2"));
98         proto = wrapper.create("StringValue", "2")
99         wrapper.invoke(config, "SetDefault", "ns3::Ipv4RawSocketImpl::Protocol", proto)
100
101         # InetSocketAddress dst = InetSocketAddress (addresses.GetAddress (3));
102         addr3 = wrapper.invoke(addresses, "GetAddress", 3)
103         dst = wrapper.create("InetSocketAddress", addr3)
104
105         # OnOffHelper onoff = OnOffHelper ("ns3::Ipv4RawSocketFactory", dst);
106         onoff = wrapper.create("OnOffHelper", "ns3::Ipv4RawSocketFactory", dst)
107
108         # onoff.SetAttribute ("DataRate", DataRateValue (DataRate (15000)));
109         dr2 = wrapper.create("DataRate", 15000)
110         drv2 = wrapper.create("DataRateValue", dr2)
111         wrapper.invoke(onoff, "SetAttribute", "DataRate", drv2)
112
113         # onoff.SetAttribute ("PacketSize", UintegerValue (1200));
114         uiv = wrapper.create("UintegerValue", 1200)
115         wrapper.invoke(onoff, "SetAttribute", "PacketSize", uiv)
116
117         # ApplicationContainer apps = onoff.Install (c.Get (0));
118         n1 = wrapper.invoke(c, "Get", 0)
119         apps = wrapper.invoke(onoff, "Install", n1)
120         
121         # apps.Start (Seconds (1.0));
122         s1 = wrapper.create("Seconds", 1.0)
123         wrapper.invoke(apps, "Start", s1)
124         
125         # apps.Stop (Seconds (10.0));
126         s2 = wrapper.create("Seconds", 10.0)
127         wrapper.invoke(apps, "Stop", s2)
128
129         ### create sink
130         # PacketSinkHelper sink = PacketSinkHelper ("ns3::Ipv4RawSocketFactory", dst);
131         sink = wrapper.create("PacketSinkHelper", "ns3::Ipv4RawSocketFactory", dst)
132         
133         # apps = sink.Install (c.Get (3));
134         n3 = wrapper.invoke(c, "Get", 3)
135         apps = wrapper.invoke (sink, "Install", n3)
136         
137         # apps.Start (Seconds (0.0));
138         s3 = wrapper.create ("Seconds", 0.0)
139         wrapper.invoke (apps, "Start", s3)
140         
141         # apps.Stop (Seconds (11.0));
142         s4 = wrapper.create ("Seconds", 11.0)
143         wrapper.invoke (apps, "Stop", s4)
144
145         ### create pinger
146         #V4PingHelper ping = V4PingHelper (addresses.GetAddress (2));
147         addr2 = wrapper.invoke(addresses, "GetAddress", 2)
148         ping = wrapper.create("V4PingHelper", addr2)
149         
150         #NodeContainer pingers;
151         pingers = wrapper.create("NodeContainer")
152         
153         #pingers.Add (c.Get (0));
154         n0 = wrapper.invoke(c, "Get", 0)
155         wrapper.invoke(pingers, "Add", n0)
156         
157         #pingers.Add (c.Get (1));
158         n1 = wrapper.invoke(c, "Get", 1)
159         wrapper.invoke(pingers, "Add", n1)
160         
161         #pingers.Add (c.Get (3));
162         n3 = wrapper.invoke(c, "Get", 3)
163         wrapper.invoke(pingers, "Add", n3)
164         
165         #apps = ping.Install (pingers);
166         apps = wrapper.invoke(ping, "Install", pingers)
167         
168         #apps.Start (Seconds (2.0));
169         s5 = wrapper.create ("Seconds", 2.0)
170         wrapper.invoke (apps, "Start", s5)
171         
172         #apps.Stop (Seconds (5.0));
173         s6 = wrapper.create ("Seconds", 5.0)
174         wrapper.invoke (apps, "Stop", s6)
175
176         ### configure tracing
177         #csma.EnablePcapAll ("csma-ping", false);
178         wrapper.invoke(csma, "EnablePcapAll", "csma-ping-pcap", False)
179  
180         #csma.EnableAsciiAll ("csma-ping", false);
181         wrapper.invoke(csma, "EnableAsciiAll", "csma-ping-ascii")
182  
183         def SinkRx(packet, address):
184             print packet
185
186         def PingRtt(context, rtt):
187             print context, rtt
188       
189         # XXX: No biding for MakeCallback
190         #Config::ConnectWithoutContext ("/NodeList/3/ApplicationList/0/$ns3::PacketSink/Rx", 
191         # MakeCallback (&SinkRx));
192         #cb = wrapper.create("MakeCallback", SinkRx)
193         #wrapper.invoke(config, "ConnectWithoutContext", 
194         #        "/NodeList/3/ApplicationList/0/$ns3::PacketSink/Rx", cb)
195
196         # Config::Connect ("/NodeList/*/ApplicationList/*/$ns3::V4Ping/Rtt", 
197         # MakeCallback (&PingRtt));
198         #cb2 = wrapper.create("MakeCallback", PingRtt)
199         #wrapper.invoke(config, "ConnectWithoutContext", 
200         #        "/NodeList/*/ApplicationList/*/$ns3::V4Ping/Rtt", 
201         #        cb2)
202
203         # Packet::EnablePrinting ();
204         packet = wrapper.singleton("Packet")
205         wrapper.invoke(packet, "EnablePrinting")
206
207         ### run Simulation
208         # Simulator::Run ();
209         simulator = wrapper.singleton("Simulator")
210         wrapper.invoke(simulator, "Run")
211
212         # Simulator::Destroy ();
213         wrapper.invoke(simulator, "Destroy")
214
215 if __name__ == '__main__':
216     unittest.main()
217