]> git.rkrishnan.org Git - tahoe-lafs/tahoe-lafs.git/blob - src/allmydata/test/test_util.py
test_util: add full coverage for mathutil.py
[tahoe-lafs/tahoe-lafs.git] / src / allmydata / test / test_util.py
1
2 def foo(): pass # keep the line number constant
3
4 from twisted.trial import unittest
5
6 from allmydata.util import bencode, idlib, humanreadable, mathutil
7
8
9 class IDLib(unittest.TestCase):
10     def test_b2a(self):
11         self.failUnlessEqual(idlib.b2a("\x12\x34"), "ci2a====")
12     def test_b2a_or_none(self):
13         self.failUnlessEqual(idlib.b2a_or_none(None), None)
14         self.failUnlessEqual(idlib.b2a_or_none("\x12\x34"), "ci2a====")
15     def test_a2b(self):
16         self.failUnlessEqual(idlib.a2b("ci2a===="), "\x12\x34")
17         self.failUnlessRaises(TypeError, idlib.a2b, "bogus")
18     def test_peerid(self):
19         # these are 160-bit numbers
20         peerid = "\x80" + "\x00" * 19
21         short = idlib.peerid_to_short_string(peerid)
22         self.failUnlessEqual(short, "qaaa")
23
24 class NoArgumentException(Exception):
25     def __init__(self):
26         pass
27
28 class HumanReadable(unittest.TestCase):
29     def test_repr(self):
30         hr = humanreadable.hr
31         self.failUnlessEqual(hr(foo), "<foo() at test_util.py:2>")
32         self.failUnlessEqual(hr(self.test_repr),
33                              "<bound method HumanReadable.test_repr of <allmydata.test.test_util.HumanReadable testMethod=test_repr>>")
34         self.failUnlessEqual(hr(1L), "1")
35         self.failUnlessEqual(hr(10**40),
36                              "100000000000000000...000000000000000000")
37         self.failUnlessEqual(hr(self), "<allmydata.test.test_util.HumanReadable testMethod=test_repr>")
38         self.failUnlessEqual(hr([1,2]), "[1, 2]")
39         self.failUnlessEqual(hr({1:2}), "{1:2}")
40         try:
41             raise RuntimeError
42         except Exception, e:
43             self.failUnless(
44                 hr(e) == "<RuntimeError: ()>" # python-2.4
45                 or hr(e) == "RuntimeError()") # python-2.5
46         try:
47             raise RuntimeError("oops")
48         except Exception, e:
49             self.failUnless(
50                 hr(e) == "<RuntimeError: 'oops'>" # python-2.4
51                 or hr(e) == "RuntimeError('oops',)") # python-2.5
52         try:
53             raise NoArgumentException
54         except Exception, e:
55             self.failUnless(
56                 hr(e) == "<NoArgumentException>" # python-2.4
57                 or hr(e) == "NoArgumentException()") # python-2.5
58
59
60 class MyList(list):
61     pass
62
63 class Bencode(unittest.TestCase):
64     def test_bencode(self):
65         e = bencode.bencode
66         self.failUnlessEqual(e(4), "i4e")
67         self.failUnlessEqual(e([1,2]), "li1ei2ee")
68         self.failUnlessEqual(e(MyList([1,2])), "li1ei2ee")
69         self.failUnlessEqual(e({1:2}), "di1ei2ee")
70         self.failUnlessEqual(e(u"a"), "u1:a")
71         self.failUnlessEqual(e([True,False]), "lb1b0e")
72         self.failUnlessEqual(e(1.5), "f1.5e")
73         self.failUnlessEqual(e("foo"), "3:foo")
74         d = bencode.bdecode
75         self.failUnlessEqual(d("li1ei2ee"), [1,2])
76         self.failUnlessEqual(d("u1:a"), u"a")
77         self.failUnlessRaises(ValueError, d, "u10:short")
78         self.failUnlessEqual(d("lb1b0e"), [True,False])
79         self.failUnlessRaises(ValueError, d, "b2")
80         self.failUnlessEqual(d("f1.5e"), 1.5)
81         self.failUnlessEqual(d("3:foo"), "foo")
82         self.failUnlessRaises(ValueError, d,
83                               "38:When doing layout, always plan ah")
84         # ooh! fascinating! bdecode requires string keys! I think this ought
85         # to be changed
86         #self.failUnlessEqual(d("di1ei2ee"), {1:2})
87         self.failUnlessEqual(d("d1:ai2eu1:bi3ee"), {"a":2, u"b":3})
88         self.failUnlessRaises(ValueError, d, "di1ei2ee")
89         self.failUnlessRaises(ValueError, d, "d1:ai1e1:ai2ee")
90
91         self.failUnlessRaises(ValueError, d, "i1ei2e")
92
93         # now run all the module's builtin tests
94         bencode.test_decode_raw_string()
95         bencode.test_encode_and_decode_unicode_results_in_unicode_type()
96         bencode.test_encode_and_decode_unicode_at_least_preserves_the_content_even_if_it_flattens_the_type()
97         bencode.test_dict_forbids_non_string_key()
98         bencode.test_dict_forbids_key_repeat()
99         bencode.test_empty_dict()
100         bencode.test_dict_allows_unicode_keys()
101         bencode.test_ValueError_in_decode_unknown()
102         bencode.test_encode_and_decode_none()
103         bencode.test_encode_and_decode_long()
104         bencode.test_encode_and_decode_int()
105         bencode.test_encode_and_decode_float()
106         bencode.test_encode_and_decode_bool()
107         #bencode.test_decode_noncanonical_int()
108         bencode.test_encode_and_decode_dict()
109         bencode.test_encode_and_decode_list()
110         bencode.test_encode_and_decode_tuple()
111         bencode.test_encode_and_decode_empty_dict()
112         bencode.test_encode_and_decode_complex_object()
113         bencode.test_unfinished_list()
114         bencode.test_unfinished_dict()
115         bencode.test_unsupported_type()
116
117 class Math(unittest.TestCase):
118     def test_div_ceil(self):
119         f = mathutil.div_ceil
120         self.failUnlessEqual(f(0, 1), 0)
121         self.failUnlessEqual(f(0, 2), 0)
122         self.failUnlessEqual(f(0, 3), 0)
123         self.failUnlessEqual(f(1, 3), 1)
124         self.failUnlessEqual(f(2, 3), 1)
125         self.failUnlessEqual(f(3, 3), 1)
126         self.failUnlessEqual(f(4, 3), 2)
127         self.failUnlessEqual(f(5, 3), 2)
128         self.failUnlessEqual(f(6, 3), 2)
129         self.failUnlessEqual(f(7, 3), 3)
130
131     def test_next_multiple(self):
132         f = mathutil.next_multiple
133         self.failUnlessEqual(f(5, 1), 5)
134         self.failUnlessEqual(f(5, 2), 6)
135         self.failUnlessEqual(f(5, 3), 6)
136         self.failUnlessEqual(f(5, 4), 8)
137         self.failUnlessEqual(f(5, 5), 5)
138         self.failUnlessEqual(f(5, 6), 6)
139         self.failUnlessEqual(f(32, 1), 32)
140         self.failUnlessEqual(f(32, 2), 32)
141         self.failUnlessEqual(f(32, 3), 33)
142         self.failUnlessEqual(f(32, 4), 32)
143         self.failUnlessEqual(f(32, 5), 35)
144         self.failUnlessEqual(f(32, 6), 36)
145         self.failUnlessEqual(f(32, 7), 35)
146         self.failUnlessEqual(f(32, 8), 32)
147         self.failUnlessEqual(f(32, 9), 36)
148         self.failUnlessEqual(f(32, 10), 40)
149         self.failUnlessEqual(f(32, 11), 33)
150         self.failUnlessEqual(f(32, 12), 36)
151         self.failUnlessEqual(f(32, 13), 39)
152         self.failUnlessEqual(f(32, 14), 42)
153         self.failUnlessEqual(f(32, 15), 45)
154         self.failUnlessEqual(f(32, 16), 32)
155         self.failUnlessEqual(f(32, 17), 34)
156         self.failUnlessEqual(f(32, 18), 36)
157         self.failUnlessEqual(f(32, 589), 589)
158
159     def test_pad_size(self):
160         f = mathutil.pad_size
161         self.failUnlessEqual(f(0, 4), 0)
162         self.failUnlessEqual(f(1, 4), 3)
163         self.failUnlessEqual(f(2, 4), 2)
164         self.failUnlessEqual(f(3, 4), 1)
165         self.failUnlessEqual(f(4, 4), 0)
166         self.failUnlessEqual(f(5, 4), 3)
167
168     def test_is_power_of_k(self):
169         f = mathutil.is_power_of_k
170         for i in range(1, 100):
171             if i in (1, 2, 4, 8, 16, 32, 64):
172                 self.failUnless(f(i, 2), "but %d *is* a power of 2" % i)
173             else:
174                 self.failIf(f(i, 2), "but %d is *not* a power of 2" % i)
175         for i in range(1, 100):
176             if i in (1, 3, 9, 27, 81):
177                 self.failUnless(f(i, 3), "but %d *is* a power of 3" % i)
178             else:
179                 self.failIf(f(i, 3), "but %d is *not* a power of 3" % i)
180
181     def test_next_power_of_k(self):
182         f = mathutil.next_power_of_k
183         self.failUnlessEqual(f(0,2), 1)
184         self.failUnlessEqual(f(1,2), 1)
185         self.failUnlessEqual(f(2,2), 2)
186         self.failUnlessEqual(f(3,2), 4)
187         self.failUnlessEqual(f(4,2), 4)
188         for i in range(5, 8): self.failUnlessEqual(f(i,2), 8, "%d" % i)
189         for i in range(9, 16): self.failUnlessEqual(f(i,2), 16, "%d" % i)
190         for i in range(17, 32): self.failUnlessEqual(f(i,2), 32, "%d" % i)
191         for i in range(33, 64): self.failUnlessEqual(f(i,2), 64, "%d" % i)
192         for i in range(65, 100): self.failUnlessEqual(f(i,2), 128, "%d" % i)
193
194         self.failUnlessEqual(f(0,3), 1)
195         self.failUnlessEqual(f(1,3), 1)
196         self.failUnlessEqual(f(2,3), 3)
197         self.failUnlessEqual(f(3,3), 3)
198         for i in range(4, 9): self.failUnlessEqual(f(i,3), 9, "%d" % i)
199         for i in range(10, 27): self.failUnlessEqual(f(i,3), 27, "%d" % i)
200         for i in range(28, 81): self.failUnlessEqual(f(i,3), 81, "%d" % i)
201         for i in range(82, 200): self.failUnlessEqual(f(i,3), 243, "%d" % i)
202
203     def test_ave(self):
204         f = mathutil.ave
205         self.failUnlessEqual(f([1,2,3]), 2)
206         self.failUnlessEqual(f([0,0,0,4]), 1)
207         self.failUnlessAlmostEqual(f([0.0, 1.0, 1.0]), .666666666666)
208