Bug 1231981 - Part 4: Pull in the necessary python dependencies in CI. r=ahal draft
authorByron Campen [:bwc] <docfaraday@gmail.com>
Tue, 15 Mar 2016 16:27:36 -0500
changeset 357879 941dfc1e9cd8cd8b79ba2dc637f29cc50b208934
parent 357878 3e8d6e0622d71925284ad164f90f01301d498faa
child 357880 46a0ad16100992803792266000210c6bd7b84779
push id16877
push userbcampen@mozilla.com
push dateFri, 29 Apr 2016 19:01:27 +0000
reviewersahal
bugs1231981
milestone49.0a1
Bug 1231981 - Part 4: Pull in the necessary python dependencies in CI. r=ahal MozReview-Commit-ID: AkmzbnI4Lq5
testing/mochitest/moz.build
testing/mozharness/scripts/android_emulator_unittest.py
testing/mozharness/scripts/androidx86_emulator_unittest.py
testing/mozharness/scripts/desktop_unittest.py
testing/tools/websocketprocessbridge/websocketprocessbridge_requirements.txt
--- a/testing/mochitest/moz.build
+++ b/testing/mochitest/moz.build
@@ -155,10 +155,11 @@ TEST_HARNESS_FILES.testing.mochitest.tes
 ]
 
 TEST_HARNESS_FILES.testing.mochitest.iceserver += [
     '/testing/tools/iceserver/iceserver.py',
 ]
 
 TEST_HARNESS_FILES.testing.mochitest.websocketprocessbridge += [
     '/testing/tools/websocketprocessbridge/websocketprocessbridge.py',
+    '/testing/tools/websocketprocessbridge/websocketprocessbridge_requirements.txt',
 ]
 
--- a/testing/mozharness/scripts/android_emulator_unittest.py
+++ b/testing/mozharness/scripts/android_emulator_unittest.py
@@ -17,17 +17,17 @@ import time
 import tempfile
 
 # load modules from parent dir
 sys.path.insert(1, os.path.dirname(sys.path[0]))
 
 from mozprocess import ProcessHandler
 
 from mozharness.base.log import FATAL
-from mozharness.base.script import BaseScript
+from mozharness.base.script import BaseScript, PreScriptAction
 from mozharness.base.vcs.vcsbase import VCSMixin
 from mozharness.mozilla.blob_upload import BlobUploadMixin, blobupload_config_options
 from mozharness.mozilla.mozbase import MozbaseMixin
 from mozharness.mozilla.testing.testbase import TestingMixin, testing_config_options
 from mozharness.mozilla.testing.unittest import EmulatorMixin
 
 
 class AndroidEmulatorTest(BlobUploadMixin, TestingMixin, EmulatorMixin, VCSMixin, BaseScript, MozbaseMixin):
