commit 2fa32642d4b734821746d2488334ef68c38ad634 Author: Dave Rolek dmr-x@riseup.net Date: Mon Aug 6 21:45:26 2018 +0000
Provide a nicer error message for packing negative numbers with unsigned types --- stem/client/datatype.py | 3 +++ test/unit/client/size.py | 9 +++++++++ 2 files changed, 12 insertions(+)
diff --git a/stem/client/datatype.py b/stem/client/datatype.py index 5ca4e820..e19adfb1 100644 --- a/stem/client/datatype.py +++ b/stem/client/datatype.py @@ -349,6 +349,7 @@ class Size(Field): self.name = name self.size = size self.format = pack_format + self.unsigned = pack_format.isupper()
@staticmethod def pop(packed): @@ -357,6 +358,8 @@ class Size(Field): def pack(self, content): if not stem.util._is_int(content): raise ValueError('Size.pack encodes an integer, but was a %s' % type(content).__name__) + if self.unsigned and content < 0: + raise ValueError('A %s field cannot pack negative values, but %i was tried' % (self.name, content))
packed = struct.pack(self.format, content)
diff --git a/test/unit/client/size.py b/test/unit/client/size.py index eebe3619..3d7d796f 100644 --- a/test/unit/client/size.py +++ b/test/unit/client/size.py @@ -7,17 +7,22 @@ import unittest
from stem.client.datatype import Size
+SIGNED_CHAR = Size('SIGNED_CHAR', 1, '!b') +
class TestSize(unittest.TestCase): def test_attributes(self): self.assertEqual('CHAR', Size.CHAR.name) self.assertEqual('!B', Size.CHAR.format) + self.assertEqual(True, Size.CHAR.unsigned)
self.assertEqual(1, Size.CHAR.size) self.assertEqual(2, Size.SHORT.size) self.assertEqual(4, Size.LONG.size) self.assertEqual(8, Size.LONG_LONG.size)
+ self.assertEqual(False, SIGNED_CHAR.unsigned) + def test_pack(self): self.assertEqual(b'\x12', Size.CHAR.pack(18)) self.assertEqual(b'\x00\x12', Size.SHORT.pack(18)) @@ -26,9 +31,13 @@ class TestSize(unittest.TestCase):
self.assertRaisesWith(ValueError, 'Size.pack encodes an integer, but was a str', Size.CHAR.pack, 'hi')
+ self.assertRaisesWith(ValueError, 'A CHAR field cannot pack negative values, but -1 was tried', Size.CHAR.pack, -1) + bad_size = Size('BAD_SIZE', 1, '!H') self.assertRaisesRegexp(ValueError, re.escape("'\x00\x12' is the wrong size for a BAD_SIZE field"), bad_size.pack, 18)
+ self.assertEqual(b'\xFF', SIGNED_CHAR.pack(-1)) + def test_unpack(self): self.assertEqual(18, Size.CHAR.unpack(b'\x12')) self.assertEqual(18, Size.SHORT.unpack(b'\x00\x12'))