[4/4] framework: Error out if there is a space in a test name

Submitted by Dylan Baker on April 14, 2015, 8:52 p.m.

Details

Message ID 1429044766-11803-5-git-send-email-baker.dylan.c@gmail.com
State New, archived
Headers show

Not browsing as part of any series.

Commit Message

Dylan Baker April 14, 2015, 8:52 p.m.
Python's Popen class requires a list of command arguments to be passed
to it. The way it handles spaces is to escape them as literals. thus
['grep foo', 'f'] != ['grep', 'foo', 'f'] (the later will work as
expected, the later will have an error, since it's very unlikely that
you have a command 'grep foo' on your system).

This adds a check to the Test.command.setter function to error out if a
command is set with a space in an element.

This has been tested against all.py, cl.py, igt.py, xts.py, and
deqp_gles3.py, and all of them work correctly.

Signed-off-by: Dylan Baker <dylanx.c.baker@intel.com>
---
 framework/test/base.py | 20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)

Patch hide | download patch | download mbox

diff --git a/framework/test/base.py b/framework/test/base.py
index 8a4bf99..4981d3d 100644
--- a/framework/test/base.py
+++ b/framework/test/base.py
@@ -42,10 +42,16 @@  from framework.results import TestResult
 
 __all__ = [
     'Test',
+    'CommandSpaceException',
     'WindowResizeMixin',
 ]
 
 
+class CommandSpaceException(Exception):
+    """Exception raised if there is a space in a test command element."""
+    pass
+
+
 class ProcessTimeout(threading.Thread):
     """ Timeout class for test processes
 
@@ -123,9 +129,9 @@  class Test(object):
 
     def __init__(self, command, run_concurrent=False):
         assert isinstance(command, list), command
-
+        self._command = None
         self.run_concurrent = run_concurrent
-        self._command = copy.copy(command)
+        self.command = command
         self.env = {}
         self.result = TestResult({'result': 'fail'})
         self.cwd = None
@@ -178,6 +184,16 @@  class Test(object):
                     '--tool=memcheck'] + self._command
         return self._command
 
+    @command.setter
+    def command(self, commandlist):
+        """If there is a space in the command list raise an exception."""
+        for each in commandlist:
+            if ' ' in each:
+                raise CommandSpaceException(
+                    'In command {}, a space was found in element {}'.format(
+                        commandlist, each))
+        self._command = copy.copy(commandlist)
+
     @abc.abstractmethod
     def interpret_result(self):
         """ Convert the raw output of the test into a form piglit understands