示例#1
0
 def test_parse_timestamp(self, __init__mock, _parse_line_mock):
     __init__mock.return_value = None
     parser = MysqlBinLogParser('')
     line = 'SET TIMESTAMP=1440237705/*!*/;'
     _parse_line_mock.return_value = ['1440237705', ]
     timestamp = parser._parse_timestamp(line)
     self.assertEqual(
         timestamp,
         datetime.datetime.fromtimestamp(float(_parse_line_mock.return_value[0])))
     _parse_line_mock.assert_called_with(_BING_LOG_TIMESTAMP, line)
示例#2
0
    def test_parse_headers(self, __init__mock, _get_next_line_mock, _parse_line_mock):
        query_line = '#150822 13:01:45 server id 192168352  end_log_pos 519   Query   thread_id=3552  exec_time=0 ' \
                     'error_code=0'

        # return None because there is no line 'BEGIN'
        __init__mock.return_value = None
        parser = MysqlBinLogParser('test_file')
        parser._cached_line = None
        _parse_line_mock.side_effect = ['DELIMITER', ]
        _get_next_line_mock.side_effect = [
            'some_line',
            'some_line',
            query_line,
            None,
        ]
        self.assertIsNone(parser._parse_headers('DELIMITER;'))
        self.assertIsNone(parser._cached_line)

        _parse_line_mock.reset_mock()
        _parse_line_mock.side_effect = ['DELIMITER', ]
        _get_next_line_mock.reset_mock()
        # return None because there is no line contains QUERY
        _get_next_line_mock.side_effect = [
            'some_line',
            'some_line',
            'BEGIN',
            None,
        ]
        self.assertIsNone(parser._parse_headers('DELIMITER;'))
        self.assertIsNone(parser._cached_line)

        _parse_line_mock.reset_mock()
        _parse_line_mock.side_effect = ['DELIMITER', ]
        _get_next_line_mock.reset_mock()
        # return None because there is no line contains QUERY
        _get_next_line_mock.side_effect = [
            'some_line',
            'some_line',
            'BEGIN',
            query_line,
        ]
        self.assertIsNone(parser._parse_headers('DELIMITER;'))
        self.assertEqual(parser._cached_line, query_line)
示例#3
0
    def test_parse_entry(self, __init__mock, _get_next_line_mock, _parse_line_mock, _parse_timestamp_mock):
        start_time, server_id, end_log_pos, thread_id, exec_time, error_code = \
            '150822 13:01:45', '192168352', '519', 3552, 0, 0
        query_line = '#{0} server id {1}  end_log_pos {2}   Query   thread_id={3}  exec_time={4} ' \
                     'error_code={5}'.format(start_time, server_id, end_log_pos, thread_id, exec_time, error_code)

        __init__mock.return_value = None

        parser = MysqlBinLogParser('')
        parser._cached_line = None

        # check None line
        _get_next_line_mock.return_value = None
        self.assertIsNone(parser._parse_entry())

        parser._cached_line = query_line
        query_type = 'INSERT'
        query = 'blablabla'
        db = 'test'
        db_line = 'use {}'.format(db)
        _get_next_line_mock.side_effect = [
            db_line,
            'SET TIMESTAMP=1440237705/*!*/;',
            '{} {}'.format(query_type, query),
            BIN_LOG_END,
        ]

        parse_line_side_effects = [(start_time, server_id, end_log_pos, thread_id, exec_time, error_code),
                                   [db, ], ]
        side_effect = lambda *args, **kwargs: parse_line_side_effects.pop(0)
        _parse_line_mock.side_effect = side_effect
        timestamp = 'test_timestamp'
        _parse_timestamp_mock.return_value = timestamp

        # parse entry
        entry = parser._parse_entry()
        self.assertEqual(entry['start_time'], datetime.datetime.strptime(start_time, "%y%m%d %H:%M:%S"))
        self.assertEqual(entry['server_id'], server_id)
        self.assertEqual(entry['end_log_pos'], end_log_pos)
        self.assertEqual(entry['thread_id'], thread_id)
        self.assertEqual(entry['error_code'], error_code)
        self.assertEqual(entry['db'], db)
        self.assertEqual(entry['timestamp'], timestamp)
        self.assertEqual(entry['query'], '{} {}'.format(query_type, query))
        self.assertEqual(entry['query_type'], query_type)
        self.assertTrue(_parse_timestamp_mock.called)
        self.assertEqual(_get_next_line_mock.call_count, 5)
        self.assertEqual(parser._cached_line, BIN_LOG_END)
        # check parse_line args
        expected = [
            mock.call(
                _BIN_LOG_QUERY_STATS,
                '#{0} server id {1}  end_log_pos {2}   Query   thread_id={3}  exec_time={4} error_code={5}'.
                    format(start_time, server_id, end_log_pos, thread_id, exec_time, error_code)
            ),
            mock.call(_BIN_LOG_DB, db_line)
        ]
        self.assertEqual(_parse_line_mock.call_args_list, expected)
        # end of log file
        self.assertIsNone(parser._parse_entry())