# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

from __future__ import absolute_import, unicode_literals

import logging
import time
import unittest

from mach.logger import StructuredHumanFormatter


class DummyLogger(logging.Logger):
    def __init__(self, cb):
        logging.Logger.__init__(self, 'test')

        self._cb = cb

    def handle(self, record):
        self._cb(record)


class TestStructuredHumanFormatter(unittest.TestCase):
    def test_non_ascii_logging(self):
        # Ensures the formatter doesn't choke when non-ASCII characters are
        # present in printed parameters.
        formatter = StructuredHumanFormatter(time.time())

        def on_record(record):
            result = formatter.format(record)
            relevant = result[5:]

            self.assertEqual(relevant, 'Test: s\xe9curit\xe9')

        logger = DummyLogger(on_record)

        value = 's\xe9curit\xe9'

        logger.log(logging.INFO, 'Test: {utf}',
            extra={'action': 'action', 'params': {'utf': value}})



