Bug 1451246 - [mozrunner] Always encode key and value of env variables as UTF-8 if those are of unicode type. draft
authorHenrik Skupin <mail@hskupin.info>
Wed, 04 Apr 2018 10:36:58 +0200
changeset 777106 f6ad1276ab9b33f65d27d12158e8085069642ea2
parent 777105 b878c7217f8626bbd211d6be1eaf03a49c0f4b3b
push id105078
push userbmo:hskupin@gmail.com
push dateWed, 04 Apr 2018 08:41:52 +0000
bugs1451246
milestone61.0a1
Bug 1451246 - [mozrunner] Always encode key and value of env variables as UTF-8 if those are of unicode type. Without encoding the key and value of environment variables as UTF-8 for non-interactive sessions "subprocess.Popen()" and specifically "os.execvpe()" will fail. MozReview-Commit-ID: 9lO562XnDZx
testing/mozbase/mozrunner/mozrunner/base/runner.py
--- a/testing/mozbase/mozrunner/mozrunner/base/runner.py
+++ b/testing/mozbase/mozrunner/mozrunner/base/runner.py
@@ -106,31 +106,32 @@ class BaseRunner(object):
         self.stop()
 
         # attach a debugger, if specified
         if debug_args:
             cmd = list(debug_args) + cmd
 
         if self.logger:
             self.logger.info('Application command: %s' % ' '.join(cmd))
+
+        encoded_env = {}
+        for k in self.env:
+            v = self.env[k]
+            if isinstance(v, unicode_type):
+                v = v.encode('utf-8')
+            if isinstance(k, unicode_type):
+                k = k.encode('utf-8')
+            encoded_env[k] = v
+
         if interactive:
-            filtered_env = {}
-            for k in self.env:
-                v = self.env[k]
-                if isinstance(v, unicode_type):
-                    v = v.encode('utf-8')
-                if isinstance(k, unicode_type):
-                    k = k.encode('utf-8')
-                filtered_env[k] = v
-
-            self.process_handler = subprocess.Popen(cmd, env=filtered_env)
+            self.process_handler = subprocess.Popen(cmd, env=encoded_env)
             # TODO: other arguments
         else:
             # this run uses the managed processhandler
-            self.process_handler = self.process_class(cmd, env=self.env, **self.process_args)
+            self.process_handler = self.process_class(cmd, env=encoded_env, **self.process_args)
             self.process_handler.run(self.timeout, self.output_timeout)
 
         self.crashed = 0
         return self.process_handler.pid
 
     def wait(self, timeout=None):
         """
         Wait for the process to exit.