Esempio n. 1
0
    def test_get_column_color_use_colors_no_column_color(self):
        config = mock.Mock()
        logger = LstailLogger(config, output=sys.stdout, verbose=False)
        logger._setup_terminal_colors(force=True)
        column = Column(color=None)

        color_code = logger._get_column_color(column, force_color=None)
        self.assertEqual(color_code, '_c_reset')
        # force color
        color_code = logger._get_column_color(column, force_color='_c_yellow')
        self.assertEqual(color_code, '_c_yellow')
Esempio n. 2
0
    def test_get_column_by_name_positive_direct(self):
        logger = LstailLogger(LOG_DOCUMENT_CONFIG,
                              output=sys.stdout,
                              verbose=False)

        # positive test - matching direct column name
        test_column_name = 'level'
        expected_column = LOG_DOCUMENT_COLUMNS[test_column_name]
        # check
        column = logger._get_column_by_name(test_column_name)
        self.assertEqual(column, expected_column)
Esempio n. 3
0
    def test_print_header_with_header_disabled(self):
        config = deepcopy(CONFIG)
        config.no_header = True

        expected_header = ''
        # test
        logger = LstailLogger(config, output=sys.stdout, verbose=False)
        logger.print_header()
        # check
        output = sys.stdout.getvalue().strip()  # pylint: disable=no-member
        self.assertEqual(output, expected_header)
Esempio n. 4
0
    def test_get_column_by_name_positive_alias(self):
        logger = LstailLogger(LOG_DOCUMENT_CONFIG,
                              output=sys.stdout,
                              verbose=False)

        # positive test - matching via Column.names
        # ("fqdn" is set as alias for "host" in LOG_DOCUMENT_COLUMNS)
        test_column_name = 'fqdn'
        expected_column = LOG_DOCUMENT_COLUMNS['host']
        # check
        column = logger._get_column_by_name(test_column_name)
        self.assertEqual(column, expected_column)
Esempio n. 5
0
    def test_print_header(self):
        config = deepcopy(CONFIG)
        config.no_header = False

        expected_header = 'timestamp{}level    hostname   program{}message'.format(
            ' ' * 16, ' ' * 16)
        # test
        logger = LstailLogger(config, output=sys.stdout, verbose=False)
        logger.print_header()
        # check
        output = sys.stdout.getvalue().strip()  # pylint: disable=no-member
        self.assertEqual(output, expected_header)
Esempio n. 6
0
    def test_log_document_positive(self):
        logger = LstailLogger(LOG_DOCUMENT_CONFIG,
                              output=sys.stdout,
                              verbose=False)
        logger.update_display_columns()

        # positive test
        logger.log_document(LOG_DOCUMENT_TEST_DOCUMENT)
        # check
        expected_output = '{}    localhost    message content'.format(
            LOG_DOCUMENT_TIMESTAMP)
        output = sys.stdout.getvalue().strip()  # pylint: disable=no-member
        self.assertEqual(output, expected_output)
Esempio n. 7
0
    def test_log_log(self, verbose):
        test_string = 'log message'
        expected_output = self._factor_log_output(test_string,
                                                  verbose,
                                                  level='DEBUG')
        # test
        with freeze_time(LOG_DATETIME):
            logger = LstailLogger(CONFIG, output=sys.stdout, verbose=verbose)
            logger.log(logging.DEBUG, test_string)

        # check
        output = sys.stdout.getvalue().strip()  # pylint: disable=no-member
        self.assertEqual(output, expected_output)
Esempio n. 8
0
    def test_update_column_name_from_document_positive_direct(self):
        logger = LstailLogger(LOG_DOCUMENT_CONFIG,
                              output=sys.stdout,
                              verbose=False)

        # direct match via column name
        document_values = safe_munchify({'host': 'localhost'})
        test_column_name = 'host'
        test_column = LOG_DOCUMENT_COLUMNS['host']
        # test
        column_name = logger._update_column_name_from_document(
            test_column_name, test_column, document_values)
        # check
        self.assertEqual(column_name, test_column_name)
