commit 2e6d441b9d0cbccb64414bd2762ac096a2253aef Author: Damian Johnson atagar@torproject.org Date: Thu Jan 25 10:43:02 2018 -0800
Test RelayCell class
Found the unencrypted RELAY cell data in endosome so adding a couple tests that we match it. --- stem/client/__init__.py | 4 ++-- stem/client/cell.py | 3 +-- test/unit/client/cell.py | 37 ++++++++++++++++++++++++++++--------- 3 files changed, 31 insertions(+), 13 deletions(-)
diff --git a/stem/client/__init__.py b/stem/client/__init__.py index 0c900fb7..58c439e6 100644 --- a/stem/client/__init__.py +++ b/stem/client/__init__.py @@ -141,8 +141,8 @@ class _IntegerEnum(stem.util.enum.Enum): else: raise ValueError('IntegerEnums can only be constructed with two or three value tuples: %s' % repr(entry))
- self._enum_to_int[enum] = int_val - self._int_to_enum[int_val] = enum + self._enum_to_int[str_val] = int_val + self._int_to_enum[int_val] = str_val parent_args.append((enum, str_val))
parent_args.append(('UNKNOWN', 'UNKNOWN')) diff --git a/stem/client/cell.py b/stem/client/cell.py index e6f08b0b..a0737765 100644 --- a/stem/client/cell.py +++ b/stem/client/cell.py @@ -298,7 +298,6 @@ class RelayCell(CircuitCell): :param int link_version: link protocol version :param int circ_id: circuit id :param stem.client.RelayCommand command: reason the circuit is being closed - :param int command_int: integer value of our command :param bytes data: payload of the cell :param int digest: running digest held with the relay :param int stream_id: specific stream this concerns @@ -309,7 +308,7 @@ class RelayCell(CircuitCell): cell = RelayCell(circ_id, command, data, digest, stream_id)
payload = io.BytesIO() - payload.write(Size.CHAR.pack(cell.command)) + payload.write(Size.CHAR.pack(cell.command_int)) payload.write(Size.SHORT.pack(0)) # 'recognized' field payload.write(Size.SHORT.pack(cell.stream_id)) payload.write(Size.LONG.pack(cell.digest)) diff --git a/test/unit/client/cell.py b/test/unit/client/cell.py index 5b8db2bb..e2a85b6f 100644 --- a/test/unit/client/cell.py +++ b/test/unit/client/cell.py @@ -13,6 +13,7 @@ from stem.client.cell import ( FIXED_PAYLOAD_LEN, Cell, PaddingCell, + RelayCell, DestroyCell, CreateFastCell, CreatedFastCell, @@ -30,6 +31,11 @@ PADDING_CELLS = { '\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), +} + 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), @@ -129,12 +135,25 @@ class TestCell(unittest.TestCase):
self.assertEqual('', content) # check that we've consumed all of the bytes
- def test_padding_packing(self): + def test_padding_cell(self): for cell_bytes, payload in PADDING_CELLS.items(): self.assertEqual(cell_bytes, PaddingCell.pack(2, payload)) self.assertEqual(payload, Cell.unpack(cell_bytes, 2)[0].payload)
- def test_destroy_packing(self): + def test_relay_cell(self): + for cell_bytes, (command, command_int, circ_id, stream_id, data, digest) in RELAY_CELLS.items(): + self.assertEqual(cell_bytes, RelayCell.pack(2, circ_id, command, data, digest, stream_id)) + self.assertEqual(cell_bytes, RelayCell.pack(2, circ_id, command_int, data, digest, stream_id)) + + cell = Cell.unpack(cell_bytes, 2)[0] + self.assertEqual(circ_id, cell.circ_id) + self.assertEqual(command, cell.command) + self.assertEqual(command_int, cell.command_int) + self.assertEqual(data, cell.data) + self.assertEqual(digest, cell.digest) + self.assertEqual(stream_id, cell.stream_id) + + def test_destroy_cell(self): for cell_bytes, (circ_id, reason, reason_int) in DESTROY_CELLS.items(): self.assertEqual(cell_bytes, DestroyCell.pack(5, circ_id, reason)) self.assertEqual(cell_bytes, DestroyCell.pack(5, circ_id, reason_int)) @@ -146,7 +165,7 @@ class TestCell(unittest.TestCase):
self.assertRaisesRegexp(ValueError, 'Circuit closure reason should be a single byte, but was 2', Cell.unpack, '\x80\x00\x00\x00\x04\x01\x01' + ZERO * 507, 5)
- def test_create_fast(self): + def test_create_fast_cell(self): for cell_bytes, (circ_id, key_material) in CREATE_FAST_CELLS.items(): self.assertEqual(cell_bytes, CreateFastCell.pack(5, circ_id, key_material))
@@ -156,7 +175,7 @@ class TestCell(unittest.TestCase):
self.assertRaisesRegexp(ValueError, 'Key material should be 20 bytes, but was 3', CreateFastCell.pack, 2, 5, 'boo')
- def test_created_fast(self): + def test_created_fast_cell(self): for cell_bytes, (circ_id, key_material, derivative_key) in CREATED_FAST_CELLS.items(): self.assertEqual(cell_bytes, CreatedFastCell.pack(5, circ_id, derivative_key, key_material))
@@ -167,12 +186,12 @@ class TestCell(unittest.TestCase):
self.assertRaisesRegexp(ValueError, 'Key material should be 20 bytes, but was 3', CreateFastCell.pack, 2, 5, 'boo')
- def test_versions_packing(self): + def test_versions_cell(self): for cell_bytes, versions in VERSIONS_CELLS.items(): self.assertEqual(cell_bytes, VersionsCell.pack(versions)) self.assertEqual(versions, Cell.unpack(cell_bytes, 2)[0].versions)
- def test_netinfo_packing(self): + def test_netinfo_cell(self): for cell_bytes, (timestamp, receiver_address, sender_addresses) in NETINFO_CELLS.items(): self.assertEqual(cell_bytes, NetinfoCell.pack(2, receiver_address, sender_addresses, timestamp))
@@ -181,14 +200,14 @@ class TestCell(unittest.TestCase): self.assertEqual(receiver_address, cell.receiver_address) self.assertEqual(sender_addresses, cell.sender_addresses)
- def test_vpadding_packing(self): + def test_vpadding_cell(self): for cell_bytes, payload in VPADDING_CELLS.items(): self.assertEqual(cell_bytes, VPaddingCell.pack(2, payload = payload)) self.assertEqual(payload, Cell.unpack(cell_bytes, 2)[0].payload)
self.assertRaisesRegexp(ValueError, 'VPaddingCell.pack caller specified both a size of 5 bytes and payload of 1 bytes', VPaddingCell.pack, 2, 5, '\x02')
- def test_certs_packing(self): + def test_certs_cell(self): for cell_bytes, certs in CERTS_CELLS.items(): self.assertEqual(cell_bytes, CertsCell.pack(2, certs)) self.assertEqual(certs, Cell.unpack(cell_bytes, 2)[0].certificates) @@ -202,7 +221,7 @@ class TestCell(unittest.TestCase): self.assertRaisesRegexp(ValueError, 'CERTS cell should have a certificate with 3 bytes, but only had 1 remaining', Cell.unpack, '\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.unpack, '\x00\x00\x81\x00\x05\x02\x01\x00\x01\x08', 2)
- def test_auth_challenge_packing(self): + def test_auth_challenge_cell(self): for cell_bytes, (challenge, methods) in AUTH_CHALLENGE_CELLS.items(): self.assertEqual(cell_bytes, AuthChallengeCell.pack(2, methods, challenge))
tor-commits@lists.torproject.org