From 77d598a882652801b2ddf480c34d896f745657dc Mon Sep 17 00:00:00 2001 From: Linda Wang Date: Tue, 26 Dec 2017 09:17:13 +0000 Subject: Execute feature command by subprocess directly Change-Id: I77e86af4e96310c6520d743e4d16c9a7b2e9adf5 Signed-off-by: Linda Wang --- functest/core/feature.py | 11 ++++--- functest/tests/unit/core/test_feature.py | 50 +++++++++++++++++--------------- 2 files changed, 33 insertions(+), 28 deletions(-) diff --git a/functest/core/feature.py b/functest/core/feature.py index 2dc3ccbd6..3200dad85 100644 --- a/functest/core/feature.py +++ b/functest/core/feature.py @@ -14,10 +14,10 @@ helpers to run any python method or any bash command. """ import logging +import subprocess import time import functest.core.testcase as base -import functest.utils.functest_utils as ft_utils from functest.utils.constants import CONST __author__ = ("Serena Feng , " @@ -123,9 +123,12 @@ class BashFeature(Feature): ret = -1 try: cmd = kwargs["cmd"] - ret = ft_utils.execute_command(cmd, output_file=self.result_file) + with open(self.result_file, 'w+') as f_stdout: + proc = subprocess.Popen(cmd.split(), stdout=f_stdout, + stderr=subprocess.STDOUT) + ret = proc.wait() + if ret != 0: + self.__logger.error("Execute command: %s failed", cmd) except KeyError: self.__logger.error("Please give cmd as arg. kwargs: %s", kwargs) - except Exception: # pylint: disable=broad-except - self.__logger.exception("Execute cmd: %s failed", cmd) return ret diff --git a/functest/tests/unit/core/test_feature.py b/functest/tests/unit/core/test_feature.py index 553a5dfa4..8c73bb5d5 100644 --- a/functest/tests/unit/core/test_feature.py +++ b/functest/tests/unit/core/test_feature.py @@ -23,7 +23,7 @@ class FeatureTestingBase(unittest.TestCase): _case_name = "foo" _project_name = "bar" _repo = "dir_repo_bar" - _cmd = "cd /home/opnfv/repos/bar/tests && bash run.sh && cd -" + _cmd = "run_bar_tests.py" _output_file = '/home/opnfv/functest/results/foo.log' feature = None @@ -78,31 +78,33 @@ class BashFeatureTesting(FeatureTestingBase): self.feature = feature.BashFeature( project_name=self._project_name, case_name=self._case_name) - @mock.patch("functest.utils.functest_utils.execute_command") - def test_run_no_cmd(self, mock_method=None): - self.assertEqual(self.feature.run(), testcase.TestCase.EX_RUN_ERROR) - mock_method.assert_not_called() + @mock.patch('subprocess.Popen') + def test_run_no_cmd(self, mock_subproc): + self.assertEqual( + self.feature.run(), testcase.TestCase.EX_RUN_ERROR) + mock_subproc.assert_not_called() - @mock.patch("functest.utils.functest_utils.execute_command", - return_value=1) - def test_run_ko(self, mock_method=None): - self._test_run(testcase.TestCase.EX_RUN_ERROR) - mock_method.assert_called_once_with( - self._cmd, output_file=self._output_file) + @mock.patch('subprocess.Popen') + def test_run_ko(self, mock_subproc): + with mock.patch('six.moves.builtins.open', mock.mock_open()) as mopen: + mock_obj = mock.Mock() + attrs = {'wait.return_value': 1} + mock_obj.configure_mock(**attrs) - @mock.patch("functest.utils.functest_utils.execute_command", - side_effect=Exception) - def test_run_exc(self, mock_method=None): - self._test_run(testcase.TestCase.EX_RUN_ERROR) - mock_method.assert_called_once_with( - self._cmd, output_file=self._output_file) - - @mock.patch("functest.utils.functest_utils.execute_command", - return_value=0) - def test_run(self, mock_method): - self._test_run(testcase.TestCase.EX_OK) - mock_method.assert_called_once_with( - self._cmd, output_file=self._output_file) + mock_subproc.return_value = mock_obj + self._test_run(testcase.TestCase.EX_RUN_ERROR) + mopen.assert_called_once_with(self._output_file, "w+") + + @mock.patch('subprocess.Popen') + def test_run(self, mock_subproc): + with mock.patch('six.moves.builtins.open', mock.mock_open()) as mopen: + mock_obj = mock.Mock() + attrs = {'wait.return_value': 0} + mock_obj.configure_mock(**attrs) + + mock_subproc.return_value = mock_obj + self._test_run(testcase.TestCase.EX_OK) + mopen.assert_called_once_with(self._output_file, "w+") if __name__ == "__main__": -- cgit 1.2.3-korg