2 def foo(): pass # keep the line number constant
4 from twisted.trial import unittest
6 from allmydata.util import bencode, idlib, humanreadable, mathutil
9 class IDLib(unittest.TestCase):
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====")
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")
24 class NoArgumentException(Exception):
28 class HumanReadable(unittest.TestCase):
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}")
44 hr(e) == "<RuntimeError: ()>" # python-2.4
45 or hr(e) == "RuntimeError()") # python-2.5
47 raise RuntimeError("oops")
50 hr(e) == "<RuntimeError: 'oops'>" # python-2.4
51 or hr(e) == "RuntimeError('oops',)") # python-2.5
53 raise NoArgumentException
56 hr(e) == "<NoArgumentException>" # python-2.4
57 or hr(e) == "NoArgumentException()") # python-2.5
63 class Bencode(unittest.TestCase):
64 def test_bencode(self):
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")
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
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")
91 self.failUnlessRaises(ValueError, d, "i1ei2e")
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()
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)
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)
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)
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)
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)
179 self.failIf(f(i, 3), "but %d is *not* a power of 3" % i)
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)
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)
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)