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())
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)