Fault fixing for cmd_exec util method 90/68490/3
authorPanagiotis Karalis <panos.pkaralis@gmail.com>
Tue, 17 Sep 2019 08:55:58 +0000 (11:55 +0300)
committerPanagiotis Karalis <panos.pkaralis@gmail.com>
Wed, 18 Sep 2019 09:22:21 +0000 (12:22 +0300)
When the 'dovetail run' command is assigned, the error
"TypeError: must be str, not bytes" is appeared.

Due to a different handling of strings in the Python3, this error
is appeared during of command execution (i.e. exec_cmd method).

Each piece of the string should be decoded, before it will be
appended to the rest one.

Signed-off-by: Panagiotis Karalis <panos.pkaralis@gmail.com>
Change-Id: I65629f3f76cc3e44f3926a744d00791ef588d2aa

dovetail/tests/unit/utils/test_dovetail_utils.py
dovetail/utils/dovetail_utils.py

index 5b403a5..d912aa8 100644 (file)
@@ -1233,9 +1233,9 @@ class DovetailUtilsTesting(unittest.TestCase):
         subp_stdout = Mock()
         subprocess_obj.stdout = subp_stdout
         subprocess_obj.wait.return_value = 0
-        subp_stdout.readline.side_effect = [cmd_output, '']
+        subp_stdout.readline.side_effect = [cmd_output.encode()]
 
-        expected = (0, 'line')
+        expected = (0, "b'line'")
         result = dovetail_utils.exec_cmd(
             cmd, logger=logger, exit_on_error=True, info=False,
             exec_msg_on=True, err_msg='', verbose=verbose,
@@ -1276,7 +1276,7 @@ class DovetailUtilsTesting(unittest.TestCase):
         subp_stdout = Mock()
         subprocess_obj.stdout = subp_stdout
         subprocess_obj.wait.return_value = 1
-        subp_stdout.readline.side_effect = [cmd_output, '']
+        subp_stdout.readline.side_effect = [cmd_output.encode()]
 
         dovetail_utils.exec_cmd(
             cmd, logger=logger, exit_on_error=True, info=False,
@@ -1286,7 +1286,6 @@ class DovetailUtilsTesting(unittest.TestCase):
         log_calls = [
             call(verbose, logger, "Executing command: '%s'" % cmd, 'debug'),
             call(verbose, logger, cmd_output, 'debug', True),
-            call(verbose, logger, '', 'debug', True),
             call(verbose, logger, "The command '%s' failed." % cmd, 'error')]
         mock_log.assert_has_calls(log_calls)
         mock_open.assert_called_once_with(cmd, shell=True, stdout=mock_pipe,
index 9259b03..306dacd 100644 (file)
@@ -60,8 +60,9 @@ def exec_cmd(cmd, logger=None, exit_on_error=False, info=False,
         count = 1
         DEBUG = os.getenv('DEBUG')
     for line in iter(p.stdout.readline, b''):
-        exec_log(verbose, logger, line.strip(), level, True)
-        stdout += line
+        exec_log(verbose, logger, line.strip().decode('unicode-escape'),
+                 level, True)
+        stdout += str(line)
         if progress_bar and (DEBUG is None or DEBUG.lower() != 'true'):
             show_progress_bar(count)
             count += 1