Changing ResourceManager naming for platform::ResourceName
[nepi.git] / test / resources / linux / ns3 / ns3simulation.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 from nepi.execution.ec import ExperimentController 
22 from nepi.execution.trace import TraceAttr
23
24 from test_utils import skipIfNotAlive
25
26 import os
27 import time
28 import unittest
29
30 def add_ns3_node(ec, simu):
31     node = ec.register_resource("ns3::Node")
32     ec.register_connection(node, simu)
33
34     ipv4 = ec.register_resource("ns3::Ipv4L3Protocol")
35     ec.register_connection(node, ipv4)
36
37     arp = ec.register_resource("ns3::ArpL3Protocol")
38     ec.register_connection(node, arp)
39     
40     icmp = ec.register_resource("ns3::Icmpv4L4Protocol")
41     ec.register_connection(node, icmp)
42
43     udp = ec.register_resource("ns3::UdpL4Protocol")
44     ec.register_connection(node, udp)
45
46     return node
47
48 def add_point2point_device(ec, node, ip, prefix):
49     dev = ec.register_resource("ns3::PointToPointNetDevice")
50     ec.set(dev, "ip", ip)
51     ec.set(dev, "prefix", prefix)
52     ec.register_connection(node, dev)
53
54     queue = ec.register_resource("ns3::DropTailQueue")
55     ec.register_connection(dev, queue)
56
57     return dev
58
59 def add_csma_device(ec, node, ip, prefix):
60     dev = ec.register_resource("ns3::CsmaNetDevice")
61     ec.set(dev, "ip", ip)
62     ec.set(dev, "prefix", prefix)
63     ec.register_connection(node, dev)
64
65     queue = ec.register_resource("ns3::DropTailQueue")
66     ec.register_connection(dev, queue)
67
68     return dev
69
70 def add_wifi_device(ec, node, ip, prefix, 
71         access_point = False):
72     dev = ec.register_resource("ns3::WifiNetDevice")
73     ec.set(dev, "ip", ip)
74     ec.set(dev, "prefix", prefix)
75     ec.register_connection(node, dev)
76
77     phy = ec.register_resource("ns3::YansWifiPhy")
78     ec.set(phy, "Standard", "WIFI_PHY_STANDARD_80211a")
79     ec.register_connection(dev, phy)
80
81     error = ec.register_resource("ns3::NistErrorRateModel")
82     ec.register_connection(phy, error)
83
84     manager = ec.register_resource("ns3::ArfWifiManager")
85     ec.register_connection(dev, manager)
86
87     if access_point:
88         mac = ec.register_resource("ns3::ApWifiMac")
89     else:
90         mac = ec.register_resource("ns3::StaWifiMac")
91
92     ec.set(mac, "Standard", "WIFI_PHY_STANDARD_80211a")
93     ec.register_connection(dev, mac)
94
95     return dev, phy
96
97 def add_random_mobility(ec, node, x, y, z, speed, bounds_width, 
98         bounds_height):
99     position = "%d:%d:%d" % (x, y, z)
100     bounds = "0|%d|0|%d" % (bounds_width, bounds_height) 
101     speed = "ns3::UniformRandomVariable[Min=%d|Max=%s]" % (speed, speed)
102     pause = "ns3::ConstantRandomVariable[Constant=1.0]"
103     
104     mobility = ec.register_resource("ns3::RandomDirection2dMobilityModel")
105     ec.set(mobility, "Position", position)
106     ec.set(mobility, "Bounds", bounds)
107     ec.set(mobility, "Speed", speed)
108     ec.set(mobility, "Pause",  pause)
109     ec.register_connection(node, mobility)
110     return mobility
111
112 def add_constant_mobility(ec, node, x, y, z):
113     mobility = ec.register_resource("ns3::ConstantPositionMobilityModel") 
114     position = "%d:%d:%d" % (x, y, z)
115     ec.set(mobility, "Position", position)
116     ec.register_connection(node, mobility)
117     return mobility
118
119 def add_wifi_channel(ec):
120     channel = ec.register_resource("ns3::YansWifiChannel")
121     delay = ec.register_resource("ns3::ConstantSpeedPropagationDelayModel")
122     ec.register_connection(channel, delay)
123
124     loss  = ec.register_resource("ns3::LogDistancePropagationLossModel")
125     ec.register_connection(channel, loss)
126
127     return channel
128
129 class LinuxNS3SimulationTest(unittest.TestCase):
130     def setUp(self):
131         self.fedora_host = "nepi2.pl.sophia.inria.fr"
132         self.fedora_user = "inria_nepi"
133         self.fedora_identity = "%s/.ssh/id_rsa_planetlab" % (os.environ['HOME'])
134
135     @skipIfNotAlive
136     def t_p2p_ping(self, host, user = None, identity = None):
137         ec = ExperimentController(exp_id = "test-ns3-p2p-ping")
138         
139         node = ec.register_resource("linux::Node")
140         if host == "localhost":
141             ec.set(node, "hostname", "localhost")
142         else:
143             ec.set(node, "hostname", host)
144             ec.set(node, "username", user)
145             ec.set(node, "identity", identity)
146         
147         ec.set(node, "cleanProcesses", True)
148         #ec.set(node, "cleanHome", True)
149
150         simu = ec.register_resource("linux::ns3::Simulation")
151         ec.set(simu, "verbose", True)
152         ec.register_connection(simu, node)
153
154         nsnode1 = add_ns3_node(ec, simu)
155         dev1 = add_point2point_device(ec, nsnode1, "10.0.0.1", "30")
156
157         nsnode2 = add_ns3_node(ec, simu)
158         dev2 = add_point2point_device(ec, nsnode2, "10.0.0.2", "30")
159
160         # Create channel
161         chan = ec.register_resource("ns3::PointToPointChannel")
162         ec.set(chan, "Delay", "0s")
163         ec.register_connection(chan, dev1)
164         ec.register_connection(chan, dev2)
165
166         ### create pinger
167         ping = ec.register_resource("ns3::V4Ping")
168         ec.set (ping, "Remote", "10.0.0.2")
169         ec.set (ping, "Interval", "1s")
170         ec.set (ping, "Verbose", True)
171         ec.set (ping, "StartTime", "0s")
172         ec.set (ping, "StopTime", "20s")
173         ec.register_connection(ping, nsnode1)
174
175         ec.deploy()
176
177         ec.wait_finished([ping])
178         
179         stdout = ec.trace(simu, "stdout") 
180
181         expected = "20 packets transmitted, 20 received, 0% packet loss"
182         self.assertTrue(stdout.find(expected) > -1)
183
184         ec.shutdown()
185
186     @skipIfNotAlive
187     def t_csma_ping(self, host, user = None, identity = None):
188         ec = ExperimentController(exp_id = "test-ns3-csma-ping")
189         
190         node = ec.register_resource("linux::Node")
191         if host == "localhost":
192             ec.set(node, "hostname", "localhost")
193         else:
194             ec.set(node, "hostname", host)
195             ec.set(node, "username", user)
196             ec.set(node, "identity", identity)
197         
198         ec.set(node, "cleanProcesses", True)
199         #ec.set(node, "cleanHome", True)
200
201         simu = ec.register_resource("linux::ns3::Simulation")
202         ec.set(simu, "verbose", True)
203         ec.register_connection(simu, node)
204
205         nsnode1 = add_ns3_node(ec, simu)
206         dev1 = add_csma_device(ec, nsnode1, "10.0.0.1", "30")
207
208         nsnode2 = add_ns3_node(ec, simu)
209         dev2 = add_csma_device(ec, nsnode2, "10.0.0.2", "30")
210
211         # Create channel
212         chan = ec.register_resource("ns3::CsmaChannel")
213         ec.set(chan, "Delay", "0s")
214         ec.register_connection(chan, dev1)
215         ec.register_connection(chan, dev2)
216
217         ### create pinger
218         ping = ec.register_resource("ns3::V4Ping")
219         ec.set (ping, "Remote", "10.0.0.2")
220         ec.set (ping, "Interval", "1s")
221         ec.set (ping, "Verbose", True)
222         ec.set (ping, "StartTime", "0s")
223         ec.set (ping, "StopTime", "20s")
224         ec.register_connection(ping, nsnode1)
225
226         ec.deploy()
227
228         ec.wait_finished([ping])
229         
230         stdout = ec.trace(simu, "stdout") 
231
232         expected = "20 packets transmitted, 20 received, 0% packet loss"
233         self.assertTrue(stdout.find(expected) > -1)
234
235         ec.shutdown()
236
237     @skipIfNotAlive
238     def t_user_sources(self, host, user = None, identity = None):
239         ec = ExperimentController(exp_id = "test-ns3-user-sources")
240         
241         node = ec.register_resource("linux::Node")
242         if host == "localhost":
243             ec.set(node, "hostname", "localhost")
244         else:
245             ec.set(node, "hostname", host)
246             ec.set(node, "username", user)
247             ec.set(node, "identity", identity)
248         
249         ec.set(node, "cleanProcesses", True)
250         #ec.set(node, "cleanHome", True)
251
252         simu = ec.register_resource("linux::ns3::Simulation")
253         ec.set(simu, "verbose", True)
254         sources = os.path.join(os.path.dirname(os.path.realpath(__file__)), 
255                 "ns-3.18-user.tar.gz")
256         ec.set(simu, "sources", sources)
257         ec.set(simu, "pybindgenVersion", "834")
258         ec.register_connection(simu, node)
259
260         nsnode1 = add_ns3_node(ec, simu)
261         dev1 = add_csma_device(ec, nsnode1, "10.0.0.1", "30")
262
263         nsnode2 = add_ns3_node(ec, simu)
264         dev2 = add_csma_device(ec, nsnode2, "10.0.0.2", "30")
265
266         # Create channel
267         chan = ec.register_resource("ns3::CsmaChannel")
268         ec.set(chan, "Delay", "0s")
269         ec.register_connection(chan, dev1)
270         ec.register_connection(chan, dev2)
271
272         ### create pinger
273         ping = ec.register_resource("ns3::V4Ping")
274         ec.set (ping, "Remote", "10.0.0.2")
275         ec.set (ping, "Interval", "1s")
276         ec.set (ping, "Verbose", True)
277         ec.set (ping, "StartTime", "0s")
278         ec.set (ping, "StopTime", "20s")
279         ec.register_connection(ping, nsnode1)
280
281         ec.deploy()
282
283         ec.wait_finished([ping])
284         
285         stdout = ec.trace(simu, "stdout") 
286
287         expected = "20 packets transmitted, 20 received, 0% packet loss"
288         self.assertTrue(stdout.find(expected) > -1)
289         
290         ec.shutdown()
291
292     @skipIfNotAlive
293     def t_compile_debug_mode(self, host, user = None, identity = None):
294         ec = ExperimentController(exp_id = "test-ns3-debug-mode")
295         
296         node = ec.register_resource("linux::Node")
297         if host == "localhost":
298             ec.set(node, "hostname", host)
299         else:
300             ec.set(node, "hostname", host)
301             ec.set(node, "username", user)
302             ec.set(node, "identity", identity)
303
304         ec.set(node, "cleanProcesses", True)
305         #ec.set(node, "cleanHome", True)
306
307         simu = ec.register_resource("linux::ns3::Simulation")
308         ec.set(simu, "verbose", True)
309         ec.set(simu, "nsLog", "V4Ping:Node")
310         ec.set(simu, "buildMode", "debug")
311         ec.register_connection(simu, node)
312
313         nsnode1 = add_ns3_node(ec, simu)
314         dev1 = add_csma_device(ec, nsnode1, "10.0.0.1", "30")
315
316         nsnode2 = add_ns3_node(ec, simu)
317         dev2 = add_csma_device(ec, nsnode2, "10.0.0.2", "30")
318
319         # Create channel
320         chan = ec.register_resource("ns3::CsmaChannel")
321         ec.set(chan, "Delay", "0s")
322         ec.register_connection(chan, dev1)
323         ec.register_connection(chan, dev2)
324
325         ### create pinger
326         ping = ec.register_resource("ns3::V4Ping")
327         ec.set (ping, "Remote", "10.0.0.2")
328         ec.set (ping, "Interval", "1s")
329         ec.set (ping, "Verbose", True)
330         ec.set (ping, "StartTime", "0s")
331         ec.set (ping, "StopTime", "20s")
332         ec.register_connection(ping, nsnode1)
333
334         ec.deploy()
335
336         ec.wait_finished([ping])
337         
338         stdout = ec.trace(simu, "stdout") 
339
340         expected = "20 packets transmitted, 20 received, 0% packet loss"
341         self.assertTrue(stdout.find(expected) > -1)
342         
343         stderr = ec.trace(simu, "stderr")
344         expected = "V4Ping:Read32"
345         self.assertTrue(stderr.find(expected) > -1)
346
347         ec.shutdown()
348
349     @skipIfNotAlive
350     def t_real_time(self, host, user = None, identity = None):
351         ec = ExperimentController(exp_id = "test-ns3-real-time")
352         
353         node = ec.register_resource("linux::Node")
354         if host == "localhost":
355             ec.set(node, "hostname", "localhost")
356         else:
357             ec.set(node, "hostname", host)
358             ec.set(node, "username", user)
359             ec.set(node, "identity", identity)
360             ec.set(node, "cleanProcesses", True)
361
362         #ec.set(node, "cleanHome", True)
363
364         simu = ec.register_resource("linux::ns3::Simulation")
365         ec.set(simu, "simulatorImplementationType", "ns3::RealtimeSimulatorImpl")
366         ec.set(simu, "checksumEnabled", True)
367         ec.set(simu, "verbose", True)
368         ec.register_connection(simu, node)
369
370         nsnode1 = add_ns3_node(ec, simu)
371         dev1 = add_point2point_device(ec, nsnode1, "10.0.0.1", "30")
372
373         nsnode2 = add_ns3_node(ec, simu)
374         dev2 = add_point2point_device(ec, nsnode2, "10.0.0.2", "30")
375
376         # Create channel
377         chan = ec.register_resource("ns3::PointToPointChannel")
378         ec.set(chan, "Delay", "0s")
379         ec.register_connection(chan, dev1)
380         ec.register_connection(chan, dev2)
381
382         ### create pinger
383         ping = ec.register_resource("ns3::V4Ping")
384         ec.set (ping, "Remote", "10.0.0.2")
385         ec.set (ping, "Interval", "1s")
386         ec.set (ping, "Verbose", True)
387         ec.set (ping, "StartTime", "0s")
388         ec.set (ping, "StopTime", "20s")
389         ec.register_connection(ping, nsnode1)
390
391         ec.deploy()
392
393         ec.wait_finished([ping])
394       
395         stdout = ec.trace(simu, "stdout") 
396
397         expected = "20 packets transmitted, 20 received, 0% packet loss"
398         self.assertTrue(stdout.find(expected) > -1)
399
400         rm = ec.get_resource(ping)
401         start_time = rm.start_time
402         stop_time = rm.stop_time
403         delta = stop_time - start_time
404
405         self.assertTrue(delta.seconds >= 20, "Time elapsed %d" % delta.seconds)
406         self.assertTrue(delta.seconds < 25, "Time elapsed %d" % delta.seconds)
407
408         ec.shutdown()
409
410     @skipIfNotAlive
411     def t_traces(self, host, user = None, identity = None):
412         ec = ExperimentController(exp_id = "test-ns3-traces")
413         
414         node = ec.register_resource("linux::Node")
415         if host == "localhost":
416             ec.set(node, "hostname", "localhost")
417         else:
418             ec.set(node, "hostname", self.fedora_host)
419             ec.set(node, "username", self.fedora_user)
420             ec.set(node, "identity", self.fedora_identity)
421
422         ec.set(node, "cleanProcesses", True)
423         #ec.set(node, "cleanHome", True)
424
425         simu = ec.register_resource("linux::ns3::Simulation")
426         ec.set(simu, "verbose", True)
427         ec.register_connection(simu, node)
428
429         nsnode1 = add_ns3_node(ec, simu)
430         dev1 = add_point2point_device(ec, nsnode1, "10.0.0.1", "30")
431
432         nsnode2 = add_ns3_node(ec, simu)
433         dev2 = add_point2point_device(ec, nsnode2, "10.0.0.2", "30")
434
435         # Create channel
436         chan = ec.register_resource("ns3::PointToPointChannel")
437         ec.set(chan, "Delay", "0s")
438         ec.register_connection(chan, dev1)
439         ec.register_connection(chan, dev2)
440
441         ### create pinger
442         ping = ec.register_resource("ns3::V4Ping")
443         ec.set (ping, "Remote", "10.0.0.2")
444         ec.set (ping, "Interval", "1s")
445         ec.set (ping, "Verbose", True)
446         ec.set (ping, "StartTime", "0s")
447         ec.set (ping, "StopTime", "20s")
448         ec.register_connection(ping, nsnode1)
449
450         # enable traces
451         ec.enable_trace(dev1, "pcap")
452         ec.enable_trace(dev1, "promiscPcap")
453         ec.enable_trace(dev1, "ascii")
454
455         ec.enable_trace(dev2, "pcap")
456         ec.enable_trace(dev2, "promiscPcap")
457         ec.enable_trace(dev2, "ascii")
458
459         ec.deploy()
460
461         ec.wait_finished([ping])
462
463         # Trace verification
464         rm_simu = ec.get_resource(simu)
465
466         # TODO: Fix this in ns-3: pcap traces do not flush until the Simulator 
467         #   process is ended, so we can't get the traces of the 'pcap' and
468         #   'promiscPcap' traces.
469         #
470         #for trace in ["pcap", "promiscPcap", "ascii"]:
471         for trace in ["ascii"]:
472             for guid in [dev1, dev2]:
473                 output = ec.trace(guid, trace)
474
475                 size = ec.trace(guid, trace, attr = TraceAttr.SIZE)
476                 self.assertEquals(size, len(output))
477                 self.assertTrue(size > 100)
478                 
479                 block = ec.trace(guid, trace, attr = TraceAttr.STREAM, block = 5, offset = 1)
480                 self.assertEquals(block, output[5:10])
481
482                 trace_path = ec.trace(guid, trace, attr = TraceAttr.PATH)
483                 rm = ec.get_resource(guid)
484                 path = os.path.join(rm_simu.run_home, rm._trace_filename.get(trace))
485                 self.assertEquals(trace_path, path)
486
487         ec.shutdown()
488
489     @skipIfNotAlive
490     def t_wifi_ping(self, host, user = None, identity = None):
491         bounds_width = bounds_height = 200
492         x = y = 100
493         speed = 1
494
495         ec = ExperimentController(exp_id = "test-ns3-wifi-ping")
496         
497         node = ec.register_resource("linux::Node")
498         if host == "localhost":
499             ec.set(node, "hostname", "localhost")
500         else:
501             ec.set(node, "hostname", host)
502             ec.set(node, "username", user)
503             ec.set(node, "identity", identity)
504
505         ec.set(node, "cleanProcesses", True)
506         #ec.set(node, "cleanHome", True)
507
508         simu = ec.register_resource("linux::ns3::Simulation")
509         ec.set(simu, "verbose", True)
510         ec.register_connection(simu, node)
511
512         nsnode1 = add_ns3_node(ec, simu)
513         dev1, phy1 = add_wifi_device(ec, nsnode1, "10.0.0.1", "24", access_point = True)
514         mobility1 = add_constant_mobility(ec, nsnode1, x, y, 0)
515
516         nsnode2 = add_ns3_node(ec, simu)
517         dev2, phy2 = add_wifi_device(ec, nsnode2, "10.0.0.2", "24", access_point = False)
518         mobility1 = add_constant_mobility(ec, nsnode2, x, y, 0)
519         #mobility2 = add_random_mobility(ec, nsnode2, x, y, 0, speed, bounds_width, bounds_height)
520
521         # Create channel
522         chan = add_wifi_channel(ec)
523         ec.register_connection(chan, phy1)
524         ec.register_connection(chan, phy2)
525
526         ### create pinger
527         ping = ec.register_resource("ns3::V4Ping")
528         ec.set (ping, "Remote", "10.0.0.1")
529         ec.set (ping, "Interval", "1s")
530         ec.set (ping, "Verbose", True)
531         ec.set (ping, "StartTime", "1s")
532         ec.set (ping, "StopTime", "21s")
533         ec.register_connection(ping, nsnode2)
534
535         ec.deploy()
536
537         ec.wait_finished([ping])
538         
539         stdout = ec.trace(simu, "stdout")
540
541         expected = "20 packets transmitted, 20 received, 0% packet loss"
542         self.assertTrue(stdout.find(expected) > -1)
543
544         ec.shutdown()
545
546     @skipIfNotAlive
547     def t_routing(self, host, user = None, identity = None):
548         """ 
549         network topology:
550                                 n4
551                                 |
552            n1 -- p2p -- n2 -- csma -- n5 -- p2p -- n6
553            |                    | 
554            ping n6              n3
555            
556
557         """
558         ec = ExperimentController(exp_id = "test-ns3-routes")
559         
560         node = ec.register_resource("linux::Node")
561         if host == "localhost":
562             ec.set(node, "hostname", host)
563         else:
564             ec.set(node, "hostname", host)
565             ec.set(node, "username", user)
566             ec.set(node, "identity", identity)
567
568         ec.set(node, "cleanProcesses", True)
569         #ec.set(node, "cleanHome", True)
570
571         simu = ec.register_resource("linux::ns3::Simulation")
572         ec.set(simu, "verbose", True)
573         ec.register_connection(simu, node)
574
575         nsnode1 = add_ns3_node(ec, simu)
576         p2p12 = add_point2point_device(ec, nsnode1, "10.0.0.1", "30")
577
578         nsnode2 = add_ns3_node(ec, simu)
579         p2p21 = add_point2point_device(ec, nsnode2, "10.0.0.2", "30")
580         csma2 = add_csma_device(ec, nsnode2, "10.0.1.1", "24")
581
582         nsnode3 = add_ns3_node(ec, simu)
583         csma3 = add_csma_device(ec, nsnode3, "10.0.1.2", "24")
584
585         nsnode4 = add_ns3_node(ec, simu)
586         csma4 = add_csma_device(ec, nsnode4, "10.0.1.3", "24")
587
588         nsnode5 = add_ns3_node(ec, simu)
589         p2p56 = add_point2point_device(ec, nsnode5, "10.0.2.1", "30")
590         csma5 = add_csma_device(ec, nsnode5, "10.0.1.4", "24")
591
592         nsnode6 = add_ns3_node(ec, simu)
593         p2p65 = add_point2point_device(ec, nsnode6, "10.0.2.2", "30")
594
595         # P2P chan1
596         p2p_chan1 = ec.register_resource("ns3::PointToPointChannel")
597         ec.set(p2p_chan1, "Delay", "0s")
598         ec.register_connection(p2p_chan1, p2p12)
599         ec.register_connection(p2p_chan1, p2p21)
600
601         # CSMA chan
602         csma_chan = ec.register_resource("ns3::CsmaChannel")
603         ec.set(csma_chan, "Delay", "0s")
604         ec.register_connection(csma_chan, csma2)
605         ec.register_connection(csma_chan, csma3)
606         ec.register_connection(csma_chan, csma4)
607         ec.register_connection(csma_chan, csma5)
608
609         # P2P chan2
610         p2p_chan2 = ec.register_resource("ns3::PointToPointChannel")
611         ec.set(p2p_chan2, "Delay", "0s")
612         ec.register_connection(p2p_chan2, p2p56)
613         ec.register_connection(p2p_chan2, p2p65)
614
615         # Add routes - n1 - n6
616         r1 = ec.register_resource("ns3::Route")
617         ec.set(r1, "network", "10.0.2.0")
618         ec.set(r1, "prefix", "30")
619         ec.set(r1, "nexthop", "10.0.0.2")
620         ec.register_connection(r1, nsnode1)
621
622         # Add routes - n2 - n6
623         r2 = ec.register_resource("ns3::Route")
624         ec.set(r2, "network", "10.0.2.0")
625         ec.set(r2, "prefix", "30")
626         ec.set(r2, "nexthop", "10.0.1.4")
627         ec.register_connection(r2, nsnode2)
628
629         # Add routes - n5 - n1
630         r5 = ec.register_resource("ns3::Route")
631         ec.set(r5, "network", "10.0.0.0")
632         ec.set(r5, "prefix", "30")
633         ec.set(r5, "nexthop", "10.0.1.1")
634         ec.register_connection(r5, nsnode5)
635
636         # Add routes - n6 - n1
637         r6 = ec.register_resource("ns3::Route")
638         ec.set(r6, "network", "10.0.0.0")
639         ec.set(r6, "prefix", "30")
640         ec.set(r6, "nexthop", "10.0.2.1")
641         ec.register_connection(r6, nsnode6)
642
643         ### create pinger
644         ping = ec.register_resource("ns3::V4Ping")
645         ec.set (ping, "Remote", "10.0.2.2")
646         ec.set (ping, "Interval", "1s")
647         ec.set (ping, "Verbose", True)
648         ec.set (ping, "StartTime", "1s")
649         ec.set (ping, "StopTime", "21s")
650         ec.register_connection(ping, nsnode1)
651
652         ec.deploy()
653
654         ec.wait_finished([ping])
655         
656         stdout = ec.trace(simu, "stdout")
657
658         expected = "20 packets transmitted, 20 received, 0% packet loss"
659         self.assertTrue(stdout.find(expected) > -1)
660
661         ec.shutdown()
662
663     @skipIfNotAlive
664     def t_automatic_routing(self, host, user = None, identity = None):
665         """ 
666         network topology:
667                                 n4
668                                 |
669            n1 -- p2p -- n2 -- csma -- n5 -- p2p -- n6
670            |                    | 
671            ping n6              n3
672            
673
674         """
675         ec = ExperimentController(exp_id = "test-ns3-routing")
676         
677         node = ec.register_resource("linux::Node")
678         if host == "localhost":
679             ec.set(node, "hostname", "localhost")
680         else:
681             ec.set(node, "hostname", host)
682             ec.set(node, "username", user)
683             ec.set(node, "identity", identity)
684         
685         ec.set(node, "cleanProcesses", True)
686         #ec.set(node, "cleanHome", True)
687
688         simu = ec.register_resource("linux::ns3::Simulation")
689         ec.set(simu, "verbose", True)
690         ec.set(simu, "populateRoutingTables", True)
691         ec.register_connection(simu, node)
692
693         nsnode1 = add_ns3_node(ec, simu)
694         p2p12 = add_point2point_device(ec, nsnode1, "10.0.0.1", "30")
695
696         nsnode2 = add_ns3_node(ec, simu)
697         p2p21 = add_point2point_device(ec, nsnode2, "10.0.0.2", "30")
698         csma2 = add_csma_device(ec, nsnode2, "10.0.1.1", "24")
699
700         nsnode3 = add_ns3_node(ec, simu)
701         csma3 = add_csma_device(ec, nsnode3, "10.0.1.2", "24")
702
703         nsnode4 = add_ns3_node(ec, simu)
704         csma4 = add_csma_device(ec, nsnode4, "10.0.1.3", "24")
705
706         nsnode5 = add_ns3_node(ec, simu)
707         p2p56 = add_point2point_device(ec, nsnode5, "10.0.2.1", "30")
708         csma5 = add_csma_device(ec, nsnode5, "10.0.1.4", "24")
709
710         nsnode6 = add_ns3_node(ec, simu)
711         p2p65 = add_point2point_device(ec, nsnode6, "10.0.2.2", "30")
712
713         # P2P chan1
714         p2p_chan1 = ec.register_resource("ns3::PointToPointChannel")
715         ec.set(p2p_chan1, "Delay", "0s")
716         ec.register_connection(p2p_chan1, p2p12)
717         ec.register_connection(p2p_chan1, p2p21)
718
719         # CSMA chan
720         csma_chan = ec.register_resource("ns3::CsmaChannel")
721         ec.set(csma_chan, "Delay", "0s")
722         ec.register_connection(csma_chan, csma2)
723         ec.register_connection(csma_chan, csma3)
724         ec.register_connection(csma_chan, csma4)
725         ec.register_connection(csma_chan, csma5)
726
727         # P2P chan2
728         p2p_chan2 = ec.register_resource("ns3::PointToPointChannel")
729         ec.set(p2p_chan2, "Delay", "0s")
730         ec.register_connection(p2p_chan2, p2p56)
731         ec.register_connection(p2p_chan2, p2p65)
732
733         ### create pinger
734         ping = ec.register_resource("ns3::V4Ping")
735         ec.set (ping, "Remote", "10.0.1.2")
736         ec.set (ping, "Interval", "1s")
737         ec.set (ping, "Verbose", True)
738         ec.set (ping, "StartTime", "1s")
739         ec.set (ping, "StopTime", "21s")
740         ec.register_connection(ping, nsnode1)
741
742         ec.deploy()
743
744         ec.wait_finished([ping])
745         
746         stdout = ec.trace(simu, "stdout")
747
748         print stdout
749
750         expected = "20 packets transmitted, 20 received, 0% packet loss"
751         self.assertTrue(stdout.find(expected) > -1)
752
753         ec.shutdown()
754
755     @skipIfNotAlive
756     def t_dce(self, host, user = None, identity = None):
757         ec = ExperimentController(exp_id = "test-ns3-dce")
758         
759         node = ec.register_resource("linux::Node")
760         if host == "localhost":
761             ec.set(node, "hostname", host)
762         else:
763             ec.set(node, "hostname", host)
764             ec.set(node, "username", user)
765             ec.set(node, "identity", identity)
766
767         ec.set(node, "cleanProcesses", True)
768         #ec.set(node, "cleanHome", True)
769
770         simu = ec.register_resource("linux::ns3::Simulation")
771         ec.set(simu, "verbose", True)
772         ec.set(simu, "buildMode", "debug")
773         ec.set(simu, "nsLog", "DceApplication")
774         ec.register_connection(simu, node)
775
776         nsnode1 = add_ns3_node(ec, simu)
777         p2p1 = add_point2point_device(ec, nsnode1, "10.0.0.1", "30")
778         ec.set(p2p1, "DataRate", "5Mbps")
779
780         nsnode2 = add_ns3_node(ec, simu)
781         p2p2 = add_point2point_device(ec, nsnode2, "10.0.0.2", "30")
782         ec.set(p2p2, "DataRate", "5Mbps")
783
784         # Create channel
785         chan = ec.register_resource("ns3::PointToPointChannel")
786         ec.set(chan, "Delay", "2ms")
787
788         ec.register_connection(chan, p2p1)
789         ec.register_connection(chan, p2p2)
790
791         ### create applications
792         udp_perf = ec.register_resource("linux::ns3::dce::Application")
793         ec.set (udp_perf, "binary", "udp-perf")
794         ec.set (udp_perf, "stackSize", 1<<20)
795         ec.set (udp_perf, "arguments", "--duration=10;--nodes=2")
796         ec.set (udp_perf, "StartTime", "1s")
797         ec.set (udp_perf, "StopTime", "20s")
798         ec.register_connection(udp_perf, nsnode1)
799
800         udp_perf_client = ec.register_resource("linux::ns3::dce::Application")
801         ec.set (udp_perf_client, "binary", "udp-perf")
802         ec.set (udp_perf_client, "stackSize", 1<<20)
803         ec.set (udp_perf_client, "arguments", "--client;--nodes=2;--host=10.0.0.1;--duration=10")
804         ec.set (udp_perf_client, "StartTime", "2s")
805         ec.set (udp_perf_client, "StopTime", "20s")
806         ec.register_connection(udp_perf_client, nsnode2)
807
808         ec.deploy()
809
810         ec.wait_finished([udp_perf_client])
811
812         expected = "udp-perf --duration=10 --nodes=2"
813         cmdline = ec.trace(udp_perf, "cmdline")
814         self.assertTrue(cmdline.find(expected) > -1, cmdline)
815
816         expected = "Start Time: NS3 Time:          1s ("
817         status = ec.trace(udp_perf, "status")
818         self.assertTrue(status.find(expected) > -1, status)
819
820         expected = "received=1500 bytes, 1 reads (@1500 bytes) 1500"
821         stdout = ec.trace(udp_perf, "stdout")
822         self.assertTrue(stdout.find(expected) > -1, stdout)
823
824         stderr = ec.trace(simu, "stderr")
825         expected = "DceApplication:StartApplication"
826         self.assertTrue(stderr.find(expected) > -1, stderr)
827
828         ec.shutdown()
829     
830     def test_p2p_ping_fedora(self):
831         self.t_p2p_ping(self.fedora_host, self.fedora_user, self.fedora_identity)
832
833     def test_p2p_ping_local(self):
834         self.t_p2p_ping("localhost")
835
836     def test_csma_ping_fedora(self):
837         self.t_csma_ping(self.fedora_host, self.fedora_user, self.fedora_identity)
838
839     def test_csma_ping_local(self):
840         self.t_csma_ping("localhost")
841
842     def test_wifi_ping_fedora(self):
843         self.t_wifi_ping(self.fedora_host, self.fedora_user, self.fedora_identity)
844
845     def test_wifi_ping_local(self):
846         self.t_wifi_ping("localhost")
847
848     def test_user_sources_fedora(self):
849         self.t_user_sources(self.fedora_host, self.fedora_user, self.fedora_identity)
850
851     def test_user_sources_local(self):
852         self.t_user_sources("localhost")
853
854     def test_compile_debug_mode_fedora(self):
855         self.t_compile_debug_mode(self.fedora_host, self.fedora_user, self.fedora_identity)
856
857     def test_compile_debug_mode_local(self):
858         self.t_compile_debug_mode("localhost")
859
860     def test_real_time_fedora(self):
861         self.t_real_time(self.fedora_host, self.fedora_user, self.fedora_identity)
862
863     def test_real_time_local(self):
864         self.t_real_time("localhost")
865
866     def test_traces_fedora(self):
867         self.t_traces(self.fedora_host, self.fedora_user, self.fedora_identity)
868
869     def test_traces_local(self):
870         self.t_traces("localhost")
871
872     def test_routing_fedora(self):
873         self.t_routing(self.fedora_host, self.fedora_user, self.fedora_identity)
874
875     def test_routing_local(self):
876         self.t_routing("localhost")
877
878     def test_dce_fedora(self):
879         self.t_dce(self.fedora_host, self.fedora_user, self.fedora_identity)
880
881     def test_dce_local(self):
882         self.t_dce("localhost")
883
884
885 if __name__ == '__main__':
886     unittest.main()
887