1 # Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
7 # http://www.apache.org/licenses/LICENSE-2.0
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
16 # vim: tabstop=4 shiftwidth=4 softtabstop=4
22 from nose.tools import eq_
23 from ryu.lib.packet import bpdu
26 LOG = logging.getLogger(__name__)
29 class Test_ConfigurationBPDUs(unittest.TestCase):
30 """ Test case for ConfigurationBPDUs
34 self.protocol_id = bpdu.PROTOCOL_IDENTIFIER
35 self.version_id = bpdu.ConfigurationBPDUs.VERSION_ID
36 self.bpdu_type = bpdu.ConfigurationBPDUs.BPDU_TYPE
37 self.flags = 0b00000001
38 self.root_priority = 4096
39 self.root_system_id_extension = 1
40 self.root_mac_address = '12:34:56:78:9a:bc'
41 self.root_path_cost = 2
42 self.bridge_priority = 8192
43 self.bridge_system_id_extension = 3
44 self.bridge_mac_address = 'aa:aa:aa:aa:aa:aa'
45 self.port_priority = 16
50 self.forward_delay = 8
52 self.msg = bpdu.ConfigurationBPDUs(
54 root_priority=self.root_priority,
55 root_system_id_extension=self.root_system_id_extension,
56 root_mac_address=self.root_mac_address,
57 root_path_cost=self.root_path_cost,
58 bridge_priority=self.bridge_priority,
59 bridge_system_id_extension=self.bridge_system_id_extension,
60 bridge_mac_address=self.bridge_mac_address,
61 port_priority=self.port_priority,
62 port_number=self.port_number,
63 message_age=self.message_age,
65 hello_time=self.hello_time,
66 forward_delay=self.forward_delay)
68 self.fmt = (bpdu.bpdu._PACK_STR
69 + bpdu.ConfigurationBPDUs._PACK_STR[1:])
70 self.buf = struct.pack(self.fmt,
71 self.protocol_id, self.version_id,
72 self.bpdu_type, self.flags,
73 bpdu.ConfigurationBPDUs.encode_bridge_id(
75 self.root_system_id_extension,
76 self.root_mac_address),
78 bpdu.ConfigurationBPDUs.encode_bridge_id(
80 self.bridge_system_id_extension,
81 self.bridge_mac_address),
82 bpdu.ConfigurationBPDUs.encode_port_id(
85 bpdu.ConfigurationBPDUs._encode_timer(
87 bpdu.ConfigurationBPDUs._encode_timer(
89 bpdu.ConfigurationBPDUs._encode_timer(
91 bpdu.ConfigurationBPDUs._encode_timer(
95 eq_(self.protocol_id, self.msg._protocol_id)
96 eq_(self.version_id, self.msg._version_id)
97 eq_(self.bpdu_type, self.msg._bpdu_type)
98 eq_(self.flags, self.msg.flags)
99 eq_(self.root_priority, self.msg.root_priority)
100 eq_(self.root_system_id_extension,
101 self.msg.root_system_id_extension)
102 eq_(self.root_mac_address, self.msg.root_mac_address)
103 eq_(self.root_path_cost, self.msg.root_path_cost)
104 eq_(self.bridge_priority, self.msg.bridge_priority)
105 eq_(self.bridge_system_id_extension,
106 self.msg.bridge_system_id_extension)
107 eq_(self.bridge_mac_address, self.msg.bridge_mac_address)
108 eq_(self.port_priority, self.msg.port_priority)
109 eq_(self.port_number, self.msg.port_number)
110 eq_(self.message_age, self.msg.message_age)
111 eq_(self.max_age, self.msg.max_age)
112 eq_(self.hello_time, self.msg.hello_time)
113 eq_(self.forward_delay, self.msg.forward_delay)
115 def test_parser(self):
116 r1, r2, _ = bpdu.bpdu.parser(self.buf)
118 eq_(type(r1), type(self.msg))
119 eq_(r1._protocol_id, self.protocol_id)
120 eq_(r1._version_id, self.version_id)
121 eq_(r1._bpdu_type, self.bpdu_type)
122 eq_(r1.flags, self.flags)
123 eq_(r1.root_priority, self.root_priority)
124 eq_(r1.root_system_id_extension, self.root_system_id_extension)
125 eq_(r1.root_mac_address, self.root_mac_address)
126 eq_(r1.root_path_cost, self.root_path_cost)
127 eq_(r1.bridge_priority, self.bridge_priority)
128 eq_(r1.bridge_system_id_extension, self.bridge_system_id_extension)
129 eq_(r1.bridge_mac_address, self.bridge_mac_address)
130 eq_(r1.port_priority, self.port_priority)
131 eq_(r1.port_number, self.port_number)
132 eq_(r1.message_age, self.message_age)
133 eq_(r1.max_age, self.max_age)
134 eq_(r1.hello_time, self.hello_time)
135 eq_(r1.forward_delay, self.forward_delay)
138 def test_serialize(self):
141 buf = self.msg.serialize(data, prev)
142 res = struct.unpack(self.fmt, buf)
144 eq_(res[0], self.protocol_id)
145 eq_(res[1], self.version_id)
146 eq_(res[2], self.bpdu_type)
147 eq_(res[3], self.flags)
148 eq_(bpdu.ConfigurationBPDUs._decode_bridge_id(res[4]),
150 self.root_system_id_extension,
151 self.root_mac_address))
152 eq_(res[5], self.root_path_cost)
153 eq_(bpdu.ConfigurationBPDUs._decode_bridge_id(res[6]),
154 (self.bridge_priority,
155 self.bridge_system_id_extension,
156 self.bridge_mac_address))
157 eq_(bpdu.ConfigurationBPDUs._decode_port_id(res[7]),
160 eq_(bpdu.ConfigurationBPDUs._decode_timer(res[8]), self.message_age)
161 eq_(bpdu.ConfigurationBPDUs._decode_timer(res[9]), self.max_age)
162 eq_(bpdu.ConfigurationBPDUs._decode_timer(res[10]), self.hello_time)
163 eq_(bpdu.ConfigurationBPDUs._decode_timer(res[11]), self.forward_delay)
166 jsondict = self.msg.to_jsondict()
167 msg = bpdu.ConfigurationBPDUs.from_jsondict(
168 jsondict['ConfigurationBPDUs'])
169 eq_(str(self.msg), str(msg))
172 class Test_TopologyChangeNotificationBPDUs(unittest.TestCase):
173 """ Test case for TopologyChangeNotificationBPDUs
177 self.protocol_id = bpdu.PROTOCOL_IDENTIFIER
178 self.version_id = bpdu.TopologyChangeNotificationBPDUs.VERSION_ID
179 self.bpdu_type = bpdu.TopologyChangeNotificationBPDUs.BPDU_TYPE
181 self.msg = bpdu.TopologyChangeNotificationBPDUs()
183 self.fmt = bpdu.bpdu._PACK_STR
184 self.buf = struct.pack(self.fmt,
190 eq_(self.protocol_id, self.msg._protocol_id)
191 eq_(self.version_id, self.msg._version_id)
192 eq_(self.bpdu_type, self.msg._bpdu_type)
194 def test_parser(self):
195 r1, r2, _ = bpdu.bpdu.parser(self.buf)
197 eq_(type(r1), type(self.msg))
198 eq_(r1._protocol_id, self.protocol_id)
199 eq_(r1._version_id, self.version_id)
200 eq_(r1._bpdu_type, self.bpdu_type)
203 def test_serialize(self):
206 buf = self.msg.serialize(data, prev)
207 res = struct.unpack(self.fmt, buf)
209 eq_(res[0], self.protocol_id)
210 eq_(res[1], self.version_id)
211 eq_(res[2], self.bpdu_type)
214 jsondict = self.msg.to_jsondict()
215 msg = bpdu.TopologyChangeNotificationBPDUs.from_jsondict(
216 jsondict['TopologyChangeNotificationBPDUs'])
217 eq_(str(self.msg), str(msg))
220 class Test_RstBPDUs(unittest.TestCase):
221 """ Test case for RstBPDUs
225 self.protocol_id = bpdu.PROTOCOL_IDENTIFIER
226 self.version_id = bpdu.RstBPDUs.VERSION_ID
227 self.bpdu_type = bpdu.RstBPDUs.BPDU_TYPE
228 self.flags = 0b01111110
229 self.root_priority = 4096
230 self.root_system_id_extension = 1
231 self.root_mac_address = '12:34:56:78:9a:bc'
232 self.root_path_cost = 2
233 self.bridge_priority = 8192
234 self.bridge_system_id_extension = 3
235 self.bridge_mac_address = 'aa:aa:aa:aa:aa:aa'
236 self.port_priority = 16
241 self.forward_delay = 8
242 self.version_1_length = bpdu.VERSION_1_LENGTH
244 self.msg = bpdu.RstBPDUs(
246 root_priority=self.root_priority,
247 root_system_id_extension=self.root_system_id_extension,
248 root_mac_address=self.root_mac_address,
249 root_path_cost=self.root_path_cost,
250 bridge_priority=self.bridge_priority,
251 bridge_system_id_extension=self.bridge_system_id_extension,
252 bridge_mac_address=self.bridge_mac_address,
253 port_priority=self.port_priority,
254 port_number=self.port_number,
255 message_age=self.message_age,
256 max_age=self.max_age,
257 hello_time=self.hello_time,
258 forward_delay=self.forward_delay)
260 self.fmt = (bpdu.bpdu._PACK_STR
261 + bpdu.ConfigurationBPDUs._PACK_STR[1:]
262 + bpdu.RstBPDUs._PACK_STR[1:])
263 self.buf = struct.pack(self.fmt,
264 self.protocol_id, self.version_id,
265 self.bpdu_type, self.flags,
266 bpdu.RstBPDUs.encode_bridge_id(
268 self.root_system_id_extension,
269 self.root_mac_address),
271 bpdu.RstBPDUs.encode_bridge_id(
272 self.bridge_priority,
273 self.bridge_system_id_extension,
274 self.bridge_mac_address),
275 bpdu.RstBPDUs.encode_port_id(
278 bpdu.RstBPDUs._encode_timer(self.message_age),
279 bpdu.RstBPDUs._encode_timer(self.max_age),
280 bpdu.RstBPDUs._encode_timer(self.hello_time),
281 bpdu.RstBPDUs._encode_timer(self.forward_delay),
282 self.version_1_length)
285 eq_(self.protocol_id, self.msg._protocol_id)
286 eq_(self.version_id, self.msg._version_id)
287 eq_(self.bpdu_type, self.msg._bpdu_type)
288 eq_(self.flags, self.msg.flags)
289 eq_(self.root_priority, self.msg.root_priority)
290 eq_(self.root_system_id_extension,
291 self.msg.root_system_id_extension)
292 eq_(self.root_mac_address, self.msg.root_mac_address)
293 eq_(self.root_path_cost, self.msg.root_path_cost)
294 eq_(self.bridge_priority, self.msg.bridge_priority)
295 eq_(self.bridge_system_id_extension,
296 self.msg.bridge_system_id_extension)
297 eq_(self.bridge_mac_address, self.msg.bridge_mac_address)
298 eq_(self.port_priority, self.msg.port_priority)
299 eq_(self.port_number, self.msg.port_number)
300 eq_(self.message_age, self.msg.message_age)
301 eq_(self.max_age, self.msg.max_age)
302 eq_(self.hello_time, self.msg.hello_time)
303 eq_(self.forward_delay, self.msg.forward_delay)
304 eq_(self.version_1_length, self.msg._version_1_length)
306 def test_parser(self):
307 r1, r2, _ = bpdu.bpdu.parser(self.buf)
309 eq_(type(r1), type(self.msg))
310 eq_(r1._protocol_id, self.protocol_id)
311 eq_(r1._version_id, self.version_id)
312 eq_(r1._bpdu_type, self.bpdu_type)
313 eq_(r1.flags, self.flags)
314 eq_(r1.root_priority, self.root_priority)
315 eq_(r1.root_system_id_extension, self.root_system_id_extension)
316 eq_(r1.root_mac_address, self.root_mac_address)
317 eq_(r1.root_path_cost, self.root_path_cost)
318 eq_(r1.bridge_priority, self.bridge_priority)
319 eq_(r1.bridge_system_id_extension, self.bridge_system_id_extension)
320 eq_(r1.bridge_mac_address, self.bridge_mac_address)
321 eq_(r1.port_priority, self.port_priority)
322 eq_(r1.port_number, self.port_number)
323 eq_(r1.message_age, self.message_age)
324 eq_(r1.max_age, self.max_age)
325 eq_(r1.hello_time, self.hello_time)
326 eq_(r1.forward_delay, self.forward_delay)
327 eq_(r1._version_1_length, self.version_1_length)
330 def test_serialize(self):
333 buf = self.msg.serialize(data, prev)
334 res = struct.unpack(self.fmt, buf)
336 eq_(res[0], self.protocol_id)
337 eq_(res[1], self.version_id)
338 eq_(res[2], self.bpdu_type)
339 eq_(res[3], self.flags)
340 eq_(bpdu.RstBPDUs._decode_bridge_id(res[4]),
342 self.root_system_id_extension,
343 self.root_mac_address))
344 eq_(res[5], self.root_path_cost)
345 eq_(bpdu.RstBPDUs._decode_bridge_id(res[6]),
346 (self.bridge_priority,
347 self.bridge_system_id_extension,
348 self.bridge_mac_address))
349 eq_(bpdu.RstBPDUs._decode_port_id(res[7]),
352 eq_(bpdu.RstBPDUs._decode_timer(res[8]), self.message_age)
353 eq_(bpdu.RstBPDUs._decode_timer(res[9]), self.max_age)
354 eq_(bpdu.RstBPDUs._decode_timer(res[10]), self.hello_time)
355 eq_(bpdu.RstBPDUs._decode_timer(res[11]), self.forward_delay)
356 eq_(res[12], self.version_1_length)
359 jsondict = self.msg.to_jsondict()
360 msg = bpdu.RstBPDUs.from_jsondict(jsondict['RstBPDUs'])
361 eq_(str(self.msg), str(msg))
364 class Test_UnknownVersion(unittest.TestCase):
365 """ Test case for unknown BPDU version
369 self.protocol_id = bpdu.PROTOCOL_IDENTIFIER
370 self.version_id = 111 # Unknown version
371 self.bpdu_type = bpdu.RstBPDUs.BPDU_TYPE
372 self.flags = 0b01111110
373 self.root_priority = 4096
374 self.root_system_id_extension = 1
375 self.root_mac_address = '12:34:56:78:9a:bc'
376 self.root_path_cost = 2
377 self.bridge_priority = 8192
378 self.bridge_system_id_extension = 3
379 self.bridge_mac_address = 'aa:aa:aa:aa:aa:aa'
380 self.port_priority = 16
385 self.forward_delay = 8
386 self.version_1_length = bpdu.VERSION_1_LENGTH
388 self.fmt = (bpdu.bpdu._PACK_STR
389 + bpdu.ConfigurationBPDUs._PACK_STR[1:]
390 + bpdu.RstBPDUs._PACK_STR[1:])
391 self.buf = struct.pack(self.fmt,
392 self.protocol_id, self.version_id,
393 self.bpdu_type, self.flags,
394 bpdu.RstBPDUs.encode_bridge_id(
396 self.root_system_id_extension,
397 self.root_mac_address),
399 bpdu.RstBPDUs.encode_bridge_id(
400 self.bridge_priority,
401 self.bridge_system_id_extension,
402 self.bridge_mac_address),
403 bpdu.RstBPDUs.encode_port_id(
406 bpdu.RstBPDUs._encode_timer(self.message_age),
407 bpdu.RstBPDUs._encode_timer(self.max_age),
408 bpdu.RstBPDUs._encode_timer(self.hello_time),
409 bpdu.RstBPDUs._encode_timer(self.forward_delay),
410 self.version_1_length)
412 def test_parser(self):
413 r1, r2, _ = bpdu.bpdu.parser(self.buf)
418 class Test_UnknownType(unittest.TestCase):
419 """ Test case for unknown BPDU type
423 self.protocol_id = bpdu.PROTOCOL_IDENTIFIER
424 self.version_id = bpdu.RstBPDUs.VERSION_ID
425 self.bpdu_type = 222 # Unknown type
426 self.flags = 0b01111110
427 self.root_priority = 4096
428 self.root_system_id_extension = 1
429 self.root_mac_address = '12:34:56:78:9a:bc'
430 self.root_path_cost = 2
431 self.bridge_priority = 8192
432 self.bridge_system_id_extension = 3
433 self.bridge_mac_address = 'aa:aa:aa:aa:aa:aa'
434 self.port_priority = 16
439 self.forward_delay = 8
440 self.version_1_length = bpdu.VERSION_1_LENGTH
442 self.fmt = (bpdu.bpdu._PACK_STR
443 + bpdu.ConfigurationBPDUs._PACK_STR[1:]
444 + bpdu.RstBPDUs._PACK_STR[1:])
445 self.buf = struct.pack(self.fmt,
446 self.protocol_id, self.version_id,
447 self.bpdu_type, self.flags,
448 bpdu.RstBPDUs.encode_bridge_id(
450 self.root_system_id_extension,
451 self.root_mac_address),
453 bpdu.RstBPDUs.encode_bridge_id(
454 self.bridge_priority,
455 self.bridge_system_id_extension,
456 self.bridge_mac_address),
457 bpdu.RstBPDUs.encode_port_id(
460 bpdu.RstBPDUs._encode_timer(self.message_age),
461 bpdu.RstBPDUs._encode_timer(self.max_age),
462 bpdu.RstBPDUs._encode_timer(self.hello_time),
463 bpdu.RstBPDUs._encode_timer(self.forward_delay),
464 self.version_1_length)
466 def test_parser(self):
467 r1, r2, _ = bpdu.bpdu.parser(self.buf)