+ encode_func[type(x)](x, r)
+ except:
+ raise ValueError, "failed to bencode the data"
+ return ''.join(r)
+
+class TestBencode(unittest.TestCase):
+ """Test the bencoding and bdecoding of data."""
+
+ timeout = 2
+
+ def test_bdecode_string(self):
+ self.failUnlessRaises(ValueError, bdecode, '0:0:')
+ self.failUnlessRaises(ValueError, bdecode, '')
+ self.failUnlessRaises(ValueError, bdecode, '35208734823ljdahflajhdf')
+ self.failUnlessRaises(ValueError, bdecode, '2:abfdjslhfld')
+ self.failUnlessEqual(bdecode('0:'), '')
+ self.failUnlessEqual(bdecode('3:abc'), 'abc')
+ self.failUnlessEqual(bdecode('10:1234567890'), '1234567890')
+ self.failUnlessRaises(ValueError, bdecode, '02:xy')
+ self.failUnlessRaises(ValueError, bdecode, '9999:x')
+
+ def test_bdecode_int(self):
+ self.failUnlessRaises(ValueError, bdecode, 'ie')
+ self.failUnlessRaises(ValueError, bdecode, 'i341foo382e')
+ self.failUnlessEqual(bdecode('i4e'), 4L)
+ self.failUnlessEqual(bdecode('i0e'), 0L)
+ self.failUnlessEqual(bdecode('i123456789e'), 123456789L)
+ self.failUnlessEqual(bdecode('i-10e'), -10L)
+ self.failUnlessRaises(ValueError, bdecode, 'i-0e')
+ self.failUnlessRaises(ValueError, bdecode, 'i123')
+ self.failUnlessRaises(ValueError, bdecode, 'i6easd')
+ self.failUnlessRaises(ValueError, bdecode, 'i03e')
+
+ def test_bdecode_list(self):
+ self.failUnlessRaises(ValueError, bdecode, 'l')
+ self.failUnlessEqual(bdecode('le'), [])
+ self.failUnlessRaises(ValueError, bdecode, 'leanfdldjfh')
+ self.failUnlessEqual(bdecode('l0:0:0:e'), ['', '', ''])
+ self.failUnlessRaises(ValueError, bdecode, 'relwjhrlewjh')
+ self.failUnlessEqual(bdecode('li1ei2ei3ee'), [1, 2, 3])
+ self.failUnlessEqual(bdecode('l3:asd2:xye'), ['asd', 'xy'])
+ self.failUnlessEqual(bdecode('ll5:Alice3:Bobeli2ei3eee'), [['Alice', 'Bob'], [2, 3]])
+ self.failUnlessRaises(ValueError, bdecode, 'l01:ae')
+ self.failUnlessRaises(ValueError, bdecode, 'l0:')
+
+ def test_bdecode_dict(self):
+ self.failUnlessRaises(ValueError, bdecode, 'd')
+ self.failUnlessRaises(ValueError, bdecode, 'defoobar')
+ self.failUnlessEqual(bdecode('de'), {})
+ self.failUnlessEqual(bdecode('d3:agei25e4:eyes4:bluee'), {'age': 25, 'eyes': 'blue'})
+ self.failUnlessEqual(bdecode('d8:spam.mp3d6:author5:Alice6:lengthi100000eee'),
+ {'spam.mp3': {'author': 'Alice', 'length': 100000}})
+ self.failUnlessRaises(ValueError, bdecode, 'd3:fooe')
+ self.failUnlessRaises(ValueError, bdecode, 'di1e0:e')
+ self.failUnlessRaises(ValueError, bdecode, 'd1:b0:1:a0:e')
+ self.failUnlessRaises(ValueError, bdecode, 'd1:a0:1:a0:e')
+ self.failUnlessRaises(ValueError, bdecode, 'd0:0:')
+ self.failUnlessRaises(ValueError, bdecode, 'd0:')
+
+ def test_bencode_int(self):
+ self.failUnlessEqual(bencode(4), 'i4e')
+ self.failUnlessEqual(bencode(0), 'i0e')
+ self.failUnlessEqual(bencode(-10), 'i-10e')
+ self.failUnlessEqual(bencode(12345678901234567890L), 'i12345678901234567890e')
+
+ def test_bencode_string(self):
+ self.failUnlessEqual(bencode(''), '0:')
+ self.failUnlessEqual(bencode('abc'), '3:abc')
+ self.failUnlessEqual(bencode('1234567890'), '10:1234567890')
+
+ def test_bencode_list(self):
+ self.failUnlessEqual(bencode([]), 'le')
+ self.failUnlessEqual(bencode([1, 2, 3]), 'li1ei2ei3ee')
+ self.failUnlessEqual(bencode([['Alice', 'Bob'], [2, 3]]), 'll5:Alice3:Bobeli2ei3eee')