def test_recovery_post_script(self, command_mock): """ Unit test specific for the execution of a post recovery script. test case: simulate the execution of a post recovery script, should return 0 test the environment for the HookScriptRunner obj. test the name of the fake script, should be the same as the one in the mocked configuration """ # BackupManager mock backup_manager = build_backup_manager(name='test_server') backup_manager.config.post_recovery_script = \ 'test_recovery_post_script' backup_manager.get_previous_backup = MagicMock() backup_manager.get_previous_backup.side_effect = \ UnknownBackupIdException() backup_manager.get_next_backup = MagicMock() backup_manager.get_next_backup.side_effect = \ UnknownBackupIdException() # BackupInfo mock backup_info = MagicMock(name='backup_info') backup_info.get_basebackup_directory.return_value = 'backup_directory' backup_info.backup_id = '123456789XYZ' backup_info.error = None backup_info.status = 'OK' # Command mock executed by HookScriptRunner command_mock.return_value.return_value = 0 # the actual test script = HookScriptRunner(backup_manager, 'recovery_script', 'post') script.env_from_recover(backup_info, dest='local_dest', tablespaces=None, remote_command=None) expected_env = { 'BARMAN_PHASE': 'post', 'BARMAN_VERSION': version, 'BARMAN_SERVER': 'test_server', 'BARMAN_CONFIGURATION': 'build_config_from_dicts', 'BARMAN_HOOK': 'recovery_script', 'BARMAN_BACKUP_DIR': 'backup_directory', 'BARMAN_BACKUP_ID': '123456789XYZ', 'BARMAN_ERROR': '', 'BARMAN_STATUS': 'OK', 'BARMAN_PREVIOUS_ID': '', 'BARMAN_NEXT_ID': '', 'BARMAN_RETRY': '0', 'BARMAN_DESTINATION_DIRECTORY': 'local_dest', 'BARMAN_TABLESPACES': '', 'BARMAN_REMOTE_COMMAND': '', 'BARMAN_RECOVER_OPTIONS': '' } assert script.run() == 0 assert command_mock.call_count == 1 assert command_mock.call_args[1]['env_append'] == expected_env assert script.script == backup_manager.config.post_recovery_script
def test_recovery_post_script(self, command_mock): """ Unit test specific for the execution of a post recovery script. test case: simulate the execution of a post recovery script, should return 0 test the environment for the HookScriptRunner obj. test the name of the fake script, should be the same as the one in the mocked configuration """ # BackupManager mock backup_manager = build_backup_manager(name="test_server") backup_manager.config.post_recovery_script = "test_recovery_post_script" backup_manager.get_previous_backup = MagicMock() backup_manager.get_previous_backup.side_effect = UnknownBackupIdException( ) backup_manager.get_next_backup = MagicMock() backup_manager.get_next_backup.side_effect = UnknownBackupIdException() # BackupInfo mock backup_info = MagicMock(name="backup_info") backup_info.get_basebackup_directory.return_value = "backup_directory" backup_info.backup_id = "123456789XYZ" backup_info.error = None backup_info.status = "OK" # Command mock executed by HookScriptRunner command_mock.return_value.return_value = 0 # the actual test script = HookScriptRunner(backup_manager, "recovery_script", "post") script.env_from_recover(backup_info, dest="local_dest", tablespaces=None, remote_command=None) expected_env = { "BARMAN_PHASE": "post", "BARMAN_VERSION": version, "BARMAN_SERVER": "test_server", "BARMAN_CONFIGURATION": "build_config_from_dicts", "BARMAN_HOOK": "recovery_script", "BARMAN_BACKUP_DIR": "backup_directory", "BARMAN_BACKUP_ID": "123456789XYZ", "BARMAN_ERROR": "", "BARMAN_STATUS": "OK", "BARMAN_PREVIOUS_ID": "", "BARMAN_NEXT_ID": "", "BARMAN_RETRY": "0", "BARMAN_DESTINATION_DIRECTORY": "local_dest", "BARMAN_TABLESPACES": "", "BARMAN_REMOTE_COMMAND": "", "BARMAN_RECOVER_OPTIONS": "", } assert script.run() == 0 assert command_mock.call_count == 1 assert command_mock.call_args[1]["env_append"] == expected_env assert script.script == backup_manager.config.post_recovery_script
def get_previous_backup(self, backup_id, status_filter=DEFAULT_STATUS_FILTER): """ Get the previous backup (if any) in the catalog :param status_filter: default DEFAULT_STATUS_FILTER. The status of the backup returned """ if not isinstance(status_filter, tuple): status_filter = tuple(status_filter) backup = LocalBackupInfo(self.server, backup_id=backup_id) available_backups = self.get_available_backups(status_filter + (backup.status, )) ids = sorted(available_backups.keys()) try: current = ids.index(backup_id) while current > 0: res = available_backups[ids[current - 1]] if res.status in status_filter: return res current -= 1 return None except ValueError: raise UnknownBackupIdException('Could not find backup_id %s' % backup_id)
def test_backup_info_exception(self, command_mock): # BackupManager mock backup_manager = build_backup_manager(name='test_server') backup_manager.config.pre_test_hook = 'not_existent_script' backup_manager.get_previous_backup = MagicMock() backup_manager.get_previous_backup.side_effect = \ UnknownBackupIdException() # BackupInfo mock backup_info = MagicMock(name='backup_info') backup_info.get_basebackup_directory.return_value = 'backup_directory' backup_info.backup_id = '123456789XYZ' backup_info.error = None backup_info.status = 'OK' # the actual test script = HookScriptRunner(backup_manager, 'test_hook', 'pre') script.env_from_backup_info(backup_info) expected_env = { 'BARMAN_PHASE': 'pre', 'BARMAN_VERSION': version, 'BARMAN_SERVER': 'test_server', 'BARMAN_CONFIGURATION': 'build_config_from_dicts', 'BARMAN_HOOK': 'test_hook', 'BARMAN_BACKUP_DIR': 'backup_directory', 'BARMAN_BACKUP_ID': '123456789XYZ', 'BARMAN_ERROR': '', 'BARMAN_STATUS': 'OK', 'BARMAN_PREVIOUS_ID': '', 'BARMAN_RETRY': '0', } script.run() assert command_mock.call_count == 1 assert command_mock.call_args[1]['env_append'] == expected_env
def test_backup_info_exception(self, command_mock): # BackupManager mock backup_manager = build_backup_manager(name="test_server") backup_manager.config.pre_test_hook = "not_existent_script" backup_manager.get_previous_backup = MagicMock() backup_manager.get_previous_backup.side_effect = UnknownBackupIdException( ) backup_manager.get_next_backup = MagicMock() backup_manager.get_next_backup.side_effect = UnknownBackupIdException() # BackupInfo mock backup_info = MagicMock(name="backup_info") backup_info.get_basebackup_directory.return_value = "backup_directory" backup_info.backup_id = "123456789XYZ" backup_info.error = None backup_info.status = "OK" # the actual test script = HookScriptRunner(backup_manager, "test_hook", "pre") script.env_from_backup_info(backup_info) expected_env = { "BARMAN_PHASE": "pre", "BARMAN_VERSION": version, "BARMAN_SERVER": "test_server", "BARMAN_CONFIGURATION": "build_config_from_dicts", "BARMAN_HOOK": "test_hook", "BARMAN_BACKUP_DIR": "backup_directory", "BARMAN_BACKUP_ID": "123456789XYZ", "BARMAN_ERROR": "", "BARMAN_STATUS": "OK", "BARMAN_PREVIOUS_ID": "", "BARMAN_NEXT_ID": "", "BARMAN_RETRY": "0", } script.run() assert command_mock.call_count == 1 assert command_mock.call_args[1]["env_append"] == expected_env
def test_delete_post_script(self, command_mock, caplog): """ Unit test specific for the execution of a post delete script. test case: simulate the execution of a post delete script, should return 1 simulating the failed execution of the script. test the log of the execution, should contain a warning message, the warning message should be the concatenation of the out and err properties of the Command object. test the environment for the HookScriptRunner obj. test the name of the fake script """ # BackupManager mock backup_manager = build_backup_manager(name='test_server') backup_manager.config.post_delete_script = 'test_delete_post_script' backup_manager.get_previous_backup = MagicMock() backup_manager.get_previous_backup.side_effect = \ UnknownBackupIdException() backup_manager.get_next_backup = MagicMock() backup_manager.get_next_backup.side_effect = \ UnknownBackupIdException() # BackupInfo mock backup_info = MagicMock(name='backup_info') backup_info.get_basebackup_directory.return_value = 'backup_directory' backup_info.backup_id = '123456789XYZ' backup_info.error = None backup_info.status = 'OK' # Command mock executed by HookScriptRunner instance = command_mock.return_value # force the Cmd object to fail instance.return_value = 1 # create a standard out entry for the obj instance.out = "std_out_line\n" # create a standard err entry for the obj instance.err = "std_err_line\n" # the actual test script = HookScriptRunner(backup_manager, 'delete_script', 'post') script.env_from_backup_info(backup_info) expected_env = { 'BARMAN_PHASE': 'post', 'BARMAN_VERSION': version, 'BARMAN_SERVER': 'test_server', 'BARMAN_CONFIGURATION': 'build_config_from_dicts', 'BARMAN_HOOK': 'delete_script', 'BARMAN_BACKUP_DIR': 'backup_directory', 'BARMAN_BACKUP_ID': '123456789XYZ', 'BARMAN_ERROR': '', 'BARMAN_STATUS': 'OK', 'BARMAN_PREVIOUS_ID': '', 'BARMAN_NEXT_ID': '', 'BARMAN_RETRY': '0', } # ensure that the script failed assert script.run() == 1 # check the logs for a warning message. skip debug messages. for record in caplog.records: if record.levelname == 'DEBUG': continue assert command_mock.call_count == 1 # check the env assert command_mock.call_args[1]['env_append'] == expected_env # check the script name assert script.script == backup_manager.config.post_delete_script