systematic use of context managers for dealing with files instead of open()/close...
[nepi.git] / test / resources / linux / ns3 / cross_dce_linux_ccn.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 version 2 as
8 #    published by the Free Software Foundation;
9 #
10 #    This program is distributed in the hope that it will be useful,
11 #    but WITHOUT ANY WARRANTY; without even the implied warranty of
12 #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 #    GNU General Public License for more details.
14 #
15 #    You should have received a copy of the GNU General Public License
16 #    along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 #
18 # Author: Alina Quereilhac <alina.quereilhac@inria.fr>
19
20 from nepi.execution.ec import ExperimentController 
21 from nepi.execution.resource import ResourceState, ResourceAction
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.set(node, "enableStack", True)
33     ec.register_connection(node, simu)
34
35     return node
36
37 def add_fd_device(ec, node, ip, prefix):
38     dev = ec.register_resource("ns3::FdNetDevice")
39     ec.set(dev, "ip", ip)
40     ec.set(dev, "prefix", prefix)
41     ec.register_connection(node, dev)
42
43     return dev
44
45 def add_tap_device(ec, node, ip, prefix):
46     dev = ec.register_resource("linux::Tap")
47     ec.set(dev, "ip", ip)
48     ec.set(dev, "prefix", prefix)
49     ec.register_connection(node, dev)
50     
51     return dev
52
53 def add_point2point_device(ec, node, ip, prefix):
54     dev = ec.register_resource("ns3::PointToPointNetDevice")
55     ec.set(dev, "ip", ip)
56     ec.set(dev, "prefix", prefix)
57     ec.register_connection(node, dev)
58
59     queue = ec.register_resource("ns3::DropTailQueue")
60     ec.register_connection(dev, queue)
61
62     return dev
63
64 class LinuxNS3FdNetDeviceTest(unittest.TestCase):
65     def setUp(self):
66         self.fedora_host = "nepi2.pl.sophia.inria.fr"
67         self.fedora_user = "inria_nepi"
68         self.fedora_identity = "%s/.ssh/id_rsa_planetlab" % (os.environ['HOME'])
69
70     @skipIfNotAlive
71     def t_cross_ccnpeek(self, host, user = None, identity = None):
72         ec = ExperimentController(exp_id = "test-linux-ns3-ccnpeek")
73         
74         node = ec.register_resource("linux::Node")
75         if host == "localhost":
76             ec.set(node, "hostname", "localhost")
77         else:
78             ec.set(node, "hostname", host)
79             ec.set(node, "username", user)
80             ec.set(node, "identity", identity)
81         
82         ec.set(node, "cleanProcesses", True)
83         ec.set(node, "cleanExperiment", True)
84
85         simu = ec.register_resource("linux::ns3::Simulation")
86         ec.set(simu, "simulatorImplementationType", "ns3::RealtimeSimulatorImpl")
87         ec.set(simu, "checksumEnabled", True)
88         ec.set(simu, "verbose", True)
89         #ec.set(simu, "buildMode", "debug")
90         #ec.set(simu, "nsLog", "FdNetDevice")
91         ec.register_connection(simu, node)
92
93         nsnode = add_ns3_node(ec, simu)
94
95         fddev = add_fd_device(ec, nsnode, "10.0.0.2", "30")
96         ec.enable_trace(fddev, "pcap")
97         ec.enable_trace(fddev, "promiscPcap")
98         ec.enable_trace(fddev, "ascii")
99
100         tap = add_tap_device(ec, node, "10.0.0.1", "30")
101
102         crosslink = ec.register_resource("linux::ns3::TunTapFdLink")
103         ec.register_connection(crosslink, tap)
104         ec.register_connection(crosslink, fddev)
105
106         ### create DCE applications
107         ccnd1 = ec.register_resource("linux::ns3::dce::CCND")
108         ec.set(ccnd1, "stackSize", 1<<20)
109         ec.set(ccnd1, "StartTime", "1s")
110         ec.register_connection(ccnd1, nsnode)
111
112         poke = ec.register_resource("linux::ns3::dce::CCNPoke")
113         ec.set(poke, "contentName", "ccnx:/chunk0")
114         ec.set(poke, "content", "DATA")
115         ec.set(poke, "stackSize", 1<<20)
116         ec.set(poke, "StartTime", "4s")
117         ec.register_connection(poke, nsnode)
118
119         fib1 = ec.register_resource("linux::ns3::dce::FIBEntry")
120         ec.set(fib1, "protocol", "udp") 
121         ec.set(fib1, "uri", "ccnx:/") 
122         ec.set(fib1, "host", "10.0.0.1")
123         ec.set(fib1, "stackSize", 1<<20)
124         ec.set(fib1, "StartTime", "2s")
125         ec.register_connection(fib1, nsnode)
126
127         ### create Linux applications
128         ccnd2 = ec.register_resource("linux::CCND")
129         ec.register_connection(ccnd2, node)
130
131         peek = ec.register_resource("linux::CCNPeek")
132         ec.set(peek, "contentName", "ccnx:/chunk0")
133         ec.register_connection(peek, ccnd2)
134         
135         fib2 = ec.register_resource("linux::FIBEntry")
136         ec.set(fib2, "protocol", "udp") 
137         ec.set(fib2, "uri", "ccnx:/") 
138         ec.set(fib2, "host", "10.0.0.2")
139         ec.register_connection(fib2, ccnd2)
140
141         ec.register_condition(peek, ResourceAction.START, poke,
142             ResourceState.STARTED)
143  
144         ec.deploy()
145
146         ec.wait_finished([peek])
147
148         stdout = ec.trace(peek, "stdout")
149         expected = "DATA"
150         self.assertTrue(stdout.find(expected) > -1)
151
152         ec.shutdown()
153
154     @skipIfNotAlive
155     def t_cross_ccncat(self, host, user = None, identity = None):
156         ec = ExperimentController(exp_id = "test-linux-ns3-ccncat")
157         
158         node = ec.register_resource("linux::Node")
159         if host == "localhost":
160             ec.set(node, "hostname", "localhost")
161         else:
162             ec.set(node, "hostname", host)
163             ec.set(node, "username", user)
164             ec.set(node, "identity", identity)
165         
166         ec.set(node, "cleanProcesses", True)
167         ec.set(node, "cleanExperiment", True)
168
169         simu = ec.register_resource("linux::ns3::Simulation")
170         ec.set(simu, "simulatorImplementationType", "ns3::RealtimeSimulatorImpl")
171         ec.set(simu, "checksumEnabled", True)
172         ec.set(simu, "verbose", True)
173         #ec.set(simu, "buildMode", "debug")
174         #ec.set(simu, "nsLog", "FdNetDevice")
175         ec.register_connection(simu, node)
176
177         nsnode = add_ns3_node(ec, simu)
178
179         fddev = add_fd_device(ec, nsnode, "10.0.0.2", "30")
180         ec.enable_trace(fddev, "pcap")
181         ec.enable_trace(fddev, "promiscPcap")
182         ec.enable_trace(fddev, "ascii")
183
184         tap = add_tap_device(ec, node, "10.0.0.1", "30")
185
186         crosslink = ec.register_resource("linux::ns3::TunTapFdLink")
187         ec.register_connection(crosslink, tap)
188         ec.register_connection(crosslink, fddev)
189
190         ### create DCE applications
191         ccnd1 = ec.register_resource("linux::ns3::dce::CCND")
192         ec.set(ccnd1, "stackSize", 1<<20)
193         ec.set(ccnd1, "StartTime", "1s")
194         ec.register_connection(ccnd1, nsnode)
195
196         repofile = os.path.join(
197             os.path.dirname(os.path.realpath(__file__)),
198             "ccn", 
199             "repoFile1")
200
201         ccnr = ec.register_resource("linux::ns3::dce::CCNR")
202         ec.set (ccnr, "repoFile1", repofile) 
203         ec.set (ccnr, "stackSize", 1<<20)
204         ec.set (ccnr, "StartTime", "2s")
205         ec.set (ccnr, "StopTime", "4s")
206         ec.register_connection(ccnr, nsnode)
207
208         fib1 = ec.register_resource("linux::ns3::dce::FIBEntry")
209         ec.set(fib1, "protocol", "udp") 
210         ec.set(fib1, "uri", "ccnx:/") 
211         ec.set(fib1, "host", "10.0.0.1")
212         ec.set(fib1, "stackSize", 1<<20)
213         ec.set(fib1, "StartTime", "2s")
214         ec.register_connection(fib1, nsnode)
215
216         ### create Linux applications
217         ccnd2 = ec.register_resource("linux::CCND")
218         ec.register_connection(ccnd2, node)
219
220         ccncat = ec.register_resource("linux::CCNCat")
221         ec.set(ccncat, "contentName", "ccnx:/test/bunny.ts")
222         ec.register_connection(ccncat, ccnd2)
223         """
224        
225         peek = ec.register_resource("linux::CCNPeek")
226         ec.set(peek, "contentName", "ccnx:/test/bunny.ts")
227         ec.register_connection(peek, ccnd2)
228         """
229
230         fib2 = ec.register_resource("linux::FIBEntry")
231         ec.set(fib2, "protocol", "udp") 
232         ec.set(fib2, "uri", "ccnx:/") 
233         ec.set(fib2, "host", "10.0.0.2")
234         ec.register_connection(fib2, ccnd2)
235
236         ec.register_condition(ccncat, ResourceAction.START, ccnr,
237             ResourceState.STARTED)
238  
239         ec.deploy()
240
241         #ec.wait_finished([ccncat])
242         import time
243         time.sleep(60)
244
245         stdout = ec.trace(ccncat, "stdout")
246         with open("bunny.ts", "w") as f:
247             f.write(stdout)
248
249         #expected = "DATA"
250         #self.assertTrue(stdout.find(expected) > -1)
251
252         ec.shutdown()
253
254     def ztest_cross_ccnpeek_fedora(self):
255         self.t_cross_cnnpeek(self.fedora_host, self.fedora_user, self.fedora_identity)
256
257     def ztest_cross_ccnpeek_local(self):
258         self.t_cross_ccnpeek("localhost")
259
260     def test_cross_ccncat_local(self):
261         self.t_cross_ccncat("localhost")
262
263 if __name__ == '__main__':
264     unittest.main()
265