def test_identifier(self): """ Basic check for 'id' lines. """ desc = get_microdescriptor({'id': 'rsa1024 Cd47okjCHD83YGzThGBDptXs9Z4'}) self.assertEqual({'rsa1024': 'Cd47okjCHD83YGzThGBDptXs9Z4'}, desc.identifiers) self.assertEqual('rsa1024', desc.identifier_type) self.assertEqual('Cd47okjCHD83YGzThGBDptXs9Z4', desc.identifier) # check when there's multiple key types desc_text = b'\n'.join((get_microdescriptor(content = True), b'id rsa1024 Cd47okjCHD83YGzThGBDptXs9Z4', b'id ed25519 50f6ddbecdc848dcc6b818b14d1')) desc = Microdescriptor(desc_text, validate = True) self.assertEqual({'rsa1024': 'Cd47okjCHD83YGzThGBDptXs9Z4', 'ed25519': '50f6ddbecdc848dcc6b818b14d1'}, desc.identifiers) self.assertEqual('ed25519', desc.identifier_type) self.assertEqual('50f6ddbecdc848dcc6b818b14d1', desc.identifier) # check when there's conflicting keys desc_text = b'\n'.join((get_microdescriptor(content = True), b'id rsa1024 Cd47okjCHD83YGzThGBDptXs9Z4', b'id rsa1024 50f6ddbecdc848dcc6b818b14d1')) desc = Microdescriptor(desc_text) self.assertEqual({}, desc.identifiers) try: Microdescriptor(desc_text, validate = True) self.fail('constructor validation should fail') except ValueError as exc: self.assertEqual("There can only be one 'id' line per a key type, but 'rsa1024' appeared multiple times", str(exc))
def test_proceeding_line(self): """ Includes a line prior to the 'onion-key' entry. """ desc_text = b'family Amunet1\n' + Microdescriptor.content() self.assertRaises(ValueError, Microdescriptor, desc_text, True) desc = Microdescriptor(desc_text, validate=False) self.assertEqual(['Amunet1'], desc.family)
def test_protocols(self): """ Basic check for 'pr' lines. """ desc = Microdescriptor.create({'pr': 'Cons=1 Desc=1 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 Link=1-4 LinkAuth=1 Microdesc=1 Relay=1-2'}) self.assertEqual(10, len(desc.protocols))
def test_unrecognized_line(self): """ Includes unrecognized content in the descriptor. """ desc = Microdescriptor.create({'pepperjack': 'is oh so tasty!'}) self.assertEqual(['pepperjack is oh so tasty!'], desc.get_unrecognized_lines())
def test_a_line(self): """ Sanity test with both an IPv4 and IPv6 address. """ desc_text = Microdescriptor.content() desc_text += b'\na 10.45.227.253:9001' desc_text += b'\na [fd9f:2e19:3bcf::02:9970]:9001' expected = [ ('10.45.227.253', 9001, False), ('fd9f:2e19:3bcf::02:9970', 9001, True), ] desc = Microdescriptor(desc_text) self.assertEqual(expected, desc.or_addresses)
def test_exit_policy(self): """ Basic check for 'p' lines. The router status entries contain an identical field so we're not investing much effort here. """ desc = Microdescriptor.create({'p': 'accept 80,110,143,443'}) self.assertEqual(stem.exit_policy.MicroExitPolicy('accept 80,110,143,443'), desc.exit_policy)
def test_identifier(self): """ Basic check for 'id' lines. """ desc = Microdescriptor.create( {'id': 'rsa1024 Cd47okjCHD83YGzThGBDptXs9Z4'}) self.assertEqual({'rsa1024': 'Cd47okjCHD83YGzThGBDptXs9Z4'}, desc.identifiers) self.assertEqual('rsa1024', desc.identifier_type) self.assertEqual('Cd47okjCHD83YGzThGBDptXs9Z4', desc.identifier) # check when there's multiple key types desc_text = b'\n'.join(( Microdescriptor.content(), b'id rsa1024 Cd47okjCHD83YGzThGBDptXs9Z4', b'id ed25519 50f6ddbecdc848dcc6b818b14d1', )) desc = Microdescriptor(desc_text, validate=True) self.assertEqual( { 'rsa1024': 'Cd47okjCHD83YGzThGBDptXs9Z4', 'ed25519': '50f6ddbecdc848dcc6b818b14d1' }, desc.identifiers) self.assertEqual('ed25519', desc.identifier_type) self.assertEqual('50f6ddbecdc848dcc6b818b14d1', desc.identifier) # check when there's conflicting keys desc_text = b'\n'.join(( Microdescriptor.content(), b'id rsa1024 Cd47okjCHD83YGzThGBDptXs9Z4', b'id rsa1024 50f6ddbecdc848dcc6b818b14d1', )) desc = Microdescriptor(desc_text) self.assertEqual({}, desc.identifiers) exc_msg = "There can only be one 'id' line per a key type, but 'rsa1024' appeared multiple times" self.assertRaisesWith(ValueError, exc_msg, Microdescriptor, desc_text, validate=True)
def test_proceeding_line(self): """ Includes a line prior to the 'onion-key' entry. """ desc_text = b'family Amunet1\n' + Microdescriptor.content() self.assertRaises(ValueError, Microdescriptor, desc_text, True) desc = Microdescriptor(desc_text, validate = False) self.assertEqual(['Amunet1'], desc.family)
def test_family(self): """ Check the family line. """ desc = Microdescriptor.create({'family': 'Amunet1 Amunet2 Amunet3'}) self.assertEqual(['Amunet1', 'Amunet2', 'Amunet3'], desc.family) # try multiple family lines desc_text = Microdescriptor.content() desc_text += b'\nfamily Amunet1' desc_text += b'\nfamily Amunet2' self.assertRaises(ValueError, Microdescriptor, desc_text, True) # family entries will overwrite each other desc = Microdescriptor(desc_text, validate=False) self.assertEqual(1, len(desc.family))
def test_proceeding_line(self): """ Includes a line prior to the 'onion-key' entry. """ desc_text = b"family Amunet1\n" + get_microdescriptor(content=True) self.assertRaises(ValueError, Microdescriptor, desc_text) desc = Microdescriptor(desc_text, validate=False) self.assertEquals(["Amunet1"], desc.family)
def test_family(self): """ Check the family line. """ desc = Microdescriptor.create({'family': 'Amunet1 Amunet2 Amunet3'}) self.assertEqual(['Amunet1', 'Amunet2', 'Amunet3'], desc.family) # try multiple family lines desc_text = Microdescriptor.content() desc_text += b'\nfamily Amunet1' desc_text += b'\nfamily Amunet2' self.assertRaises(ValueError, Microdescriptor, desc_text, True) # family entries will overwrite each other desc = Microdescriptor(desc_text, validate = False) self.assertEqual(1, len(desc.family))
def test_identifier(self): """ Basic check for 'id' lines. """ desc = Microdescriptor.create({'id': 'rsa1024 Cd47okjCHD83YGzThGBDptXs9Z4'}) self.assertEqual({'rsa1024': 'Cd47okjCHD83YGzThGBDptXs9Z4'}, desc.identifiers) self.assertEqual('rsa1024', desc.identifier_type) self.assertEqual('Cd47okjCHD83YGzThGBDptXs9Z4', desc.identifier) # check when there's multiple key types desc_text = b'\n'.join(( Microdescriptor.content(), b'id rsa1024 Cd47okjCHD83YGzThGBDptXs9Z4', b'id ed25519 50f6ddbecdc848dcc6b818b14d1', )) desc = Microdescriptor(desc_text, validate = True) self.assertEqual({'rsa1024': 'Cd47okjCHD83YGzThGBDptXs9Z4', 'ed25519': '50f6ddbecdc848dcc6b818b14d1'}, desc.identifiers) self.assertEqual('ed25519', desc.identifier_type) self.assertEqual('50f6ddbecdc848dcc6b818b14d1', desc.identifier) # check when there's conflicting keys desc_text = b'\n'.join(( Microdescriptor.content(), b'id rsa1024 Cd47okjCHD83YGzThGBDptXs9Z4', b'id rsa1024 50f6ddbecdc848dcc6b818b14d1', )) desc = Microdescriptor(desc_text) self.assertEqual({}, desc.identifiers) exc_msg = "There can only be one 'id' line per a key type, but 'rsa1024' appeared multiple times" self.assertRaisesRegexp(ValueError, exc_msg, Microdescriptor, desc_text, validate = True)
def test_a_line(self): """ Sanity test with both an IPv4 and IPv6 address. """ desc_text = get_microdescriptor(content=True) desc_text += b"\na 10.45.227.253:9001" desc_text += b"\na [fd9f:2e19:3bcf::02:9970]:9001" expected = [ ("10.45.227.253", 9001, False), ("fd9f:2e19:3bcf::02:9970", 9001, True), ] desc = Microdescriptor(desc_text) self.assertEquals(expected, desc.or_addresses)
def test_minimal_microdescriptor(self): """ Basic sanity check that we can parse a microdescriptor with minimal attributes. """ desc = Microdescriptor.create() self.assertEqual(None, desc.ntor_onion_key) self.assertEqual([], desc.or_addresses) self.assertEqual([], desc.family) self.assertEqual(stem.exit_policy.MicroExitPolicy('reject 1-65535'), desc.exit_policy) self.assertEqual(None, desc.exit_policy_v6) self.assertEqual({}, desc.identifiers) self.assertEqual({}, desc.protocols) self.assertEqual([], desc.get_unrecognized_lines())
def test_minimal_microdescriptor(self): """ Basic sanity check that we can parse a microdescriptor with minimal attributes. """ desc = Microdescriptor.create() self.assertEqual(None, desc.ntor_onion_key) self.assertEqual([], desc.or_addresses) self.assertEqual([], desc.family) self.assertEqual(stem.exit_policy.MicroExitPolicy('reject 1-65535'), desc.exit_policy) self.assertEqual(None, desc.exit_policy_v6) self.assertEqual({}, desc.identifiers) self.assertEqual(None, desc.identifier_type) self.assertEqual(None, desc.identifier) self.assertEqual({}, desc.protocols) self.assertEqual([], desc.get_unrecognized_lines())
def test_family(self): """ Check the family line. """ desc = get_microdescriptor({"family": "Amunet1 Amunet2 Amunet3"}) self.assertEquals(["Amunet1", "Amunet2", "Amunet3"], desc.family) # try multiple family lines desc_text = get_microdescriptor(content=True) desc_text += b"\nfamily Amunet1" desc_text += b"\nfamily Amunet2" self.assertRaises(ValueError, Microdescriptor, desc_text) # family entries will overwrite each other desc = Microdescriptor(desc_text, validate=False) self.assertEquals(1, len(desc.family))
def test_from_str(self): sig = Microdescriptor.create() self.assertEqual(sig, Microdescriptor.from_str(str(sig)))