You've already forked mariadb-columnstore-engine
mirror of
https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
synced 2025-07-29 08:21:15 +03:00
* feat(save_brm)!: protect from S3/NFS IO errors * feat(save_brm)!: future refactoring * cleanup * feat(save_brm)!: forgotten template * feat(save-brm,ci)!: python3 package for rocky8 --------- Co-authored-by: Roman Nozdrin <roman.nozdrin@mariadb.com>
117 lines
5.4 KiB
Python
117 lines
5.4 KiB
Python
import unittest
|
|
from unittest.mock import patch, mock_open, MagicMock
|
|
import socket
|
|
import ssl
|
|
import json
|
|
import os
|
|
import subprocess
|
|
from urllib.error import HTTPError, URLError
|
|
from urllib.request import Request
|
|
from xml.etree.ElementTree import Element
|
|
import importlib.util
|
|
|
|
import mcssavebrm
|
|
|
|
class TestMcsSavebrmFunctions(unittest.TestCase):
|
|
@patch('mcssavebrm.configparser.ConfigParser.get', return_value='test_api_key')
|
|
@patch('mcssavebrm.configparser.ConfigParser.read')
|
|
def test_get_api_key(self, mock_read, mock_get):
|
|
self.assertEqual(mcssavebrm.get_api_key(), 'test_api_key')
|
|
mock_read.assert_called_once_with(mcssavebrm.CMAPI_CONFIG_PATH)
|
|
|
|
def test_get_unverified_context(self):
|
|
ctx = mcssavebrm.get_unverified_context()
|
|
self.assertFalse(ctx.check_hostname)
|
|
self.assertEqual(ctx.verify_mode, ssl.CERT_NONE)
|
|
|
|
@patch('mcssavebrm.urlopen')
|
|
@patch('mcssavebrm.get_unverified_context')
|
|
def test_cmapi_available(self, mock_get_unverified_context, mock_urlopen):
|
|
mock_get_unverified_context.return_value = ssl._create_unverified_context()
|
|
mock_urlopen.side_effect = HTTPError(None, 404, 'Not Found', None, None)
|
|
self.assertTrue(mcssavebrm.cmapi_available())
|
|
|
|
@patch('mcssavebrm.fcntl.ioctl')
|
|
@patch('mcssavebrm.socket.socket')
|
|
def test_get_ip_address_by_nic(self, mock_socket, mock_ioctl):
|
|
mock_socket_inst = MagicMock()
|
|
mock_socket.return_value = mock_socket_inst
|
|
mock_ioctl.return_value = b'\x00' * 20 + b'\x7f\x00\x00\x01'
|
|
self.assertEqual(mcssavebrm.get_ip_address_by_nic('lo'), '127.0.0.1')
|
|
|
|
@patch('mcssavebrm.get_ip_address_by_nic', return_value='127.0.0.1')
|
|
@patch('mcssavebrm.socket.gethostbyaddr', return_value=('localhost', [], []))
|
|
@patch('mcssavebrm.socket.if_nameindex', return_value=[(1, 'lo')])
|
|
def test_is_primary_fallback(self, mock_if_nameindex, mock_gethostbyaddr, mock_get_ip_address_by_nic):
|
|
self.assertTrue(mcssavebrm.is_primary_fallback('localhost'))
|
|
|
|
@patch('mcssavebrm.cmapi_available', return_value=True)
|
|
@patch('mcssavebrm.urlopen')
|
|
@patch('mcssavebrm.get_unverified_context')
|
|
@patch('mcssavebrm.get_api_key', return_value='test_api_key')
|
|
def test_is_node_primary(self, mock_get_api_key, mock_get_unverified_context, mock_urlopen, mock_cmapi_available):
|
|
mock_get_unverified_context.return_value = ssl._create_unverified_context()
|
|
mock_response = MagicMock()
|
|
mock_response.read.return_value = json.dumps({'is_primary': 'True'}).encode('utf-8')
|
|
mock_urlopen.return_value.__enter__.return_value = mock_response
|
|
root = MagicMock()
|
|
self.assertTrue(mcssavebrm.is_node_primary(root))
|
|
|
|
@patch('os.path.getsize', return_value=1024)
|
|
def test_get_file_size(self, mock_getsize):
|
|
self.assertEqual(mcssavebrm.get_file_size('test_file'), 1024)
|
|
|
|
@patch('mcssavebrm.get_file_size', return_value=500)
|
|
def test_em_is_empty(self, mock_get_file_size):
|
|
self.assertTrue(mcssavebrm.em_is_empty('test_prefix'))
|
|
|
|
@patch('os.remove')
|
|
@patch('os.listdir', return_value=[f'test_file{i}' for i in range(50)])
|
|
def test_clean_up_backup_brm_files(self, mock_listdir, mock_remove):
|
|
mcssavebrm.clean_up_backup_brm_files('/dummy/path')
|
|
self.assertEqual(mock_remove.call_count, 10)
|
|
|
|
@patch('os.remove')
|
|
@patch('mcssavebrm.glob.glob', return_value=['test_file1', 'test_file2'])
|
|
def test_remove_files_by_prefix_if_exist(self, mock_glob, mock_remove):
|
|
mcssavebrm.remove_files_by_prefix_if_exist('test_prefix')
|
|
mock_remove.assert_any_call('test_file1')
|
|
mock_remove.assert_any_call('test_file2')
|
|
|
|
@patch('xml.etree.ElementTree.parse')
|
|
def test_get_config_root_from_file(self, mock_parse):
|
|
mock_tree = MagicMock()
|
|
mock_parse.return_value = mock_tree
|
|
self.assertEqual(mcssavebrm.get_config_root_from_file('test_file'), mock_tree.getroot())
|
|
|
|
@patch('time.time', return_value=1624478400)
|
|
def test_get_epoch_prefix(self, mock_time):
|
|
self.assertEqual(mcssavebrm.get_epoch_prefix(), 'backup_1624478400')
|
|
|
|
@patch('mcssavebrm.get_epoch_prefix', return_value='backup_1624478400')
|
|
@patch('mcssavebrm.get_save_brm_dir_path', return_value='/tmp/columnstore_tmp_files/rdwrscratch/')
|
|
def test_get_save_brm_path_prefix(self, mock_get_epoch_prefix, mock_get_save_brm_dir_path):
|
|
root = MagicMock()
|
|
self.assertIn('backup_1624478400_BRM_saves', mcssavebrm.get_save_brm_path_prefix(root))
|
|
|
|
@patch('subprocess.check_call')
|
|
def test_call_save_brm(self, mock_check_call):
|
|
self.assertEqual(mcssavebrm.call_save_brm('test_path'), 'test_path')
|
|
|
|
@patch('mcssavebrm.call_save_brm', return_value='test_path')
|
|
@patch('mcssavebrm.get_save_brm_path_prefix', return_value='test_path')
|
|
def test_call_save_brm_locally(self, mock_get_save_brm_path_prefix, mock_call_save_brm):
|
|
root = MagicMock()
|
|
self.assertEqual(mcssavebrm.call_save_brm_locally(root), 'test_path')
|
|
|
|
@patch('subprocess.check_call')
|
|
@patch('mcssavebrm.get_save_brm_path_prefix', return_value='test_path')
|
|
def test_call_save_brm_with_local_fallback(self, mock_get_save_brm_path_prefix, mock_check_call):
|
|
root = MagicMock()
|
|
mock_check_call.side_effect = [subprocess.CalledProcessError(1, 'test'), None]
|
|
with self.assertRaises(SystemExit):
|
|
mcssavebrm.call_save_brm_with_local_fallback(root)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main() |