def test_legacy_dir_key(self): """ Includes a 'legacy-dir-key' line with both valid and invalid content. """ test_value = '65968CCB6BECB5AA88459C5A072624C6995B6B72' authority = DirectoryAuthority.create({'legacy-dir-key': test_value}, is_vote = True) self.assertEqual(test_value, authority.legacy_dir_key) # check that we'll fail if legacy-dir-key appears in a consensus content = DirectoryAuthority.content({'legacy-dir-key': test_value}) self.assertRaises(ValueError, DirectoryAuthority, content, True) test_values = ( '', 'zzzzz', 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz', ) for value in test_values: content = DirectoryAuthority.content({'legacy-dir-key': value}) self.assertRaises(ValueError, DirectoryAuthority, content, True) authority = DirectoryAuthority(content, False) self.assertEqual(None, authority.legacy_dir_key)
def test_malformed_port(self): """ Includes a malformed orport or dirport on the 'dir-source' line. """ test_values = ( '', '-1', '399482', 'blarg', ) for value in test_values: for include_or_port in (False, True): for include_dir_port in (False, True): if not include_or_port and not include_dir_port: continue dir_source = DIR_SOURCE_LINE if include_or_port: dir_source = dir_source.replace('9090', value) if include_dir_port: dir_source = dir_source.replace('9030', value) content = DirectoryAuthority.content({'dir-source': dir_source}) self.assertRaises(ValueError, DirectoryAuthority, content, True) authority = DirectoryAuthority(content, False) actual_value = authority.or_port if include_or_port else authority.dir_port self.assertEqual(None, actual_value)
def test_first_line(self): """ Includes a non-mandatory field before the 'dir-source' line. """ content = b'ho-hum 567\n' + DirectoryAuthority.content() self.assertRaises(ValueError, DirectoryAuthority, content, True) authority = DirectoryAuthority(content, False) self.assertTrue(authority.nickname.startswith('Unnamed')) self.assertEqual(['ho-hum 567'], authority.get_unrecognized_lines())
def test_key_certificate(self): """ Includes or exclude a key certificate from the directory entry. """ key_cert = KeyCertificate.content() # include a key cert with a consensus content = DirectoryAuthority.content() + b'\n' + key_cert self.assertRaises(ValueError, DirectoryAuthority, content, True) authority = DirectoryAuthority(content, False) self.assertTrue(authority.nickname.startswith('Unnamed')) # exclude key cert from a vote content = b'\n'.join(DirectoryAuthority.content(is_vote = True).splitlines()[:-5]) self.assertRaises(ValueError, DirectoryAuthority, content, True, True) authority = DirectoryAuthority(content, False, True) self.assertTrue(authority.nickname.startswith('Unnamed'))
def test_key_certificate(self): """ Includes or exclude a key certificate from the directory entry. """ key_cert = KeyCertificate.content() # include a key cert with a consensus content = DirectoryAuthority.content() + b'\n' + key_cert self.assertRaises(ValueError, DirectoryAuthority, content, True) authority = DirectoryAuthority(content, False) self.assertTrue(authority.nickname.startswith('Unnamed')) # exclude key cert from a vote content = b'\n'.join(DirectoryAuthority.content(is_vote = True).splitlines()[:-5]) self.assertRaises(ValueError, DirectoryAuthority, content, True, True) authority = DirectoryAuthority(content, False, True) self.assertTrue(authority.nickname.startswith('Unnamed'))
def test_duplicate_lines(self): """ Duplicates linesin the entry. """ lines = DirectoryAuthority.content().split(b'\n') for index, duplicate_line in enumerate(lines): content = b'\n'.join(lines[:index] + [duplicate_line] + lines[index:]) self.assertRaises(ValueError, DirectoryAuthority, content, True) authority = DirectoryAuthority(content, False) self.assertTrue(authority.nickname.startswith('Unnamed'))
def test_duplicate_lines(self): """ Duplicates linesin the entry. """ lines = DirectoryAuthority.content().split(b'\n') for index, duplicate_line in enumerate(lines): content = b'\n'.join(lines[:index] + [duplicate_line] + lines[index:]) self.assertRaises(ValueError, DirectoryAuthority, content, True) authority = DirectoryAuthority(content, False) self.assertTrue(authority.nickname.startswith('Unnamed'))
def test_missing_fields(self): """ Parse an authority where a mandatory field is missing. """ for excluded_field in ('dir-source', 'contact'): content = DirectoryAuthority.content(exclude = (excluded_field,)) self.assertRaises(ValueError, DirectoryAuthority, content, True) authority = DirectoryAuthority(content, False) if excluded_field == 'dir-source': self.assertEqual('Mike Perry <email>', authority.contact) else: self.assertTrue(authority.nickname.startswith('Unnamed'))
def test_missing_fields(self): """ Parse an authority where a mandatory field is missing. """ for excluded_field in ('dir-source', 'contact'): content = DirectoryAuthority.content(exclude = (excluded_field,)) self.assertRaises(ValueError, DirectoryAuthority, content, True) authority = DirectoryAuthority(content, False) if excluded_field == 'dir-source': self.assertEqual('Mike Perry <email>', authority.contact) else: self.assertTrue(authority.nickname.startswith('Unnamed'))
def test_malformed_fingerprint(self): """ Includes a malformed fingerprint on the 'dir-source' line. """ test_values = ( '', 'zzzzz', 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz', ) for value in test_values: dir_source = DIR_SOURCE_LINE.replace('27B6B5996C426270A5C95488AA5BCEB6BCC86956', value) content = DirectoryAuthority.content({'dir-source': dir_source}) self.assertRaises(ValueError, DirectoryAuthority, content, True) authority = DirectoryAuthority(content, False) self.assertEqual(None, authority.fingerprint)
def test_missing_dir_source_field(self): """ Excludes fields from the 'dir-source' line. """ for missing_value in DIR_SOURCE_LINE.split(' '): dir_source = DIR_SOURCE_LINE.replace(missing_value, '').replace(' ', ' ') content = DirectoryAuthority.content({'dir-source': dir_source}) self.assertRaises(ValueError, DirectoryAuthority, content, True) authority = DirectoryAuthority(content, False) self.assertEqual(None, authority.nickname) self.assertEqual(None, authority.fingerprint) self.assertEqual(None, authority.hostname) self.assertEqual(None, authority.address) self.assertEqual(None, authority.dir_port) self.assertEqual(None, authority.or_port)
def test_malformed_fingerprint(self): """ Includes a malformed fingerprint on the 'dir-source' line. """ test_values = ( '', 'zzzzz', 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz', ) for value in test_values: dir_source = DIR_SOURCE_LINE.replace('27B6B5996C426270A5C95488AA5BCEB6BCC86956', value) content = DirectoryAuthority.content({'dir-source': dir_source}) self.assertRaises(ValueError, DirectoryAuthority, content, True) authority = DirectoryAuthority(content, False) self.assertEqual(None, authority.fingerprint)
def test_missing_dir_source_field(self): """ Excludes fields from the 'dir-source' line. """ for missing_value in DIR_SOURCE_LINE.split(' '): dir_source = DIR_SOURCE_LINE.replace(missing_value, '').replace(' ', ' ') content = DirectoryAuthority.content({'dir-source': dir_source}) self.assertRaises(ValueError, DirectoryAuthority, content, True) authority = DirectoryAuthority(content, False) self.assertEqual(None, authority.nickname) self.assertEqual(None, authority.fingerprint) self.assertEqual(None, authority.hostname) self.assertEqual(None, authority.address) self.assertEqual(None, authority.dir_port) self.assertEqual(None, authority.or_port)
def test_malformed_address(self): """ Includes a malformed ip address on the 'dir-source' line. """ test_values = ( '', '71.35.150.', '71.35..29', '71.35.150', '71.35.150.256', '[fd9f:2e19:3bcf::02:9970]', ) for value in test_values: dir_source = DIR_SOURCE_LINE.replace('76.73.17.194', value) content = DirectoryAuthority.content({'dir-source': dir_source}) self.assertRaises(ValueError, DirectoryAuthority, content, True) authority = DirectoryAuthority(content, False) self.assertEqual(None, authority.address)
def test_malformed_address(self): """ Includes a malformed ip address on the 'dir-source' line. """ test_values = ( '', '71.35.150.', '71.35..29', '71.35.150', '71.35.150.256', '[fd9f:2e19:3bcf::02:9970]', ) for value in test_values: dir_source = DIR_SOURCE_LINE.replace('76.73.17.194', value) content = DirectoryAuthority.content({'dir-source': dir_source}) self.assertRaises(ValueError, DirectoryAuthority, content, True) authority = DirectoryAuthority(content, False) self.assertEqual(None, authority.address)