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

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

Fix for #318. Now value passed to constructor is validate by calling set() method.

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        self.cls_field.bits = 0
178
179    def test_set(self):
180        f = self.cls_field('foobar')
181
182        def check(val):
183            f.set(val)
184            assert f.get() == val
185
186        f.pieces_amount = 4
187        f.separator = "."
188        f.piece_size = 8
189        f.base = 10
190
191        check("255.255.255.255")
192        check((255,255,255,255))
193        check("127.0.0.1")
194        check("0.0.0.0")
195        check((127,0,0,1))
196        check((0,0,0,0))
197        f.set([127,0,0,1])
198        assert f.get() == (127,0,0,1)
199        f.set([0,0,0,0])
200        assert f.get() == (0,0,0,0)
201
202        py.test.raises(UMPAAttributeException, f.set, "256.0.0.1")
203        py.test.raises(UMPAAttributeException, f.set, "127,0,0,1")
204        py.test.raises(UMPAAttributeException, f.set, "327,0,0,1")
205        py.test.raises(UMPAAttributeException, f.set, "127.0.0.")
206        py.test.raises(UMPAAttributeException, f.set, "127")
207        py.test.raises(UMPAAttributeException, f.set, "A")
208        py.test.raises(UMPAAttributeException, f.set, "0xF.0xF.0xF.0xF")
209        py.test.raises(UMPAAttributeException, f.set, (500,))
210        py.test.raises(UMPAAttributeException, f.set, (500,0,0,0))
211        py.test.raises(UMPAAttributeException, f.set, ("10.0.0.0",))
212
213        f.separator = "*"
214        check("127*0*0*1")
215        py.test.raises(UMPAAttributeException, f.set, "127.0.0.1")
216
217        f.pieces_amount = 3
218        check("127*0*1")
219        py.test.raises(UMPAAttributeException, f.set, "127.0.0.1")
220
221        f.pieces_amount = 4
222        f.separator = "."
223        f.piece_size = 6
224        check("63.0.0.1")
225        py.test.raises(UMPAAttributeException, f.set, "127.0.0.1")
226        py.test.raises(UMPAAttributeException, f.set, "65.0.0.1")
227        py.test.raises(UMPAAttributeException, f.set, "64.0.0.1")
228
229        f.piece_size = 8
230        f.base = 16
231        check("0xFF.0xFF.0xFF.0xFF")
232        py.test.raises(UMPAAttributeException, f.set, "0xG.0xFF.0xFF.0xFF")
233
234    def test_clear(self):
235        self.cls_field.pieces_amount = 4
236        self.cls_field.separator = "."
237        self.cls_field.piece_size = 8
238        self.cls_field.base = 10
239
240        f = self.cls_field('foobar', "127.0.0.1")
241        assert f.get() == "127.0.0.1"
242        f.clear()
243        assert f.get() is None
244
245        self.cls_field.separator = ""
246        self.cls_field.base = 0
247        self.cls_field.piece_size = 0
248        self.cls_field.pieces_amount = 0
249        self.cls_field.bits = 0
250
251    def test_raw_value(self):
252        f = self.cls_field('foobar')
253        f.pieces_amount = 4
254        f.separator = "."
255        f.piece_size = 8
256        f.base = 10
257
258        f.set("127.0.0.1")
259        assert f._raw_value() == 2130706433
260        f.set("0.0.0.0")
261        assert f._raw_value() == 0
262        f.set("255.255.255.255")
263        assert f._raw_value() == 2**32-1
264
265    def test_fillout(self):
266        f = self.cls_field('foobar')
267        py.test.raises(UMPAException, f.fillout)
268
269        f.pieces_amount = 4
270        f.separator = "."
271        f.piece_size = 8
272        f.base = 10
273
274        f.set("127.0.0.1")
275        assert f.fillout() == 2130706433
276        f.set("0.0.0.0")
277        assert f.fillout() == 0
278        f.set("255.255.255.255")
279        assert f.fillout() == 2**32-1
280
281class TestIPv4AddrField(TestIPAddrField):
282    cls_field = IPv4AddrField
283
284    def setup_method(self, method):
285        self.cls_field.pieces_amount = 4
286        self.cls_field.separator = "."
287        self.cls_field.piece_size = 8
288        self.cls_field.base = 10
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
326    def test_set(self):
327        f = self.cls_field('foobar')
328
329        def check(val):
330            f.set(val)
331            assert f.get() == val
332
333        check("0:0:0:0:0:0:0:0")
334        check("FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF")
335        check("2001:0db8:85a3:0000:0000:8a2e:0370:7334")
336        check((0,0,0,0,0,0,0,0))
337        check((0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF))
338        check((0x2001,0x0db8,0x85a3,0,0,0x8a2e,0x0370,0x7334))
339        f.set([0,0,0,0,0,0,0,0])
340        assert f.get() == (0,0,0,0,0,0,0,0)
341        f.set([0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF])
342        assert f.get() == (0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
343                                                                        0xFFFF)
344        f.set([0x2001,0x0db8,0x85a3,0,0,0x8a2e,0x0370,0x7334])
345        assert f.get() == (0x2001,0x0db8,0x85a3,0,0,0x8a2e,0x0370,0x7334)
346
347        py.test.raises(UMPAAttributeException, f.set, "127.0.0.1")
348        py.test.raises(UMPAAttributeException, f.set, "FFFF.FFFF.FFFF.FFFF")
349        py.test.raises(UMPAAttributeException, f.set,
350                                    "FFFF.FFFF.FFFF.FFFF.FFFF.FFFF.FFFF.FFFF")
351        py.test.raises(UMPAAttributeException, f.set, "G:G:G:G:G:G:G:G")
352
353class TestPaddingField(TestSpecialIntField):
354    cls_field = PaddingField
355
356    def test_init(self):
357        f = self.cls_field('foobar')
358        assert f.auto is True
359        assert f.get() == 0
360
361        f = self.cls_field('foobar', 8)
362        assert f.auto is True
363        assert f.get() == 0
364
365    def test_get(self):
366        f = self.cls_field('foobar')
367        assert f.get() == 0
368
369        f = self.cls_field('foobar', 8)
370        assert f.get() == 0
371
372    def test_set(self):
373        f = self.cls_field('foobar', 10)
374        assert f.get() == 0
375
376        f.set(5)
377        assert f.get() == 5
378
379        f.set(0)
380        assert f.get() == 0
381
382        f._word = 9
383        f.set(9)
384        assert f.get() == 9
385        py.test.raises(UMPAAttributeException, f.set, 10)
386        py.test.raises(UMPAAttributeException, f.set, -1)
387
388    def test_raw_value(self):
389        f = self.cls_field('foobar')
390        assert f._raw_value() == 0
391
392    def test_generate_value(self):
393        f = self.cls_field('foobar')
394
395        f._tmp_value = 0
396        assert f._generate_value() == 0
397        f._tmp_value = 1
398        assert f._generate_value() == 31
399        f._tmp_value = 10
400        assert f._generate_value() == 22
401        f._tmp_value = 31
402        assert f._generate_value() == 1
403        f._tmp_value = 32
404        assert f._generate_value() == 0
405        f._tmp_value = 33
406        assert f._generate_value() == 31
407
408        f = self.cls_field('foobar', 16) # word == 16
409
410        f._tmp_value = 0
411        assert f._generate_value() == 0
412        f._tmp_value = 1
413        assert f._generate_value() == 15
414        f._tmp_value = 10
415        assert f._generate_value() == 6
416        f._tmp_value = 15
417        assert f._generate_value() == 1
418        f._tmp_value = 32
419        assert f._generate_value() == 0
420        f._tmp_value = 33
421        assert f._generate_value() == 15
422
423    def test_fillout(self):
424        f = self.cls_field('foobar')
425        assert f.bits == 0
426        assert f.fillout() == 0
427        assert f.bits == 0
428
429        f._tmp_value = 3
430        assert f.fillout() == 0
431        assert f.bits == 29
432
433        f._word = 16
434        f._tmp_value = 3
435        f.bits = 0
436        assert f.fillout() == 0
437        assert f.bits == 13
438
439class TestFlags(TestField):
440    cls_field = Flags
441
442    def test_init(self):
443        bits = ['a', 'b', 'c']
444        f = self.cls_field('foobar', bits)
445        assert f._ordered_fields == bits
446        for b in bits:
447            f._value.has_key(b)
448        assert f.bits == len(bits)
449
450        f = self.cls_field('foobar', bits, b=False, c=True)
451        assert f.get('a') == [False]
452        assert f.get('b') == [False]
453        assert f.get('c') == [True]
454
455        py.test.raises(UMPAAttributeException, self.cls_field, 'foobar', bits,
456                                                            b=True, xxx=True)
457
458    def test_get(self):
459        bits = ['a', 'b', 'c']
460        f = self.cls_field('foobar', bits, b=False, c=True)
461
462        assert f.get(*bits) == [False, False, True]
463        assert f.get() == [False, False, True]
464       
465        py.test.raises(UMPAAttributeException, f.get, 'd')
466        py.test.raises(UMPAAttributeException, f.get, 'a', 'd')
467
468    def test_set(self):
469        bits = ['a', 'b', 'c']
470        f = self.cls_field('foobar', bits)
471        assert f.get() == [False, False, False]
472        f.set('b')
473        assert f.get('b') == [True]
474        f.set('a', 'c')
475        assert f.get('a', 'b') == [True, True]
476       
477    def test_unset(self):
478        bits = ['a', 'b', 'c']
479        f = self.cls_field('foobar', bits, a=True, b=True, c=True)
480        assert f.get() == [True, True, True]
481        f.unset('b')
482        assert f.get('b') == [False]
483        f.unset('a', 'c')
484        assert f.get('a', 'b') == [False, False]
485
486    def test_clear(self):
487        bits = ['a', 'b', 'c']
488        f = self.cls_field('foobar', bits, a=True, b=False, c=True)
489        assert f.get() == [True, False, True]
490        f.clear()
491        assert f.get() == [False, False, False]
492
493    def test_is_valid(self):
494        bits = ['a', 'b', 'c']
495        f = self.cls_field('foobar', bits)
496       
497        assert f._is_valid('xxx') is False
498        py.test.raises(UMPAAttributeException, f.set, 'xxx')
499
500    def test_doc(self):
501        bits = ['a', 'b', 'c']
502        f = self.cls_field('foobar', bits)
503        f.set_doc('xxx')
504        assert f.__doc__ == 'xxx'
505
506    def test_fillout(self):
507        bits = ['a', 'b', 'c']
508        f = self.cls_field('foobar', bits)
509       
510        assert f.fillout() == 0
511        f.set('a')
512        assert f.fillout() == 4
513        f.set('b', 'c')
514        assert f.fillout() == 7
515
516    def test_raw_value(self):
517        bits = ['a', 'b', 'c']
518        f = self.cls_field('foobar', bits, a=True, b=True, c=True)
519        py.test.raises(NotImplementedError, f._raw_value)
520
521    def test_set_bit(self):
522        bits = ['a', 'b', 'c']
523        f = self.cls_field('foobar', bits)
524
525        f._set_bit('a', True)
526        assert f.get('a') == [True]
527        f._set_bit('a', False)
528        assert f.get('a') == [False]
529
530        py.test.raises(UMPAAttributeException, f._set_bit, 'xxx', True)
531
532class TestBitField(TestField):
533    cls_field = BitField
534   
535    def test_init(self):
536        f = self.cls_field('foobar')
537        assert f._value is None
538        assert f.auto is False
539
540        f = self.cls_field('foobar', False)
541        assert f._value is False
542
543        f = self.cls_field('foobar', True)
544        assert f._value is True
545
546    def test_set(self):
547        f = self.cls_field('foobar')
548        assert f.get() is None
549       
550        f.set(False)
551        assert f.get() is False
552
553        f.set('aaa')
554        assert f.get() is True
555       
556        f.set(None)
557        assert f.get() is None
558
559    def test_get(self):
560        f = self.cls_field('foobar', 10)
561        assert f.get() is True
562       
563        f = self.cls_field('foobar')
564        assert f.get() is None
565
566    def test_fillout(self):
567        f = self.cls_field('foobar')
568
569        py.test.raises(UMPAException, f.fillout)
570
571        f.set(True)
572        assert f.fillout() == 1
573
574        f.set(False)
575        assert f.fillout() == 0
576
577    def test_raw_value(self):
578        f = self.cls_field('foobar', 5)
579        assert f._raw_value() == 1
580
581        f.set(0)
582        assert f._raw_value() == 0
583        f.set(False)
584        assert f._raw_value() == 0
585
586    def test_is_valid(self):
587        f = self.cls_field('foobar')
588        assert f._is_valid(True) is True
589        assert f._is_valid(False) is True
590        assert f._is_valid(None) is True
591        assert f._is_valid('xxx') is True
Note: See TracBrowser for help on using the browser.