1# Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
2#
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
6#
7#    http://www.apache.org/licenses/LICENSE-2.0
8#
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
12# implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15
16# vim: tabstop=4 shiftwidth=4 softtabstop=4
17
18import copy
19import logging
20from struct import pack, unpack_from
21import unittest
22
23from nose.tools import ok_, eq_, raises
24from ryu.ofproto import ether
25from ryu.lib.packet.ethernet import ethernet
26from ryu.lib.packet.packet import Packet
27from ryu.lib import addrconv
28from ryu.lib.packet.slow import slow, lacp
29from ryu.lib.packet.slow import SLOW_PROTOCOL_MULTICAST
30from ryu.lib.packet.slow import SLOW_SUBTYPE_LACP
31from ryu.lib.packet.slow import SLOW_SUBTYPE_MARKER
32
33LOG = logging.getLogger(__name__)
34
35
36class Test_slow(unittest.TestCase):
37    """ Test case for Slow Protocol
38    """
39
40    def setUp(self):
41        self.subtype = SLOW_SUBTYPE_LACP
42        self.version = lacp.LACP_VERSION_NUMBER
43        self.actor_tag = lacp.LACP_TLV_TYPE_ACTOR
44        self.actor_length = 20
45        self.actor_system_priority = 65534
46        self.actor_system = '00:07:0d:af:f4:54'
47        self.actor_key = 1
48        self.actor_port_priority = 65535
49        self.actor_port = 1
50        self.actor_state_activity = lacp.LACP_STATE_ACTIVE
51        self.actor_state_timeout = lacp.LACP_STATE_LONG_TIMEOUT
52        self.actor_state_aggregation = lacp.LACP_STATE_AGGREGATEABLE
53        self.actor_state_synchronization = lacp.LACP_STATE_IN_SYNC
54        self.actor_state_collecting = lacp.LACP_STATE_COLLECTING_ENABLED
55        self.actor_state_distributing = lacp.LACP_STATE_DISTRIBUTING_ENABLED
56        self.actor_state_defaulted = lacp.LACP_STATE_OPERATIONAL_PARTNER
57        self.actor_state_expired = lacp.LACP_STATE_EXPIRED
58        self.actor_state = (
59            (self.actor_state_activity << 0) |
60            (self.actor_state_timeout << 1) |
61            (self.actor_state_aggregation << 2) |
62            (self.actor_state_synchronization << 3) |
63            (self.actor_state_collecting << 4) |
64            (self.actor_state_distributing << 5) |
65            (self.actor_state_defaulted << 6) |
66            (self.actor_state_expired << 7))
67        self.partner_tag = lacp.LACP_TLV_TYPE_PARTNER
68        self.partner_length = 20
69        self.partner_system_priority = 0
70        self.partner_system = '00:00:00:00:00:00'
71        self.partner_key = 0
72        self.partner_port_priority = 0
73        self.partner_port = 0
74        self.partner_state_activity = 0
75        self.partner_state_timeout = lacp.LACP_STATE_SHORT_TIMEOUT
76        self.partner_state_aggregation = 0
77        self.partner_state_synchronization = 0
78        self.partner_state_collecting = 0
79        self.partner_state_distributing = 0
80        self.partner_state_defaulted = 0
81        self.partner_state_expired = 0
82        self.partner_state = (
83            (self.partner_state_activity << 0) |
84            (self.partner_state_timeout << 1) |
85            (self.partner_state_aggregation << 2) |
86            (self.partner_state_synchronization << 3) |
87            (self.partner_state_collecting << 4) |
88            (self.partner_state_distributing << 5) |
89            (self.partner_state_defaulted << 6) |
90            (self.partner_state_expired << 7))
91        self.collector_tag = lacp.LACP_TLV_TYPE_COLLECTOR
92        self.collector_length = 16
93        self.collector_max_delay = 0
94        self.terminator_tag = lacp.LACP_TLV_TYPE_TERMINATOR
95        self.terminator_length = 0
96
97        self.head_fmt = lacp._HLEN_PACK_STR
98        self.head_len = lacp._HLEN_PACK_LEN
99        self.act_fmt = lacp._ACTPRT_INFO_PACK_STR
100        self.act_len = lacp._ACTPRT_INFO_PACK_LEN
101        self.prt_fmt = lacp._ACTPRT_INFO_PACK_STR
102        self.prt_len = lacp._ACTPRT_INFO_PACK_LEN
103        self.col_fmt = lacp._COL_INFO_PACK_STR
104        self.col_len = lacp._COL_INFO_PACK_LEN
105        self.trm_fmt = lacp._TRM_PACK_STR
106        self.trm_len = lacp._TRM_PACK_LEN
107        self.length = lacp._ALL_PACK_LEN
108
109        self.head_buf = pack(self.head_fmt,
110                             self.subtype,
111                             self.version)
112        self.act_buf = pack(self.act_fmt,
113                            self.actor_tag,
114                            self.actor_length,
115                            self.actor_system_priority,
116                            addrconv.mac.text_to_bin(self.actor_system),
117                            self.actor_key,
118                            self.actor_port_priority,
119                            self.actor_port,
120                            self.actor_state)
121        self.prt_buf = pack(self.prt_fmt,
122                            self.partner_tag,
123                            self.partner_length,
124                            self.partner_system_priority,
125                            addrconv.mac.text_to_bin(self.partner_system),
126                            self.partner_key,
127                            self.partner_port_priority,
128                            self.partner_port,
129                            self.partner_state)
130        self.col_buf = pack(self.col_fmt,
131                            self.collector_tag,
132                            self.collector_length,
133                            self.collector_max_delay)
134        self.trm_buf = pack(self.trm_fmt,
135                            self.terminator_tag,
136                            self.terminator_length)
137
138        self.buf = self.head_buf + self.act_buf + self.prt_buf + \
139            self.col_buf + self.trm_buf
140
141    def tearDown(self):
142        pass
143
144    def test_parser(self):
145        slow.parser(self.buf)
146
147    def test_not_implemented_subtype(self):
148        not_implemented_buf = pack(
149            slow._PACK_STR, SLOW_SUBTYPE_MARKER) + self.buf[1:]
150        (instance, nexttype, last) = slow.parser(not_implemented_buf)
151        assert instance is None
152        assert nexttype is None
153        assert last is not None
154
155    def test_invalid_subtype(self):
156        invalid_buf = b'\xff' + self.buf[1:]
157        (instance, nexttype, last) = slow.parser(invalid_buf)
158        assert instance is None
159        assert nexttype is None
160        assert last is not None
161
162
163class Test_lacp(unittest.TestCase):
164    """ Test case for lacp
165    """
166
167    def setUp(self):
168        self.subtype = SLOW_SUBTYPE_LACP
169        self.version = lacp.LACP_VERSION_NUMBER
170        self.actor_tag = lacp.LACP_TLV_TYPE_ACTOR
171        self.actor_length = 20
172        self.actor_system_priority = 65534
173        self.actor_system = '00:07:0d:af:f4:54'
174        self.actor_key = 1
175        self.actor_port_priority = 65535
176        self.actor_port = 1
177        self.actor_state_activity = lacp.LACP_STATE_ACTIVE
178        self.actor_state_timeout = lacp.LACP_STATE_LONG_TIMEOUT
179        self.actor_state_aggregation = lacp.LACP_STATE_AGGREGATEABLE
180        self.actor_state_synchronization = lacp.LACP_STATE_IN_SYNC
181        self.actor_state_collecting = lacp.LACP_STATE_COLLECTING_ENABLED
182        self.actor_state_distributing = lacp.LACP_STATE_DISTRIBUTING_ENABLED
183        self.actor_state_defaulted = lacp.LACP_STATE_OPERATIONAL_PARTNER
184        self.actor_state_expired = lacp.LACP_STATE_EXPIRED
185        self.actor_state = (
186            (self.actor_state_activity << 0) |
187            (self.actor_state_timeout << 1) |
188            (self.actor_state_aggregation << 2) |
189            (self.actor_state_synchronization << 3) |
190            (self.actor_state_collecting << 4) |
191            (self.actor_state_distributing << 5) |
192            (self.actor_state_defaulted << 6) |
193            (self.actor_state_expired << 7))
194        self.partner_tag = lacp.LACP_TLV_TYPE_PARTNER
195        self.partner_length = 20
196        self.partner_system_priority = 0
197        self.partner_system = '00:00:00:00:00:00'
198        self.partner_key = 0
199        self.partner_port_priority = 0
200        self.partner_port = 0
201        self.partner_state_activity = 0
202        self.partner_state_timeout = lacp.LACP_STATE_SHORT_TIMEOUT
203        self.partner_state_aggregation = 0
204        self.partner_state_synchronization = 0
205        self.partner_state_collecting = 0
206        self.partner_state_distributing = 0
207        self.partner_state_defaulted = 0
208        self.partner_state_expired = 0
209        self.partner_state = (
210            (self.partner_state_activity << 0) |
211            (self.partner_state_timeout << 1) |
212            (self.partner_state_aggregation << 2) |
213            (self.partner_state_synchronization << 3) |
214            (self.partner_state_collecting << 4) |
215            (self.partner_state_distributing << 5) |
216            (self.partner_state_defaulted << 6) |
217            (self.partner_state_expired << 7))
218        self.collector_tag = lacp.LACP_TLV_TYPE_COLLECTOR
219        self.collector_length = 16
220        self.collector_max_delay = 0
221        self.terminator_tag = lacp.LACP_TLV_TYPE_TERMINATOR
222        self.terminator_length = 0
223
224        self.head_fmt = lacp._HLEN_PACK_STR
225        self.head_len = lacp._HLEN_PACK_LEN
226        self.act_fmt = lacp._ACTPRT_INFO_PACK_STR
227        self.act_len = lacp._ACTPRT_INFO_PACK_LEN
228        self.prt_fmt = lacp._ACTPRT_INFO_PACK_STR
229        self.prt_len = lacp._ACTPRT_INFO_PACK_LEN
230        self.col_fmt = lacp._COL_INFO_PACK_STR
231        self.col_len = lacp._COL_INFO_PACK_LEN
232        self.trm_fmt = lacp._TRM_PACK_STR
233        self.trm_len = lacp._TRM_PACK_LEN
234        self.length = lacp._ALL_PACK_LEN
235
236        self.head_buf = pack(self.head_fmt,
237                             self.subtype,
238                             self.version)
239        self.act_buf = pack(self.act_fmt,
240                            self.actor_tag,
241                            self.actor_length,
242                            self.actor_system_priority,
243                            addrconv.mac.text_to_bin(self.actor_system),
244                            self.actor_key,
245                            self.actor_port_priority,
246                            self.actor_port,
247                            self.actor_state)
248        self.prt_buf = pack(self.prt_fmt,
249                            self.partner_tag,
250                            self.partner_length,
251                            self.partner_system_priority,
252                            addrconv.mac.text_to_bin(self.partner_system),
253                            self.partner_key,
254                            self.partner_port_priority,
255                            self.partner_port,
256                            self.partner_state)
257        self.col_buf = pack(self.col_fmt,
258                            self.collector_tag,
259                            self.collector_length,
260                            self.collector_max_delay)
261        self.trm_buf = pack(self.trm_fmt,
262                            self.terminator_tag,
263                            self.terminator_length)
264
265        self.buf = self.head_buf + self.act_buf + self.prt_buf + \
266            self.col_buf + self.trm_buf
267
268        self.l = lacp(self.version,
269                      self.actor_system_priority,
270                      self.actor_system,
271                      self.actor_key,
272                      self.actor_port_priority,
273                      self.actor_port,
274                      self.actor_state_activity,
275                      self.actor_state_timeout,
276                      self.actor_state_aggregation,
277                      self.actor_state_synchronization,
278                      self.actor_state_collecting,
279                      self.actor_state_distributing,
280                      self.actor_state_defaulted,
281                      self.actor_state_expired,
282                      self.partner_system_priority,
283                      self.partner_system,
284                      self.partner_key,
285                      self.partner_port_priority,
286                      self.partner_port,
287                      self.partner_state_activity,
288                      self.partner_state_timeout,
289                      self.partner_state_aggregation,
290                      self.partner_state_synchronization,
291                      self.partner_state_collecting,
292                      self.partner_state_distributing,
293                      self.partner_state_defaulted,
294                      self.partner_state_expired,
295                      self.collector_max_delay)
296
297    def tearDown(self):
298        pass
299
300    def find_protocol(self, pkt, name):
301        for p in pkt.protocols:
302            if p.protocol_name == name:
303                return p
304
305    def test_init(self):
306        eq_(self.subtype, self.l._subtype)
307        eq_(self.version, self.l.version)
308        eq_(self.actor_tag, self.l._actor_tag)
309        eq_(self.actor_length, self.l._actor_length)
310        eq_(self.actor_system_priority, self.l.actor_system_priority)
311        eq_(self.actor_system, self.l.actor_system)
312        eq_(self.actor_key, self.l.actor_key)
313        eq_(self.actor_port_priority, self.l.actor_port_priority)
314        eq_(self.actor_port, self.l.actor_port)
315        eq_(self.actor_state_activity, self.l.actor_state_activity)
316        eq_(self.actor_state_timeout, self.l.actor_state_timeout)
317        eq_(self.actor_state_aggregation,
318            self.l.actor_state_aggregation)
319        eq_(self.actor_state_synchronization,
320            self.l.actor_state_synchronization)
321        eq_(self.actor_state_collecting,
322            self.l.actor_state_collecting)
323        eq_(self.actor_state_distributing,
324            self.l.actor_state_distributing)
325        eq_(self.actor_state_defaulted, self.l.actor_state_defaulted)
326        eq_(self.actor_state_expired, self.l.actor_state_expired)
327        eq_(self.actor_state, self.l._actor_state)
328        eq_(self.partner_tag, self.l._partner_tag)
329        eq_(self.partner_length, self.l._partner_length)
330        eq_(self.partner_system_priority,
331            self.l.partner_system_priority)
332        eq_(self.partner_system, self.l.partner_system)
333        eq_(self.partner_key, self.l.partner_key)
334        eq_(self.partner_port_priority, self.l.partner_port_priority)
335        eq_(self.partner_port, self.l.partner_port)
336        eq_(self.partner_state_activity, self.l.partner_state_activity)
337        eq_(self.partner_state_timeout, self.l.partner_state_timeout)
338        eq_(self.partner_state_aggregation,
339            self.l.partner_state_aggregation)
340        eq_(self.partner_state_synchronization,
341            self.l.partner_state_synchronization)
342        eq_(self.partner_state_collecting,
343            self.l.partner_state_collecting)
344        eq_(self.partner_state_distributing,
345            self.l.partner_state_distributing)
346        eq_(self.partner_state_defaulted,
347            self.l.partner_state_defaulted)
348        eq_(self.partner_state_expired, self.l.partner_state_expired)
349        eq_(self.partner_state, self.l._partner_state)
350        eq_(self.collector_tag, self.l._collector_tag)
351        eq_(self.collector_length, self.l._collector_length)
352        eq_(self.collector_max_delay, self.l.collector_max_delay)
353        eq_(self.terminator_tag, self.l._terminator_tag)
354        eq_(self.terminator_length, self.l._terminator_length)
355
356    def test_parser(self):
357        _res = self.l.parser(self.buf)
358        if type(_res) is tuple:
359            res = _res[0]
360        else:
361            res = _res
362
363        eq_(res._subtype, self.subtype)
364        eq_(res.version, self.version)
365        eq_(res._actor_tag, self.actor_tag)
366        eq_(res._actor_length, self.actor_length)
367        eq_(res.actor_system_priority, self.actor_system_priority)
368        eq_(res.actor_system, self.actor_system)
369        eq_(res.actor_key, self.actor_key)
370        eq_(res.actor_port_priority, self.actor_port_priority)
371        eq_(res.actor_port, self.actor_port)
372        eq_(res.actor_state_activity, self.actor_state_activity)
373        eq_(res.actor_state_timeout, self.actor_state_timeout)
374        eq_(res.actor_state_aggregation, self.actor_state_aggregation)
375        eq_(res.actor_state_synchronization,
376            self.actor_state_synchronization)
377        eq_(res.actor_state_collecting, self.actor_state_collecting)
378        eq_(res.actor_state_distributing, self.actor_state_distributing)
379        eq_(res.actor_state_defaulted, self.actor_state_defaulted)
380        eq_(res.actor_state_expired, self.actor_state_expired)
381        eq_(res._actor_state, self.actor_state)
382        eq_(res._partner_tag, self.partner_tag)
383        eq_(res._partner_length, self.partner_length)
384        eq_(res.partner_system_priority, self.partner_system_priority)
385        eq_(res.partner_system, self.partner_system)
386        eq_(res.partner_key, self.partner_key)
387        eq_(res.partner_port_priority, self.partner_port_priority)
388        eq_(res.partner_port, self.partner_port)
389        eq_(res.partner_state_activity, self.partner_state_activity)
390        eq_(res.partner_state_timeout, self.partner_state_timeout)
391        eq_(res.partner_state_aggregation,
392            self.partner_state_aggregation)
393        eq_(res.partner_state_synchronization,
394            self.partner_state_synchronization)
395        eq_(res.partner_state_collecting, self.partner_state_collecting)
396        eq_(res.partner_state_distributing,
397            self.partner_state_distributing)
398        eq_(res.partner_state_defaulted, self.partner_state_defaulted)
399        eq_(res.partner_state_expired, self.partner_state_expired)
400        eq_(res._partner_state, self.partner_state)
401        eq_(res._collector_tag, self.collector_tag)
402        eq_(res._collector_length, self.collector_length)
403        eq_(res.collector_max_delay, self.collector_max_delay)
404        eq_(res._terminator_tag, self.terminator_tag)
405        eq_(res._terminator_length, self.terminator_length)
406
407    def test_serialize(self):
408        data = bytearray()
409        prev = None
410        buf = self.l.serialize(data, prev)
411
412        offset = 0
413        head_res = unpack_from(self.head_fmt, buf, offset)
414        offset += self.head_len
415        act_res = unpack_from(self.act_fmt, buf, offset)
416        offset += self.act_len
417        prt_res = unpack_from(self.prt_fmt, buf, offset)
418        offset += self.prt_len
419        col_res = unpack_from(self.col_fmt, buf, offset)
420        offset += self.col_len
421        trm_res = unpack_from(self.trm_fmt, buf, offset)
422
423        eq_(head_res[0], self.subtype)
424        eq_(head_res[1], self.version)
425
426        eq_(act_res[0], self.actor_tag)
427        eq_(act_res[1], self.actor_length)
428        eq_(act_res[2], self.actor_system_priority)
429        eq_(act_res[3], addrconv.mac.text_to_bin(self.actor_system))
430        eq_(act_res[4], self.actor_key)
431        eq_(act_res[5], self.actor_port_priority)
432        eq_(act_res[6], self.actor_port)
433        eq_(act_res[7], self.actor_state)
434
435        eq_(prt_res[0], self.partner_tag)
436        eq_(prt_res[1], self.partner_length)
437        eq_(prt_res[2], self.partner_system_priority)
438        eq_(prt_res[3], addrconv.mac.text_to_bin(self.partner_system))
439        eq_(prt_res[4], self.partner_key)
440        eq_(prt_res[5], self.partner_port_priority)
441        eq_(prt_res[6], self.partner_port)
442        eq_(prt_res[7], self.partner_state)
443
444        eq_(col_res[0], self.collector_tag)
445        eq_(col_res[1], self.collector_length)
446        eq_(col_res[2], self.collector_max_delay)
447
448        eq_(trm_res[0], self.terminator_tag)
449        eq_(trm_res[1], self.terminator_length)
450
451    def _build_lacp(self):
452        ethertype = ether.ETH_TYPE_SLOW
453        dst = SLOW_PROTOCOL_MULTICAST
454        e = ethernet(dst, self.actor_system, ethertype)
455        p = Packet()
456
457        p.add_protocol(e)
458        p.add_protocol(self.l)
459        p.serialize()
460        return p
461
462    def test_build_lacp(self):
463        p = self._build_lacp()
464
465        e = self.find_protocol(p, "ethernet")
466        ok_(e)
467        eq_(e.ethertype, ether.ETH_TYPE_SLOW)
468
469        l = self.find_protocol(p, "lacp")
470        ok_(l)
471
472        eq_(l._subtype, self.subtype)
473        eq_(l.version, self.version)
474        eq_(l._actor_tag, self.actor_tag)
475        eq_(l._actor_length, self.actor_length)
476        eq_(l.actor_system_priority, self.actor_system_priority)
477        eq_(l.actor_system, self.actor_system)
478        eq_(l.actor_key, self.actor_key)
479        eq_(l.actor_port_priority, self.actor_port_priority)
480        eq_(l.actor_port, self.actor_port)
481        eq_(l.actor_state_activity, self.actor_state_activity)
482        eq_(l.actor_state_timeout, self.actor_state_timeout)
483        eq_(l.actor_state_aggregation, self.actor_state_aggregation)
484        eq_(l.actor_state_synchronization,
485            self.actor_state_synchronization)
486        eq_(l.actor_state_collecting, self.actor_state_collecting)
487        eq_(l.actor_state_distributing, self.actor_state_distributing)
488        eq_(l.actor_state_defaulted, self.actor_state_defaulted)
489        eq_(l.actor_state_expired, self.actor_state_expired)
490        eq_(l._actor_state, self.actor_state)
491        eq_(l._partner_tag, self.partner_tag)
492        eq_(l._partner_length, self.partner_length)
493        eq_(l.partner_system_priority, self.partner_system_priority)
494        eq_(l.partner_system, self.partner_system)
495        eq_(l.partner_key, self.partner_key)
496        eq_(l.partner_port_priority, self.partner_port_priority)
497        eq_(l.partner_port, self.partner_port)
498        eq_(l.partner_state_activity, self.partner_state_activity)
499        eq_(l.partner_state_timeout, self.partner_state_timeout)
500        eq_(l.partner_state_aggregation, self.partner_state_aggregation)
501        eq_(l.partner_state_synchronization,
502            self.partner_state_synchronization)
503        eq_(l.partner_state_collecting, self.partner_state_collecting)
504        eq_(l.partner_state_distributing,
505            self.partner_state_distributing)
506        eq_(l.partner_state_defaulted, self.partner_state_defaulted)
507        eq_(l.partner_state_expired, self.partner_state_expired)
508        eq_(l._partner_state, self.partner_state)
509        eq_(l._collector_tag, self.collector_tag)
510        eq_(l._collector_length, self.collector_length)
511        eq_(l.collector_max_delay, self.collector_max_delay)
512        eq_(l._terminator_tag, self.terminator_tag)
513        eq_(l._terminator_length, self.terminator_length)
514
515    @raises(Exception)
516    def test_malformed_lacp(self):
517        m_short_buf = self.buf[1:self.length]
518        slow.parser(m_short_buf)
519
520    @raises(Exception)
521    def test_invalid_subtype(self):
522        invalid_lacv = copy.deepcopy(self.l)
523        invalid_lacv.subtype = 0xff
524        invalid_buf = invalid_lacv.serialize()
525        slow.parser(invalid_buf)
526
527    @raises(Exception)
528    def test_invalid_version(self):
529        invalid_lacv = copy.deepcopy(self.l)
530        invalid_lacv.version = 0xff
531        invalid_buf = invalid_lacv.serialize()
532        slow.parser(invalid_buf)
533
534    @raises(Exception)
535    def test_invalid_actor_tag(self):
536        invalid_lacv = copy.deepcopy(self.l)
537        invalid_lacv.actor_tag = 0x04
538        invalid_buf = invalid_lacv.serialize()
539        slow.parser(invalid_buf)
540
541    @raises(Exception)
542    def test_invalid_actor_length(self):
543        invalid_lacv = copy.deepcopy(self.l)
544        invalid_lacv.actor_length = 50
545        invalid_buf = invalid_lacv.serialize()
546        slow.parser(invalid_buf)
547
548    @raises(Exception)
549    def test_invalid_partner_tag(self):
550        invalid_lacv = copy.deepcopy(self.l)
551        invalid_lacv.partner_tag = 0x01
552        invalid_buf = invalid_lacv.serialize()
553        slow.parser(invalid_buf)
554
555    @raises(Exception)
556    def test_invalid_partner_length(self):
557        invalid_lacv = copy.deepcopy(self.l)
558        invalid_lacv.partner_length = 0
559        invalid_buf = invalid_lacv.serialize()
560        slow.parser(invalid_buf)
561
562    @raises(Exception)
563    def test_invalid_collector_tag(self):
564        invalid_lacv = copy.deepcopy(self.l)
565        invalid_lacv.collector_tag = 0x00
566        invalid_buf = invalid_lacv.serialize()
567        slow.parser(invalid_buf)
568
569    @raises(Exception)
570    def test_invalid_collector_length(self):
571        invalid_lacv = copy.deepcopy(self.l)
572        invalid_lacv.collector_length = 20
573        invalid_buf = invalid_lacv.serialize()
574        slow.parser(invalid_buf)
575
576    @raises(Exception)
577    def test_invalid_terminator_tag(self):
578        invalid_lacv = copy.deepcopy(self.l)
579        invalid_lacv.terminator_tag = 0x04
580        invalid_buf = invalid_lacv.serialize()
581        slow.parser(invalid_buf)
582
583    @raises(Exception)
584    def test_invalid_terminator_length(self):
585        invalid_lacv = copy.deepcopy(self.l)
586        invalid_lacv.terminator_length = self.trm_len
587        invalid_buf = invalid_lacv.serialize()
588        slow.parser(invalid_buf)
589
590    @raises(Exception)
591    def test_invalid_actor_state_activity(self):
592        l = lacp(self.version,
593                 self.actor_system_priority,
594                 self.actor_system,
595                 self.actor_key,
596                 self.actor_port_priority,
597                 self.actor_port,
598                 2,
599                 self.actor_state_timeout,
600                 self.actor_state_aggregation,
601                 self.actor_state_synchronization,
602                 self.actor_state_collecting,
603                 self.actor_state_distributing,
604                 self.actor_state_defaulted,
605                 self.actor_state_expired,
606                 self.partner_system_priority,
607                 self.partner_system,
608                 self.partner_key,
609                 self.partner_port_priority,
610                 self.partner_port,
611                 self.partner_state_activity,
612                 self.partner_state_timeout,
613                 self.partner_state_aggregation,
614                 self.partner_state_synchronization,
615                 self.partner_state_collecting,
616                 self.partner_state_distributing,
617                 self.partner_state_defaulted,
618                 self.partner_state_expired,
619                 self.collector_max_delay)
620        l.serialize()
621
622    @raises(Exception)
623    def test_invalid_actor_state_timeout(self):
624        l = lacp(self.version,
625                 self.actor_system_priority,
626                 self.actor_system,
627                 self.actor_key,
628                 self.actor_port_priority,
629                 self.actor_port,
630                 self.actor_state_activity,
631                 2,
632                 self.actor_state_aggregation,
633                 self.actor_state_synchronization,
634                 self.actor_state_collecting,
635                 self.actor_state_distributing,
636                 self.actor_state_defaulted,
637                 self.actor_state_expired,
638                 self.partner_system_priority,
639                 self.partner_system,
640                 self.partner_key,
641                 self.partner_port_priority,
642                 self.partner_port,
643                 self.partner_state_activity,
644                 self.partner_state_timeout,
645                 self.partner_state_aggregation,
646                 self.partner_state_synchronization,
647                 self.partner_state_collecting,
648                 self.partner_state_distributing,
649                 self.partner_state_defaulted,
650                 self.partner_state_expired,
651                 self.collector_max_delay)
652        l.serialize()
653
654    @raises(Exception)
655    def test_invalid_actor_state_aggregation(self):
656        l = lacp(self.version,
657                 self.actor_system_priority,
658                 self.actor_system,
659                 self.actor_key,
660                 self.actor_port_priority,
661                 self.actor_port,
662                 self.actor_state_activity,
663                 self.actor_state_timeout,
664                 2,
665                 self.actor_state_synchronization,
666                 self.actor_state_collecting,
667                 self.actor_state_distributing,
668                 self.actor_state_defaulted,
669                 self.actor_state_expired,
670                 self.partner_system_priority,
671                 self.partner_system,
672                 self.partner_key,
673                 self.partner_port_priority,
674                 self.partner_port,
675                 self.partner_state_activity,
676                 self.partner_state_timeout,
677                 self.partner_state_aggregation,
678                 self.partner_state_synchronization,
679                 self.partner_state_collecting,
680                 self.partner_state_distributing,
681                 self.partner_state_defaulted,
682                 self.partner_state_expired,
683                 self.collector_max_delay)
684        l.serialize()
685
686    @raises(Exception)
687    def test_invalid_actor_state_synchronization(self):
688        l = lacp(self.version,
689                 self.actor_system_priority,
690                 self.actor_system,
691                 self.actor_key,
692                 self.actor_port_priority,
693                 self.actor_port,
694                 self.actor_state_activity,
695                 self.actor_state_timeout,
696                 self.actor_state_aggregation,
697                 2,
698                 self.actor_state_collecting,
699                 self.actor_state_distributing,
700                 self.actor_state_defaulted,
701                 self.actor_state_expired,
702                 self.partner_system_priority,
703                 self.partner_system,
704                 self.partner_key,
705                 self.partner_port_priority,
706                 self.partner_port,
707                 self.partner_state_activity,
708                 self.partner_state_timeout,
709                 self.partner_state_aggregation,
710                 self.partner_state_synchronization,
711                 self.partner_state_collecting,
712                 self.partner_state_distributing,
713                 self.partner_state_defaulted,
714                 self.partner_state_expired,
715                 self.collector_max_delay)
716        l.serialize()
717
718    @raises(Exception)
719    def test_invalid_actor_state_collecting(self):
720        l = lacp(self.version,
721                 self.actor_system_priority,
722                 self.actor_system,
723                 self.actor_key,
724                 self.actor_port_priority,
725                 self.actor_port,
726                 self.actor_state_activity,
727                 self.actor_state_timeout,
728                 self.actor_state_aggregation,
729                 self.actor_state_synchronization,
730                 2,
731                 self.actor_state_distributing,
732                 self.actor_state_defaulted,
733                 self.actor_state_expired,
734                 self.partner_system_priority,
735                 self.partner_system,
736                 self.partner_key,
737                 self.partner_port_priority,
738                 self.partner_port,
739                 self.partner_state_activity,
740                 self.partner_state_timeout,
741                 self.partner_state_aggregation,
742                 self.partner_state_synchronization,
743                 self.partner_state_collecting,
744                 self.partner_state_distributing,
745                 self.partner_state_defaulted,
746                 self.partner_state_expired,
747                 self.collector_max_delay)
748        l.serialize()
749
750    @raises(Exception)
751    def test_invalid_actor_state_distributing(self):
752        l = lacp(self.version,
753                 self.actor_system_priority,
754                 self.actor_system,
755                 self.actor_key,
756                 self.actor_port_priority,
757                 self.actor_port,
758                 self.actor_state_activity,
759                 self.actor_state_timeout,
760                 self.actor_state_aggregation,
761                 self.actor_state_synchronization,
762                 self.actor_state_collecting,
763                 2,
764                 self.actor_state_defaulted,
765                 self.actor_state_expired,
766                 self.partner_system_priority,
767                 self.partner_system,
768                 self.partner_key,
769                 self.partner_port_priority,
770                 self.partner_port,
771                 self.partner_state_activity,
772                 self.partner_state_timeout,
773                 self.partner_state_aggregation,
774                 self.partner_state_synchronization,
775                 self.partner_state_collecting,
776                 self.partner_state_distributing,
777                 self.partner_state_defaulted,
778                 self.partner_state_expired,
779                 self.collector_max_delay)
780        l.serialize()
781
782    @raises(Exception)
783    def test_invalid_actor_state_defaulted(self):
784        l = lacp(self.version,
785                 self.actor_system_priority,
786                 self.actor_system,
787                 self.actor_key,
788                 self.actor_port_priority,
789                 self.actor_port,
790                 self.actor_state_activity,
791                 self.actor_state_timeout,
792                 self.actor_state_aggregation,
793                 self.actor_state_synchronization,
794                 self.actor_state_collecting,
795                 self.actor_state_distributing,
796                 2,
797                 self.actor_state_expired,
798                 self.partner_system_priority,
799                 self.partner_system,
800                 self.partner_key,
801                 self.partner_port_priority,
802                 self.partner_port,
803                 self.partner_state_activity,
804                 self.partner_state_timeout,
805                 self.partner_state_aggregation,
806                 self.partner_state_synchronization,
807                 self.partner_state_collecting,
808                 self.partner_state_distributing,
809                 self.partner_state_defaulted,
810                 self.partner_state_expired,
811                 self.collector_max_delay)
812        l.serialize()
813
814    @raises(Exception)
815    def test_invalid_actor_state_expired(self):
816        l = lacp(self.version,
817                 self.actor_system_priority,
818                 self.actor_system,
819                 self.actor_key,
820                 self.actor_port_priority,
821                 self.actor_port,
822                 self.actor_state_activity,
823                 self.actor_state_timeout,
824                 self.actor_state_aggregation,
825                 self.actor_state_synchronization,
826                 self.actor_state_collecting,
827                 self.actor_state_distributing,
828                 self.actor_state_defaulted,
829                 2,
830                 self.partner_system_priority,
831                 self.partner_system,
832                 self.partner_key,
833                 self.partner_port_priority,
834                 self.partner_port,
835                 self.partner_state_activity,
836                 self.partner_state_timeout,
837                 self.partner_state_aggregation,
838                 self.partner_state_synchronization,
839                 self.partner_state_collecting,
840                 self.partner_state_distributing,
841                 self.partner_state_defaulted,
842                 self.partner_state_expired,
843                 self.collector_max_delay)
844        l.serialize()
845
846    @raises(Exception)
847    def test_invalid_partner_state_activity(self):
848        l = lacp(self.version,
849                 self.actor_system_priority,
850                 self.actor_system,
851                 self.actor_key,
852                 self.actor_port_priority,
853                 self.actor_port,
854                 self.actor_state_activity,
855                 self.actor_state_timeout,
856                 self.actor_state_aggregation,
857                 self.actor_state_synchronization,
858                 self.actor_state_collecting,
859                 self.actor_state_distributing,
860                 self.actor_state_defaulted,
861                 self.actor_state_expired,
862                 self.partner_system_priority,
863                 self.partner_system,
864                 self.partner_key,
865                 self.partner_port_priority,
866                 self.partner_port,
867                 -1,
868                 self.partner_state_timeout,
869                 self.partner_state_aggregation,
870                 self.partner_state_synchronization,
871                 self.partner_state_collecting,
872                 self.partner_state_distributing,
873                 self.partner_state_defaulted,
874                 self.partner_state_expired,
875                 self.collector_max_delay)
876        l.serialize()
877
878    @raises(Exception)
879    def test_invalid_partner_state_timeout(self):
880        l = lacp(self.version,
881                 self.actor_system_priority,
882                 self.actor_system,
883                 self.actor_key,
884                 self.actor_port_priority,
885                 self.actor_port,
886                 self.actor_state_activity,
887                 self.actor_state_timeout,
888                 self.actor_state_aggregation,
889                 self.actor_state_synchronization,
890                 self.actor_state_collecting,
891                 self.actor_state_distributing,
892                 self.actor_state_defaulted,
893                 self.actor_state_expired,
894                 self.partner_system_priority,
895                 self.partner_system,
896                 self.partner_key,
897                 self.partner_port_priority,
898                 self.partner_port,
899                 self.partner_state_activity,
900                 -1,
901                 self.partner_state_aggregation,
902                 self.partner_state_synchronization,
903                 self.partner_state_collecting,
904                 self.partner_state_distributing,
905                 self.partner_state_defaulted,
906                 self.partner_state_expired,
907                 self.collector_max_delay)
908        l.serialize()
909
910    @raises(Exception)
911    def test_invalid_partner_state_aggregation(self):
912        l = lacp(self.version,
913                 self.actor_system_priority,
914                 self.actor_system,
915                 self.actor_key,
916                 self.actor_port_priority,
917                 self.actor_port,
918                 self.actor_state_activity,
919                 self.actor_state_timeout,
920                 self.actor_state_aggregation,
921                 self.actor_state_synchronization,
922                 self.actor_state_collecting,
923                 self.actor_state_distributing,
924                 self.actor_state_defaulted,
925                 self.actor_state_expired,
926                 self.partner_system_priority,
927                 self.partner_system,
928                 self.partner_key,
929                 self.partner_port_priority,
930                 self.partner_port,
931                 self.partner_state_activity,
932                 self.partner_state_timeout,
933                 -1,
934                 self.partner_state_synchronization,
935                 self.partner_state_collecting,
936                 self.partner_state_distributing,
937                 self.partner_state_defaulted,
938                 self.partner_state_expired,
939                 self.collector_max_delay)
940        l.serialize()
941
942    @raises(Exception)
943    def test_invalid_partner_state_synchronization(self):
944        l = lacp(self.version,
945                 self.actor_system_priority,
946                 self.actor_system,
947                 self.actor_key,
948                 self.actor_port_priority,
949                 self.actor_port,
950                 self.actor_state_activity,
951                 self.actor_state_timeout,
952                 self.actor_state_aggregation,
953                 self.actor_state_synchronization,
954                 self.actor_state_collecting,
955                 self.actor_state_distributing,
956                 self.actor_state_defaulted,
957                 self.actor_state_expired,
958                 self.partner_system_priority,
959                 self.partner_system,
960                 self.partner_key,
961                 self.partner_port_priority,
962                 self.partner_port,
963                 self.partner_state_activity,
964                 self.partner_state_timeout,
965                 self.partner_state_aggregation,
966                 -1,
967                 self.partner_state_collecting,
968                 self.partner_state_distributing,
969                 self.partner_state_defaulted,
970                 self.partner_state_expired,
971                 self.collector_max_delay)
972        l.serialize()
973
974    @raises(Exception)
975    def test_invalid_partner_state_collecting(self):
976        l = lacp(self.version,
977                 self.actor_system_priority,
978                 self.actor_system,
979                 self.actor_key,
980                 self.actor_port_priority,
981                 self.actor_port,
982                 self.actor_state_activity,
983                 self.actor_state_timeout,
984                 self.actor_state_aggregation,
985                 self.actor_state_synchronization,
986                 self.actor_state_collecting,
987                 self.actor_state_distributing,
988                 self.actor_state_defaulted,
989                 self.actor_state_expired,
990                 self.partner_system_priority,
991                 self.partner_system,
992                 self.partner_key,
993                 self.partner_port_priority,
994                 self.partner_port,
995                 self.partner_state_activity,
996                 self.partner_state_timeout,
997                 self.partner_state_aggregation,
998                 self.partner_state_synchronization,
999                 -1,
1000                 self.partner_state_distributing,
1001                 self.partner_state_defaulted,
1002                 self.partner_state_expired,
1003                 self.collector_max_delay)
1004        l.serialize()
1005
1006    @raises(Exception)
1007    def test_invalid_partner_state_distributing(self):
1008        l = lacp(self.version,
1009                 self.actor_system_priority,
1010                 self.actor_system,
1011                 self.actor_key,
1012                 self.actor_port_priority,
1013                 self.actor_port,
1014                 self.actor_state_activity,
1015                 self.actor_state_timeout,
1016                 self.actor_state_aggregation,
1017                 self.actor_state_synchronization,
1018                 self.actor_state_collecting,
1019                 self.actor_state_distributing,
1020                 self.actor_state_defaulted,
1021                 self.actor_state_expired,
1022                 self.partner_system_priority,
1023                 self.partner_system,
1024                 self.partner_key,
1025                 self.partner_port_priority,
1026                 self.partner_port,
1027                 self.partner_state_activity,
1028                 self.partner_state_timeout,
1029                 self.partner_state_aggregation,
1030                 self.partner_state_synchronization,
1031                 self.partner_state_collecting,
1032                 -1,
1033                 self.partner_state_defaulted,
1034                 self.partner_state_expired,
1035                 self.collector_max_delay)
1036        l.serialize()
1037
1038    @raises(Exception)
1039    def test_invalid_partner_state_defaulted(self):
1040        l = lacp(self.version,
1041                 self.actor_system_priority,
1042                 self.actor_system,
1043                 self.actor_key,
1044                 self.actor_port_priority,
1045                 self.actor_port,
1046                 self.actor_state_activity,
1047                 self.actor_state_timeout,
1048                 self.actor_state_aggregation,
1049                 self.actor_state_synchronization,
1050                 self.actor_state_collecting,
1051                 self.actor_state_distributing,
1052                 self.actor_state_defaulted,
1053                 self.actor_state_expired,
1054                 self.partner_system_priority,
1055                 self.partner_system,
1056                 self.partner_key,
1057                 self.partner_port_priority,
1058                 self.partner_port,
1059                 self.partner_state_activity,
1060                 self.partner_state_timeout,
1061                 self.partner_state_aggregation,
1062                 self.partner_state_synchronization,
1063                 self.partner_state_collecting,
1064                 self.partner_state_distributing,
1065                 -1,
1066                 self.partner_state_expired,
1067                 self.collector_max_delay)
1068        l.serialize()
1069
1070    @raises(Exception)
1071    def test_invalid_partner_state_expired(self):
1072        l = lacp(self.version,
1073                 self.actor_system_priority,
1074                 self.actor_system,
1075                 self.actor_key,
1076                 self.actor_port_priority,
1077                 self.actor_port,
1078                 self.actor_state_activity,
1079                 self.actor_state_timeout,
1080                 self.actor_state_aggregation,
1081                 self.actor_state_synchronization,
1082                 self.actor_state_collecting,
1083                 self.actor_state_distributing,
1084                 self.actor_state_defaulted,
1085                 self.actor_state_expired,
1086                 self.partner_system_priority,
1087                 self.partner_system,
1088                 self.partner_key,
1089                 self.partner_port_priority,
1090                 self.partner_port,
1091                 self.partner_state_activity,
1092                 self.partner_state_timeout,
1093                 self.partner_state_aggregation,
1094                 self.partner_state_synchronization,
1095                 self.partner_state_collecting,
1096                 self.partner_state_distributing,
1097                 self.partner_state_defaulted,
1098                 -1,
1099                 self.collector_max_delay)
1100        l.serialize()
1101
1102    def test_json(self):
1103        jsondict = self.l.to_jsondict()
1104        l = lacp.from_jsondict(jsondict['lacp'])
1105        eq_(str(self.l), str(l))
1106