2007-04-06 23:29:25 +00:00
|
|
|
|
|
|
|
def foo(): pass # keep the line number constant
|
|
|
|
|
|
|
|
from twisted.trial import unittest
|
|
|
|
|
|
|
|
from allmydata.util import bencode, idlib, humanreadable
|
|
|
|
|
|
|
|
|
|
|
|
class IDLib(unittest.TestCase):
|
|
|
|
def test_b2a(self):
|
|
|
|
self.failUnlessEqual(idlib.b2a("\x12\x34"), "ci2a====")
|
|
|
|
def test_b2a_or_none(self):
|
|
|
|
self.failUnlessEqual(idlib.b2a_or_none(None), None)
|
|
|
|
self.failUnlessEqual(idlib.b2a_or_none("\x12\x34"), "ci2a====")
|
|
|
|
def test_a2b(self):
|
|
|
|
self.failUnlessEqual(idlib.a2b("ci2a===="), "\x12\x34")
|
2007-04-06 23:33:22 +00:00
|
|
|
self.failUnlessRaises(TypeError, idlib.a2b, "bogus")
|
2007-04-06 23:29:25 +00:00
|
|
|
def test_peerid(self):
|
|
|
|
# these are 160-bit numbers
|
|
|
|
peerid = "\x80" + "\x00" * 19
|
|
|
|
short = idlib.peerid_to_short_string(peerid)
|
|
|
|
self.failUnlessEqual(short, "qaaa")
|
|
|
|
|
|
|
|
class NoArgumentException(Exception):
|
|
|
|
def __init__(self):
|
|
|
|
pass
|
|
|
|
|
|
|
|
class HumanReadable(unittest.TestCase):
|
|
|
|
def test_repr(self):
|
|
|
|
hr = humanreadable.hr
|
2007-04-06 23:36:22 +00:00
|
|
|
self.failUnlessEqual(hr(foo), "<foo() at test_util.py:2>")
|
2007-04-06 23:29:25 +00:00
|
|
|
self.failUnlessEqual(hr(self.test_repr),
|
2007-04-06 23:36:22 +00:00
|
|
|
"<bound method HumanReadable.test_repr of <allmydata.test.test_util.HumanReadable testMethod=test_repr>>")
|
2007-04-06 23:29:25 +00:00
|
|
|
self.failUnlessEqual(hr(1L), "1")
|
|
|
|
self.failUnlessEqual(hr(10**40),
|
|
|
|
"100000000000000000...000000000000000000")
|
2007-04-06 23:36:22 +00:00
|
|
|
self.failUnlessEqual(hr(self), "<allmydata.test.test_util.HumanReadable testMethod=test_repr>")
|
2007-04-06 23:29:25 +00:00
|
|
|
self.failUnlessEqual(hr([1,2]), "[1, 2]")
|
|
|
|
self.failUnlessEqual(hr({1:2}), "{1:2}")
|
|
|
|
try:
|
|
|
|
raise RuntimeError
|
|
|
|
except Exception, e:
|
2007-04-06 23:36:22 +00:00
|
|
|
self.failUnless(
|
|
|
|
hr(e) == "<RuntimeError: ()>" # python-2.4
|
|
|
|
or hr(e) == "RuntimeError()") # python-2.5
|
2007-04-06 23:29:25 +00:00
|
|
|
try:
|
|
|
|
raise RuntimeError("oops")
|
|
|
|
except Exception, e:
|
2007-04-07 00:12:26 +00:00
|
|
|
self.failUnless(
|
|
|
|
hr(e) == "<RuntimeError: 'oops'>" # python-2.4
|
2007-04-07 00:21:25 +00:00
|
|
|
or hr(e) == "RuntimeError('oops',)") # python-2.5
|
2007-04-06 23:29:25 +00:00
|
|
|
try:
|
|
|
|
raise NoArgumentException
|
|
|
|
except Exception, e:
|
2007-04-07 00:21:25 +00:00
|
|
|
self.failUnless(
|
|
|
|
hr(e) == "<NoArgumentException>" # python-2.4
|
|
|
|
or hr(e) == "NoArgumentException()") # python-2.5
|
2007-04-06 23:29:25 +00:00
|
|
|
|
|
|
|
|
|
|
|
class MyList(list):
|
|
|
|
pass
|
|
|
|
|
|
|
|
class Bencode(unittest.TestCase):
|
|
|
|
def test_bencode(self):
|
|
|
|
e = bencode.bencode
|
|
|
|
self.failUnlessEqual(e(4), "i4e")
|
|
|
|
self.failUnlessEqual(e([1,2]), "li1ei2ee")
|
|
|
|
self.failUnlessEqual(e(MyList([1,2])), "li1ei2ee")
|
|
|
|
self.failUnlessEqual(e({1:2}), "di1ei2ee")
|
|
|
|
self.failUnlessEqual(e(u"a"), "u1:a")
|
|
|
|
self.failUnlessEqual(e([True,False]), "lb1b0e")
|
|
|
|
self.failUnlessEqual(e(1.5), "f1.5e")
|
|
|
|
self.failUnlessEqual(e("foo"), "3:foo")
|
|
|
|
d = bencode.bdecode
|
|
|
|
self.failUnlessEqual(d("li1ei2ee"), [1,2])
|
|
|
|
self.failUnlessEqual(d("u1:a"), u"a")
|
|
|
|
self.failUnlessRaises(ValueError, d, "u10:short")
|
|
|
|
self.failUnlessEqual(d("lb1b0e"), [True,False])
|
|
|
|
self.failUnlessRaises(ValueError, d, "b2")
|
|
|
|
self.failUnlessEqual(d("f1.5e"), 1.5)
|
|
|
|
self.failUnlessEqual(d("3:foo"), "foo")
|
|
|
|
self.failUnlessRaises(ValueError, d,
|
|
|
|
"38:When doing layout, always plan ah")
|
|
|
|
# ooh! fascinating! bdecode requires string keys! I think this ought
|
|
|
|
# to be changed
|
|
|
|
#self.failUnlessEqual(d("di1ei2ee"), {1:2})
|
|
|
|
self.failUnlessEqual(d("d1:ai2eu1:bi3ee"), {"a":2, u"b":3})
|
|
|
|
self.failUnlessRaises(ValueError, d, "di1ei2ee")
|
|
|
|
self.failUnlessRaises(ValueError, d, "d1:ai1e1:ai2ee")
|
|
|
|
|
|
|
|
self.failUnlessRaises(ValueError, d, "i1ei2e")
|
|
|
|
|
|
|
|
# now run all the module's builtin tests
|
|
|
|
bencode.test_decode_raw_string()
|
|
|
|
bencode.test_encode_and_decode_unicode_results_in_unicode_type()
|
|
|
|
bencode.test_encode_and_decode_unicode_at_least_preserves_the_content_even_if_it_flattens_the_type()
|
|
|
|
bencode.test_dict_forbids_non_string_key()
|
|
|
|
bencode.test_dict_forbids_key_repeat()
|
|
|
|
bencode.test_empty_dict()
|
|
|
|
bencode.test_dict_allows_unicode_keys()
|
|
|
|
bencode.test_ValueError_in_decode_unknown()
|
|
|
|
bencode.test_encode_and_decode_none()
|
|
|
|
bencode.test_encode_and_decode_long()
|
|
|
|
bencode.test_encode_and_decode_int()
|
|
|
|
bencode.test_encode_and_decode_float()
|
|
|
|
bencode.test_encode_and_decode_bool()
|
|
|
|
#bencode.test_decode_noncanonical_int()
|
|
|
|
bencode.test_encode_and_decode_dict()
|
|
|
|
bencode.test_encode_and_decode_list()
|
|
|
|
bencode.test_encode_and_decode_tuple()
|
|
|
|
bencode.test_encode_and_decode_empty_dict()
|
|
|
|
bencode.test_encode_and_decode_complex_object()
|
|
|
|
bencode.test_unfinished_list()
|
|
|
|
bencode.test_unfinished_dict()
|
|
|
|
bencode.test_unsupported_type()
|
|
|
|
|