source: OpenRLabs-Git/deploy/rlabs-docker/web2py-rlabs/gluon/tests/test_utils.py

main
Last change on this file was 42bd667, checked in by David Fuertes <dfuertes@…>, 4 years ago

Historial Limpio

  • Property mode set to 100755
File size: 7.4 KB
Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3
4""" Unit tests for utils.py """
5
6import unittest
7import pickle
8from hashlib import md5
9
10from gluon.utils import md5_hash, compare, is_valid_ip_address, web2py_uuid
11import gluon.utils
12from gluon.validators import simple_hash, get_digest
13from gluon.utils import secure_dumps, secure_loads
14
15
16class TestUtils(unittest.TestCase):
17    """ Tests the utils.py module """
18
19    # TODO: def test_AES_new(self):
20
21    def test_compare(self):
22        """ Tests the compare funciton """
23
24        a, b = 'test123', 'test123'
25        compare_result_true = compare(a, b)
26        self.assertTrue(compare_result_true)
27
28        a, b = 'test123', 'test456'
29        compare_result_false = compare(a, b)
30        self.assertFalse(compare_result_false)
31
32    def test_md5_hash(self):
33        """ Tests the md5_hash function """
34
35        data = md5_hash("web2py rocks")
36        self.assertEqual(data, '79509f3246a2824dee64635303e99204')
37
38    def test_simple_hash(self):
39        """ Tests the simple_hash function """
40
41        # no key, no salt, digest_alg=None
42        self.assertRaises(RuntimeError, simple_hash, 'web2py rocks!', key='', salt='', digest_alg=None)
43
44        # no key, no salt, digest_alg = md5
45        data_md5 = simple_hash('web2py rocks!', key='', salt='', digest_alg=md5)
46        self.assertEqual(data_md5, '37d95defba6c8834cb8cae86ee888568')
47
48        # no key, no salt, 'md5'
49        data_md5 = simple_hash('web2py rocks!', key='', salt='', digest_alg='md5')
50        self.assertEqual(data_md5, '37d95defba6c8834cb8cae86ee888568')
51
52        # no key, no salt, 'sha1'
53        data_sha1 = simple_hash('web2py rocks!', key='', salt='', digest_alg='sha1')
54        self.assertEqual(data_sha1, '00489a46753d8db260c71542611cdef80652c4b7')
55
56        # no key, no salt, 'sha224'
57        data_sha224 = simple_hash('web2py rocks!', key='', salt='', digest_alg='sha224')
58        self.assertEqual(data_sha224, '84d7054271842c2c17983baa2b1447e0289d101140a8c002d49d60da')
59
60        # no key, no salt, 'sha256'
61        data_sha256 = simple_hash('web2py rocks!', key='', salt='', digest_alg='sha256')
62        self.assertEqual(data_sha256, '0849f224d8deb267e4598702aaec1bd749e6caec90832469891012a4be24af08')
63
64        # no key, no salt, 'sha384'
65        data_sha384 = simple_hash('web2py rocks!', key='', salt='', digest_alg='sha384')
66        self.assertEqual(data_sha384,
67                         '3cffaf39371adbe84eb10f588d2718207d8e965e9172a27a278321b86977351376ae79f92e91d8c58cad86c491282d5f')
68
69        # no key, no salt, 'sha512'
70        data_sha512 = simple_hash('web2py rocks!', key='', salt='', digest_alg='sha512')
71        self.assertEqual(data_sha512, 'fa3237f594743e1d7b6c800bb134b3255cf4a98ab8b01e2ec23256328c9f8059'
72                                      '64fdef25a038d6cc3fda1b2fb45d66461eeed5c4669e506ec8bdfee71348db7e')
73
74    # NOTE : get_digest() is covered by simple_hash tests above except raise error...
75    def test_get_digest(self):
76        # Bad algorithm
77        # Option 1, think not working with python 2.6
78        # with self.assertRaises(ValueError) as cm:
79        #     get_digest('123')
80        # self.assertEqual(cm.exception[0], 'Invalid digest algorithm: 123')
81        # Option 2
82        self.assertRaises(ValueError, get_digest, '123')
83
84    # TODO: def test_get_callable_argspec(self):
85
86    def test_pad(self):
87        test_cases = [
88            (16, b'mydata'), # verify data padding and unpad identity
89            (32, b'mydata '), # verify space is not stripped
90            (8, b'mydata\x01'), # verify "padding" bytes are ignored
91            (4, b'mydata'), # verify multiblock behavior
92            (2, b''), # verify empty string behavior
93        ]
94        for (testlen,teststr) in test_cases:
95            padded = gluon.utils.pad(teststr,testlen)
96            unpadded = gluon.utils.unpad(padded,testlen)
97            self.assertTrue(len(padded) > len(teststr))
98            self.assertTrue(len(padded)%testlen == 0)
99            self.assertEqual(teststr, unpadded)
100
101        testobj = {'a': 1, 'b': 2}
102        pickled = pickle.dumps(testobj)
103        padded = gluon.utils.pad(pickled)
104        unpadded = gluon.utils.unpad(padded)
105        unpickled = pickle.loads(unpadded)
106        self.assertEqual(pickled, unpadded)
107        self.assertEqual(testobj, unpickled)
108        self.assertTrue(len(padded) > len(pickled))
109        self.assertTrue(len(padded)%32==0)
110
111    def test_secure_dumps_and_loads(self):
112        """ Tests secure_dumps and secure_loads"""
113        testobj = {'a': 1, 'b': 2}
114        testkey = 'mysecret'
115        secured = secure_dumps(testobj, testkey)
116        original = secure_loads(secured, testkey)
117        self.assertEqual(testobj, original)
118        self.assertTrue(isinstance(secured, bytes))
119        self.assertTrue(secured.count(b':') == 2)
120
121        secured_deprecated = gluon.utils.secure_dumps_deprecated(testobj, testkey)
122        original_deprecated = secure_loads(secured_deprecated, testkey)
123        self.assertEqual(testobj, original_deprecated)
124        self.assertTrue(isinstance(secured_deprecated, bytes))
125        self.assertTrue(secured_deprecated.count(b':') == 1)
126
127        large_testobj = [x for x in range(1000)]
128        secured_comp = secure_dumps(large_testobj, testkey, compression_level=9)
129        original_comp = secure_loads(secured_comp, testkey, compression_level=9)
130        self.assertEqual(large_testobj, original_comp)
131        secured = secure_dumps(large_testobj, testkey)
132        self.assertTrue(len(secured_comp) < len(secured))
133
134        testhash = 'myhash'
135        secured = secure_dumps(testobj, testkey, testhash)
136        original = secure_loads(secured, testkey, testhash)
137        self.assertEqual(testobj, original)
138
139        wrong1 = secure_loads(secured, testkey, 'wronghash')
140        self.assertEqual(wrong1, None)
141        wrong2 = secure_loads(secured, 'wrongkey', testhash)
142        self.assertEqual(wrong2, None)
143        wrong3 = secure_loads(secured, 'wrongkey', 'wronghash')
144        self.assertEqual(wrong3, None)
145        wrong4 = secure_loads(b'abc', 'a', 'b')
146        self.assertEqual(wrong4, None)
147
148    # TODO: def test_initialize_urandom(self):
149
150    # TODO: def test_fast_urandom16(self):
151
152    def test_web2py_uuid(self):
153        from uuid import UUID
154        self.assertTrue(UUID(web2py_uuid()))
155
156    def test_is_valid_ip_address(self):
157        # IPv4
158        # False
159        # self.assertEqual(is_valid_ip_address('127.0'), False)  # Fail with AppVeyor?? should pass
160        self.assertEqual(is_valid_ip_address('unknown'), False)
161        self.assertEqual(is_valid_ip_address(''), False)
162        # True
163        self.assertEqual(is_valid_ip_address('127.0.0.1'), True)
164        self.assertEqual(is_valid_ip_address('localhost'), True)
165        self.assertEqual(is_valid_ip_address('::1'), True)
166        # IPv6
167        # True
168        # Compressed
169        self.assertEqual(is_valid_ip_address('::ffff:7f00:1'), True)  # IPv6 127.0.0.1 compressed
170        self.assertEqual(is_valid_ip_address('2001:660::1'), True)
171        # Expanded
172        self.assertEqual(is_valid_ip_address('0:0:0:0:0:ffff:7f00:1'), True)  # IPv6 127.0.0.1 expanded
173        self.assertEqual(is_valid_ip_address('2607:fa48:6d50:69f1:21f:3cff:fe9d:9be3'), True)  # Any address
174        # False
175        # self.assertEqual(is_valid_ip_address('2607:fa48:6d50:69f1:21f:3cff:fe9d:'), False)  # Any address with mistake
176        # The above pass locally but fail with AppVeyor
177
178        # TODO: def test_is_loopback_ip_address(self):
179
180        # TODO: def test_getipaddrinfo(self):
Note: See TracBrowser for help on using the repository browser.