commit 17d571d0414df0691b54888614ab92dc8171c72e
Author: Damian Johnson <atagar(a)torproject.org>
Date: Sun Feb 25 17:34:56 2018 -0800
Fix python3 compatibility for tests
Mostly just the usual bytes/unicode issues with new additions.
---
stem/client/cell.py | 8 ++---
stem/client/datatype.py | 10 +++---
stem/descriptor/remote.py | 3 ++
test/task.py | 2 +-
test/unit/client/address.py | 24 +++++++-------
test/unit/client/cell.py | 70 ++++++++++++++++++++---------------------
test/unit/client/certificate.py | 18 +++++------
test/unit/client/kdf.py | 24 +++++++-------
test/unit/client/size.py | 26 +++++++--------
test/unit/descriptor/remote.py | 18 +++++------
10 files changed, 103 insertions(+), 100 deletions(-)
diff --git a/stem/client/cell.py b/stem/client/cell.py
index c5f8f20b..a3a0f7f0 100644
--- a/stem/client/cell.py
+++ b/stem/client/cell.py
@@ -46,7 +46,7 @@ import sys
from stem import UNDEFINED
from stem.client.datatype import HASH_LEN, ZERO, Address, Certificate, CloseReason, RelayCommand, Size, split
-from stem.util import _hash_attr, datetime_to_unix
+from stem.util import _hash_attr, datetime_to_unix, str_type, str_tools
FIXED_PAYLOAD_LEN = 509
AUTH_CHALLENGE_SIZE = 32
@@ -307,7 +307,7 @@ class RelayCell(CircuitCell):
# isinstance() isn't such a great option.
digest = Size.LONG.unpack(digest.digest()[:4])
- elif isinstance(digest, str):
+ elif isinstance(digest, (bytes, str_type)):
digest = Size.LONG.unpack(digest[:4])
elif isinstance(digest, int):
pass
@@ -316,7 +316,7 @@ class RelayCell(CircuitCell):
super(RelayCell, self).__init__(circ_id)
self.command, self.command_int = RelayCommand.get(command)
- self.data = data
+ self.data = str_tools._to_bytes(data)
self.recognized = recognized
self.digest = digest
self.stream_id = stream_id
@@ -619,7 +619,7 @@ class CertsCell(Cell):
self.certificates = certs
def pack(self, link_protocol):
- return CertsCell._pack(link_protocol, Size.CHAR.pack(len(self.certificates)) + ''.join([cert.pack() for cert in self.certificates]))
+ return CertsCell._pack(link_protocol, Size.CHAR.pack(len(self.certificates)) + b''.join([cert.pack() for cert in self.certificates]))
@classmethod
def _unpack(cls, content, circ_id, link_protocol):
diff --git a/stem/client/datatype.py b/stem/client/datatype.py
index 352a643e..687c5081 100644
--- a/stem/client/datatype.py
+++ b/stem/client/datatype.py
@@ -121,7 +121,7 @@ import stem.util.enum
from stem.util import _hash_attr
-ZERO = '\x00'
+ZERO = b'\x00'
HASH_LEN = 20
KEY_LEN = 16
@@ -354,17 +354,17 @@ class Address(Field):
if self.type == AddrType.IPv4:
if stem.util.connection.is_valid_ipv4_address(value):
self.value = value
- self.value_bin = ''.join([Size.CHAR.pack(int(v)) for v in value.split('.')])
+ self.value_bin = b''.join([Size.CHAR.pack(int(v)) for v in value.split('.')])
else:
if len(value) != 4:
raise ValueError('Packed IPv4 addresses should be four bytes, but was: %s' % repr(value))
- self.value = '.'.join([str(Size.CHAR.unpack(value[i])) for i in range(4)])
+ self.value = '.'.join([str(Size.CHAR.unpack(value[i:i + 1])) for i in range(4)])
self.value_bin = value
elif self.type == AddrType.IPv6:
if stem.util.connection.is_valid_ipv6_address(value):
self.value = stem.util.connection.expand_ipv6_address(value).lower()
- self.value_bin = ''.join([Size.SHORT.pack(int(v, 16)) for v in self.value.split(':')])
+ self.value_bin = b''.join([Size.SHORT.pack(int(v, 16)) for v in self.value.split(':')])
else:
if len(value) != 16:
raise ValueError('Packed IPv6 addresses should be sixteen bytes, but was: %s' % repr(value))
@@ -460,7 +460,7 @@ class KDF(collections.namedtuple('KDF', ['key_hash', 'forward_digest', 'backward
#
# K = H(K0 | [00]) | H(K0 | [01]) | H(K0 | [02]) | ...
- derived_key = ''
+ derived_key = b''
counter = 0
while len(derived_key) < KEY_LEN * 2 + HASH_LEN * 3:
diff --git a/stem/descriptor/remote.py b/stem/descriptor/remote.py
index d2a6867c..9181dbcf 100644
--- a/stem/descriptor/remote.py
+++ b/stem/descriptor/remote.py
@@ -1132,6 +1132,9 @@ class FallbackDirectory(Directory):
:raises: **ValueError** if content is malformed
"""
+ if isinstance(content, bytes):
+ content = str_tools._to_unicode(content)
+
matches = {}
for line in content.splitlines():
diff --git a/test/task.py b/test/task.py
index b28833bd..89437c77 100644
--- a/test/task.py
+++ b/test/task.py
@@ -95,7 +95,7 @@ def _import_tests():
for module in (CONFIG['test.unit_tests'].splitlines() + CONFIG['test.integ_tests'].splitlines()):
try:
importlib.import_module(module.rsplit('.', 1)[0])
- except Exception as exc:
+ except:
raise ImportError(traceback.format_exc())
diff --git a/test/unit/client/address.py b/test/unit/client/address.py
index 09fcee95..aaa5fc0e 100644
--- a/test/unit/client/address.py
+++ b/test/unit/client/address.py
@@ -21,13 +21,13 @@ class TestAddress(unittest.TestCase):
def test_constructor(self):
test_data = (
- ((4, '\x7f\x00\x00\x01'), ExpectedAddress(AddrType.IPv4, 4, '127.0.0.1', '\x7f\x00\x00\x01')),
- ((4, 'aq\x0f\x02'), ExpectedAddress(AddrType.IPv4, 4, '97.113.15.2', 'aq\x0f\x02')),
- ((6, ' \x01\r\xb8\x00\x00\x00\x00\x00\x00\xff\x00\x00B\x83)'), ExpectedAddress(AddrType.IPv6, 6, '2001:0db8:0000:0000:0000:ff00:0042:8329', ' \x01\r\xb8\x00\x00\x00\x00\x00\x00\xff\x00\x00B\x83)')),
- ((AddrType.IPv4, '127.0.0.1'), ExpectedAddress(AddrType.IPv4, 4, '127.0.0.1', '\x7f\x00\x00\x01')),
- ((AddrType.IPv4, '97.113.15.2'), ExpectedAddress(AddrType.IPv4, 4, '97.113.15.2', 'aq\x0f\x02')),
- ((AddrType.IPv6, '2001:0db8:0000:0000:0000:ff00:0042:8329'), ExpectedAddress(AddrType.IPv6, 6, '2001:0db8:0000:0000:0000:ff00:0042:8329', ' \x01\r\xb8\x00\x00\x00\x00\x00\x00\xff\x00\x00B\x83)')),
- ((AddrType.IPv6, '2001:0DB8:AC10:FE01::'), ExpectedAddress(AddrType.IPv6, 6, '2001:0db8:ac10:fe01:0000:0000:0000:0000', ' \x01\r\xb8\xac\x10\xfe\x01\x00\x00\x00\x00\x00\x00\x00\x00')), # collaped and different case
+ ((4, b'\x7f\x00\x00\x01'), ExpectedAddress(AddrType.IPv4, 4, '127.0.0.1', b'\x7f\x00\x00\x01')),
+ ((4, b'aq\x0f\x02'), ExpectedAddress(AddrType.IPv4, 4, '97.113.15.2', b'aq\x0f\x02')),
+ ((6, b' \x01\r\xb8\x00\x00\x00\x00\x00\x00\xff\x00\x00B\x83)'), ExpectedAddress(AddrType.IPv6, 6, '2001:0db8:0000:0000:0000:ff00:0042:8329', b' \x01\r\xb8\x00\x00\x00\x00\x00\x00\xff\x00\x00B\x83)')),
+ ((AddrType.IPv4, '127.0.0.1'), ExpectedAddress(AddrType.IPv4, 4, '127.0.0.1', b'\x7f\x00\x00\x01')),
+ ((AddrType.IPv4, '97.113.15.2'), ExpectedAddress(AddrType.IPv4, 4, '97.113.15.2', b'aq\x0f\x02')),
+ ((AddrType.IPv6, '2001:0db8:0000:0000:0000:ff00:0042:8329'), ExpectedAddress(AddrType.IPv6, 6, '2001:0db8:0000:0000:0000:ff00:0042:8329', b' \x01\r\xb8\x00\x00\x00\x00\x00\x00\xff\x00\x00B\x83)')),
+ ((AddrType.IPv6, '2001:0DB8:AC10:FE01::'), ExpectedAddress(AddrType.IPv6, 6, '2001:0db8:ac10:fe01:0000:0000:0000:0000', b' \x01\r\xb8\xac\x10\xfe\x01\x00\x00\x00\x00\x00\x00\x00\x00')), # collaped and different case
)
for (addr_type, addr_value), expected in test_data:
@@ -55,18 +55,18 @@ class TestAddress(unittest.TestCase):
def test_packing(self):
test_data = {
- '\x04\x04\x7f\x00\x00\x01': Address('127.0.0.1'),
- '\x06\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\xff\x00\x00B\x83)': Address('2001:0db8:0000:0000:0000:ff00:0042:8329'),
+ b'\x04\x04\x7f\x00\x00\x01': Address('127.0.0.1'),
+ b'\x06\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\xff\x00\x00B\x83)': Address('2001:0db8:0000:0000:0000:ff00:0042:8329'),
}
for cell_bytes, address in test_data.items():
self.assertEqual(cell_bytes, address.pack())
self.assertEqual(address, Address.unpack(cell_bytes))
- addr, content = Address.pop('\x04\x04\x7f\x00\x00\x01\x01\x04\x04aq\x0f\x02\x00\x00\x00\x00')
- self.assertEqual('\x01\x04\x04aq\x0f\x02\x00\x00\x00\x00', content)
+ addr, content = Address.pop(b'\x04\x04\x7f\x00\x00\x01\x01\x04\x04aq\x0f\x02\x00\x00\x00\x00')
+ self.assertEqual(b'\x01\x04\x04aq\x0f\x02\x00\x00\x00\x00', content)
self.assertEqual(AddrType.IPv4, addr.type)
self.assertEqual(4, addr.type_int)
self.assertEqual('127.0.0.1', addr.value)
- self.assertEqual('\x7f\x00\x00\x01', addr.value_bin)
+ self.assertEqual(b'\x7f\x00\x00\x01', addr.value_bin)
diff --git a/test/unit/client/cell.py b/test/unit/client/cell.py
index 19744c6d..f066cc4f 100644
--- a/test/unit/client/cell.py
+++ b/test/unit/client/cell.py
@@ -26,55 +26,55 @@ from stem.client.cell import (
)
RANDOM_PAYLOAD = os.urandom(FIXED_PAYLOAD_LEN)
-CHALLENGE = '\x89Y\t\x99\xb2\x1e\xd9*V\xb6\x1bn\n\x05\xd8/\xe3QH\x85\x13Z\x17\xfc\x1c\x00{\xa9\xae\x83^K'
+CHALLENGE = b'\x89Y\t\x99\xb2\x1e\xd9*V\xb6\x1bn\n\x05\xd8/\xe3QH\x85\x13Z\x17\xfc\x1c\x00{\xa9\xae\x83^K'
PADDING_CELLS = {
- '\x00\x00\x00' + RANDOM_PAYLOAD: RANDOM_PAYLOAD,
+ b'\x00\x00\x00' + RANDOM_PAYLOAD: RANDOM_PAYLOAD,
}
RELAY_CELLS = {
- '\x00\x01\x03\r\x00\x00\x00\x01!\xa3?\xec' + ZERO * 500: ('RELAY_BEGIN_DIR', 13, 1, 1, '', 564346860),
- '\x00\x01\x03\x02\x00\x00\x00\x01\x15:m\xe0\x00&GET /tor/server/authority HTTP/1.0\r\n\r\n' + ZERO * 460: ('RELAY_DATA', 2, 1, 1, 'GET /tor/server/authority HTTP/1.0\r\n\r\n', 356150752),
+ b'\x00\x01\x03\r\x00\x00\x00\x01!\xa3?\xec' + ZERO * 500: ('RELAY_BEGIN_DIR', 13, 1, 1, b'', 564346860),
+ b'\x00\x01\x03\x02\x00\x00\x00\x01\x15:m\xe0\x00&GET /tor/server/authority HTTP/1.0\r\n\r\n' + ZERO * 460: ('RELAY_DATA', 2, 1, 1, b'GET /tor/server/authority HTTP/1.0\r\n\r\n', 356150752),
}
DESTROY_CELLS = {
- '\x80\x00\x00\x00\x04\x00' + ZERO * 508: (2147483648, CloseReason.NONE, 0),
- '\x80\x00\x00\x00\x04\x03' + ZERO * 508: (2147483648, CloseReason.REQUESTED, 3),
+ b'\x80\x00\x00\x00\x04\x00' + ZERO * 508: (2147483648, CloseReason.NONE, 0),
+ b'\x80\x00\x00\x00\x04\x03' + ZERO * 508: (2147483648, CloseReason.REQUESTED, 3),
}
CREATE_FAST_CELLS = {
- ('\x80\x00\x00\x00\x05\x92O\x0c\xcb\xa8\xac\xfb\xc9\x7f\xd0\rz\x1a\x03u\x91\xceas\xce' + ZERO * 489): (2147483648, '\x92O\x0c\xcb\xa8\xac\xfb\xc9\x7f\xd0\rz\x1a\x03u\x91\xceas\xce'),
+ (b'\x80\x00\x00\x00\x05\x92O\x0c\xcb\xa8\xac\xfb\xc9\x7f\xd0\rz\x1a\x03u\x91\xceas\xce' + ZERO * 489): (2147483648, b'\x92O\x0c\xcb\xa8\xac\xfb\xc9\x7f\xd0\rz\x1a\x03u\x91\xceas\xce'),
}
CREATED_FAST_CELLS = {
- ('\x80\x00\x00\x00\x06\x92O\x0c\xcb\xa8\xac\xfb\xc9\x7f\xd0\rz\x1a\x03u\x91\xceas\xce\x13Z\x99\xb2\x1e\xb6\x05\x85\x17\xfc\x1c\x00{\xa9\xae\x83^K\x99\xb2' + ZERO * 469): (2147483648, '\x92O\x0c\xcb\xa8\xac\xfb\xc9\x7f\xd0\rz\x1a\x03u\x91\xceas\xce', '\x13Z\x99\xb2\x1e\xb6\x05\x85\x17\xfc\x1c\x00{\xa9\xae\x83^K\x99\xb2'),
+ (b'\x80\x00\x00\x00\x06\x92O\x0c\xcb\xa8\xac\xfb\xc9\x7f\xd0\rz\x1a\x03u\x91\xceas\xce\x13Z\x99\xb2\x1e\xb6\x05\x85\x17\xfc\x1c\x00{\xa9\xae\x83^K\x99\xb2' + ZERO * 469): (2147483648, b'\x92O\x0c\xcb\xa8\xac\xfb\xc9\x7f\xd0\rz\x1a\x03u\x91\xceas\xce', b'\x13Z\x99\xb2\x1e\xb6\x05\x85\x17\xfc\x1c\x00{\xa9\xae\x83^K\x99\xb2'),
}
VERSIONS_CELLS = {
- '\x00\x00\x07\x00\x00': [],
- '\x00\x00\x07\x00\x02\x00\x01': [1],
- '\x00\x00\x07\x00\x06\x00\x01\x00\x02\x00\x03': [1, 2, 3],
+ b'\x00\x00\x07\x00\x00': [],
+ b'\x00\x00\x07\x00\x02\x00\x01': [1],
+ b'\x00\x00\x07\x00\x06\x00\x01\x00\x02\x00\x03': [1, 2, 3],
}
NETINFO_CELLS = {
- '\x00\x00\x08ZZ\xb6\x90\x04\x04\x7f\x00\x00\x01\x01\x04\x04aq\x0f\x02' + ZERO * (FIXED_PAYLOAD_LEN - 17): (datetime.datetime(2018, 1, 14, 1, 46, 56), Address('127.0.0.1'), [Address('97.113.15.2')]),
+ b'\x00\x00\x08ZZ\xb6\x90\x04\x04\x7f\x00\x00\x01\x01\x04\x04aq\x0f\x02' + ZERO * (FIXED_PAYLOAD_LEN - 17): (datetime.datetime(2018, 1, 14, 1, 46, 56), Address('127.0.0.1'), [Address('97.113.15.2')]),
}
VPADDING_CELLS = {
- '\x00\x00\x80\x00\x00': '',
- '\x00\x00\x80\x00\x01\x08': '\x08',
- '\x00\x00\x80\x00\x02\x08\x11': '\x08\x11',
- '\x00\x00\x80\x01\xfd' + RANDOM_PAYLOAD: RANDOM_PAYLOAD,
+ b'\x00\x00\x80\x00\x00': b'',
+ b'\x00\x00\x80\x00\x01\x08': b'\x08',
+ b'\x00\x00\x80\x00\x02\x08\x11': b'\x08\x11',
+ b'\x00\x00\x80\x01\xfd' + RANDOM_PAYLOAD: RANDOM_PAYLOAD,
}
CERTS_CELLS = {
- '\x00\x00\x81\x00\x01\x00': [],
- '\x00\x00\x81\x00\x04\x01\x01\x00\x00': [Certificate(1, '')],
- '\x00\x00\x81\x00\x05\x01\x01\x00\x01\x08': [Certificate(1, '\x08')],
+ b'\x00\x00\x81\x00\x01\x00': [],
+ b'\x00\x00\x81\x00\x04\x01\x01\x00\x00': [Certificate(1, b'')],
+ b'\x00\x00\x81\x00\x05\x01\x01\x00\x01\x08': [Certificate(1, b'\x08')],
}
AUTH_CHALLENGE_CELLS = {
- '\x00\x00\x82\x00&%s\x00\x02\x00\x01\x00\x03' % CHALLENGE: (CHALLENGE, [1, 3]),
+ b'\x00\x00\x82\x00&%s\x00\x02\x00\x01\x00\x03' % CHALLENGE: (CHALLENGE, [1, 3]),
}
@@ -100,15 +100,15 @@ class TestCell(unittest.TestCase):
self.assertRaises(ValueError, Cell.by_value, None)
def test_unpack_not_implemented(self):
- self.assertRaisesRegexp(NotImplementedError, 'Unpacking not yet implemented for AUTHORIZE cells', Cell.pop, '\x00\x00\x84\x00\x06\x00\x01\x00\x02\x00\x03', 2)
+ self.assertRaisesRegexp(NotImplementedError, 'Unpacking not yet implemented for AUTHORIZE cells', Cell.pop, b'\x00\x00\x84\x00\x06\x00\x01\x00\x02\x00\x03', 2)
def test_unpack_for_new_link(self):
expected_certs = (
- (CertType.LINK, 1, '0\x82\x02F0\x82\x01\xaf'),
- (CertType.IDENTITY, 2, '0\x82\x01\xc90\x82\x012'),
- (CertType.UNKNOWN, 4, '\x01\x04\x00\x06m\x1f'),
- (CertType.UNKNOWN, 5, '\x01\x05\x00\x06m\n\x01'),
- (CertType.UNKNOWN, 7, '\x1a\xa5\xb3\xbd\x88\xb1C'),
+ (CertType.LINK, 1, b'0\x82\x02F0\x82\x01\xaf'),
+ (CertType.IDENTITY, 2, b'0\x82\x01\xc90\x82\x012'),
+ (CertType.UNKNOWN, 4, b'\x01\x04\x00\x06m\x1f'),
+ (CertType.UNKNOWN, 5, b'\x01\x05\x00\x06m\n\x01'),
+ (CertType.UNKNOWN, 7, b'\x1a\xa5\xb3\xbd\x88\xb1C'),
)
content = test_data('new_link_cells')
@@ -126,7 +126,7 @@ class TestCell(unittest.TestCase):
self.assertTrue(certs_cell.certificates[i].value.startswith(cert_prefix))
auth_challenge_cell, content = Cell.pop(content, 2)
- self.assertEqual(AuthChallengeCell([1, 3], '\x89Y\t\x99\xb2\x1e\xd9*V\xb6\x1bn\n\x05\xd8/\xe3QH\x85\x13Z\x17\xfc\x1c\x00{\xa9\xae\x83^K'), auth_challenge_cell)
+ self.assertEqual(AuthChallengeCell([1, 3], b'\x89Y\t\x99\xb2\x1e\xd9*V\xb6\x1bn\n\x05\xd8/\xe3QH\x85\x13Z\x17\xfc\x1c\x00{\xa9\xae\x83^K'), auth_challenge_cell)
netinfo_cell, content = Cell.pop(content, 2)
self.assertEqual(NetinfoCell, type(netinfo_cell))
@@ -134,7 +134,7 @@ class TestCell(unittest.TestCase):
self.assertEqual(Address('127.0.0.1'), netinfo_cell.receiver_address)
self.assertEqual([Address('97.113.15.2')], netinfo_cell.sender_addresses)
- self.assertEqual('', content) # check that we've consumed all of the bytes
+ self.assertEqual(b'', content) # check that we've consumed all of the bytes
def test_padding_cell(self):
for cell_bytes, payload in PADDING_CELLS.items():
@@ -154,7 +154,7 @@ class TestCell(unittest.TestCase):
self.assertEqual(digest, cell.digest)
self.assertEqual(stream_id, cell.stream_id)
- digest = hashlib.sha1('hi')
+ digest = hashlib.sha1(b'hi')
self.assertEqual(3257622417, RelayCell(5, 'RELAY_BEGIN_DIR', '', digest, 564346860).digest)
self.assertEqual(3257622417, RelayCell(5, 'RELAY_BEGIN_DIR', '', digest.digest(), 564346860).digest)
self.assertEqual(3257622417, RelayCell(5, 'RELAY_BEGIN_DIR', '', 3257622417, 564346860).digest)
@@ -171,7 +171,7 @@ class TestCell(unittest.TestCase):
self.assertEqual(reason, cell.reason)
self.assertEqual(reason_int, cell.reason_int)
- self.assertRaisesRegexp(ValueError, 'Circuit closure reason should be a single byte, but was 2', Cell.pop, '\x80\x00\x00\x00\x04\x01\x01' + ZERO * 507, 5)
+ self.assertRaisesRegexp(ValueError, 'Circuit closure reason should be a single byte, but was 2', Cell.pop, b'\x80\x00\x00\x00\x04\x01\x01' + ZERO * 507, 5)
def test_create_fast_cell(self):
for cell_bytes, (circ_id, key_material) in CREATE_FAST_CELLS.items():
@@ -222,12 +222,12 @@ class TestCell(unittest.TestCase):
# extra bytes after the last certificate should be ignored
- self.assertEqual([Certificate(1, '\x08')], Cell.pop('\x00\x00\x81\x00\x07\x01\x01\x00\x01\x08\x06\x04', 2)[0].certificates)
+ self.assertEqual([Certificate(1, '\x08')], Cell.pop(b'\x00\x00\x81\x00\x07\x01\x01\x00\x01\x08\x06\x04', 2)[0].certificates)
# ... but truncated or missing certificates should error
- self.assertRaisesRegexp(ValueError, 'CERTS cell should have a certificate with 3 bytes, but only had 1 remaining', Cell.pop, '\x00\x00\x81\x00\x05\x01\x01\x00\x03\x08', 2)
- self.assertRaisesRegexp(ValueError, 'CERTS cell indicates it should have 2 certificates, but only contained 1', Cell.pop, '\x00\x00\x81\x00\x05\x02\x01\x00\x01\x08', 2)
+ self.assertRaisesRegexp(ValueError, 'CERTS cell should have a certificate with 3 bytes, but only had 1 remaining', Cell.pop, b'\x00\x00\x81\x00\x05\x01\x01\x00\x03\x08', 2)
+ self.assertRaisesRegexp(ValueError, 'CERTS cell indicates it should have 2 certificates, but only contained 1', Cell.pop, b'\x00\x00\x81\x00\x05\x02\x01\x00\x01\x08', 2)
def test_auth_challenge_cell(self):
for cell_bytes, (challenge, methods) in AUTH_CHALLENGE_CELLS.items():
@@ -237,5 +237,5 @@ class TestCell(unittest.TestCase):
self.assertEqual(challenge, cell.challenge)
self.assertEqual(methods, cell.methods)
- self.assertRaisesRegexp(ValueError, 'AUTH_CHALLENGE cell should have a payload of 38 bytes, but only had 16', Cell.pop, '\x00\x00\x82\x00&%s\x00\x02\x00\x01\x00\x03' % CHALLENGE[:10], 2)
- self.assertRaisesRegexp(ValueError, 'AUTH_CHALLENGE should have 3 methods, but only had 4 bytes for it', Cell.pop, '\x00\x00\x82\x00&%s\x00\x03\x00\x01\x00\x03' % CHALLENGE, 2)
+ self.assertRaisesRegexp(ValueError, 'AUTH_CHALLENGE cell should have a payload of 38 bytes, but only had 16', Cell.pop, b'\x00\x00\x82\x00&%s\x00\x02\x00\x01\x00\x03' % CHALLENGE[:10], 2)
+ self.assertRaisesRegexp(ValueError, 'AUTH_CHALLENGE should have 3 methods, but only had 4 bytes for it', Cell.pop, b'\x00\x00\x82\x00&%s\x00\x03\x00\x01\x00\x03' % CHALLENGE, 2)
diff --git a/test/unit/client/certificate.py b/test/unit/client/certificate.py
index b6782acc..a15779f5 100644
--- a/test/unit/client/certificate.py
+++ b/test/unit/client/certificate.py
@@ -10,11 +10,11 @@ from stem.client.datatype import CertType, Certificate
class TestCertificate(unittest.TestCase):
def test_constructor(self):
test_data = (
- ((1, '\x7f\x00\x00\x01'), (CertType.LINK, 1, '\x7f\x00\x00\x01')),
- ((2, '\x7f\x00\x00\x01'), (CertType.IDENTITY, 2, '\x7f\x00\x00\x01')),
- ((3, '\x7f\x00\x00\x01'), (CertType.AUTHENTICATE, 3, '\x7f\x00\x00\x01')),
- ((4, '\x7f\x00\x00\x01'), (CertType.UNKNOWN, 4, '\x7f\x00\x00\x01')),
- ((CertType.IDENTITY, '\x7f\x00\x00\x01'), (CertType.IDENTITY, 2, '\x7f\x00\x00\x01')),
+ ((1, b'\x7f\x00\x00\x01'), (CertType.LINK, 1, b'\x7f\x00\x00\x01')),
+ ((2, b'\x7f\x00\x00\x01'), (CertType.IDENTITY, 2, b'\x7f\x00\x00\x01')),
+ ((3, b'\x7f\x00\x00\x01'), (CertType.AUTHENTICATE, 3, b'\x7f\x00\x00\x01')),
+ ((4, b'\x7f\x00\x00\x01'), (CertType.UNKNOWN, 4, b'\x7f\x00\x00\x01')),
+ ((CertType.IDENTITY, b'\x7f\x00\x00\x01'), (CertType.IDENTITY, 2, b'\x7f\x00\x00\x01')),
)
for (cert_type, cert_value), (expected_type, expected_type_int, expected_value) in test_data:
@@ -30,10 +30,10 @@ class TestCertificate(unittest.TestCase):
self.assertEqual('hello', cert.value)
def test_packing(self):
- cert, content = Certificate.pop('\x02\x00\x04\x00\x00\x01\x01\x04\x04aq\x0f\x02\x00\x00\x00\x00')
- self.assertEqual('\x04\x04aq\x0f\x02\x00\x00\x00\x00', content)
+ cert, content = Certificate.pop(b'\x02\x00\x04\x00\x00\x01\x01\x04\x04aq\x0f\x02\x00\x00\x00\x00')
+ self.assertEqual(b'\x04\x04aq\x0f\x02\x00\x00\x00\x00', content)
self.assertEqual(CertType.IDENTITY, cert.type)
self.assertEqual(2, cert.type_int)
- self.assertEqual('\x00\x00\x01\x01', cert.value)
- self.assertEqual('\x02\x00\x04\x00\x00\x01\x01', cert.pack())
+ self.assertEqual(b'\x00\x00\x01\x01', cert.value)
+ self.assertEqual(b'\x02\x00\x04\x00\x00\x01\x01', cert.pack())
diff --git a/test/unit/client/kdf.py b/test/unit/client/kdf.py
index f3922538..b9fcb9ce 100644
--- a/test/unit/client/kdf.py
+++ b/test/unit/client/kdf.py
@@ -6,22 +6,22 @@ import unittest
from stem.client.datatype import KDF
-KEY_1 = '\xec\xec.\xeb7R\xf2\n\xcb\xce\x97\xf4\x86\x82\x19#\x10\x0f\x08\xf0\xa2Z\xdeJ\x8f2\x8cc\xf6\xfa\x0e\t\x83f\xc5\xe2\xb3\x94\xa8\x13'
-KEY_2 = '\xe0v\xe4\xfaTB\x91\x1c\x81Gz\xa0\tI\xcb{\xc56\xcfV\xc2\xa0\x19\x9c\x98\x9a\x06\x0e\xc5\xfa\xb0z\x83\xa6\x10\xf6r"<b'
+KEY_1 = b'\xec\xec.\xeb7R\xf2\n\xcb\xce\x97\xf4\x86\x82\x19#\x10\x0f\x08\xf0\xa2Z\xdeJ\x8f2\x8cc\xf6\xfa\x0e\t\x83f\xc5\xe2\xb3\x94\xa8\x13'
+KEY_2 = b'\xe0v\xe4\xfaTB\x91\x1c\x81Gz\xa0\tI\xcb{\xc56\xcfV\xc2\xa0\x19\x9c\x98\x9a\x06\x0e\xc5\xfa\xb0z\x83\xa6\x10\xf6r"<b'
class TestKDF(unittest.TestCase):
def test_parsing(self):
k1 = KDF.from_value(KEY_1)
- self.assertEqual('\xca+\x81\x05\x14\x9d)o\xa6\x82\xe9B\xa8?\xf2\xaf\x85\x1b]6', k1.key_hash)
- self.assertEqual('\xac\xcc\xbc\x91\xb1\xaf\xd7\xe0\xe9\x9dF#\xd8\xdbz\xe8\xe6\xca\x83,', k1.forward_digest)
- self.assertEqual('*\xe5scX\xbb+\xca \xcb\xa4\xbc\xad\x0f\x95\x0cO\xcc\xac\xf1', k1.backward_digest)
- self.assertEqual('\xc3\xbe\xc9\xe1\xf4\x90f\xdai\xf3\xf3\xf5\x14\xb5\xb9\x03', k1.forward_key)
- self.assertEqual('U\xaf\x1e\x1b\xb1q||\x86A<_\xf7\xa0%\x86', k1.backward_key)
+ self.assertEqual(b'\xca+\x81\x05\x14\x9d)o\xa6\x82\xe9B\xa8?\xf2\xaf\x85\x1b]6', k1.key_hash)
+ self.assertEqual(b'\xac\xcc\xbc\x91\xb1\xaf\xd7\xe0\xe9\x9dF#\xd8\xdbz\xe8\xe6\xca\x83,', k1.forward_digest)
+ self.assertEqual(b'*\xe5scX\xbb+\xca \xcb\xa4\xbc\xad\x0f\x95\x0cO\xcc\xac\xf1', k1.backward_digest)
+ self.assertEqual(b'\xc3\xbe\xc9\xe1\xf4\x90f\xdai\xf3\xf3\xf5\x14\xb5\xb9\x03', k1.forward_key)
+ self.assertEqual(b'U\xaf\x1e\x1b\xb1q||\x86A<_\xf7\xa0%\x86', k1.backward_key)
k2 = KDF.from_value(KEY_1)
- self.assertEqual('\xca+\x81\x05\x14\x9d)o\xa6\x82\xe9B\xa8?\xf2\xaf\x85\x1b]6', k2.key_hash)
- self.assertEqual('\xac\xcc\xbc\x91\xb1\xaf\xd7\xe0\xe9\x9dF#\xd8\xdbz\xe8\xe6\xca\x83,', k2.forward_digest)
- self.assertEqual('*\xe5scX\xbb+\xca \xcb\xa4\xbc\xad\x0f\x95\x0cO\xcc\xac\xf1', k2.backward_digest)
- self.assertEqual('\xc3\xbe\xc9\xe1\xf4\x90f\xdai\xf3\xf3\xf5\x14\xb5\xb9\x03', k2.forward_key)
- self.assertEqual('U\xaf\x1e\x1b\xb1q||\x86A<_\xf7\xa0%\x86', k2.backward_key)
+ self.assertEqual(b'\xca+\x81\x05\x14\x9d)o\xa6\x82\xe9B\xa8?\xf2\xaf\x85\x1b]6', k2.key_hash)
+ self.assertEqual(b'\xac\xcc\xbc\x91\xb1\xaf\xd7\xe0\xe9\x9dF#\xd8\xdbz\xe8\xe6\xca\x83,', k2.forward_digest)
+ self.assertEqual(b'*\xe5scX\xbb+\xca \xcb\xa4\xbc\xad\x0f\x95\x0cO\xcc\xac\xf1', k2.backward_digest)
+ self.assertEqual(b'\xc3\xbe\xc9\xe1\xf4\x90f\xdai\xf3\xf3\xf5\x14\xb5\xb9\x03', k2.forward_key)
+ self.assertEqual(b'U\xaf\x1e\x1b\xb1q||\x86A<_\xf7\xa0%\x86', k2.backward_key)
diff --git a/test/unit/client/size.py b/test/unit/client/size.py
index 59416662..392c77ff 100644
--- a/test/unit/client/size.py
+++ b/test/unit/client/size.py
@@ -19,10 +19,10 @@ class TestSize(unittest.TestCase):
self.assertEqual(8, Size.LONG_LONG.size)
def test_pack(self):
- self.assertEqual('\x12', Size.CHAR.pack(18))
- self.assertEqual('\x00\x12', Size.SHORT.pack(18))
- self.assertEqual('\x00\x00\x00\x12', Size.LONG.pack(18))
- self.assertEqual('\x00\x00\x00\x00\x00\x00\x00\x12', Size.LONG_LONG.pack(18))
+ self.assertEqual(b'\x12', Size.CHAR.pack(18))
+ self.assertEqual(b'\x00\x12', Size.SHORT.pack(18))
+ self.assertEqual(b'\x00\x00\x00\x12', Size.LONG.pack(18))
+ self.assertEqual(b'\x00\x00\x00\x00\x00\x00\x00\x12', Size.LONG_LONG.pack(18))
self.assertRaisesRegexp(ValueError, 'Size.pack encodes an integer, but was a str', Size.CHAR.pack, 'hi')
@@ -30,21 +30,21 @@ class TestSize(unittest.TestCase):
self.assertRaisesRegexp(ValueError, re.escape("'\\x00\\x12' is the wrong size for a BAD_SIZE field"), bad_size.pack, 18)
def test_unpack(self):
- self.assertEqual(18, Size.CHAR.unpack('\x12'))
- self.assertEqual(18, Size.SHORT.unpack('\x00\x12'))
- self.assertEqual(18, Size.LONG.unpack('\x00\x00\x00\x12'))
- self.assertEqual(18, Size.LONG_LONG.unpack('\x00\x00\x00\x00\x00\x00\x00\x12'))
+ self.assertEqual(18, Size.CHAR.unpack(b'\x12'))
+ self.assertEqual(18, Size.SHORT.unpack(b'\x00\x12'))
+ self.assertEqual(18, Size.LONG.unpack(b'\x00\x00\x00\x12'))
+ self.assertEqual(18, Size.LONG_LONG.unpack(b'\x00\x00\x00\x00\x00\x00\x00\x12'))
- self.assertEqual(ord('a'), Size.CHAR.unpack('a'))
- self.assertEqual(24930, Size.SHORT.unpack('ab'))
+ self.assertEqual(ord('a'), Size.CHAR.unpack(b'a'))
+ self.assertEqual(24930, Size.SHORT.unpack(b'ab'))
self.assertRaisesRegexp(ValueError, re.escape("'\\x00\\x12' is the wrong size for a CHAR field"), Size.CHAR.unpack, '\x00\x12')
def test_pop(self):
- self.assertEqual((18, ''), Size.CHAR.pop('\x12'))
+ self.assertEqual((18, b''), Size.CHAR.pop(b'\x12'))
- self.assertEqual((0, '\x12'), Size.CHAR.pop('\x00\x12'))
- self.assertEqual((18, ''), Size.SHORT.pop('\x00\x12'))
+ self.assertEqual((0, b'\x12'), Size.CHAR.pop(b'\x00\x12'))
+ self.assertEqual((18, b''), Size.SHORT.pop(b'\x00\x12'))
self.assertRaisesRegexp(ValueError, "'' is the wrong size for a CHAR field", Size.CHAR.pop, '')
self.assertRaisesRegexp(ValueError, re.escape("'\\x12' is the wrong size for a SHORT field"), Size.SHORT.pop, '\x12')
diff --git a/test/unit/descriptor/remote.py b/test/unit/descriptor/remote.py
index 9409544c..ac150d5c 100644
--- a/test/unit/descriptor/remote.py
+++ b/test/unit/descriptor/remote.py
@@ -300,17 +300,17 @@ class TestDescriptorDownloader(unittest.TestCase):
@patch(URL_OPEN)
def test_fallback_directories_from_remote_empty(self, urlopen_mock):
- urlopen_mock.return_value = io.BytesIO('')
+ urlopen_mock.return_value = io.BytesIO(b'')
self.assertRaisesRegexp(IOError, 'did not have any content', stem.descriptor.remote.FallbackDirectory.from_remote)
@patch(URL_OPEN)
def test_fallback_directories_from_remote_no_header(self, urlopen_mock):
- urlopen_mock.return_value = io.BytesIO('\n'.join(FALLBACK_DIR_CONTENT.splitlines()[1:]))
+ urlopen_mock.return_value = io.BytesIO(b'\n'.join(FALLBACK_DIR_CONTENT.splitlines()[1:]))
self.assertRaisesRegexp(IOError, 'does not have a type field indicating it is fallback directory metadata', stem.descriptor.remote.FallbackDirectory.from_remote)
@patch(URL_OPEN)
def test_fallback_directories_from_remote_malformed_header(self, urlopen_mock):
- urlopen_mock.return_value = io.BytesIO(FALLBACK_DIR_CONTENT.replace('version=2.0.0', 'version'))
+ urlopen_mock.return_value = io.BytesIO(FALLBACK_DIR_CONTENT.replace(b'version=2.0.0', b'version'))
self.assertRaisesRegexp(IOError, 'Malformed fallback directory header line: /\* version \*/', stem.descriptor.remote.FallbackDirectory.from_remote)
def test_fallback_directories_from_str(self):
@@ -328,12 +328,12 @@ class TestDescriptorDownloader(unittest.TestCase):
def test_fallback_directories_from_str_malformed(self):
test_values = {
- FALLBACK_ENTRY.replace('id=0756B7CD4DFC8182BE23143FAC0642F515182CEB', ''): 'Malformed fallback address line:',
- FALLBACK_ENTRY.replace('5.9.110.236', '5.9.110'): '0756B7CD4DFC8182BE23143FAC0642F515182CEB has an invalid IPv4 address: 5.9.110',
- FALLBACK_ENTRY.replace(':9030', ':7814713228'): '0756B7CD4DFC8182BE23143FAC0642F515182CEB has an invalid dir_port: 7814713228',
- FALLBACK_ENTRY.replace('orport=9001', 'orport=7814713228'): '0756B7CD4DFC8182BE23143FAC0642F515182CEB has an invalid or_port: 7814713228',
- FALLBACK_ENTRY.replace('ipv6=[2a01', 'ipv6=[:::'): '0756B7CD4DFC8182BE23143FAC0642F515182CEB has an invalid IPv6 address: ::::4f8:162:51e2::2',
- FALLBACK_ENTRY.replace('nickname=rueckgrat', 'nickname=invalid~nickname'): '0756B7CD4DFC8182BE23143FAC0642F515182CEB has an invalid nickname: invalid~nickname',
+ FALLBACK_ENTRY.replace(b'id=0756B7CD4DFC8182BE23143FAC0642F515182CEB', b''): 'Malformed fallback address line:',
+ FALLBACK_ENTRY.replace(b'5.9.110.236', b'5.9.110'): '0756B7CD4DFC8182BE23143FAC0642F515182CEB has an invalid IPv4 address: 5.9.110',
+ FALLBACK_ENTRY.replace(b':9030', b':7814713228'): '0756B7CD4DFC8182BE23143FAC0642F515182CEB has an invalid dir_port: 7814713228',
+ FALLBACK_ENTRY.replace(b'orport=9001', b'orport=7814713228'): '0756B7CD4DFC8182BE23143FAC0642F515182CEB has an invalid or_port: 7814713228',
+ FALLBACK_ENTRY.replace(b'ipv6=[2a01', b'ipv6=[:::'): '0756B7CD4DFC8182BE23143FAC0642F515182CEB has an invalid IPv6 address: ::::4f8:162:51e2::2',
+ FALLBACK_ENTRY.replace(b'nickname=rueckgrat', b'nickname=invalid~nickname'): '0756B7CD4DFC8182BE23143FAC0642F515182CEB has an invalid nickname: invalid~nickname',
}
for entry, expected in test_values.items():