Bug 1363373 - Browse to mitmproxy playback pages during browser init draft
authorRob Wood <rwood@mozilla.com>
Wed, 31 May 2017 14:59:14 -0400
changeset 587203 205a5b69e8047e240b4aa8ad1a522a0e2d84b570
parent 586973 7b8937970f9ca85db88cb2496f2112175fd847c8
child 631227 f2d6e2ab127f98fc3140fb4bfb0d8d230d9696e9
push id61661
push userrwood@mozilla.com
push dateWed, 31 May 2017 18:59:25 +0000
bugs1363373
milestone55.0a1
Bug 1363373 - Browse to mitmproxy playback pages during browser init MozReview-Commit-ID: 1Tbo3rG2gsq
testing/talos/talos/ffsetup.py
testing/talos/talos/run_tests.py
testing/talos/talos/tests/quit.js
--- a/testing/talos/talos/ffsetup.py
+++ b/testing/talos/talos/ffsetup.py
@@ -53,16 +53,18 @@ class FFSetup(object):
     def __init__(self, browser_config, test_config):
         self.browser_config, self.test_config = browser_config, test_config
         self._tmp_dir = tempfile.mkdtemp()
         self.env = None
         # The profile dir must be named 'profile' because of xperf analysis
         # (in etlparser.py). TODO fix that ?
         self.profile_dir = os.path.join(self._tmp_dir, 'profile')
         self.gecko_profile = None
+        self.mitmproxy = False
+        self.mitmproxy_recordings_list = None
 
     def _init_env(self):
         self.env = dict(os.environ)
         for k, v in self.browser_config['env'].iteritems():
             self.env[k] = str(v)
         self.env['MOZ_CRASHREPORTER_NO_REPORT'] = '1'
         if self.browser_config['symbols_path']:
             self.env['MOZ_CRASHREPORTER'] = '1'
@@ -109,16 +111,22 @@ class FFSetup(object):
 
     def _run_profile(self):
         runner_cls = mozrunner.runners.get(
             mozinfo.info.get(
                 'appname',
                 'firefox'),
             mozrunner.Runner)
 
+        # if using mitmproxy we don't want the init_url to close the browser
+        if self.browser_config.get('mitmproxy', None):
+            self.browser_config['init_url'] = self.browser_config['init_url'] + '?close=False'
+            self.mitmproxy = True
+            self.mitmproxy_recordings_list = self.browser_config.get('mitmproxy_recordings_list', None)
+
         if self.test_config.get('webextensions', None):
             args = [self.browser_config["extra_args"], "-marionette"]
             runner = runner_cls(profile=self.profile_dir,
                                 binary=self.browser_config["browser_path"],
                                 cmdargs=args,
                                 process_class=ProcessHandlerMixin,
                                 process_args={})
 
@@ -145,32 +153,55 @@ class FFSetup(object):
 
                 if not filename.endswith('.xpi'):
                     continue
                 if not os.path.exists(filename):
                     continue
 
                 addons.install(filename)
 
-            # browse to init_url which will close the browser
+            # browse to init_url which will close the browser (if mitmproxy isn't being used)
             client.navigate(self.browser_config["init_url"])
             client.close()
         else:
             args = [self.browser_config["extra_args"], self.browser_config["init_url"]]
             runner = runner_cls(profile=self.profile_dir,
                                 binary=self.browser_config["browser_path"],
                                 cmdargs=args,
                                 process_class=ProcessHandlerMixin,
                                 process_args={})
 
             runner.start(outputTimeout=30)
             proc = runner.process_handler
             LOG.process_start(proc.pid, "%s %s" % (self.browser_config["browser_path"],
                                                    ' '.join(args)))
 
+        # if using mitmproxy, the init_url will have left the browser open; now we want to
+        # browse to each of the test pages in the mitmproxy playback set, to initialize
+        if self.mitmproxy:
+            LOG.info("mitmproxy test pages init: browsing to each page in the playback archive")
+            try:
+                client = Marionette(host='localhost', port=2828)
+                client.start_session()
+            except Exception, e:
+                print e
+                raise TalosError("Failed test page init: couldn't establish mariontte connection")
+
+            try:
+                for test_page in self.mitmproxy_recordings_list:
+                    LOG.info("mitmproxy test page init: %s" % test_page)
+                    client.navigate(test_page)
+
+                LOG.info("mitmproxy test pages init complete, closing the browser")
+                client.close()
+            except Exception, e:
+                print e
+                raise TalosError("Failed mitmproxy test page init, %s" % e)
+        # TODO: Move above into own py module in /mitmproxy
+
         try:
             exit_code = proc.wait()
         except Exception, e:
             proc.kill()
             raise TalosError("Browser Failed to close properly during warmup")
 
         LOG.process_exit(proc.pid, exit_code)
 
--- a/testing/talos/talos/run_tests.py
+++ b/testing/talos/talos/run_tests.py
@@ -191,16 +191,17 @@ def run_tests(config, browser_config):
     if config['gecko_profile']:
         talos_results.add_extra_option('geckoProfile')
 
     # some tests use mitmproxy to playback pages
     mitmproxy_recordings_list = config.get('mitmproxy', False)
     if mitmproxy_recordings_list is not False:
         # needed so can tell talos ttest to allow external connections
         browser_config['mitmproxy'] = True
+        browser_config['mitmproxy_recordings_list'] = mitmproxy_recordings_list
 
         # start mitmproxy playback; this also generates the CA certificate
         mitmdump_path = config.get('mitmdumpPath', False)
         if mitmdump_path is False:
             # cannot continue, need path for mitmdump playback tool
             LOG.error('Aborting: mitmdumpPath was not provided on cmd line but is required')
             sys.exit()
 
--- a/testing/talos/talos/tests/quit.js
+++ b/testing/talos/talos/tests/quit.js
@@ -68,16 +68,24 @@ function canQuitApplication()
   return true;
 }
 
 function goQuitApplication(waitForSafeBrowsing)
 {
   const privs = 'UniversalPreferencesRead UniversalPreferencesWrite ' +
     'UniversalXPConnect';
 
+  // getInfo has optional url param to not close the browser after init
+  if (window.location.search.indexOf("close=False") > -1) {
+    console.log('not closing the browser');
+    return;
+  } else {
+    console.log('will close the browser');
+  }
+
   try
   {
     netscape.security.PrivilegeManager.enablePrivilege(privs);
   }
   catch(ex)
   {
     throw('goQuitApplication: privilege failure ' + ex);
   }