Monkey patch the logging module to make debugging poorly written
logging statements easier.

Signed-off-by: Gregory Smith <gps@google.com>


git-svn-id: http://test.kernel.org/svn/autotest/trunk@3066 592f7852-d20e-0410-864c-8624ca9c26a4
diff --git a/client/setup_modules_unittest.py b/client/setup_modules_unittest.py
new file mode 100644
index 0000000..571f449
--- /dev/null
+++ b/client/setup_modules_unittest.py
@@ -0,0 +1,72 @@
+#!/usr/bin/python2.4
+
+import cStringIO, logging, os, sys, unittest
+
+# direct imports; autotest_lib has not been setup while testing this.
+from common_lib.test_utils import mock
+import setup_modules
+
+
+class LoggingErrorStderrTests(unittest.TestCase):
+    def setUp(self):
+        autotest_dir = os.path.abspath(os.path.join(setup_modules.dirname,
+                                                    '..'))
+        setup_modules.setup(autotest_dir, root_module_name='autotest_lib')
+        self.god = mock.mock_god()
+        self.test_stderr = cStringIO.StringIO()
+        self.god.stub_with(sys, 'stderr', self.test_stderr)
+        self.old_root_logging_level = logging.root.level
+        logging.basicConfig(level=logging.ERROR)
+
+
+    def tearDown(self):
+        self.god.unstub_all()
+        # Undo the setUp logging.basicConfig call.
+        logging.basicConfig(level=self.old_root_logging_level)
+
+
+    def assert_autotest_logging_handle_error_called(self):
+        self.stderr_str = self.test_stderr.getvalue()
+        self.assertTrue('Exception occurred formatting' in self.stderr_str,
+                        repr(self.stderr_str))
+
+
+    def test_autotest_logging_handle_error(self):
+        record = logging.LogRecord(
+                'test', logging.DEBUG, __file__, 0, 'MESSAGE', 'ARGS', None)
+        try:
+            raise RuntimeError('Exception context needed for the test.')
+        except RuntimeError:
+            setup_modules._autotest_logging_handle_error(logging.Handler(),
+                                                         record)
+        else:
+            self.fail()
+        self.assert_autotest_logging_handle_error_called()
+        self.assertTrue(('MESSAGE' in self.stderr_str), repr(self.stderr_str))
+        self.assertTrue(('ARGS' in self.stderr_str), repr(self.stderr_str))
+        self.assertTrue(('Exception' in self.stderr_str), repr(self.stderr_str))
+        self.assertTrue(('setup_modules_unittest.py' in self.stderr_str),
+                        repr(self.stderr_str))
+
+
+    def test_logging_monkey_patch_wrong_number_of_args(self):
+        logging.error('logging unittest %d %s', 32)
+        self.assert_autotest_logging_handle_error_called()
+        self.assertTrue('logging unittest' in self.stderr_str,
+                        repr(self.stderr_str))
+
+
+    def test_logging_monkey_patch_wrong_type_of_arg(self):
+        logging.error('logging unittest %d', 'eighteen')
+        self.assert_autotest_logging_handle_error_called()
+        self.assertTrue('logging unittest' in self.stderr_str,
+                        repr(self.stderr_str))
+
+
+    def test_logging_no_error(self):
+        logging.error('logging unittest.  %s %s', 'meep', 'meep!')
+        self.assertEqual('', self.test_stderr.getvalue())
+
+
+if __name__ == "__main__":
+    unittest.main()