Esempio n. 9
0
    def test_update_column_name_from_document_positive_nested_alias(self):
        logger = LstailLogger(LOG_DOCUMENT_CONFIG,
                              output=sys.stdout,
                              verbose=False)

        # alias match
        document_values = safe_munchify({'nested.alias': 'localhost'})
        test_column_name = 'nested.test.column'
        test_column = LOG_DOCUMENT_COLUMNS['nested.test.column']
        # test
        column_name = logger._update_column_name_from_document(
            test_column_name, test_column, document_values)
        # check
        self.assertEqual(column_name, 'nested.alias')
Esempio n. 10
0
    def test_assert_document_already_processed_negative(self):
        config = mock.Mock()
        config.display.columns = {LSTAIL_DEFAULT_FIELD_DOCUMENT_ID: None}

        logger = LstailLogger(config, output=sys.stdout, verbose=False)
        logger._setup_processed_ids_queue()

        _id = str(uuid4())
        document_values = {LSTAIL_DEFAULT_FIELD_DOCUMENT_ID: _id}
        # this is OK, the passed ID is first seen
        logger._assert_document_already_processed(document_values)
        # this one should raise an exception
        with self.assertRaises(DocumentIdAlreadyProcessedError):
            logger._assert_document_already_processed(document_values)
Esempio n. 11
0
    def test_print_header_nested_column(self):
        config = deepcopy(CONFIG)
        config.no_header = False
        config.kibana.default_columns = CONFIG_DEFAULT_COLUMNS_NESTED
        config.display.columns[
            CONFIG_COLUMN_NESTED_NAME] = CONFIG_COLUMN_NESTED

        expected_header = 'timestamp                level    {}       message'.format(
            CONFIG_COLUMN_NESTED_NAME)
        # test
        logger = LstailLogger(config, output=sys.stdout, verbose=False)
        logger.print_header()
        # check
        output = sys.stdout.getvalue().strip()  # pylint: disable=no-member
        self.assertEqual(output, expected_header)
Esempio n. 12
0
    def test_log_document_negative_parse_exception_no_recover(self):
        logger = LstailLogger(LOG_DOCUMENT_CONFIG,
                              output=sys.stdout,
                              verbose=False)

        # negative test - fake an internal exception
        with freeze_time(datetime.now()):
            with mock.patch.object(LstailLogger,
                                   '_print_document') as mock_print:
                mock_print.side_effect = ValueError('fake exception ABCDEFG')
                logger.log_document(LOG_DOCUMENT_TEST_DOCUMENT)

                expected_output = 'Unparseable document: ValueError: fake exception ABCDEFG:'
                output = sys.stdout.getvalue().strip()  # pylint: disable=no-member
                self.assertTrue(output.startswith(expected_output))
Esempio n. 13
0
    def test_get_column_by_name_positive_default(self):
        logger = LstailLogger(LOG_DOCUMENT_CONFIG,
                              output=sys.stdout,
                              verbose=False)

        # positive test - matching via Column.names
        # ("fqdn" is set as alias for "host" in LOG_DOCUMENT_COLUMNS)
        test_column_name = 'non-existent-column-name-ABCDEFG'
        expected_column = Column(names=[test_column_name],
                                 color=factor_color_code(TERM_COLOR_DEFAULT),
                                 display=True,
                                 padding=None)
        # test
        column = logger._get_column_by_name(test_column_name)
        self.assertEqual(column, expected_column)
Esempio n. 14
0
    def test_update_column_name_from_document_negative_nested(self):
        logger = LstailLogger(LOG_DOCUMENT_CONFIG,
                              output=sys.stdout,
                              verbose=False)

        # alias match
        document_values = safe_munchify({'nested.foo': 'blah'})
        test_column_name = 'nested.bar'
        test_column = LOG_DOCUMENT_COLUMNS['host']
        # test
        column_name = logger._update_column_name_from_document(
            test_column_name, test_column, document_values)
        # check - we get the passed column name
        # but the initially missing column name was added to document_values
        self.assertEqual(column_name, test_column_name)
        self.assertIn(test_column_name, document_values)
