|
20 | 20 |
|
21 | 21 | from st2actions.runners import pythonrunner
|
22 | 22 | from st2actions.container import service
|
| 23 | +from st2common.constants.action import ACTION_OUTPUT_RESULT_DELIMITER |
23 | 24 | from st2common.constants.action import LIVEACTION_STATUS_SUCCEEDED, LIVEACTION_STATUS_FAILED
|
24 | 25 | from st2common.constants.pack import SYSTEM_PACK_NAME
|
25 | 26 | import st2tests.base as tests_base
|
@@ -111,6 +112,52 @@ def test_action_with_user_supplied_env_vars(self, mock_popen):
|
111 | 112 | else:
|
112 | 113 | self.assertEqual(actual_env[key], value)
|
113 | 114 |
|
| 115 | + @mock.patch('st2actions.runners.pythonrunner.subprocess.Popen') |
| 116 | + def test_stdout_interception_and_parsing(self, mock_popen): |
| 117 | + values = {'delimiter': ACTION_OUTPUT_RESULT_DELIMITER} |
| 118 | + |
| 119 | + # No output to stdout and no result (implicit None) |
| 120 | + mock_stdout = '%(delimiter)sNone%(delimiter)s' % values |
| 121 | + mock_stderr = 'foo stderr' |
| 122 | + mock_process = mock.Mock() |
| 123 | + mock_process.communicate.return_value = (mock_stdout, mock_stderr) |
| 124 | + mock_process.returncode = 0 |
| 125 | + mock_popen.return_value = mock_process |
| 126 | + |
| 127 | + runner = pythonrunner.get_runner() |
| 128 | + runner.action = self._get_mock_action_obj() |
| 129 | + runner.runner_parameters = {} |
| 130 | + runner.entry_point = PACAL_ROW_ACTION_PATH |
| 131 | + runner.container_service = service.RunnerContainerService() |
| 132 | + runner.pre_run() |
| 133 | + (_, output, _) = runner.run({'row_index': 4}) |
| 134 | + |
| 135 | + self.assertEqual(output['stdout'], '') |
| 136 | + self.assertEqual(output['stderr'], mock_stderr) |
| 137 | + self.assertEqual(output['result'], 'None') |
| 138 | + self.assertEqual(output['exit_code'], 0) |
| 139 | + |
| 140 | + # Output to stdout and no result (implicit None) |
| 141 | + mock_stdout = 'pre result%(delimiter)sNone%(delimiter)spost result' % values |
| 142 | + mock_stderr = 'foo stderr' |
| 143 | + mock_process = mock.Mock() |
| 144 | + mock_process.communicate.return_value = (mock_stdout, mock_stderr) |
| 145 | + mock_process.returncode = 0 |
| 146 | + mock_popen.return_value = mock_process |
| 147 | + |
| 148 | + runner = pythonrunner.get_runner() |
| 149 | + runner.action = self._get_mock_action_obj() |
| 150 | + runner.runner_parameters = {} |
| 151 | + runner.entry_point = PACAL_ROW_ACTION_PATH |
| 152 | + runner.container_service = service.RunnerContainerService() |
| 153 | + runner.pre_run() |
| 154 | + (_, output, _) = runner.run({'row_index': 4}) |
| 155 | + |
| 156 | + self.assertEqual(output['stdout'], 'pre resultpost result') |
| 157 | + self.assertEqual(output['stderr'], mock_stderr) |
| 158 | + self.assertEqual(output['result'], 'None') |
| 159 | + self.assertEqual(output['exit_code'], 0) |
| 160 | + |
114 | 161 | def _get_mock_action_obj(self):
|
115 | 162 | """
|
116 | 163 | Return mock action object.
|
|
0 commit comments