def test_complete_workflow_exception(self, mock_pgbasebackup_run,
                                         mock_pgbasebackup_init,
                                         mock_pgrewind_run,
                                         mock_pgrewind_init):
        mock_pgrewind_run.side_effect = [Exception('pg_rewind failed')]
        mock_pgbasebackup_run.side_effect = [
            Exception('pg_basebackup failed once'),
            Exception('pg_basebackup failed twice')
        ]
        mix_confinfo = gppylib.recoveryinfo.serialize_list(
            [self.full_r1, self.incr_r2])
        sys.argv = [
            'gpsegrecovery', '-l', '/tmp/logdir', '--era={}'.format(self.era),
            '-c {}'.format(mix_confinfo)
        ]
        buf = io.StringIO()
        with redirect_stderr(buf):
            with self.assertRaises(SystemExit) as ex:
                SegRecovery().main()

        self.assertCountEqual(
            '[{"error_type": "incremental", "error_msg": "pg_rewind failed", "dbid": 4, "datadir": "target_data_dir4", '
            '"port": 5004, "progress_file": "/tmp/progress_file4"} , '
            '{"error_type": "full", "error_msg": "pg_basebackup failed twice", "dbid": 1,'
            '"datadir": "target_data_dir1", "port": 5001, "progress_file": "/tmp/progress_file1"}]',
            buf.getvalue().strip())
        self.assertEqual(1, ex.exception.code)
        self.assertEqual(1, mock_pgrewind_run.call_count)
        self.assertEqual(1, mock_pgrewind_init.call_count)
        self.assertEqual(2, mock_pgbasebackup_run.call_count)
        self.assertEqual(2, mock_pgbasebackup_init.call_count)
        self.assertRegex(gplog.get_logfile(), '/gpsegrecovery.py_\d+\.log')
 def test_get_recovery_cmds_mix_recoveryinfo_forceoverwrite(self):
     cmd_list = SegRecovery().get_recovery_cmds(
         [self.full_r1, self.incr_r2], True, self.mock_logger, self.era)
     self._assert_validation_full_call(cmd_list[0],
                                       self.full_r1,
                                       expected_forceoverwrite=True)
     self._assert_setup_incr_call(cmd_list[1], self.incr_r2)
 def test_complete_workflow(self, mock_pgbasebackup_run,
                            mock_pgbasebackup_init, mock_pgrewind_run,
                            mock_pgrewind_init):
     mix_confinfo = gppylib.recoveryinfo.serialize_recovery_info_list(
         [self.full_r1, self.incr_r2])
     sys.argv = ['gpsegrecovery', '-c {}'.format(mix_confinfo)]
     buf = io.StringIO()
     with redirect_stderr(buf):
         with self.assertRaises(SystemExit) as ex:
             seg_recovery = SegRecovery()
             seg_recovery.main()
     self.assertEqual('', buf.getvalue())
     self.assertEqual(0, ex.exception.code)
     self.assertEqual(1, mock_pgrewind_run.call_count)
     self.assertEqual(1, mock_pgrewind_init.call_count)
     self.assertEqual(1, mock_pgbasebackup_run.call_count)
     self.assertEqual(1, mock_pgbasebackup_init.call_count)
     self.assertRegex(gplog.get_logfile(), '/gpsegrecovery.py_\d+\.log')
 def test_get_recovery_cmds_is_called(self, mock_get_recovery_cmds,
                                      mock_recovery_base_main, mock_logger):
     mix_confinfo = gppylib.recoveryinfo.serialize_list(
         [self.full_r1, self.incr_r2])
     sys.argv = [
         'gpsegrecovery', '-l', '/tmp/logdir', '--era={}'.format(self.era),
         '-f', '-c {}'.format(mix_confinfo)
     ]
     SegRecovery().main()
     mock_get_recovery_cmds.assert_called_once_with(
         [self.full_r1, self.incr_r2], True, mock_logger.return_value,
         self.era)
     mock_recovery_base_main.assert_called_once_with(
         mock_get_recovery_cmds.return_value)
 def test_get_recovery_cmds_mix_recoveryinfo(self):
     cmd_list = SegRecovery().get_recovery_cmds(
         [self.full_r1, self.incr_r2], False, self.mock_logger, self.era)
     self._assert_validation_full_call(cmd_list[0], self.full_r1)
     self._assert_setup_incr_call(cmd_list[1], self.incr_r2)
 def test_empty_recovery_info_list(self):
     cmd_list = SegRecovery().get_recovery_cmds([], False, None, self.era)
     self.assertEqual([], cmd_list)
 def test_get_recovery_cmds_incr_recoveryinfo(self):
     cmd_list = SegRecovery().get_recovery_cmds(
         [self.incr_r1, self.incr_r2], False, self.mock_logger)
     self._assert_setup_incr_call(cmd_list[0], self.incr_r1)
     self._assert_setup_incr_call(cmd_list[1], self.incr_r2)