1*9c5db199SXin Li#!/usr/bin/python3 2*9c5db199SXin Li 3*9c5db199SXin Liimport logging, os, sys, unittest 4*9c5db199SXin Lifrom six.moves import StringIO 5*9c5db199SXin Li 6*9c5db199SXin Li# direct imports; autotest_lib has not been setup while testing this. 7*9c5db199SXin Lifrom client.common_lib.test_utils import mock 8*9c5db199SXin Lifrom client import setup_modules 9*9c5db199SXin Li 10*9c5db199SXin Li 11*9c5db199SXin Liclass LoggingErrorStderrTests(unittest.TestCase): 12*9c5db199SXin Li """Test the setup_modules.""" 13*9c5db199SXin Li 14*9c5db199SXin Li def setUp(self): 15*9c5db199SXin Li autotest_dir = os.path.abspath(os.path.join(setup_modules.dirname, 16*9c5db199SXin Li '..')) 17*9c5db199SXin Li setup_modules.setup(autotest_dir, root_module_name='autotest_lib') 18*9c5db199SXin Li self.god = mock.mock_god() 19*9c5db199SXin Li self.test_stderr = StringIO() 20*9c5db199SXin Li self.god.stub_with(sys, 'stderr', self.test_stderr) 21*9c5db199SXin Li self.old_root_logging_level = logging.root.level 22*9c5db199SXin Li logging.basicConfig(level=logging.ERROR) 23*9c5db199SXin Li # _autotest_logging_handle_error unsets this after being called once. 24*9c5db199SXin Li logging.raiseExceptions = 1 25*9c5db199SXin Li 26*9c5db199SXin Li def tearDown(self): 27*9c5db199SXin Li self.god.unstub_all() 28*9c5db199SXin Li # Undo the setUp logging.basicConfig call. 29*9c5db199SXin Li logging.basicConfig(level=self.old_root_logging_level) 30*9c5db199SXin Li 31*9c5db199SXin Li def assert_autotest_logging_handle_error_called(self): 32*9c5db199SXin Li self.stderr_str = self.test_stderr.getvalue() 33*9c5db199SXin Li self.assertTrue('Exception occurred formatting' in self.stderr_str, 34*9c5db199SXin Li repr(self.stderr_str)) 35*9c5db199SXin Li 36*9c5db199SXin Li def test_autotest_logging_handle_error(self): 37*9c5db199SXin Li record = logging.LogRecord( 38*9c5db199SXin Li 'test', logging.DEBUG, __file__, 0, 'MESSAGE', 'ARGS', None) 39*9c5db199SXin Li try: 40*9c5db199SXin Li raise RuntimeError('Exception context needed for the test.') 41*9c5db199SXin Li except RuntimeError: 42*9c5db199SXin Li setup_modules._autotest_logging_handle_error(logging.Handler(), 43*9c5db199SXin Li record) 44*9c5db199SXin Li else: 45*9c5db199SXin Li self.fail() 46*9c5db199SXin Li self.assert_autotest_logging_handle_error_called() 47*9c5db199SXin Li stderr_repr = repr(self.stderr_str) 48*9c5db199SXin Li self.assertTrue(('MESSAGE' in self.stderr_str), stderr_repr) 49*9c5db199SXin Li self.assertTrue(('ARGS' in self.stderr_str), stderr_repr) 50*9c5db199SXin Li self.assertTrue(('Exception' in self.stderr_str), stderr_repr) 51*9c5db199SXin Li self.assertTrue(('setup_modules_unittest.py' in self.stderr_str), 52*9c5db199SXin Li stderr_repr) 53*9c5db199SXin Li self.assertTrue(('disabled.\n' in self.stderr_str), stderr_repr) 54*9c5db199SXin Li # Make sure this was turned off by our handle_error. 55*9c5db199SXin Li self.assertFalse(logging.raiseExceptions) 56*9c5db199SXin Li 57*9c5db199SXin Li def test_logging_monkey_patch_wrong_number_of_args(self): 58*9c5db199SXin Li logging.error('logging unittest %d %s', 32) 59*9c5db199SXin Li self.assert_autotest_logging_handle_error_called() 60*9c5db199SXin Li self.assertTrue('logging unittest' in self.stderr_str, 61*9c5db199SXin Li repr(self.stderr_str)) 62*9c5db199SXin Li 63*9c5db199SXin Li def test_logging_monkey_patch_wrong_type_of_arg(self): 64*9c5db199SXin Li logging.error('logging unittest %d', 'eighteen') 65*9c5db199SXin Li self.assert_autotest_logging_handle_error_called() 66*9c5db199SXin Li self.assertTrue('logging unittest' in self.stderr_str, 67*9c5db199SXin Li repr(self.stderr_str)) 68*9c5db199SXin Li 69*9c5db199SXin Li def test_logging_no_error(self): 70*9c5db199SXin Li logging.error('logging unittest. %s %s', 'meep', 'meep!') 71*9c5db199SXin Li self.assertEqual('', self.test_stderr.getvalue()) 72*9c5db199SXin Li 73*9c5db199SXin Li 74*9c5db199SXin Liif __name__ == "__main__": 75*9c5db199SXin Li unittest.main() 76