@@ -131,29 +131,44 @@ class AndroidEmulatorTest(BlobUploadMixi
         dirs['abs_xre_dir'] = os.path.join(
             abs_dirs['abs_work_dir'], 'hostutils')
         dirs['abs_modules_dir'] = os.path.join(
             dirs['abs_test_install_dir'], 'modules')
         dirs['abs_blob_upload_dir'] = os.path.join(
             abs_dirs['abs_work_dir'], 'blobber_upload_dir')
         dirs['abs_emulator_dir'] = os.path.join(
             abs_dirs['abs_work_dir'], 'emulator')
+        dirs['abs_mochitest_dir'] = os.path.join(
+            dirs['abs_test_install_dir'], 'mochitest')
 
         if self.config.get("developer_mode"):
             dirs['abs_avds_dir'] = os.path.join(
                 abs_dirs['abs_work_dir'], "avds_dir")
         else:
             dirs['abs_avds_dir'] = "/home/cltbld/.android"
 
         for key in dirs.keys():
             if key not in abs_dirs:
                 abs_dirs[key] = dirs[key]
         self.abs_dirs = abs_dirs
         return self.abs_dirs
 
+    @PreScriptAction('create-virtualenv')
+    def _pre_create_virtualenv(self, action):
+        dirs = self.query_abs_dirs()
+
+        if os.path.isdir(dirs['abs_mochitest_dir']):
+            # mochitest is the only thing that needs this
+            requirements = os.path.join(dirs['abs_mochitest_dir'],
+                        'websocketprocessbridge',
+                        'websocketprocessbridge_requirements.txt')
+
+            self.register_virtualenv_module(requirements=[requirements],
+                                            two_pass=True)
+
     def _launch_emulator(self):
         env = self.query_env()
 
         # Set $LD_LIBRARY_PATH to self.dirs['abs_work_dir'] so that
         # the emulator picks up the symlink to libGL.so.1 that we
         # constructed in start_emulator.
         env['LD_LIBRARY_PATH'] = self.abs_dirs['abs_work_dir']
 
--- a/testing/mozharness/scripts/androidx86_emulator_unittest.py
+++ b/testing/mozharness/scripts/androidx86_emulator_unittest.py
@@ -16,17 +16,17 @@ import time
 import tempfile
 
 # load modules from parent dir
 sys.path.insert(1, os.path.dirname(sys.path[0]))
 
 from mozprocess import ProcessHandler
 
 from mozharness.base.log import FATAL
-from mozharness.base.script import BaseScript, PostScriptRun
+from mozharness.base.script import BaseScript, PostScriptRun, PreScriptAction
 from mozharness.base.vcs.vcsbase import VCSMixin
 from mozharness.mozilla.blob_upload import BlobUploadMixin, blobupload_config_options
 from mozharness.mozilla.mozbase import MozbaseMixin
 from mozharness.mozilla.buildbot import TBPL_WORST_LEVEL_TUPLE
 from mozharness.mozilla.testing.testbase import TestingMixin, testing_config_options
 from mozharness.mozilla.testing.unittest import EmulatorMixin
 
 
@@ -138,29 +138,44 @@ class AndroidEmulatorTest(BlobUploadMixi
         dirs['abs_xre_dir'] = os.path.join(
             abs_dirs['abs_work_dir'], 'hostutils')
         dirs['abs_modules_dir'] = os.path.join(
             dirs['abs_test_install_dir'], 'modules')
         dirs['abs_blob_upload_dir'] = os.path.join(
             abs_dirs['abs_work_dir'], 'blobber_upload_dir')
         dirs['abs_emulator_dir'] = os.path.join(
             abs_dirs['abs_work_dir'], 'emulator')
+        dirs['abs_mochitest_dir'] = os.path.join(
+            dirs['abs_test_install_dir'], 'mochitest')
 
         if self.config.get("developer_mode"):
             dirs['abs_avds_dir'] = os.path.join(
                 abs_dirs['abs_work_dir'], "avds_dir")
         else:
             dirs['abs_avds_dir'] = "/home/cltbld/.android"
 
         for key in dirs.keys():
             if key not in abs_dirs:
                 abs_dirs[key] = dirs[key]
         self.abs_dirs = abs_dirs
         return self.abs_dirs
 
+    @PreScriptAction('create-virtualenv')
+    def _pre_create_virtualenv(self, action):
+        dirs = self.query_abs_dirs()
+
+        if os.path.isdir(dirs['abs_mochitest_dir']):
+            # mochitest is the only thing that needs this
+            requirements = os.path.join(dirs['abs_mochitest_dir'],
+                        'websocketprocessbridge',
+                        'websocketprocessbridge_requirements.txt')
+
+            self.register_virtualenv_module(requirements=[requirements],
+                                            two_pass=True)
+
     def _build_arg(self, option, value):
         """
         Build a command line argument
         """
         if not value:
             return []
         return [str(option), str(value)]
 
--- a/testing/mozharness/scripts/desktop_unittest.py
+++ b/testing/mozharness/scripts/desktop_unittest.py
@@ -255,21 +255,30 @@ class DesktopUnittest(TestingMixin, Merc
     def _pre_create_virtualenv(self, action):
         dirs = self.query_abs_dirs()
 
         self.register_virtualenv_module(name='pip>=1.5')
         self.register_virtualenv_module('psutil==3.1.1', method='pip')
         self.register_virtualenv_module(name='mock')
         self.register_virtualenv_module(name='simplejson')
 
-        requirements = os.path.join(dirs['abs_test_install_dir'],
-                                    'config',
-                                    'marionette_requirements.txt')
-        if os.path.isfile(requirements):
-            self.register_virtualenv_module(requirements=[requirements],
+        requirements_files = [
+                os.path.join(dirs['abs_test_install_dir'],
+                    'config',
+                    'marionette_requirements.txt')]
+
+        if os.path.isdir(dirs['abs_mochitest_dir']):
+            # mochitest is the only thing that needs this
+            requirements_files.append(
+                os.path.join(dirs['abs_mochitest_dir'],
+                             'websocketprocessbridge',
+                             'websocketprocessbridge_requirements.txt'))
+
+        for requirements_file in requirements_files:
+            self.register_virtualenv_module(requirements=[requirements_file],
                                             two_pass=True)
 
     def _query_symbols_url(self):
         """query the full symbols URL based upon binary URL"""
         # may break with name convention changes but is one less 'input' for script
         if self.symbols_url:
             return self.symbols_url
 
new file mode 100644
--- /dev/null
+++ b/testing/tools/websocketprocessbridge/websocketprocessbridge_requirements.txt
@@ -0,0 +1,13 @@
+twisted==10.2.0
+
+# websocket adapter for twisted, might be built into twisted someday
+txws==0.9.1
+
+psutil==3.1.1
+
+# needed by txws, but pypi doesn't know about it
+six==1.10.0
+
+# Needed by iceserver
+ipaddr==2.1.11
+passlib==1.6.5