def test_successful_command(self, *_): self.assertIsNone( process_group_command(UserInput('group create team Alice'), *self.args)) user_input = UserInput( f"group join {b58encode(GROUP_ID_LENGTH*b'a')} team2") self.assert_fr("Error: Group with matching ID already exists.", process_group_command, user_input, *self.args)
def test_serial_settings_raise_fr(self): self.assert_fr( "Error: Serial interface setting can only be changed manually.", change_setting, UserInput("set use_serial_usb_adapter True"), *self.args) self.assert_fr( "Error: Serial interface setting can only be changed manually.", change_setting, UserInput("set built_in_serial_interface Truej"), *self.args)
def test_file_window(self, _): self.assertIsNone( rxp_show_sys_win(UserInput(plaintext='fw'), *self.args)) self.assertEqual(self.queues[COMMAND_PACKET_QUEUE].qsize(), 2) self.assertIsNone( rxp_show_sys_win(UserInput(plaintext='fw'), *self.args)) self.assertEqual(self.queues[COMMAND_PACKET_QUEUE].qsize(), 4) self.assertIsNone( rxp_show_sys_win(UserInput(plaintext='fw'), *self.args)) self.assertEqual(self.queues[COMMAND_PACKET_QUEUE].qsize(), 6)
def test_rxm_command(self): self.assertIsNone( change_master_key(UserInput("passwd rx"), self.contact_list, self.group_list, self.settings, self.queues, self.master_key)) time.sleep(0.1) self.assertEqual(self.queues[COMMAND_PACKET_QUEUE].qsize(), 1)
def test_successful_removal_of_last_member_of_active_group(self): # Setup builtins.input = lambda _: 'Yes' user_input = UserInput('rm Alice') window = TxWindow( window_contacts=[self.contact_list.get_contact('Alice')], type=WIN_TYPE_GROUP, name='testgroup') group = self.group_list.get_group('testgroup') group.members = [self.contact_list.get_contact('*****@*****.**')] # Test for g in self.group_list: self.assertIsInstance(g, Group) self.assertTrue(g.has_member('*****@*****.**')) self.assertEqual(len(group), 1) self.assertIsNone( remove_contact(user_input, window, self.contact_list, self.group_list, self.settings, self.queues, self.master_key)) time.sleep(0.1) for g in self.group_list: self.assertIsInstance(g, Group) self.assertFalse(g.has_member('*****@*****.**')) self.assertFalse(self.contact_list.has_contact('*****@*****.**')) self.assertEqual(self.queues[COMMAND_PACKET_QUEUE].qsize(), 2) km_data = self.queues[KEY_MANAGEMENT_QUEUE].get() self.assertEqual(km_data, (KDB_REMOVE_ENTRY_HEADER, '*****@*****.**'))
def test_disable_notifications_for_all_users(self): # Setup user_input = UserInput('notify off all') contact_list = ContactList(nicks=['Alice', 'Bob']) group_list = GroupList(groups=['testgroup']) contact = contact_list.get_contact('*****@*****.**') settings = Settings() c_queue = Queue() window = Window(uid='*****@*****.**', type='contact', contact=contact, window_contacts=[contact]) for c in contact_list: c.notifications = True for g in group_list: g.notifications = True # Test for c in contact_list: self.assertTrue(c.notifications) for g in group_list: self.assertTrue(g.notifications) self.assertIsNone( contact_setting(user_input, window, contact_list, group_list, settings, c_queue)) time.sleep(0.2) for c in contact_list: self.assertFalse(c.notifications) for g in group_list: self.assertFalse(g.notifications)
def test_missing_setting_raises_fr(self): # Setup user_input = UserInput('set') # Test self.assertFR('No setting specified.', change_setting, user_input, None, None, None, None, None)
def test_invalid_number_raises_fr(self): # Setup user_input = UserInput('export a') # Test self.assertFR("Specified invalid number of messages to export.", export_logs, user_input, None, None, None, None, None)
def test_enable_logging_for_all_users(self) -> None: # Setup contact = self.contact_list.get_contact_by_address_or_nick("Alice") window = TxWindow(uid=self.pub_key, type=WIN_TYPE_CONTACT, contact=contact, window_contacts=[contact]) for c in self.contact_list: c.log_messages = False for g in self.group_list: g.log_messages = False # Test for c in self.contact_list: self.assertFalse(c.log_messages) for g in self.group_list: self.assertFalse(g.log_messages) self.assertIsNone(contact_setting(UserInput('logging on all'), window, *self.args)) for c in self.contact_list: self.assertTrue(c.log_messages) for g in self.group_list: self.assertTrue(g.log_messages)
def test_contact_removal_during_traffic_masking_raises_soft_error(self) -> None: # Setup self.settings.traffic_masking = True # Test self.assert_se("Error: Command is disabled during traffic masking.", remove_contact, UserInput(), None, *self.args)
def test_user_abort_raises_se(self, *_: Any) -> None: # Setup user_input = UserInput(f'rm {nick_to_onion_address("Alice")}') # Test self.assert_se("Removal of contact aborted.", remove_contact, user_input, None, *self.args)
def test_raises_fr_when_traffic_masking_is_enabled(self): # Setup self.settings.traffic_masking = True # Test self.assert_fr("Error: Command is disabled during traffic masking.", process_group_command, UserInput(), *self.args)
def test_raises_fr_during_traffic_masking(self): # Setup self.settings.traffic_masking = True # Test self.assert_fr("Error: Command is disabled during traffic masking.", change_master_key, UserInput(), *self.args)
def test_loop(self): # Setup queues = gen_queue_dict() settings = Settings(traffic_masking=True, tm_static_delay=0.001, tm_random_delay=0.001) gateway = Gateway() key_list = KeyList(nicks=['Alice', LOCAL_ID]) window = TxWindow(log_messages=True) contact_list = ContactList(nicks=['Alice', LOCAL_ID]) window.contact_list = contact_list window.window_contacts = [contact_list.get_contact_by_address_or_nick('Alice')] user_input = UserInput(plaintext='test') def queue_delayer(): """Place packets to queue after delay.""" time.sleep(0.01) queues[WINDOW_SELECT_QUEUE].put(window.window_contacts) time.sleep(0.01) queue_command(b'test', settings, queues) # 1 queue_message(user_input, window, settings, queues) # 2 queue_message(user_input, window, settings, queues) # 3 queue_command(b'test', settings, queues) # 4 queues[TM_NOISE_COMMAND_QUEUE].put((C_N_HEADER + bytes(PADDING_LENGTH))) # 5 queue_to_nc(UNENCRYPTED_DATAGRAM_HEADER + UNENCRYPTED_EXIT_COMMAND, queues[RELAY_PACKET_QUEUE]) # 6 queue_to_nc(UNENCRYPTED_DATAGRAM_HEADER + UNENCRYPTED_WIPE_COMMAND, queues[RELAY_PACKET_QUEUE]) # 7 queues[SENDER_MODE_QUEUE].put(settings) # Test threading.Thread(target=queue_delayer).start() self.assertIsInstance(traffic_masking_loop(queues, settings, gateway, key_list), Settings) self.assertEqual(len(gateway.packets), 7) # Teardown tear_queues(queues)
def test_cancel_message_during_normal(self) -> None: # Setup user_input = UserInput('cm') settings = Settings() window = TxWindow(name='Alice', type=WIN_TYPE_CONTACT, type_print='contact', uid=nick_to_pub_key("Alice")) window.window_contacts = [create_contact('Alice')] self.queues[MESSAGE_PACKET_QUEUE].put( ('test_message1', nick_to_pub_key("Alice"), False, False, nick_to_pub_key("Alice"))) self.queues[MESSAGE_PACKET_QUEUE].put( ('test_message2', nick_to_pub_key("Charlie"), False, False, nick_to_pub_key("Charlie"))) self.queues[MESSAGE_PACKET_QUEUE].put( ('test_message3', nick_to_pub_key("Alice"), False, False, nick_to_pub_key("Alice"))) # Test self.assert_se("Cancelled queued messages to contact Alice.", cancel_packet, user_input, window, settings, self.queues) self.assertEqual(self.queues[MESSAGE_PACKET_QUEUE].qsize(), 2)
def test_disable_notifications_for_all_users(self): # Setup user_input = UserInput('notify off all') contact = self.contact_list.get_contact('*****@*****.**') window = TxWindow(uid='*****@*****.**', type=WIN_TYPE_CONTACT, contact=contact, window_contacts=[contact]) for c in self.contact_list: c.notifications = True for g in self.group_list: g.notifications = True # Test for c in self.contact_list: self.assertTrue(c.notifications) for g in self.group_list: self.assertTrue(g.notifications) self.assertIsNone( contact_setting(user_input, window, self.contact_list, self.group_list, self.settings, self.c_queue)) time.sleep(0.1) for c in self.contact_list: self.assertFalse(c.notifications) for g in self.group_list: self.assertFalse(g.notifications)
def test_enable_logging_for_all_users(self): # Setup user_input = UserInput('logging on all') contact = self.contact_list.get_contact('*****@*****.**') window = TxWindow(uid='*****@*****.**', type=WIN_TYPE_CONTACT, contact=contact, window_contacts=[contact]) for c in self.contact_list: c.log_messages = False for g in self.group_list: g.log_messages = False # Test for c in self.contact_list: self.assertFalse(c.log_messages) for g in self.group_list: self.assertFalse(g.log_messages) self.assertIsNone( contact_setting(user_input, window, self.contact_list, self.group_list, self.settings, self.c_queue)) time.sleep(0.1) for c in self.contact_list: self.assertTrue(c.log_messages) for g in self.group_list: self.assertTrue(g.log_messages)
def test_successful_removal_of_contact(self): # Setup o_input = builtins.input builtins.input = lambda x: 'Yes' user_input = UserInput('rm Alice') contact_list = ContactList(nicks=['Alice']) window = Window(window_contacts=[contact_list.get_contact('Alice')], type='contact') group_list = GroupList(groups=['testgroup']) settings = Settings() queues = {KEY_MANAGEMENT_QUEUE: Queue(), COMMAND_PACKET_QUEUE: Queue()} # Test for g in group_list: self.assertIsInstance(g, Group) self.assertTrue(g.has_member('*****@*****.**')) self.assertIsNone( remove_contact(user_input, window, contact_list, group_list, settings, queues)) self.assertEqual(queues[COMMAND_PACKET_QUEUE].qsize(), 1) km_data = queues[KEY_MANAGEMENT_QUEUE].get() self.assertEqual(km_data, ('REM', '*****@*****.**')) self.assertFalse(contact_list.has_contact('*****@*****.**')) for g in group_list: self.assertIsInstance(g, Group) self.assertFalse(g.has_member('*****@*****.**')) # Teardown builtins.input = o_input
def test_contact_not_present_on_txm(self): # Setup o_input = builtins.input builtins.input = lambda x: 'Yes' user_input = UserInput('rm [email protected]') contact_list = ContactList(nicks=['Bob']) window = Window(window_contact=[contact_list.get_contact('Bob')], type='group') group_list = GroupList(groups=[]) settings = Settings() queues = {KEY_MANAGEMENT_QUEUE: Queue(), COMMAND_PACKET_QUEUE: Queue()} # Test self.assertIsNone( remove_contact(user_input, window, contact_list, group_list, settings, queues)) self.assertEqual(queues[COMMAND_PACKET_QUEUE].qsize(), 1) command_packet, settings_ = queues[COMMAND_PACKET_QUEUE].get() self.assertIsInstance(command_packet, bytes) self.assertIsInstance(settings_, Settings) # Teardown builtins.input = o_input queues[KEY_MANAGEMENT_QUEUE].close() queues[COMMAND_PACKET_QUEUE].close()
def test_invalid_nick_raises_se(self) -> None: # Setup window = TxWindow(type=WIN_TYPE_CONTACT, contact=create_contact('Bob')) # Test self.assert_se("Error: Nick must be printable.", change_nick, UserInput("nick Alice\x01"), window, *self.args)
def test_missing_parameter_raises_fr(self): # Setup user_input = UserInput('') # Test self.assertFR("Error: Invalid command.", contact_setting, user_input, None, None, None, None, None)
def test_successful_removal_of_last_member_of_active_group(self, _: Any) -> None: # Setup user_input = UserInput('rm Alice') window = TxWindow(window_contacts=[self.contact_list.get_contact_by_address_or_nick("Alice")], type=WIN_TYPE_GROUP, name='test_group') group = self.group_list.get_group('test_group') group.members = [self.contact_list.get_contact_by_address_or_nick("Alice")] pub_key = nick_to_pub_key('Alice') # Test for g in self.group_list: self.assertIsInstance(g, Group) self.assertTrue(g.has_member(pub_key)) self.assertEqual(len(group), 1) self.assertIsNone(remove_contact(user_input, window, *self.args)) for g in self.group_list: self.assertIsInstance(g, Group) self.assertFalse(g.has_member(pub_key)) self.assertFalse(self.contact_list.has_pub_key(pub_key)) self.assertEqual(self.queues[COMMAND_PACKET_QUEUE].qsize(), 1) km_data = self.queues[KEY_MANAGEMENT_QUEUE].get() self.assertEqual(km_data, (KDB_REMOVE_ENTRY_HEADER, pub_key))
def test_invalid_extra_parameter_raises_fr(self): # Setup user_input = UserInput('logging on al') # Test self.assertFR("Error: Invalid command.", contact_setting, user_input, None, None, None, None, None)
def test_disable_notifications_for_all_users(self) -> None: # Setup contact = self.contact_list.get_contact_by_address_or_nick("Alice") window = TxWindow(uid=self.pub_key, type=WIN_TYPE_CONTACT, contact=contact, window_contacts=[contact]) for c in self.contact_list: c.notifications = True for g in self.group_list: g.notifications = True # Test for c in self.contact_list: self.assertTrue(c.notifications) for g in self.group_list: self.assertTrue(g.notifications) self.assertIsNone(contact_setting(UserInput('notify off all'), window, *self.args)) for c in self.contact_list: self.assertFalse(c.notifications) for g in self.group_list: self.assertFalse(g.notifications)
def test_disable_file_reception_for_all_users(self): # Setup user_input = UserInput('store off all') contact_list = ContactList(nicks=['Alice', 'Bob']) group_list = GroupList() contact = contact_list.get_contact('*****@*****.**') settings = Settings() c_queue = Queue() window = Window(uid='*****@*****.**', type='contact', contact=contact, window_contacts=[contact]) for c in contact_list: c.file_reception = True for g in group_list: g.file_reception = True # Test for c in contact_list: self.assertTrue(c.file_reception) for g in group_list: self.assertTrue(g.log_messages) self.assertIsNone( contact_setting(user_input, window, contact_list, group_list, settings, c_queue)) time.sleep(0.2) for c in contact_list: self.assertFalse(c.file_reception) for g in group_list: self.assertFalse(g.log_messages)
def test_txm_command(self): # Setup user_input = UserInput("passwd tx") contact_list = ContactList() group_list = GroupList() settings = Settings() queues = {COMMAND_PACKET_QUEUE: Queue(), KEY_MANAGEMENT_QUEUE: Queue()} master_key = MasterKey() o_getpass = getpass.getpass getpass.getpass = lambda x: 'a' # Test self.assertIsNone( change_master_key(user_input, contact_list, group_list, settings, queues, master_key)) # Teardown while not queues[COMMAND_PACKET_QUEUE].empty(): queues[COMMAND_PACKET_QUEUE].get() while not queues[KEY_MANAGEMENT_QUEUE].empty(): queues[KEY_MANAGEMENT_QUEUE].get() getpass.getpass = o_getpass time.sleep(0.2) cleanup()
def test_reset_screens(self): self.assertIsNone( clear_screens(UserInput(plaintext='reset'), self.window, self.settings, self.queues)) time.sleep(0.1) self.assertEqual(self.queues[COMMAND_PACKET_QUEUE].qsize(), 1) self.assertEqual(self.queues[NH_PACKET_QUEUE].qsize(), 1)
def test_cancel_message_during_normal(self): # Setup user_input = UserInput('cm') settings = Settings() window = TxWindow(name='Alice', type=WIN_TYPE_CONTACT, type_print='contact', uid='*****@*****.**') window.window_contacts = [create_contact()] self.queues[MESSAGE_PACKET_QUEUE].put( ('testmessage1', settings, '*****@*****.**', '*****@*****.**', False, False, '*****@*****.**')) self.queues[MESSAGE_PACKET_QUEUE].put( ('testmessage2', settings, '*****@*****.**', '*****@*****.**', False, False, '*****@*****.**')) self.queues[MESSAGE_PACKET_QUEUE].put( ('testmessage3', settings, '*****@*****.**', '*****@*****.**', False, False, '*****@*****.**')) time.sleep(0.1) # Test self.assertIsNone( cancel_packet(user_input, window, settings, self.queues)) time.sleep(0.1) self.assertEqual(self.queues[MESSAGE_PACKET_QUEUE].qsize(), 2)
def test_invalid_setting_raises_fr(self): # Setup user_input = UserInput('set e_correction_ratia true') settings = Settings(key_list=['e_correction_ratio']) # Test self.assertFR('Invalid setting e_correction_ratia.', change_setting, user_input, None, None, settings, None, None)
def test_missing_value_raises_fr(self): # Setup user_input = UserInput('set e_correction_ratio') settings = Settings(key_list=['e_correction_ratio']) # Test self.assertFR('No value for setting specified.', change_setting, user_input, None, None, settings, None, None)