def test_remove_contact(self): # Setup contact1 = Contact('*****@*****.**', '*****@*****.**', 'Alice', 32 * b'\x01', 32 * b'\x02', True, True, True) contact2 = Contact('*****@*****.**', '*****@*****.**', 'Charlie', 32 * b'\x01', 32 * b'\x02', True, True, True) contact_l = ContactList(MasterKey(), Settings()) contact_l.contacts = [contact1, contact2] # Test self.assertTrue(contact_l.has_contacts()) self.assertTrue(contact_l.has_contact('Alice')) self.assertTrue(contact_l.has_contact('*****@*****.**')) contact_l.remove_contact('*****@*****.**') self.assertFalse(contact_l.has_contact('Alice')) self.assertFalse(contact_l.has_contact('*****@*****.**')) contact_l.remove_contact('Charlie') self.assertEqual(len(contact_l.contacts), 0) self.assertFalse(contact_l.has_contacts())
class TestGroupList(TFCTestCase): def setUp(self): self.master_key = MasterKey() self.settings = Settings() self.contact_list = ContactList(self.master_key, self.settings) self.group_list = GroupList(self.master_key, self.settings, self.contact_list) members = [create_contact(n) for n in ['Alice', 'Bob', 'Charlie', 'David', 'Eric', 'Fido', 'Guido', 'Heidi', 'Ivan', 'Joana', 'Karol']] self.contact_list.contacts = members groups = [Group(n, False, False, members, self.settings, self.group_list.store_groups) for n in ['testgroup_1', 'testgroup_2', 'testgroup_3', 'testgroup_4', 'testgroup_5', 'testgroup_6', 'testgroup_7', 'testgroup_8', 'testgroup_9', 'testgroup_10', 'testgroup_11']] self.group_list.groups = groups self.group_list.store_groups() self.single_member_data = (PADDED_UTF32_STR_LEN + (2 * BOOLEAN_SETTING_LEN) + (self.settings.max_number_of_group_members * PADDED_UTF32_STR_LEN)) def tearDown(self): cleanup() def test_group_list_iterates_over_group_objects(self): for g in self.group_list: self.assertIsInstance(g, Group) def test_len_returns_number_of_groups(self): self.assertEqual(len(self.group_list), 11) def test_database_size(self): self.assertTrue(os.path.isfile(f'{DIR_USER_DATA}ut_groups')) self.assertEqual(os.path.getsize(f'{DIR_USER_DATA}ut_groups'), XSALSA20_NONCE_LEN + GROUP_DB_HEADER_LEN + self.settings.max_number_of_groups * self.single_member_data + POLY1305_TAG_LEN) self.settings.max_number_of_groups = 10 self.settings.max_number_of_group_members = 10 group_list2 = GroupList(self.master_key, self.settings, self.contact_list) self.assertEqual(len(group_list2), 11) # Check that load_groups() function increases setting values with larger db self.assertEqual(self.settings.max_number_of_groups, 20) self.assertEqual(self.settings.max_number_of_group_members, 20) # Check that removed contact from contact list updates group self.contact_list.remove_contact('Alice') group_list3 = GroupList(self.master_key, self.settings, self.contact_list) self.assertEqual(len(group_list3.get_group('testgroup_1').members), 10) group_list4 = GroupList(self.master_key, self.settings, self.contact_list) self.assertEqual(len(group_list4.get_group('testgroup_2').members), 10) def test_generate_group_db_header(self): header = self.group_list.generate_group_db_header() self.assertEqual(len(header), GROUP_DB_HEADER_LEN) self.assertIsInstance(header, bytes) def test_generate_dummy_group(self): dummy_group = self.group_list.generate_dummy_group() self.assertEqual(len(dummy_group.serialize_g()), self.single_member_data) self.assertIsInstance(dummy_group, Group) def test_add_group(self): members = [create_contact('Laura')] self.group_list.add_group('testgroup_12', False, False, members) self.group_list.add_group('testgroup_12', False, True, members) self.assertTrue(self.group_list.get_group('testgroup_12').notifications) self.assertEqual(len(self.group_list), 12) def test_remove_group(self): self.assertEqual(len(self.group_list), 11) self.assertIsNone(self.group_list.remove_group('testgroup_12')) self.assertEqual(len(self.group_list), 11) self.assertIsNone(self.group_list.remove_group('testgroup_11')) self.assertEqual(len(self.group_list), 10) def test_get_list_of_group_names(self): g_names = ['testgroup_1', 'testgroup_2', 'testgroup_3', 'testgroup_4', 'testgroup_5', 'testgroup_6', 'testgroup_7', 'testgroup_8', 'testgroup_9', 'testgroup_10', 'testgroup_11'] self.assertEqual(self.group_list.get_list_of_group_names(), g_names) def test_get_group(self): self.assertEqual(self.group_list.get_group('testgroup_3').name, 'testgroup_3') def test_get_group_members(self): members = self.group_list.get_group_members('testgroup_1') for c in members: self.assertIsInstance(c, Contact) def test_has_group(self): self.assertTrue(self.group_list.has_group('testgroup_11')) self.assertFalse(self.group_list.has_group('testgroup_12')) def test_has_groups(self): self.assertTrue(self.group_list.has_groups()) self.group_list.groups = [] self.assertFalse(self.group_list.has_groups()) def test_largest_group(self): self.assertEqual(self.group_list.largest_group(), 11) def test_print_group(self): self.group_list.get_group("testgroup_1").log_messages = True self.group_list.get_group("testgroup_2").notifications = True self.group_list.get_group("testgroup_3").members = [] self.assertPrints("""\ Group Logging Notify Members ──────────────────────────────────────────────────────────────────────────────── testgroup_1 Yes No Alice, Bob, Charlie, David, Eric, Fido, Guido, Heidi, Ivan, Joana, Karol testgroup_2 No Yes Alice, Bob, Charlie, David, Eric, Fido, Guido, Heidi, Ivan, Joana, Karol testgroup_3 No No <Empty group> testgroup_4 No No Alice, Bob, Charlie, David, Eric, Fido, Guido, Heidi, Ivan, Joana, Karol testgroup_5 No No Alice, Bob, Charlie, David, Eric, Fido, Guido, Heidi, Ivan, Joana, Karol testgroup_6 No No Alice, Bob, Charlie, David, Eric, Fido, Guido, Heidi, Ivan, Joana, Karol testgroup_7 No No Alice, Bob, Charlie, David, Eric, Fido, Guido, Heidi, Ivan, Joana, Karol testgroup_8 No No Alice, Bob, Charlie, David, Eric, Fido, Guido, Heidi, Ivan, Joana, Karol testgroup_9 No No Alice, Bob, Charlie, David, Eric, Fido, Guido, Heidi, Ivan, Joana, Karol testgroup_10 No No Alice, Bob, Charlie, David, Eric, Fido, Guido, Heidi, Ivan, Joana, Karol testgroup_11 No No Alice, Bob, Charlie, David, Eric, Fido, Guido, Heidi, Ivan, Joana, Karol """, self.group_list.print_groups)
class TestContactList(TFCTestCase): def setUp(self): self.master_key = MasterKey() self.settings = Settings() self.contact_list = ContactList(self.master_key, self.settings) self.contact_list.contacts = list( map(create_contact, ['Alice', 'Benny', 'Charlie', 'David', 'Eric'])) def tearDown(self): cleanup() def test_contact_list_iterates_over_contact_objects(self): for c in self.contact_list: self.assertIsInstance(c, Contact) def test_len_returns_number_of_contacts(self): self.assertEqual(len(self.contact_list), 5) def test_storing_and_loading_of_contacts(self): # Test store self.contact_list.store_contacts() self.assertTrue(os.path.isfile(f'{DIR_USER_DATA}ut_contacts')) self.assertEqual( os.path.getsize(f'{DIR_USER_DATA}ut_contacts'), XSALSA20_NONCE_LEN + self.settings.max_number_of_contacts * CONTACT_LENGTH + POLY1305_TAG_LEN) # Test load contact_list2 = ContactList(self.master_key, self.settings) self.assertEqual(len(contact_list2), 5) for c in contact_list2: self.assertIsInstance(c, Contact) def test_generate_dummy_contact(self): dummy_contact = ContactList.generate_dummy_contact() self.assertIsInstance(dummy_contact, Contact) self.assertEqual(len(dummy_contact.serialize_c()), CONTACT_LENGTH) def test_add_contact(self): self.assertIsNone( self.contact_list.add_contact(f'*****@*****.**', '*****@*****.**', f'Faye', FINGERPRINT_LEN * b'\x03', FINGERPRINT_LEN * b'\x04', True, True, True)) contact_list2 = ContactList(MasterKey(), Settings()) c_alice = contact_list2.get_contact('Alice') c_faye = contact_list2.get_contact('Faye') self.assertEqual(len(self.contact_list), 6) self.assertIsInstance(c_alice, Contact) self.assertEqual(c_alice.tx_fingerprint, FINGERPRINT_LEN * b'\x01') self.assertEqual(c_faye.tx_fingerprint, FINGERPRINT_LEN * b'\x03') def test_replace_existing_contact(self): c_alice = self.contact_list.get_contact('Alice') self.assertEqual(c_alice.tx_fingerprint, FINGERPRINT_LEN * b'\x01') self.assertIsNone( self.contact_list.add_contact(f'*****@*****.**', '*****@*****.**', f'Alice', FINGERPRINT_LEN * b'\x03', FINGERPRINT_LEN * b'\x04', True, True, True)) contact_list2 = ContactList(MasterKey(), Settings()) c_alice = contact_list2.get_contact('Alice') self.assertEqual(len(self.contact_list), 5) self.assertIsInstance(c_alice, Contact) self.assertEqual(c_alice.tx_fingerprint, FINGERPRINT_LEN * b'\x03') def test_remove_contact(self): self.assertTrue(self.contact_list.has_contact('Benny')) self.assertTrue(self.contact_list.has_contact('Charlie')) self.contact_list.remove_contact('*****@*****.**') self.assertFalse(self.contact_list.has_contact('Benny')) self.contact_list.remove_contact('Charlie') self.assertFalse(self.contact_list.has_contact('Charlie')) def test_get_contact(self): for selector in ['*****@*****.**', 'Benny']: contact = self.contact_list.get_contact(selector) self.assertIsInstance(contact, Contact) self.assertEqual(contact.rx_account, '*****@*****.**') def test_get_list_of_contacts(self): for c in self.contact_list.get_list_of_contacts(): self.assertIsInstance(c, Contact) def test_get_list_of_accounts(self): self.assertEqual(self.contact_list.get_list_of_accounts(), [ '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**' ]) def test_get_list_of_nicks(self): self.assertEqual(self.contact_list.get_list_of_nicks(), ['Alice', 'Benny', 'Charlie', 'David', 'Eric']) def test_get_list_of_users_accounts(self): self.assertEqual(self.contact_list.get_list_of_users_accounts(), ['*****@*****.**']) def test_contact_selectors(self): self.assertEqual(self.contact_list.contact_selectors(), [ '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', 'Alice', 'Benny', 'Charlie', 'David', 'Eric' ]) def test_has_contacts(self): self.assertTrue(self.contact_list.has_contacts()) self.contact_list.contacts = [] self.assertFalse(self.contact_list.has_contacts()) def test_has_contact(self): self.contact_list.contacts = [] self.assertFalse(self.contact_list.has_contact('Benny')) self.assertFalse(self.contact_list.has_contact('*****@*****.**')) self.contact_list.contacts = list( map(create_contact, ['Bob', 'Charlie'])) self.assertTrue(self.contact_list.has_contact('Bob')) self.assertTrue(self.contact_list.has_contact('*****@*****.**')) def test_has_local_contact(self): self.assertFalse(self.contact_list.has_local_contact()) self.contact_list.contacts.append(create_contact(LOCAL_ID)) self.assertTrue(self.contact_list.has_local_contact()) def test_contact_printing(self): self.contact_list.contacts.append(create_contact(LOCAL_ID)) self.contact_list.get_contact('Alice').log_messages = False self.contact_list.get_contact('Benny').notifications = False self.contact_list.get_contact('Charlie').file_reception = False self.contact_list.get_contact('David').tx_fingerprint = bytes( FINGERPRINT_LEN) self.assertPrints( CLEAR_ENTIRE_SCREEN + CURSOR_LEFT_UP_CORNER + """\ Contact Logging Notify Files Key Ex Account ──────────────────────────────────────────────────────────────────────────────── Alice No Yes Accept X25519 [email protected] Benny Yes No Accept X25519 [email protected] Charlie Yes Yes Reject X25519 [email protected] David Yes Yes Accept PSK [email protected] Eric Yes Yes Accept X25519 [email protected] """, self.contact_list.print_contacts)