From 26cfeef233e2ad28489a62fbb1a6a69cc02d1b83 Mon Sep 17 00:00:00 2001 From: Mehdi Abaakouk Date: Mon, 31 Aug 2015 16:09:13 +0200 Subject: [PATCH] Fix cli.base.execute with py34 In python3, the command must be a string not bytes. Also all tempest_lib assert tools expected the result is a str. But in python subprocess stdout/stderr returns bytes To fix that we decode it with the fsencoding. Change-Id: Id5b2e5d75f2c881cd2a3fff216126f6529dccef3 --- tempest_lib/cli/base.py | 10 +++++++-- tempest_lib/tests/cli/test_execute.py | 31 +++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 tempest_lib/tests/cli/test_execute.py diff --git a/tempest_lib/cli/base.py b/tempest_lib/cli/base.py index ec966ca..d5250ff 100644 --- a/tempest_lib/cli/base.py +++ b/tempest_lib/cli/base.py @@ -16,6 +16,7 @@ import logging import os import shlex +import six import subprocess from tempest_lib import base @@ -50,7 +51,9 @@ def execute(cmd, action, flags='', params='', fail_ok=False, cmd = ' '.join([os.path.join(cli_dir, cmd), flags, action, params]) LOG.info("running: '%s'" % cmd) - cmd = shlex.split(cmd.encode('utf-8')) + if six.PY2: + cmd = cmd.encode('utf-8') + cmd = shlex.split(cmd) result = '' result_err = '' stdout = subprocess.PIPE @@ -62,7 +65,10 @@ def execute(cmd, action, flags='', params='', fail_ok=False, cmd, result, result_err) - return result + if six.PY2: + return result + else: + return os.fsdecode(result) class CLIClient(object): diff --git a/tempest_lib/tests/cli/test_execute.py b/tempest_lib/tests/cli/test_execute.py new file mode 100644 index 0000000..b56d614 --- /dev/null +++ b/tempest_lib/tests/cli/test_execute.py @@ -0,0 +1,31 @@ +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + + +from tempest_lib.cli import base as cli_base +from tempest_lib.tests import base + + +class TestExecute(base.TestCase): + def test_execute_success(self): + result = cli_base.execute("/bin/ls", action="tempest_lib", + flags="-l -a") + self.assertIsInstance(result, str) + self.assertIn("__init__.py", result) + + def test_execute_failure(self): + result = cli_base.execute("/bin/ls", action="tempest_lib", + flags="--foobar", merge_stderr=True, + fail_ok=True) + self.assertIsInstance(result, str) + self.assertIn("--foobar", result)