testing/mozbase/mozlog/tests/test_structured.py

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/testing/mozbase/mozlog/tests/test_structured.py	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,275 @@
     1.4 +import argparse
     1.5 +import os
     1.6 +import time
     1.7 +import unittest
     1.8 +import StringIO
     1.9 +import json
    1.10 +
    1.11 +from mozlog.structured import (
    1.12 +    commandline,
    1.13 +    reader,
    1.14 +    structuredlog,
    1.15 +)
    1.16 +
    1.17 +
    1.18 +class TestHandler(object):
    1.19 +    def __init__(self):
    1.20 +        self.last_item = None
    1.21 +
    1.22 +    def __call__(self, data):
    1.23 +        self.last_item = data
    1.24 +
    1.25 +
    1.26 +class BaseStructuredTest(unittest.TestCase):
    1.27 +    def setUp(self):
    1.28 +        self.logger = structuredlog.StructuredLogger("test")
    1.29 +        self.handler = TestHandler()
    1.30 +        self.logger.add_handler(self.handler)
    1.31 +
    1.32 +    @property
    1.33 +    def last_item(self):
    1.34 +        return self.handler.last_item
    1.35 +
    1.36 +    def assert_log_equals(self, expected, actual=None):
    1.37 +        if actual is None:
    1.38 +            actual = self.last_item
    1.39 +
    1.40 +        all_expected = {"pid": os.getpid(),
    1.41 +                        "thread": "MainThread",
    1.42 +                        "source": "test"}
    1.43 +        specials = set(["time"])
    1.44 +
    1.45 +        all_expected.update(expected)
    1.46 +        for key, value in all_expected.iteritems():
    1.47 +            self.assertEqual(actual[key], value)
    1.48 +
    1.49 +        self.assertEquals(set(all_expected.keys()) | specials, set(actual.keys()))
    1.50 +
    1.51 +
    1.52 +class TestStructuredLog(BaseStructuredTest):
    1.53 +    def test_suite_start(self):
    1.54 +        self.logger.suite_start(["test"])
    1.55 +        self.assert_log_equals({"action": "suite_start",
    1.56 +                                "tests":["test"]})
    1.57 +
    1.58 +    def test_suite_end(self):
    1.59 +        self.logger.suite_end()
    1.60 +        self.assert_log_equals({"action": "suite_end"})
    1.61 +
    1.62 +    def test_start(self):
    1.63 +        self.logger.test_start("test1")
    1.64 +        self.assert_log_equals({"action": "test_start",
    1.65 +                                "test":"test1"})
    1.66 +
    1.67 +        self.logger.test_start(("test1", "==", "test1-ref"))
    1.68 +        self.assert_log_equals({"action": "test_start",
    1.69 +                                "test":("test1", "==", "test1-ref")})
    1.70 +
    1.71 +    def test_status(self):
    1.72 +        self.logger.test_status("test1", "subtest name", "fail", expected="FAIL", message="Test message")
    1.73 +        self.assert_log_equals({"action": "test_status",
    1.74 +                                "subtest": "subtest name",
    1.75 +                                "status": "FAIL",
    1.76 +                                "message": "Test message",
    1.77 +                                "test":"test1"})
    1.78 +
    1.79 +    def test_status_1(self):
    1.80 +        self.logger.test_status("test1", "subtest name", "fail")
    1.81 +        self.assert_log_equals({"action": "test_status",
    1.82 +                                "subtest": "subtest name",
    1.83 +                                "status": "FAIL",
    1.84 +                                "expected": "PASS",
    1.85 +                                "test":"test1"})
    1.86 +
    1.87 +    def test_status_2(self):
    1.88 +        self.assertRaises(ValueError, self.logger.test_status, "test1", "subtest name", "XXXUNKNOWNXXX")
    1.89 +
    1.90 +    def test_end(self):
    1.91 +        self.logger.test_end("test1", "fail", message="Test message")
    1.92 +        self.assert_log_equals({"action": "test_end",
    1.93 +                                "status": "FAIL",
    1.94 +                                "expected": "OK",
    1.95 +                                "message": "Test message",
    1.96 +                                "test":"test1"})
    1.97 +
    1.98 +    def test_end_1(self):
    1.99 +        self.logger.test_end("test1", "PASS", expected="PASS", extra={"data":123})
   1.100 +        self.assert_log_equals({"action": "test_end",
   1.101 +                                "status": "PASS",
   1.102 +                                "extra": {"data": 123},
   1.103 +                                "test":"test1"})
   1.104 +
   1.105 +    def test_end_2(self):
   1.106 +        self.assertRaises(ValueError, self.logger.test_end, "test1", "XXXUNKNOWNXXX")
   1.107 +
   1.108 +    def test_process(self):
   1.109 +        self.logger.process_output(1234, "test output")
   1.110 +        self.assert_log_equals({"action": "process_output",
   1.111 +                                "process": 1234,
   1.112 +                                "data": "test output"})
   1.113 +
   1.114 +    def test_log(self):
   1.115 +        for level in ["critical", "error", "warning", "info", "debug"]:
   1.116 +            getattr(self.logger, level)("message")
   1.117 +            self.assert_log_equals({"action": "log",
   1.118 +                                    "level": level.upper(),
   1.119 +                                    "message": "message"})
   1.120 +
   1.121 +    def test_logging_adapter(self):
   1.122 +        import logging
   1.123 +        logging.basicConfig(level="DEBUG")
   1.124 +        old_level = logging.root.getEffectiveLevel()
   1.125 +        logging.root.setLevel("DEBUG")
   1.126 +
   1.127 +        std_logger = logging.getLogger("test")
   1.128 +        std_logger.setLevel("DEBUG")
   1.129 +
   1.130 +        logger = structuredlog.std_logging_adapter(std_logger)
   1.131 +
   1.132 +        try:
   1.133 +            for level in ["critical", "error", "warning", "info", "debug"]:
   1.134 +                getattr(logger, level)("message")
   1.135 +                self.assert_log_equals({"action": "log",
   1.136 +                                        "level": level.upper(),
   1.137 +                                        "message": "message"})
   1.138 +        finally:
   1.139 +            logging.root.setLevel(old_level)
   1.140 +
   1.141 +    def test_add_remove_handlers(self):
   1.142 +        handler = TestHandler()
   1.143 +        self.logger.add_handler(handler)
   1.144 +        self.logger.info("test1")
   1.145 +
   1.146 +        self.assert_log_equals({"action": "log",
   1.147 +                                "level": "INFO",
   1.148 +                                "message": "test1"})
   1.149 +
   1.150 +        self.assert_log_equals({"action": "log",
   1.151 +                                "level": "INFO",
   1.152 +                                "message": "test1"}, actual=handler.last_item)
   1.153 +
   1.154 +        self.logger.remove_handler(handler)
   1.155 +        self.logger.info("test2")
   1.156 +
   1.157 +        self.assert_log_equals({"action": "log",
   1.158 +                                "level": "INFO",
   1.159 +                                "message": "test2"})
   1.160 +
   1.161 +        self.assert_log_equals({"action": "log",
   1.162 +                                "level": "INFO",
   1.163 +                                "message": "test1"}, actual=handler.last_item)
   1.164 +
   1.165 +    def test_wrapper(self):
   1.166 +        file_like = structuredlog.StructuredLogFileLike(self.logger)
   1.167 +
   1.168 +        file_like.write("line 1")
   1.169 +
   1.170 +        self.assert_log_equals({"action": "log",
   1.171 +                                "level": "INFO",
   1.172 +                                "message": "line 1"})
   1.173 +
   1.174 +        file_like.write("line 2\n")
   1.175 +
   1.176 +        self.assert_log_equals({"action": "log",
   1.177 +                                "level": "INFO",
   1.178 +                                "message": "line 2"})
   1.179 +
   1.180 +        file_like.write("line 3\r")
   1.181 +
   1.182 +        self.assert_log_equals({"action": "log",
   1.183 +                                "level": "INFO",
   1.184 +                                "message": "line 3"})
   1.185 +
   1.186 +        file_like.write("line 4\r\n")
   1.187 +
   1.188 +        self.assert_log_equals({"action": "log",
   1.189 +                                "level": "INFO",
   1.190 +                                "message": "line 4"})
   1.191 +
   1.192 +class TestCommandline(unittest.TestCase):
   1.193 +    def test_setup_logging(self):
   1.194 +        parser = argparse.ArgumentParser()
   1.195 +        commandline.add_logging_group(parser)
   1.196 +        args = parser.parse_args(["--log-raw=/tmp/foo"])
   1.197 +        logger = commandline.setup_logging("test", args, {})
   1.198 +        self.assertEqual(len(logger.handlers), 1)
   1.199 +
   1.200 +class TestReader(unittest.TestCase):
   1.201 +    def to_file_like(self, obj):
   1.202 +        data_str = "\n".join(json.dumps(item) for item in obj)
   1.203 +        return StringIO.StringIO(data_str)
   1.204 +
   1.205 +    def test_read(self):
   1.206 +        data = [{"action": "action_0", "data": "data_0"},
   1.207 +                {"action": "action_1", "data": "data_1"}]
   1.208 +
   1.209 +        f = self.to_file_like(data)
   1.210 +        self.assertEquals(data, list(reader.read(f)))
   1.211 +
   1.212 +    def test_imap_log(self):
   1.213 +        data = [{"action": "action_0", "data": "data_0"},
   1.214 +                {"action": "action_1", "data": "data_1"}]
   1.215 +
   1.216 +        f = self.to_file_like(data)
   1.217 +
   1.218 +        def f_action_0(item):
   1.219 +            return ("action_0", item["data"])
   1.220 +
   1.221 +        def f_action_1(item):
   1.222 +            return ("action_1", item["data"])
   1.223 +
   1.224 +        res_iter = reader.imap_log(reader.read(f),
   1.225 +                                   {"action_0": f_action_0,
   1.226 +                                    "action_1": f_action_1})
   1.227 +        self.assertEquals([("action_0", "data_0"), ("action_1", "data_1")],
   1.228 +                          list(res_iter))
   1.229 +
   1.230 +    def test_each_log(self):
   1.231 +        data = [{"action": "action_0", "data": "data_0"},
   1.232 +                {"action": "action_1", "data": "data_1"}]
   1.233 +
   1.234 +        f = self.to_file_like(data)
   1.235 +
   1.236 +        count = {"action_0":0,
   1.237 +                 "action_1":0}
   1.238 +
   1.239 +        def f_action_0(item):
   1.240 +            count[item["action"]] += 1
   1.241 +
   1.242 +        def f_action_1(item):
   1.243 +            count[item["action"]] += 2
   1.244 +
   1.245 +        reader.each_log(reader.read(f),
   1.246 +                        {"action_0": f_action_0,
   1.247 +                         "action_1": f_action_1})
   1.248 +
   1.249 +        self.assertEquals({"action_0":1, "action_1":2}, count)
   1.250 +
   1.251 +    def test_handler(self):
   1.252 +        data = [{"action": "action_0", "data": "data_0"},
   1.253 +                {"action": "action_1", "data": "data_1"}]
   1.254 +
   1.255 +        f = self.to_file_like(data)
   1.256 +
   1.257 +        test = self
   1.258 +        class ReaderTestHandler(reader.LogHandler):
   1.259 +            def __init__(self):
   1.260 +                self.action_0_count = 0
   1.261 +                self.action_1_count = 0
   1.262 +
   1.263 +            def action_0(self, item):
   1.264 +                test.assertEquals(item["action"], "action_0")
   1.265 +                self.action_0_count += 1
   1.266 +
   1.267 +            def action_1(self, item):
   1.268 +                test.assertEquals(item["action"], "action_1")
   1.269 +                self.action_1_count += 1
   1.270 +
   1.271 +        handler = ReaderTestHandler()
   1.272 +        reader.handle_log(reader.read(f), handler)
   1.273 +
   1.274 +        self.assertEquals(handler.action_0_count, 1)
   1.275 +        self.assertEquals(handler.action_1_count, 1)
   1.276 +
   1.277 +if __name__ == "__main__":
   1.278 +    unittest.main()

mercurial