def test_loop_keyboard_interrupt(self): # We mock out so much of this, is it even a worthwhile test? Well, it # does give us coverage. self.run_forever.side_effect = KeyboardInterrupt main(('-n',)) # loop.run_until_complete() was still executed. self.assertTrue(self.run_until_complete.called)
def test_loop_keyboard_interrupt(self): # We mock out so much of this, is it even a worthwhile test? Well, it # does give us coverage. self.run_forever.side_effect = KeyboardInterrupt main(('-n', )) # loop.run_until_complete() was still executed. self.assertTrue(self.run_until_complete.called)
def test_setuid(self): with patch('os.setuid', side_effect=RuntimeError) as mock: try: main(args=()) except RuntimeError: pass mock.assert_called_with(pwd.getpwnam('nobody').pw_uid)
def test_smtputf8(self): # We mock out so much of this, is it even a worthwhile test? Well, it # does give us coverage. main(('-n', '--smtputf8')) positional, keywords = self.create_server.call_args self.assertEqual(positional[0].keywords, dict(data_size_limit=None, enable_SMTPUTF8=True))
def test_setuid_permission_error(self, nobody_uid, mocker, capsys): mock = mocker.patch("os.setuid", side_effect=PermissionError) with pytest.raises(SystemExit) as excinfo: main(args=()) assert excinfo.value.code == 1 mock.assert_called_with(nobody_uid) assert (capsys.readouterr().err == 'Cannot setuid "nobody"; try running with -n option.\n')
def test_debug_0(self): # For this test, the runner will have already set the log level so it # may not be logging.ERROR. log = logging.getLogger('mail.log') default_level = log.getEffectiveLevel() with patch.object(log, 'info'): main(('-n', )) self.assertEqual(log.getEffectiveLevel(), default_level)
def test_debug_0(self): # For this test, the runner will have already set the log level so it # may not be logging.ERROR. log = logging.getLogger('mail.log') default_level = log.getEffectiveLevel() with patch.object(log, 'info'): main(('-n',)) self.assertEqual(log.getEffectiveLevel(), default_level)
def test_smtputf8(self): # We mock out so much of this, is it even a worthwhile test? Well, it # does give us coverage. main(('-n', '--smtputf8')) positional, keywords = self.create_server.call_args self.assertEqual(positional[0].keywords, dict( data_size_limit=None, enable_SMTPUTF8=True))
def test_debug_2(self): # The main loop will produce an error, but that's fine. Also, mock # the logger to eliminate console noise. with patch.object(logging.getLogger('mail.log'), 'info'): try: main(('-n', '-dd')) except RuntimeError: pass self.assertEqual(log.getEffectiveLevel(), logging.DEBUG)
def test_setuid_no_pwd_module(self): self.resources.enter_context(patch('aiosmtpd.main.pwd', None)) stderr = StringIO() self.resources.enter_context(patch('sys.stderr', stderr)) with self.assertRaises(SystemExit) as cm: main(args=()) self.assertEqual(cm.exception.code, 1) self.assertEqual( stderr.getvalue(), 'Cannot import module "pwd"; try running with -n option.\n')
def test_setuid_permission_error(self): mock = self.resources.enter_context( patch('os.setuid', side_effect=PermissionError)) stderr = StringIO() self.resources.enter_context(patch('sys.stderr', stderr)) with self.assertRaises(SystemExit) as cm: main(args=()) self.assertEqual(cm.exception.code, 1) mock.assert_called_with(pwd.getpwnam('nobody').pw_uid) self.assertEqual( stderr.getvalue(), 'Cannot setuid "nobody"; try running with -n option.\n')
def test_setuid_no_pwd_module(self, nobody_uid, mocker, capsys): mocker.patch("aiosmtpd.main.pwd", None) with pytest.raises(SystemExit) as excinfo: main(args=()) assert excinfo.value.code == 1 # On Python 3.8 on Linux, a bunch of "RuntimeWarning: coroutine # 'AsyncMockMixin._execute_mock_call' was never awaited" messages # gets mixed up into stderr causing test fail. # Therefore, we use assertIn instead of assertEqual here, because # the string DOES appear in stderr, just buried. assert ('Cannot import module "pwd"; try running with -n option.\n' in capsys.readouterr().err)
def test_debug_0(self): # The main loop will produce an error, but that's fine. Also, mock # the logger to eliminate console noise. For this test, the runner # will have already set the log level so it may not be logging.ERROR. log = logging.getLogger('mail.log') default_level = log.getEffectiveLevel() with patch.object(log, 'info'): try: main(('-n', )) except RuntimeError: pass self.assertEqual(log.getEffectiveLevel(), default_level)
def test_debug_0(self): # The main loop will produce an error, but that's fine. Also, mock # the logger to eliminate console noise. For this test, the runner # will have already set the log level so it may not be logging.ERROR. log = logging.getLogger('mail.log') default_level = log.getEffectiveLevel() with patch.object(log, 'info'): try: main(('-n',)) except RuntimeError: pass self.assertEqual(log.getEffectiveLevel(), default_level)
def test_keyboard_interrupt(self): """ main() must close loop gracefully on Ctrl-C. """ def interrupt(): raise KeyboardInterrupt self.loop.call_later(1.5, interrupt) try: main(("-n", )) except Exception: self.fail("main() should've closed cleanly without exceptions!") else: self.assertFalse(self.loop.is_running())
def test_setuid_no_pwd_module(self): self.resources.enter_context(patch('aiosmtpd.main.pwd', None)) stderr = StringIO() self.resources.enter_context(patch('sys.stderr', stderr)) with self.assertRaises(SystemExit) as cm: main(args=()) self.assertEqual(cm.exception.code, 1) # On Python 3.8 on Linux, a bunch of "RuntimeWarning: coroutine # 'AsyncMockMixin._execute_mock_call' was never awaited" messages # gets mixed up into stderr causing test fail. # Therefore, we use assertIn instead of assertEqual here, because # the string DOES appear in stderr, just buried. self.assertIn( 'Cannot import module "pwd"; try running with -n option.\n', stderr.getvalue(), )
def test_loop(self): main(('-n', )) # create_server() is called with a partial as the factory, and a # socket object. self.assertEqual(self.create_server.call_count, 1) positional, keywords = self.create_server.call_args self.assertEqual(positional[0].func, SMTP) self.assertEqual(len(positional[0].args), 1) self.assertIsInstance(positional[0].args[0], Debugging) self.assertEqual(positional[0].keywords, dict(data_size_limit=None, enable_SMTPUTF8=False)) self.assertEqual(sorted(keywords), ['host', 'port']) # run_until_complete() was called once. The argument isn't important. self.assertTrue(self.run_until_complete.called) # add_signal_handler() is called with two arguments. self.assertEqual(self.add_signal_handler.call_count, 1) signal_number, callback = self.add_signal_handler.call_args[0] self.assertEqual(signal_number, signal.SIGINT) self.assertEqual(callback, self.loop.stop) # run_forever() was called once. self.assertEqual(self.run_forever.call_count, 1)
def test_loop(self): main(('-n',)) # create_server() is called with a partial as the factory, and a # socket object. self.assertEqual(self.create_server.call_count, 1) positional, keywords = self.create_server.call_args self.assertEqual(positional[0].func, SMTP) self.assertEqual(len(positional[0].args), 1) self.assertIsInstance(positional[0].args[0], Debugging) self.assertEqual(positional[0].keywords, dict( data_size_limit=None, enable_SMTPUTF8=False)) self.assertEqual(sorted(keywords), ['host', 'port']) # run_until_complete() was called once. The argument isn't important. self.assertTrue(self.run_until_complete.called) # add_signal_handler() is called with two arguments. self.assertEqual(self.add_signal_handler.call_count, 1) signal_number, callback = self.add_signal_handler.call_args[0] self.assertEqual(signal_number, signal.SIGINT) self.assertEqual(callback, self.loop.stop) # run_forever() was called once. self.assertEqual(self.run_forever.call_count, 1)
def test_debug_3(self): # Mock the logger to eliminate console noise. with patch.object(logging.getLogger('mail.log'), 'info'): main(('-n', '-ddd')) self.assertEqual(log.getEffectiveLevel(), logging.DEBUG) self.assertTrue(asyncio.get_event_loop().get_debug())
from aiosmtpd.main import main if __name__ == '__main__': main()
def test_debug_1(self): # Mock the logger to eliminate console noise. with patch.object(logging.getLogger('mail.log'), 'info'): main(('-n', '-d')) self.assertEqual(log.getEffectiveLevel(), logging.INFO)
def test_setuid(self): with patch('os.setuid') as mock: main(args=()) mock.assert_called_with(pwd.getpwnam('nobody').pw_uid)
def test_nosetuid(self, setuid): with pytest.raises(RuntimeError): main(("--nosetuid",))
def test_setuid(self, nobody_uid, mocker): mock = mocker.patch("os.setuid") main(args=()) mock.assert_called_with(nobody_uid)
def main_n(*args): main(("-n",) + args)
# Copyright 2014-2021 The aiosmtpd Developers # SPDX-License-Identifier: Apache-2.0 from aiosmtpd.main import main if __name__ == '__main__': main()