Esempio n. 15
0
    def test_update_display_columns(self):
        default_column_names = ['column1', 'column2']
        config = mock.Mock(kibana=mock.Mock(
            default_columns=default_column_names))
        logger = LstailLogger(config, output=sys.stdout, verbose=False)

        # columns = None
        logger.update_display_columns(columns=None)
        expected_columns = ['document_id', 'timestamp'] + default_column_names
        self.assertEqual(logger._display_columns, expected_columns)

        # columns = custom
        test_columns = ['test_col1', 'test_col2', 'test_col3']
        logger.update_display_columns(columns=test_columns)
        expected_columns = ['document_id', 'timestamp'] + test_columns
        self.assertEqual(logger._display_columns, expected_columns)
Esempio n. 16
0
    def test_assert_document_already_processed_positive(self):
        config = mock.Mock()
        config.display.columns = {LSTAIL_DEFAULT_FIELD_DOCUMENT_ID: None}
        logger = LstailLogger(config, output=sys.stdout, verbose=False)
        logger._setup_processed_ids_queue()

        # positive test - uuid
        _id = str(uuid4())
        document_values = {LSTAIL_DEFAULT_FIELD_DOCUMENT_ID: _id}
        logger._assert_document_already_processed(document_values)
        # check
        self.assertIn(_id, logger._processed_ids)

        # positive test - internal dummy id
        _id = LSTAIL_INTERNAL_DOCUMENT_ID
        document_values = {LSTAIL_DEFAULT_FIELD_DOCUMENT_ID: _id}
        logger._assert_document_already_processed(document_values)
Esempio n. 17
0
    def test_log_custom_output(self):
        test_string = 'custom output message'
        custom_output = StringIO()
        expected_output = self._factor_log_output(test_string,
                                                  verbose=True,
                                                  level='INFO')

        with freeze_time(LOG_DATETIME):
            logger = LstailLogger(CONFIG, output=custom_output, verbose=True)
            logger.info(test_string)

        # check for output in custom output
        output = custom_output.getvalue().strip()
        self.assertEqual(output, expected_output)

        # check there is no output on default sys.stdout
        output = sys.stdout.getvalue().strip()  # pylint: disable=no-member
        self.assertEqual(output, '')
Esempio n. 18
0
    def test_log_info_nested_column(self):
        config = deepcopy(CONFIG)
        config.no_header = False
        config.kibana.default_columns = CONFIG_DEFAULT_COLUMNS_NESTED
        config.display.columns[
            CONFIG_COLUMN_NESTED_NAME] = CONFIG_COLUMN_NESTED

        test_string = 'info nested test message'
        test_nested = dict(nested=dict(column=dict(test='nested')))
        expected_output = '{}  INFO     nested                   {}'.format(
            LOG_TIMESTAMP, test_string)

        with freeze_time(LOG_DATETIME):
            logger = LstailLogger(config, output=sys.stdout, verbose=False)
            logger.info(test_string, extra=test_nested)

        # check
        output = sys.stdout.getvalue().strip()  # pylint: disable=no-member
        self.assertEqual(output, expected_output)
Esempio n. 19
0
    def test_log_exception_with_exc_info(self, verbose):
        test_string = 'exception message'
        expected_output = self._factor_log_output(test_string,
                                                  verbose=verbose,
                                                  level='ERROR')
        # provoke exception to test with
        try:
            1 / 0
        except ZeroDivisionError as exc:
            with freeze_time(LOG_DATETIME):
                logger = LstailLogger(CONFIG,
                                      output=sys.stdout,
                                      verbose=verbose)
                logger.exception(test_string, exc_info=exc)

        # check
        output = sys.stdout.getvalue().strip()  # pylint: disable=no-member
        self.assertTrue(output.startswith(expected_output))
        self.assertIn('Traceback (most recent call last):', output)
        self.assertIn('1 / 0', output)
        self.assertTrue(output.endswith('ZeroDivisionError: division by zero'))
Esempio n. 20
0
 def _setup_logger(self):
     self._logger = LstailLogger(config=self._config,
                                 output=self._output,
                                 verbose=self._config.verbose)