3 # NEPI, a framework to manage network experiments
4 # Copyright (C) 2013 INRIA
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;
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.
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/>.
18 # Author: Alina Quereilhac <alina.quereilhac@inria.fr>
20 from nepi.execution.ec import ExperimentController
21 from nepi.execution.resource import ResourceState, ResourceAction
22 from nepi.execution.trace import TraceAttr
24 from test_utils import skipIfNotAlive
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)
37 def add_fd_device(ec, node, ip, prefix):
38 dev = ec.register_resource("ns3::FdNetDevice")
40 ec.set(dev, "prefix", prefix)
41 ec.register_connection(node, dev)
45 def add_tap_device(ec, node, ip, prefix):
46 dev = ec.register_resource("linux::Tap")
48 ec.set(dev, "prefix", prefix)
49 ec.register_connection(node, dev)
53 def add_point2point_device(ec, node, ip, prefix):
54 dev = ec.register_resource("ns3::PointToPointNetDevice")
56 ec.set(dev, "prefix", prefix)
57 ec.register_connection(node, dev)
59 queue = ec.register_resource("ns3::DropTailQueue")
60 ec.register_connection(dev, queue)
64 class LinuxNS3FdNetDeviceTest(unittest.TestCase):
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'])
71 def t_cross_ccnpeek(self, host, user = None, identity = None):
72 ec = ExperimentController(exp_id = "test-linux-ns3-ccnpeek")
74 node = ec.register_resource("linux::Node")
75 if host == "localhost":
76 ec.set(node, "hostname", "localhost")
78 ec.set(node, "hostname", host)
79 ec.set(node, "username", user)
80 ec.set(node, "identity", identity)
82 ec.set(node, "cleanProcesses", True)
83 ec.set(node, "cleanExperiment", True)
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)
93 nsnode = add_ns3_node(ec, simu)
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")
100 tap = add_tap_device(ec, node, "10.0.0.1", "30")
102 crosslink = ec.register_resource("linux::ns3::TunTapFdLink")
103 ec.register_connection(crosslink, tap)
104 ec.register_connection(crosslink, fddev)
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)
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)
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)
127 ### create Linux applications
128 ccnd2 = ec.register_resource("linux::CCND")
129 ec.register_connection(ccnd2, node)
131 peek = ec.register_resource("linux::CCNPeek")
132 ec.set(peek, "contentName", "ccnx:/chunk0")
133 ec.register_connection(peek, ccnd2)
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)
141 ec.register_condition(peek, ResourceAction.START, poke,
142 ResourceState.STARTED)
146 ec.wait_finished([peek])
148 stdout = ec.trace(peek, "stdout")
150 self.assertTrue(stdout.find(expected) > -1)
155 def t_cross_ccncat(self, host, user = None, identity = None):
156 ec = ExperimentController(exp_id = "test-linux-ns3-ccncat")
158 node = ec.register_resource("linux::Node")
159 if host == "localhost":
160 ec.set(node, "hostname", "localhost")
162 ec.set(node, "hostname", host)
163 ec.set(node, "username", user)
164 ec.set(node, "identity", identity)
166 ec.set(node, "cleanProcesses", True)
167 ec.set(node, "cleanExperiment", True)
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)
177 nsnode = add_ns3_node(ec, simu)
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")
184 tap = add_tap_device(ec, node, "10.0.0.1", "30")
186 crosslink = ec.register_resource("linux::ns3::TunTapFdLink")
187 ec.register_connection(crosslink, tap)
188 ec.register_connection(crosslink, fddev)
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)
196 repofile = os.path.join(
197 os.path.dirname(os.path.realpath(__file__)),
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)
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)
216 ### create Linux applications
217 ccnd2 = ec.register_resource("linux::CCND")
218 ec.register_connection(ccnd2, node)
220 ccncat = ec.register_resource("linux::CCNCat")
221 ec.set(ccncat, "contentName", "ccnx:/test/bunny.ts")
222 ec.register_connection(ccncat, ccnd2)
225 peek = ec.register_resource("linux::CCNPeek")
226 ec.set(peek, "contentName", "ccnx:/test/bunny.ts")
227 ec.register_connection(peek, ccnd2)
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)
236 ec.register_condition(ccncat, ResourceAction.START, ccnr,
237 ResourceState.STARTED)
241 #ec.wait_finished([ccncat])
245 stdout = ec.trace(ccncat, "stdout")
246 f = open("bunny.ts", "w")
251 #self.assertTrue(stdout.find(expected) > -1)
255 def ztest_cross_ccnpeek_fedora(self):
256 self.t_cross_cnnpeek(self.fedora_host, self.fedora_user, self.fedora_identity)
258 def ztest_cross_ccnpeek_local(self):
259 self.t_cross_ccnpeek("localhost")
261 def test_cross_ccncat_local(self):
262 self.t_cross_ccncat("localhost")
264 if __name__ == '__main__':