root/branch/UMPA/tests/unit/test_protocols/test__fields.py @ 4641

Revision 4641, 17.0 kB (checked in by getxsick, 4 years ago)

regression tests failed for last commit (r4640).
funny thing is that i had to fix tests, not base code ;)

Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3
4# Copyright (C) 2008-2009 Adriano Monteiro Marques.
5#
6# Author: Bartosz SKOWRON <getxsick at gmail dot com>
7#
8# This library is free software; you can redistribute it and/or modify
9# it under the terms of the GNU Lesser General Public License as published
10# by the Free Software Foundation; either version 2.1 of the License, or
11# (at your option) any later version.
12#
13# This library is distributed in the hope that it will be useful, but
14# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
16# License for more details.
17#
18# You should have received a copy of the GNU Lesser General Public License
19# along with this library; if not, write to the Free Software Foundation,
20# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21
22import py.test
23from umpa.protocols._fields import *
24from umpa.utils.exceptions import UMPAException, UMPAAttributeException
25
26class TestField(object):
27    cls_field = Field
28
29    def test_init(self):
30        f = self.cls_field('foobar')
31        assert f.auto is False
32
33    def test_set(self):
34        f = self.cls_field('foobar')
35        py.test.raises(NotImplementedError, f.set, 0)
36
37    def test_get(self):
38        f = self.cls_field('foobar', 10)
39        assert f.get() == 10
40       
41        f = self.cls_field('foobar')
42        assert f.get() is None
43
44    def test_clear(self):
45        f = self.cls_field('foobar', 10)
46        f.clear()
47        assert f.get() is None
48   
49    def test_doc(self):
50        f = self.cls_field('foobar')
51        f.set_doc('xxx')
52        assert f.__doc__ == 'xxx'
53
54    def test_fillout(self):
55        f = self.cls_field('foobar')
56        py.test.raises(UMPAException, f.fillout)
57
58        f = self.cls_field('foobar', 10)
59        py.test.raises(NotImplementedError, f.fillout)
60
61    def test_raw_value(self):
62        f = self.cls_field('foobar')
63        py.test.raises(NotImplementedError, f._raw_value)
64
65class TestIntField(TestField):
66    cls_field = IntField
67
68    def test_get(self):
69        f = self.cls_field('foobar', 10, 8)
70        assert f.get() == 10
71       
72        f = self.cls_field('foobar')
73        assert f.get() is None
74
75    def test_set(self): #_is_valid() tests included
76        f = self.cls_field('foobar', 10, 5)
77        assert f.get() == 10
78
79        f = self.cls_field('foobar', bits=5)
80        f.set(10)
81        assert f.get() == 10
82
83        f = self.cls_field('foobar', bits=4)
84        f.set(10)
85        assert f.get() == 10
86
87        f = self.cls_field('foobar', bits=3)
88        py.test.raises(UMPAAttributeException, f.set, 10)
89
90    def test_clear(self):
91        f = self.cls_field('foobar', 10, 8)
92        f.clear()
93        assert f.get() is None
94
95    def test_raw_value(self):
96        f = self.cls_field('foobar', 10, 8)
97        assert f._raw_value() == 10
98
99    def test_fillout(self):
100        f = self.cls_field('foobar')
101        py.test.raises(UMPAException, f.fillout)
102
103        f = self.cls_field('foobar', 10, 8)
104        assert f.fillout() == 10
105
106class TestSpecialIntField(TestIntField):
107    cls_field = SpecialIntField
108
109    def test_tmpvalue(self):
110        f = self.cls_field('foobar')
111       
112        assert f.get_tmpvalue() == 0
113        assert f._tmp_value == 0
114
115        f.set_tmpvalue(10)
116        assert f.get_tmpvalue() == 10
117
118        f.clear_tmpvalue()
119        assert f._tmp_value == 0
120
121        f._tmp_value = 20
122        assert f._tmp_value == 20
123
124        del f._tmp_value
125        assert f.get_tmpvalue() == 0
126
127class TestEnumField(TestIntField):
128    cls_field = EnumField
129
130    def test_get(self):
131        f = self.cls_field('foobar', 10, 16)
132        f.enumerable = {'foo' : 5, 'bar' : 10}
133
134        assert f.get() == 10
135        assert f.get(True) == 'bar'
136
137        f.set(5)
138        assert f.get(human=True) == 'foo'
139
140        f.set(0)
141        assert f.get(True) == 0
142
143    def test_set(self):
144        f = self.cls_field('foobar', bits=16)
145        f.enumerable = {'foo' : 5, 'bar' : 10}
146
147        f.set('foo')
148        assert f.get() == 5
149        assert f.get(True) == 'foo'
150
151        f.set(10)
152        assert f.get() == 10
153        assert f.get(True) == 'bar'
154
155class TestAddrField(TestField):
156    pass
157
158class TestIPAddrField(TestAddrField):
159    cls_field = IPAddrField
160
161    def test_get(self):
162        self.cls_field.pieces_amount = 4
163        self.cls_field.separator = "."
164        self.cls_field.piece_size = 8
165        self.cls_field.base = 10
166
167        f = self.cls_field('foobar', "127.0.0.1")
168        assert f.get() == "127.0.0.1"
169       
170        f = self.cls_field('foobar')
171        assert f.get() is None
172
173        self.cls_field.separator = ""
174        self.cls_field.base = 0
175        self.cls_field.piece_size = 0
176        self.cls_field.pieces_amount = 0
177
178    def test_set(self):
179        f = self.cls_field('foobar')
180
181        def check(val):
182            f.set(val)
183            assert f.get() == val
184
185        f.pieces_amount = 4
186        f.separator = "."
187        f.piece_size = 8
188        f.base = 10
189
190        check("255.255.255.255")
191        check((255,255,255,255))
192        check("127.0.0.1")
193        check("0.0.0.0")
194        check((127,0,0,1))
195        check((0,0,0,0))
196        f.set([127,0,0,1])
197        assert f.get() == (127,0,0,1)
198        f.set([0,0,0,0])
199        assert f.get() == (0,0,0,0)
200
201        py.test.raises(UMPAAttributeException, f.set, "256.0.0.1")
202        py.test.raises(UMPAAttributeException, f.set, "127,0,0,1")
203        py.test.raises(UMPAAttributeException, f.set, "327,0,0,1")
204        py.test.raises(UMPAAttributeException, f.set, "127.0.0.")
205        py.test.raises(UMPAAttributeException, f.set, "127")
206        py.test.raises(UMPAAttributeException, f.set, "A")
207        py.test.raises(UMPAAttributeException, f.set, "0xF.0xF.0xF.0xF")
208        py.test.raises(UMPAAttributeException, f.set, (500,))
209        py.test.raises(UMPAAttributeException, f.set, (500,0,0,0))
210        py.test.raises(UMPAAttributeException, f.set, ("10.0.0.0",))
211
212        f.separator = "*"
213        check("127*0*0*1")
214        py.test.raises(UMPAAttributeException, f.set, "127.0.0.1")
215
216        f.pieces_amount = 3
217        check("127*0*1")
218        py.test.raises(UMPAAttributeException, f.set, "127.0.0.1")
219
220        f.pieces_amount = 4
221        f.separator = "."
222        f.piece_size = 6
223        check("63.0.0.1")
224        py.test.raises(UMPAAttributeException, f.set, "127.0.0.1")
225        py.test.raises(UMPAAttributeException, f.set, "65.0.0.1")
226        py.test.raises(UMPAAttributeException, f.set, "64.0.0.1")
227
228        f.piece_size = 8
229        f.base = 16
230        check("0xFF.0xFF.0xFF.0xFF")
231        py.test.raises(UMPAAttributeException, f.set, "0xG.0xFF.0xFF.0xFF")
232
233    def test_clear(self):
234        self.cls_field.pieces_amount = 4
235        self.cls_field.separator = "."
236        self.cls_field.piece_size = 8
237        self.cls_field.base = 10
238
239        f = self.cls_field('foobar', "127.0.0.1")
240        assert f.get() == "127.0.0.1"
241        f.clear()
242        assert f.get() is None
243
244        self.cls_field.separator = ""
245        self.cls_field.base = 0
246        self.cls_field.piece_size = 0
247        self.cls_field.pieces_amount = 0
248        self.cls_field.bits = 0
249
250    def test_raw_value(self):
251        f = self.cls_field('foobar')
252        f.pieces_amount = 4
253        f.separator = "."
254        f.piece_size = 8
255        f.base = 10
256
257        f.set("127.0.0.1")
258        assert f._raw_value() == 2130706433
259        f.set("0.0.0.0")
260        assert f._raw_value() == 0
261        f.set("255.255.255.255")
262        assert f._raw_value() == 2**32-1
263
264    def test_fillout(self):
265        f = self.cls_field('foobar')
266        py.test.raises(UMPAException, f.fillout)
267
268        f.pieces_amount = 4
269        f.separator = "."
270        f.piece_size = 8
271        f.base = 10
272
273        f.set("127.0.0.1")
274        assert f.fillout() == 2130706433
275        f.set("0.0.0.0")
276        assert f.fillout() == 0
277        f.set("255.255.255.255")
278        assert f.fillout() == 2**32-1
279
280class TestIPv4AddrField(TestIPAddrField):
281    cls_field = IPv4AddrField
282
283    def setup_method(self, method):
284        self.cls_field.pieces_amount = 4
285        self.cls_field.separator = "."
286        self.cls_field.piece_size = 8
287        self.cls_field.base = 10
288        self.cls_field.bits = 32
289
290    def test_set(self):
291        f = self.cls_field('foobar')
292
293        def check(val):
294            f.set(val)
295            assert f.get() == val
296
297        check("127.0.0.1")
298        check("0.0.0.0")
299        check((127,0,0,1))
300        check((0,0,0,0))
301        f.set([127,0,0,1])
302        assert f.get() == (127,0,0,1)
303        f.set([0,0,0,0])
304        assert f.get() == (0,0,0,0)
305
306        py.test.raises(UMPAAttributeException, f.set, "256.0.0.1")
307        py.test.raises(UMPAAttributeException, f.set, "127,0,0,1")
308        py.test.raises(UMPAAttributeException, f.set, "327,0,0,1")
309        py.test.raises(UMPAAttributeException, f.set, "127.0.0.")
310        py.test.raises(UMPAAttributeException, f.set, "127")
311        py.test.raises(UMPAAttributeException, f.set, "A")
312        py.test.raises(UMPAAttributeException, f.set, "0xF.0xF.0xF.0xF")
313        py.test.raises(UMPAAttributeException, f.set, (500,))
314        py.test.raises(UMPAAttributeException, f.set, (500,0,0,0))
315        py.test.raises(UMPAAttributeException, f.set, ("10.0.0.0",))
316
317class TestIPv6AddrField(TestIPAddrField):
318    cls_field = IPv6AddrField
319
320    def setup_method(self, method):
321        self.cls_field.pieces_amount = 8
322        self.cls_field.separator = ":"
323        self.cls_field.piece_size = 16
324        self.cls_field.base = 16
325        self.cls_field.bits = 128
326
327    def test_set(self):
328        f = self.cls_field('foobar')
329
330        def check(val):
331            f.set(val)
332            assert f.get() == val
333
334        check("0:0:0:0:0:0:0:0")
335        check("FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF")
336        check("2001:0db8:85a3:0000:0000:8a2e:0370:7334")
337        check((0,0,0,0,0,0,0,0))
338        check((0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF))
339        check((0x2001,0x0db8,0x85a3,0,0,0x8a2e,0x0370,0x7334))
340        f.set([0,0,0,0,0,0,0,0])
341        assert f.get() == (0,0,0,0,0,0,0,0)
342        f.set([0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF])
343        assert f.get() == (0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
344                                                                        0xFFFF)
345        f.set([0x2001,0x0db8,0x85a3,0,0,0x8a2e,0x0370,0x7334])
346        assert f.get() == (0x2001,0x0db8,0x85a3,0,0,0x8a2e,0x0370,0x7334)
347
348        py.test.raises(UMPAAttributeException, f.set, "127.0.0.1")
349        py.test.raises(UMPAAttributeException, f.set, "FFFF.FFFF.FFFF.FFFF")
350        py.test.raises(UMPAAttributeException, f.set,
351                                    "FFFF.FFFF.FFFF.FFFF.FFFF.FFFF.FFFF.FFFF")
352        py.test.raises(UMPAAttributeException, f.set, "G:G:G:G:G:G:G:G")
353
354class TestPaddingField(TestSpecialIntField):
355    cls_field = PaddingField
356
357    def test_init(self):
358        f = self.cls_field('foobar')
359        assert f.auto is True
360        assert f.get() == 0
361
362        f = self.cls_field('foobar', 8)
363        assert f.auto is True
364        assert f.get() == 0
365
366    def test_get(self):
367        f = self.cls_field('foobar')
368        assert f.get() == 0
369
370        f = self.cls_field('foobar', 8)
371        assert f.get() == 0
372
373    def test_set(self):
374        f = self.cls_field('foobar', 10)
375        assert f.get() == 0
376
377        f.set(5)
378        assert f.get() == 5
379
380        f.set(0)
381        assert f.get() == 0
382
383        f._word = 9
384        f.set(9)
385        assert f.get() == 9
386        py.test.raises(UMPAAttributeException, f.set, 10)
387        py.test.raises(UMPAAttributeException, f.set, -1)
388
389    def test_raw_value(self):
390        f = self.cls_field('foobar')
391        assert f._raw_value() == 0
392
393    def test_generate_value(self):
394        f = self.cls_field('foobar')
395
396        f._tmp_value = 0
397        assert f._generate_value() == 0
398        f._tmp_value = 1
399        assert f._generate_value() == 31
400        f._tmp_value = 10
401        assert f._generate_value() == 22
402        f._tmp_value = 31
403        assert f._generate_value() == 1
404        f._tmp_value = 32
405        assert f._generate_value() == 0
406        f._tmp_value = 33
407        assert f._generate_value() == 31
408
409        f = self.cls_field('foobar', 16) # word == 16
410
411        f._tmp_value = 0
412        assert f._generate_value() == 0
413        f._tmp_value = 1
414        assert f._generate_value() == 15
415        f._tmp_value = 10
416        assert f._generate_value() == 6
417        f._tmp_value = 15
418        assert f._generate_value() == 1
419        f._tmp_value = 32
420        assert f._generate_value() == 0
421        f._tmp_value = 33
422        assert f._generate_value() == 15
423
424    def test_fillout(self):
425        f = self.cls_field('foobar')
426        assert f.bits == 0
427        assert f.fillout() == 0
428        assert f.bits == 0
429
430        f._tmp_value = 3
431        assert f.fillout() == 0
432        assert f.bits == 29
433
434        f._word = 16
435        f._tmp_value = 3
436        f.bits = 0
437        assert f.fillout() == 0
438        assert f.bits == 13
439
440class TestFlags(TestField):
441    cls_field = Flags
442
443    def test_init(self):
444        bits = ['a', 'b', 'c']
445        f = self.cls_field('foobar', bits)
446        assert f._ordered_fields == bits
447        for b in bits:
448            f._value.has_key(b)
449        assert f.bits == len(bits)
450
451        f = self.cls_field('foobar', bits, b=False, c=True)
452        assert f.get('a') == [False]
453        assert f.get('b') == [False]
454        assert f.get('c') == [True]
455
456        py.test.raises(UMPAAttributeException, self.cls_field, 'foobar', bits,
457                                                            b=True, xxx=True)
458
459    def test_get(self):
460        bits = ['a', 'b', 'c']
461        f = self.cls_field('foobar', bits, b=False, c=True)
462
463        assert f.get(*bits) == [False, False, True]
464        assert f.get() == [False, False, True]
465       
466        py.test.raises(UMPAAttributeException, f.get, 'd')
467        py.test.raises(UMPAAttributeException, f.get, 'a', 'd')
468
469    def test_set(self):
470        bits = ['a', 'b', 'c']
471        f = self.cls_field('foobar', bits)
472        assert f.get() == [False, False, False]
473        f.set('b')
474        assert f.get('b') == [True]
475        f.set('a', 'c')
476        assert f.get('a', 'b') == [True, True]
477       
478    def test_unset(self):
479        bits = ['a', 'b', 'c']
480        f = self.cls_field('foobar', bits, a=True, b=True, c=True)
481        assert f.get() == [True, True, True]
482        f.unset('b')
483        assert f.get('b') == [False]
484        f.unset('a', 'c')
485        assert f.get('a', 'b') == [False, False]
486
487    def test_clear(self):
488        bits = ['a', 'b', 'c']
489        f = self.cls_field('foobar', bits, a=True, b=False, c=True)
490        assert f.get() == [True, False, True]
491        f.clear()
492        assert f.get() == [False, False, False]
493
494    def test_is_valid(self):
495        bits = ['a', 'b', 'c']
496        f = self.cls_field('foobar', bits)
497       
498        assert f._is_valid('xxx') is False
499        py.test.raises(UMPAAttributeException, f.set, 'xxx')
500
501    def test_doc(self):
502        bits = ['a', 'b', 'c']
503        f = self.cls_field('foobar', bits)
504        f.set_doc('xxx')
505        assert f.__doc__ == 'xxx'
506
507    def test_fillout(self):
508        bits = ['a', 'b', 'c']
509        f = self.cls_field('foobar', bits)
510       
511        assert f.fillout() == 0
512        f.set('a')
513        assert f.fillout() == 4
514        f.set('b', 'c')
515        assert f.fillout() == 7
516
517    def test_raw_value(self):
518        bits = ['a', 'b', 'c']
519        f = self.cls_field('foobar', bits, a=True, b=True, c=True)
520        py.test.raises(NotImplementedError, f._raw_value)
521
522    def test_set_bit(self):
523        bits = ['a', 'b', 'c']
524        f = self.cls_field('foobar', bits)
525
526        f._set_bit('a', True)
527        assert f.get('a') == [True]
528        f._set_bit('a', False)
529        assert f.get('a') == [False]
530
531        py.test.raises(UMPAAttributeException, f._set_bit, 'xxx', True)
532
533class TestBitField(TestField):
534    cls_field = BitField
535   
536    def test_init(self):
537        f = self.cls_field('foobar')
538        assert f._value is None
539        assert f.auto is False
540
541        f = self.cls_field('foobar', False)
542        assert f._value is False
543
544        f = self.cls_field('foobar', True)
545        assert f._value is True
546
547    def test_set(self):
548        f = self.cls_field('foobar')
549        assert f.get() is None
550       
551        f.set(False)
552        assert f.get() is False
553
554        f.set('aaa')
555        assert f.get() is True
556       
557        f.set(None)
558        assert f.get() is None
559
560    def test_get(self):
561        f = self.cls_field('foobar', 10)
562        assert f.get() is True
563       
564        f = self.cls_field('foobar')
565        assert f.get() is None
566
567    def test_fillout(self):
568        f = self.cls_field('foobar')
569
570        py.test.raises(UMPAException, f.fillout)
571
572        f.set(True)
573        assert f.fillout() == 1
574
575        f.set(False)
576        assert f.fillout() == 0
577
578    def test_raw_value(self):
579        f = self.cls_field('foobar', 5)
580        assert f._raw_value() == 1
581
582        f.set(0)
583        assert f._raw_value() == 0
584        f.set(False)
585        assert f._raw_value() == 0
586
587    def test_is_valid(self):
588        f = self.cls_field('foobar')
589        assert f._is_valid(True) is True
590        assert f._is_valid(False) is True
591        assert f._is_valid(None) is True
592        assert f._is_valid('xxx') is True
Note: See TracBrowser for help on using the browser.