Bug 1410210 - Remove talos pageloader command line options; r=jmaher
authorRob Wood <rwood@mozilla.com>
Tue, 07 Nov 2017 08:30:43 -0500
changeset 393078 a40ffd441b9a724a6a11a41f282f8b69050b98c0
parent 393077 b2998f106294f4e76467382dfa796f3dfafab46c
child 393079 01298c757565d7277b81c396e873d7f8fb07cc42
push id55836
push userrwood@mozilla.com
push dateWed, 22 Nov 2017 15:05:21 +0000
treeherderautoland@a40ffd441b9a [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersjmaher
bugs1410210
milestone59.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1410210 - Remove talos pageloader command line options; r=jmaher MozReview-Commit-ID: BS22DU6Pmxk
testing/talos/talos/cmdline.py
testing/talos/talos/config.py
testing/talos/talos/pageloader/chrome/pageloader.js
testing/talos/talos/pageloader/components/tp-cmdline.js
testing/talos/talos/pageloader/install.rdf
testing/talos/talos/pageloader/pageloader-signed.xpi
testing/talos/talos/run_tests.py
testing/talos/talos/test.py
testing/talos/talos/ttest.py
testing/talos/talos/unittests/test_config.py
testing/talos/talos/utils.py
--- a/testing/talos/talos/cmdline.py
+++ b/testing/talos/talos/cmdline.py
@@ -65,18 +65,16 @@ def create_parser(mach_interface=False):
     add_arg('--browserWait', dest='browser_wait', default=5, type=int,
             help="Amount of time allowed for the browser to cleanly close")
     add_arg('-a', '--activeTests',
             help="List of tests to run, separated by ':' (ex. damp:cart)")
     add_arg('--suite',
             help="Suite to use (instead of --activeTests)")
     add_arg('--subtests',
             help="Name of the subtest(s) to run (works only on DAMP)")
-    add_arg('--noChrome', action='store_true',
-            help="do not run tests as chrome")
     add_arg('--mainthread', action='store_true',
             help="Collect mainthread IO data from the browser by setting"
                  " an environment variable")
     add_arg("--mozAfterPaint", action='store_true', dest="tpmozafterpaint",
             help="wait for MozAfterPaint event before recording the time")
     add_arg("--firstPaint", action='store_true', dest="firstpaint",
             help="Also report the first paint value in supported tests")
     add_arg("--userReady", action='store_true', dest="userready",
@@ -137,18 +135,16 @@ def create_parser(mach_interface=False):
     add_arg('--tpcycles', type=int,
             help="number of pageloader cycles to run")
     add_arg('--tptimeout', type=int,
             help='number of milliseconds to wait for a load event after'
                  ' calling loadURI before timing out')
     add_arg('--tppagecycles', type=int,
             help='number of pageloader cycles to run for each page in'
                  ' the manifest')
-    add_arg('--tpdelay', type=int,
-            help="length of the pageloader delay")
     add_arg('--no-download', action="store_true", dest="no_download",
             help="Do not download the talos test pagesets")
     add_arg('--sourcestamp',
             help='Specify the hg revision or sourcestamp for the changeset'
                  ' we are testing.  This will use the value found in'
                  ' application.ini if it is not specified.')
     add_arg('--repository',
             help='Specify the url for the repository we are testing. '
--- a/testing/talos/talos/config.py
+++ b/testing/talos/talos/config.py
@@ -41,28 +41,27 @@ DEFAULTS = dict(
         tpcycles=10,
         tpmozafterpaint=False,
         fnbpaint=False,
         firstpaint=False,
         format_pagename=True,
         userready=False,
         testeventmap=[],
         base_vs_ref=False,
-        tpnoisy=True,
         tppagecycles=1,
         tploadnocache=False,
         tpscrolltest=False,
-        tprender=False,
         win_counters=[],
         w7_counters=[],
         linux_counters=[],
         mac_counters=[],
         xperf_counters=[],
         setup=None,
         cleanup=None,
+        preferences={},
     ),
     # default preferences to run with
     # these are updated with --extraPrefs from the commandline
     # for extension scopes, see
     # see https://developer.mozilla.org/en/Installing_extensions
     preferences={
         'app.update.enabled': False,
         'browser.addon-watch.interval': -1,  # Deactivate add-on watching
@@ -214,17 +213,16 @@ DEFAULTS = dict(
 # keys to generated self.config that are global overrides to tests
 GLOBAL_OVERRIDES = (
     'cycles',
     'gecko_profile',
     'gecko_profile_interval',
     'gecko_profile_entries',
     'shutdown',
     'tpcycles',
-    'tpdelay',
     'tppagecycles',
     'tpmanifest',
     'tptimeout',
     'tpmozafterpaint',
     'fnbpaint',
     'firstpaint',
     'userready',
 )
@@ -329,21 +327,16 @@ def get_global_overrides(config):
     for key in GLOBAL_OVERRIDES:
         # get global overrides for all tests
         value = config[key]
         if value is not None:
             global_overrides[key] = value
         if key != 'gecko_profile':
             config.pop(key)
 
-    # add noChrome to global overrides (HACK)
-    noChrome = config.pop('noChrome')
-    if noChrome:
-        global_overrides['tpchrome'] = False
-
     # HACK: currently xperf tests post results to graph server and
     # we want to ensure we don't publish shutdown numbers
     # This is also hacked because "--noShutdown -> shutdown:True"
     if config['xperf_path']:
         global_overrides['shutdown'] = False
     return global_overrides
 
 
--- a/testing/talos/talos/pageloader/chrome/pageloader.js
+++ b/testing/talos/talos/pageloader/chrome/pageloader.js
@@ -17,42 +17,39 @@ Components.utils.import("resource:///mod
 
 var NUM_CYCLES = 5;
 var numPageCycles = 1;
 
 var numRetries = 0;
 var maxRetries = 3;
 
 var pageFilterRegexp = null;
-var useBrowser = true;
 var winWidth = 1024;
 var winHeight = 768;
 
-var doRenderTest = false;
-
 var pages;
 var pageIndex;
 var start_time;
 var cycle;
 var pageCycle;
 var report;
-var noisy = false;
 var timeout = -1;
 var delay = 250;
 var running = false;
 var forceCC = true;
 
 var useMozAfterPaint = false;
 var useFNBPaint = false;
 var gPaintWindow = window;
 var gPaintListener = false;
 var loadNoCache = false;
 var scrollTest = false;
 var profilingInfo = false;
 var baseVsRef = false;
+var useBrowserChrome = false;
 
 var isIdleCallbackPending = false;
 
 // when TEST_DOES_OWN_TIMING, we need to store the time from the page as MozAfterPaint can be slower than pageload
 var gTime = -1;
 var gStartTime = -1;
 var gReference = -1;
 
@@ -105,120 +102,102 @@ SingleTimeout.prototype.register = funct
 SingleTimeout.prototype.clear = function() {
   if (this.timeoutEvent !== undefined) {
     clearTimeout(this.timeoutEvent);
     this.timeoutEvent = undefined;
   }
 };
 
 var failTimeout = new SingleTimeout();
-var renderReport;
 
 function plInit() {
   if (running) {
     return;
   }
   running = true;
 
   cycle = 0;
   pageCycle = 1;
 
   try {
-    var args;
-
     /*
      * Desktop firefox:
      * non-chrome talos runs - tp-cmdline will create and load pageloader
      * into the main window of the app which displays and tests content.
      * chrome talos runs - tp-cmdline does the same however pageloader
      * creates a new chromed browser window below for content.
      */
 
-    // cmdline arguments are on window
-    args = window.arguments[0].wrappedJSObject;
-
-    var manifestURI = args.manifest;
-    var startIndex = 0;
-    var endIndex = -1;
-    if (args.startIndex) startIndex = parseInt(args.startIndex);
-    if (args.endIndex) endIndex = parseInt(args.endIndex);
-    if (args.numCycles) NUM_CYCLES = parseInt(args.numCycles);
-    if (args.numPageCycles) numPageCycles = parseInt(args.numPageCycles);
-    if (args.width) winWidth = parseInt(args.width);
-    if (args.height) winHeight = parseInt(args.height);
-    if (args.filter) pageFilterRegexp = new RegExp(args.filter);
-    if (args.noisy) noisy = true;
-    if (args.timeout) timeout = parseInt(args.timeout);
-    if (args.delay) delay = parseInt(args.delay);
-    if (args.mozafterpaint) useMozAfterPaint = true;
-    if (args.fnbpaint) useFNBPaint = true;
-    if (args.loadnocache) loadNoCache = true;
-    if (args.scrolltest) scrollTest = true;
-    if (args.profilinginfo) profilingInfo = JSON.parse(args.profilinginfo);
-
-    if (profilingInfo) {
-      TalosParentProfiler.initFromObject(profilingInfo);
+    var manifestURI = Services.prefs.getCharPref("talos.tpmanifest", null);
+    if (manifestURI.length == null) {
+      dumpLine("tp abort: talos.tpmanifest browser pref is not set");
+      plStop(true);
     }
 
-    forceCC = !args.noForceCC;
-    doRenderTest = args.doRender;
+    NUM_CYCLES = Services.prefs.getIntPref("talos.tpcycles", 1);
+    numPageCycles = Services.prefs.getIntPref("talos.tppagecycles", 1);
+    timeout = Services.prefs.getIntPref("talos.tptimeout", -1);
+    useMozAfterPaint = Services.prefs.getBoolPref("talos.tpmozafterpaint", false);
+    useFNBPaint = Services.prefs.getBoolPref("talos.fnbpaint", false);
+    loadNoCache = Services.prefs.getBoolPref("talos.tploadnocache", false);
+    scrollTest = Services.prefs.getBoolPref("talos.tpscrolltest", false);
+    useBrowserChrome = Services.prefs.getBoolPref("talos.tpchrome", false);
+
+    // for pageloader tests the profiling info is found in an env variable
+    // because it is not available early enough to set it as a browser pref
+    var env = Components.classes["@mozilla.org/process/environment;1"].
+              getService(Components.interfaces.nsIEnvironment);
+
+    if (env.exists("TPPROFILINGINFO")) {
+      profilingInfo = env.get("TPPROFILINGINFO");
+      if (profilingInfo !== null) {
+        TalosParentProfiler.initFromObject(JSON.parse(profilingInfo));
+      }
+    }
 
     if (forceCC &&
         !window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
                .getInterface(Components.interfaces.nsIDOMWindowUtils)
                .garbageCollect) {
       forceCC = false;
     }
 
     gIOS = Cc["@mozilla.org/network/io-service;1"]
       .getService(Ci.nsIIOService);
-    if (args.offline)
-      gIOS.offline = true;
+
     var fileURI = gIOS.newURI(manifestURI);
     pages = plLoadURLsFromURI(fileURI);
 
     if (!pages) {
       dumpLine("tp: could not load URLs, quitting");
       plStop(true);
     }
 
     if (pages.length == 0) {
       dumpLine("tp: no pages to test, quitting");
       plStop(true);
     }
 
-    if (startIndex < 0)
-      startIndex = 0;
-    if (endIndex == -1 || endIndex >= pages.length)
-      endIndex = pages.length - 1;
-    if (startIndex > endIndex) {
-      dumpLine("tp: error: startIndex >= endIndex");
-      plStop(true);
-    }
-
-    pages = pages.slice(startIndex, endIndex + 1);
     pageUrls = pages.map(function(p) { return p.url.spec.toString(); });
     report = new Report();
-    if (doRenderTest)
-      renderReport = new Report();
 
     pageIndex = 0;
     if (profilingInfo) {
       TalosParentProfiler.beginTest(getCurrentPageShortName());
     }
 
     // Create a new chromed browser window for content
     var wwatch = Cc["@mozilla.org/embedcomp/window-watcher;1"]
       .getService(Ci.nsIWindowWatcher);
     var blank = Cc["@mozilla.org/supports-string;1"]
       .createInstance(Ci.nsISupportsString);
     blank.data = "about:blank";
 
     let toolbars = "all";
-    if (!args.useBrowserChrome) {
+    if (!useBrowserChrome) {
       toolbars = "titlebar,resizable";
     }
 
     browserWindow = wwatch.openWindow(null, "chrome://browser/content/", "_blank",
        `chrome,${toolbars},dialog=no,width=${winWidth},height=${winHeight}`, blank);
 
     gPaintWindow = browserWindow;
     // get our window out of the way
@@ -559,19 +538,17 @@ function plRecordTime(time) {
         report.recordTime(names, times[t]);
       } else {
         report.recordTime(names[t], times[t]);
       }
     }
   } else {
     report.recordTime(recordedName, time);
   }
-  if (noisy) {
-    dumpLine("Cycle " + (cycle + 1) + "(" + pageCycle + "): loaded " + pageName + " (next: " + nextName + ")");
-  }
+  dumpLine("Cycle " + (cycle + 1) + "(" + pageCycle + "): loaded " + pageName + " (next: " + nextName + ")");
 }
 
 function plLoadHandlerCapturing(evt) {
   // make sure we pick up the right load event
   if (evt.type != "load" ||
        evt.originalTarget.defaultView.frameElement)
       return;
 
@@ -704,20 +681,16 @@ function _loadHandler(fnbpaint = 0) {
   // does this page want to do its own timing?
   // if so, we shouldn't be here
   if (plPageFlags() & TEST_DOES_OWN_TIMING) {
     dumpLine("tp: Bubbling onload handler used with page that does its own timing?");
     plStop(true);
   }
 
   plRecordTime(duration);
-
-  if (doRenderTest)
-    runRenderTest();
-
   plNextPage();
 }
 
 // the core handler
 function plLoadHandlerMessage(message) {
   let fnbpaint = 0;
   if (message.json.fnbpaint !== undefined) {
     fnbpaint = message.json.fnbpaint;
@@ -739,18 +712,16 @@ function plLoadHandlerMessage(message) {
       } else if (!useMozAfterPaint) {
         time = gTime;
       }
       gTime = -1;
     }
 
     if (time !== undefined) {
       plRecordTime(time);
-      if (doRenderTest)
-        runRenderTest();
       plNextPage();
     }
   } else {
     _loadHandler(fnbpaint);
   }
 }
 
 // the record time handler
@@ -766,38 +737,16 @@ function plRecordTimeMessage(message) {
 }
 
 // error retrieving fnbpaint
 function plFNBPaintErrorMessage(message) {
   dumpLine("Abort: firstNonBlankPaint value is not available after loading the page");
   plStop(true);
 }
 
-function runRenderTest() {
-  const redrawsPerSample = 500;
-
-  if (!Ci.nsIDOMWindowUtils)
-    return;
-
-  var win;
-
-  if (browserWindow)
-    win = content.contentWindow;
-  else
-    win = window;
-  var wu = win.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils);
-
-  var start = Date.now();
-  for (var j = 0; j < redrawsPerSample; j++)
-    wu.redraw();
-  var end = Date.now();
-
-  renderReport.recordTime(pageIndex, end - start);
-}
-
 function plStop(force) {
   plStopAll(force);
 }
 
 function plStopAll(force) {
   try {
     if (force == false) {
       pageIndex = 0;
@@ -985,8 +934,9 @@ function plLoadURLsFromURI(manifestUri) 
 }
 
 function dumpLine(str) {
   if (MozillaFileLogger && MozillaFileLogger._foStream)
     MozillaFileLogger.log(str + "\n");
   dump(str);
   dump("\n");
 }
+
--- a/testing/talos/talos/pageloader/components/tp-cmdline.js
+++ b/testing/talos/talos/pageloader/components/tp-cmdline.js
@@ -66,79 +66,36 @@ PageLoaderCmdLineHandler.prototype =
       return this;
 
     throw Components.results.NS_ERROR_NO_INTERFACE;
   },
 
   /* nsICommandLineHandler */
   handle: function handler_handle(cmdLine) {
     var args = {};
-    try {
-      var uristr = cmdLine.handleFlagWithParam("tp", false);
-      if (uristr == null)
-        return;
-      try {
-        args.manifest = cmdLine.resolveURI(uristr).spec;
-      } catch (e) {
-        return;
-      }
 
-      args.numCycles = cmdLine.handleFlagWithParam("tpcycles", false);
-      args.numPageCycles = cmdLine.handleFlagWithParam("tppagecycles", false);
-      args.startIndex = cmdLine.handleFlagWithParam("tpstart", false);
-      args.endIndex = cmdLine.handleFlagWithParam("tpend", false);
-      args.filter = cmdLine.handleFlagWithParam("tpfilter", false);
-      args.useBrowserChrome = cmdLine.handleFlag("tpchrome", false);
-      args.doRender = cmdLine.handleFlag("tprender", false);
-      args.width = cmdLine.handleFlagWithParam("tpwidth", false);
-      args.height = cmdLine.handleFlagWithParam("tpheight", false);
-      args.profilinginfo = cmdLine.handleFlagWithParam("tpprofilinginfo", false);
-      args.offline = cmdLine.handleFlag("tpoffline", false);
-      args.noisy = cmdLine.handleFlag("tpnoisy", false);
-      args.timeout = cmdLine.handleFlagWithParam("tptimeout", false);
-      args.delay = cmdLine.handleFlagWithParam("tpdelay", false);
-      args.noForceCC = cmdLine.handleFlag("tpnoforcecc", false);
-      args.mozafterpaint = cmdLine.handleFlag("tpmozafterpaint", false);
-      args.fnbpaint = cmdLine.handleFlag("fnbpaint", false);
-      args.loadnocache = cmdLine.handleFlag("tploadnocache", false);
-      args.scrolltest = cmdLine.handleFlag("tpscrolltest", false);
-    } catch (e) {
+    var tpmanifest = Services.prefs.getCharPref("talos.tpmanifest", null);
+    if (tpmanifest == null) {
+      // pageloader tests as well as startup tests use this pageloader add-on; pageloader tests
+      // pass in a 'tpmanifest' which has been set to the talos.tpmanifest pref; startup tests
+      // don't use 'tpmanifest' but pass in the test page which is forwarded onto the Firefox cmd
+      // line. If this is a startup test exit here as we don't need a pageloader window etc.
       return;
     }
 
     let chromeURL = "chrome://pageloader/content/pageloader.xul";
 
     args.wrappedJSObject = args;
+
     Services.ww.openWindow(null, chromeURL, "_blank",
                             "chrome,dialog=no,all", args);
 
     // Don't pass command line to the default app processor
     cmdLine.preventDefault = true;
   },
-
-  helpInfo:
-  "  -tp <file>             Run pageload perf tests on given manifest\n" +
-  "  -tpfilter str          Only include pages from manifest that contain str (regexp)\n" +
-  "  -tpcycles n            Loop through pages n times\n" +
-  "  -tppagecycles n        Loop through each page n times before going onto the next page\n" +
-  "  -tpstart n             Start at index n in the manifest\n" +
-  "  -tpend n               End with index n in the manifest\n" +
-  "  -tpchrome              Test with normal browser chrome\n" +
-  "  -tprender              Run render-only benchmark for each page\n" +
-  "  -tpwidth width         Width of window\n" +
-  "  -tpheight height       Height of window\n" +
-  "  -tbprofilinginfo       A JSON object describing profiler settings\n" +
-  "  -tpoffline             Force offline mode\n" +
-  "  -tpnoisy               Dump the name of the last loaded page to console\n" +
-  "  -tptimeout             Max amount of time given for a page to load, quit if exceeded\n" +
-  "  -tpdelay               Amount of time to wait between each pageload\n" +
-  "  -tpnoforcecc           Don't force cycle collection between each pageload\n" +
-  "  -tpmozafterpaint       Measure Time after recieving MozAfterPaint event instead of load event\n" +
-  "  -fnbpaint  Measure time after a first non-blank paint has occurred\n" +
-  "  -tpscrolltest          Unknown\n"
 };
 
 
 var PageLoaderCmdLineFactory =
 {
   createInstance(outer, iid) {
     if (outer != null) {
       throw Components.results.NS_ERROR_NO_AGGREGATION;
--- a/testing/talos/talos/pageloader/install.rdf
+++ b/testing/talos/talos/pageloader/install.rdf
@@ -1,15 +1,15 @@
 <?xml version="1.0"?>
 
 <RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
      xmlns:em="http://www.mozilla.org/2004/em-rdf#">
   <Description about="urn:mozilla:install-manifest">
     <em:id>pageloader@mozilla.org</em:id>
-    <em:version>1.0.30</em:version>
+    <em:version>1.0.32</em:version>
     <em:targetApplication>
       <Description>
         <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
         <em:minVersion>44.0</em:minVersion>
         <em:maxVersion>*</em:maxVersion>
       </Description>
     </em:targetApplication>
     <!-- Front End MetaData -->
index 0ff2653559ab0509ac189e678aea33c1e2ce82d0..1865161888ad210f556bad5ff820c9b630fc9acd
GIT binary patch
literal 29693
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
--- a/testing/talos/talos/run_tests.py
+++ b/testing/talos/talos/run_tests.py
@@ -32,54 +32,44 @@ def useBaseTestDefaults(base, tests):
         for item in base:
             if item not in test:
                 test[item] = base[item]
                 if test[item] is None:
                     test[item] = ''
     return tests
 
 
-def buildCommandLine(test):
-    """build firefox command line options for tp tests"""
-
+def set_tp_preferences(test, browser_config):
     # sanity check pageloader values
     # mandatory options: tpmanifest, tpcycles
     if test['tpcycles'] not in range(1, 1000):
         raise TalosError('pageloader cycles must be int 1 to 1,000')
-    if test.get('tpdelay') and test['tpdelay'] not in range(1, 10000):
-        raise TalosError('pageloader delay must be int 1 to 10,000')
     if 'tpmanifest' not in test:
         raise TalosError("tpmanifest not found in test: %s" % test)
 
     # if profiling is on, override tppagecycles to prevent test hanging
     if test['gecko_profile']:
         LOG.info("Gecko profiling is enabled so talos is reducing the number "
                  "of cycles, please disregard reported numbers")
         for cycle_var in ['tppagecycles', 'tpcycles', 'cycles']:
             if test[cycle_var] > 2:
                 test[cycle_var] = 2
 
-    # build pageloader command from options
-    url = ['-tp', test['tpmanifest']]
-    CLI_bool_options = ['tpchrome', 'tpmozafterpaint', 'tpnoisy', 'tprender',
-                        'tploadnocache', 'tpscrolltest', 'fnbpaint']
-    CLI_options = ['tpcycles', 'tppagecycles', 'tpdelay', 'tptimeout']
+    CLI_bool_options = ['tpchrome', 'tpmozafterpaint', 'tploadnocache', 'tpscrolltest', 'fnbpaint']
+    CLI_options = ['tpcycles', 'tppagecycles', 'tptimeout']
     for key in CLI_bool_options:
-        if test.get(key):
-            url.append('-%s' % key)
+        if key in test:
+            _pref_name = "talos.%s" % key
+            test['preferences'][_pref_name] = test.get(key)
 
     for key in CLI_options:
         value = test.get(key)
         if value:
-            url.extend(['-%s' % key, str(value)])
-
-    # XXX we should actually return the list but since we abuse
-    # the url as a command line flag to pass to firefox all over the place
-    # will just make a string for now
-    return ' '.join(url)
+            _pref_name = "talos.%s" % key
+            test['preferences'][_pref_name] = value
 
 
 def setup_webserver(webserver):
     """use mozhttpd to setup a webserver"""
     LOG.info("starting webserver on %r" % webserver)
 
     host, port = webserver.split(':')
     return mozhttpd.MozHttpd(host=host, port=int(port), docroot=here)
@@ -98,20 +88,23 @@ def run_tests(config, browser_config):
         # Build command line from config
         for path in paths:
             if test.get(path):
                 test[path] = utils.interpolate(test[path])
         if test.get('tpmanifest'):
             test['tpmanifest'] = \
                 os.path.normpath('file:/%s' % (urllib.quote(test['tpmanifest'],
                                                '/\\t:\\')))
+            test['preferences']['talos.tpmanifest'] = test['tpmanifest']
+
         if not test.get('url'):
-            # build 'url' for tptest
-            test['url'] = buildCommandLine(test)
-        test['url'] = utils.interpolate(test['url'])
+            # set browser prefs for pageloader test setings (doesn't use cmd line args / url)
+            test['url'] = None
+            set_tp_preferences(test, browser_config)
+
         test['setup'] = utils.interpolate(test['setup'])
         test['cleanup'] = utils.interpolate(test['cleanup'])
 
         if not test.get('profile', False):
             test['profile'] = config.get('profile')
 
     # pass --no-remote to firefox launch, if --develop is specified
     # we do that to allow locally the user to have another running firefox
--- a/testing/talos/talos/test.py
+++ b/testing/talos/talos/test.py
@@ -882,48 +882,16 @@ class perf_reftest_singletons(Pageloader
     gecko_profile_entries = 2000000
     filters = filter.ignore_first.prepare(5) + filter.median.prepare()
     unit = 'ms'
     lower_is_better = True
     alert_threshold = 5.0
 
 
 @register_test()
-class quantum_pageload_google(QuantumPageloadTest):
-    """
-    Quantum Pageload Test - Google
-    """
-    tpmanifest = '${talos}/tests/quantum_pageload/quantum_pageload_google.manifest'
-
-
-@register_test()
-class quantum_pageload_youtube(QuantumPageloadTest):
-    """
-    Quantum Pageload Test - YouTube
-    """
-    tpmanifest = '${talos}/tests/quantum_pageload/quantum_pageload_youtube.manifest'
-
-
-@register_test()
-class quantum_pageload_amazon(QuantumPageloadTest):
-    """
-    Quantum Pageload Test - Amazon
-    """
-    tpmanifest = '${talos}/tests/quantum_pageload/quantum_pageload_amazon.manifest'
-
-
-@register_test()
-class quantum_pageload_facebook(QuantumPageloadTest):
-    """
-    Quantum Pageload Test - Facebook
-    """
-    tpmanifest = '${talos}/tests/quantum_pageload/quantum_pageload_facebook.manifest'
-
-
-@register_test()
 class tp6_google(QuantumPageloadTest):
     """
     Quantum Pageload Test - Google
     """
     tpmanifest = '${talos}/tests/quantum_pageload/quantum_pageload_google.manifest'
 
 
 @register_test()
--- a/testing/talos/talos/ttest.py
+++ b/testing/talos/talos/ttest.py
@@ -8,16 +8,17 @@
      - tests the profile
      - gets metrics for the current test environment
      - loads the url
      - collects info on any counters while test runs
      - waits for a 'dump' from the browser
 """
 from __future__ import absolute_import, print_function
 
+import json
 import os
 import platform
 import shutil
 import subprocess
 import sys
 
 import mozcrash
 import mozfile
@@ -103,21 +104,23 @@ class TTest(object):
             setup.env['STYLO_FORCE_ENABLED'] = '1'
         if browser_config['disable_stylo']:
             setup.env['STYLO_FORCE_DISABLED'] = '1'
 
         # During the Stylo transition, measure different number of threads
         if browser_config.get('stylothreads', 0) > 0:
             setup.env['STYLO_THREADS'] = str(browser_config['stylothreads'])
 
-        test_config['url'] = utils.interpolate(
-            test_config['url'],
-            profile=setup.profile_dir,
-            firefox=browser_config['browser_path']
-        )
+        # set url if there is one (i.e. receiving a test page, not a manifest/pageloader test)
+        if test_config.get('url', None) is not None:
+            test_config['url'] = utils.interpolate(
+                test_config['url'],
+                profile=setup.profile_dir,
+                firefox=browser_config['browser_path']
+            )
 
         # setup global (cross-cycle) counters:
         # shutdown, responsiveness
         global_counters = {}
         if browser_config.get('xperf_path'):
             for c in test_config.get('xperf_counters', []):
                 global_counters[c] = []
 
@@ -165,16 +168,18 @@ class TTest(object):
                     shutil.copy(origin, dest)
 
             # Run the test
             timeout = test_config.get('timeout', 7200)  # 2 hours default
             if setup.gecko_profile:
                 # When profiling, give the browser some extra time
                 # to dump the profile.
                 timeout += 5 * 60
+                # store profiling info for pageloader; too late to add it as browser pref
+                setup.env["TPPROFILINGINFO"] = json.dumps(setup.gecko_profile.profiling_info)
 
             command_args = utils.GenerateBrowserCommandLine(
                 browser_config["browser_path"],
                 browser_config["extra_args"],
                 setup.profile_dir,
                 test_config['url'],
                 profiling_info=(setup.gecko_profile.profiling_info
                                 if setup.gecko_profile else None)
--- a/testing/talos/talos/unittests/test_config.py
+++ b/testing/talos/talos/unittests/test_config.py
@@ -235,24 +235,16 @@ class Test_get_config(object):
         cls.argv_tsvg_static = '--activeTests tsvg_static -e /some/random/path'.split()
         cls.argv_tsvgr_opacity = '--activeTests tsvgr_opacity -e /some/random/path'.split()
         cls.argv_tscrollx = '--activeTests tscrollx -e /some/random/path'.split()
         cls.argv_a11yr = '--activeTests a11yr -e /some/random/path'.split()
         cls.argv_speedometer = '--activeTests speedometer -e /some/random/path'.split()
         cls.argv_perf_reftest = '--activeTests perf_reftest -e /some/random/path'.split()
         cls.argv_perf_reftest_singletons = \
             '--activeTests perf_reftest_singletons -e /some/random/path'.split()
-        cls.argv_quantum_pageload_google = \
-            '--activeTests quantum_pageload_google -e /some/random/path'.split()
-        cls.argv_quantum_pageload_youtube = \
-            '--activeTests quantum_pageload_youtube -e /some/random/path'.split()
-        cls.argv_quantum_pageload_amazon = \
-            '--activeTests quantum_pageload_amazon -e /some/random/path'.split()
-        cls.argv_quantum_pageload_facebook = \
-            '--activeTests quantum_pageload_facebook -e /some/random/path'.split()
         cls.argv_tp6_google = '--activeTests tp6_google -e /some/random/path'.split()
         cls.argv_tp6_google_heavy = '--activeTests tp6_google_heavy -e /some/random/path'.split()
         cls.argv_tp6_youtube = '--activeTests tp6_youtube -e /some/random/path'.split()
         cls.argv_tp6_youtube_heavy = '--activeTests tp6_youtube_heavy -e /some/random/path'.split()
         cls.argv_tp6_amazon = '--activeTests tp6_amazon -e /some/random/path'.split()
         cls.argv_tp6_amazon_heavy = '--activeTests tp6_amazon_heavy -e /some/random/path'.split()
         cls.argv_tp6_facebook = '--activeTests tp6_facebook -e /some/random/path'.split()
         cls.argv_tp6_facebook_heavy = \
@@ -981,80 +973,16 @@ class Test_get_config(object):
         assert test_config['tptimeout'] == 30000
         assert test_config['gecko_profile_interval'] == 1
         assert test_config['gecko_profile_entries'] == 2000000
         assert test_config['filters'] is not None
         assert test_config['unit'] == 'ms'
         assert test_config['lower_is_better'] is True
         assert test_config['alert_threshold'] == 5.0
 
-    def test_quantum_pageload_google_has_expected_attributes(self):
-        config = get_config(self.argv_quantum_pageload_google)
-        test_config = config['tests'][0]
-
-        assert test_config['name'] == 'quantum_pageload_google'
-        assert test_config['tpcycles'] == 1
-        assert test_config['tppagecycles'] == 25
-        assert test_config['gecko_profile_interval'] == 1
-        assert test_config['gecko_profile_entries'] == 2000000
-        assert test_config['filters'] is not None
-        assert test_config['unit'] == 'ms'
-        assert test_config['lower_is_better'] is True
-        assert test_config['fnbpaint'] is True
-        assert test_config['tpmanifest'] != \
-            '${talos}/tests/quantum_pageload/quantum_pageload_google.manifest'
-
-    def test_quantum_pageload_youtube_has_expected_attributes(self):
-        config = get_config(self.argv_quantum_pageload_youtube)
-        test_config = config['tests'][0]
-
-        assert test_config['name'] == 'quantum_pageload_youtube'
-        assert test_config['tpcycles'] == 1
-        assert test_config['tppagecycles'] == 25
-        assert test_config['gecko_profile_interval'] == 1
-        assert test_config['gecko_profile_entries'] == 2000000
-        assert test_config['filters'] is not None
-        assert test_config['unit'] == 'ms'
-        assert test_config['lower_is_better'] is True
-        assert test_config['fnbpaint'] is True
-        assert test_config['tpmanifest'] != \
-            '${talos}/tests/quantum_pageload/quantum_pageload_youtube.manifest'
-
-    def test_quantum_pageload_amazon_has_expected_attributes(self):
-        config = get_config(self.argv_quantum_pageload_amazon)
-        test_config = config['tests'][0]
-
-        assert test_config['name'] == 'quantum_pageload_amazon'
-        assert test_config['tpcycles'] == 1
-        assert test_config['tppagecycles'] == 25
-        assert test_config['gecko_profile_interval'] == 1
-        assert test_config['gecko_profile_entries'] == 2000000
-        assert test_config['filters'] is not None
-        assert test_config['unit'] == 'ms'
-        assert test_config['lower_is_better'] is True
-        assert test_config['fnbpaint'] is True
-        assert test_config['tpmanifest'] != \
-            '${talos}/tests/quantum_pageload/quantum_pageload_amazon.manifest'
-
-    def test_quantum_pageload_facebook_has_expected_attributes(self):
-        config = get_config(self.argv_quantum_pageload_facebook)
-        test_config = config['tests'][0]
-
-        assert test_config['name'] == 'quantum_pageload_facebook'
-        assert test_config['tpcycles'] == 1
-        assert test_config['tppagecycles'] == 25
-        assert test_config['gecko_profile_interval'] == 1
-        assert test_config['gecko_profile_entries'] == 2000000
-        assert test_config['filters'] is not None
-        assert test_config['unit'] == 'ms'
-        assert test_config['lower_is_better'] is True
-        assert test_config['fnbpaint'] is True
-        assert test_config['tpmanifest'] != \
-            '${talos}/tests/quantum_pageload/quantum_pageload_facebook.manifest'
-
     def test_tp6_google_has_expected_attributes(self):
         config = get_config(self.argv_tp6_google)
         test_config = config['tests'][0]
 
         assert test_config['name'] == 'tp6_google'
         assert test_config['tpcycles'] == 1
         assert test_config['tppagecycles'] == 25
         assert test_config['gecko_profile_interval'] == 1
--- a/testing/talos/talos/utils.py
+++ b/testing/talos/talos/utils.py
@@ -1,16 +1,15 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 """Utility functions for Talos"""
 from __future__ import absolute_import
 
-import json
 import os
 import platform
 import re
 import string
 import time
 import urllib
 import urlparse
 
@@ -116,43 +115,44 @@ def parse_pref(value):
     """parse a preference value from a string"""
     from mozprofile.prefs import Preferences
     return Preferences.cast(value)
 
 
 def GenerateBrowserCommandLine(browser_path, extra_args, profile_dir,
                                url, profiling_info=None):
     # TODO: allow for spaces in file names on Windows
-
     command_args = [browser_path.strip()]
     if platform.system() == "Darwin":
         command_args.extend(['-foreground'])
 
     if isinstance(extra_args, list):
         command_args.extend(extra_args)
 
     elif extra_args.strip():
         command_args.extend([extra_args])
 
     command_args.extend(['-profile', profile_dir])
 
     if profiling_info:
-        # For pageloader, buildCommandLine() puts the -tp* command line
-        # options into the url argument.
-        # It would be better to assemble all -tp arguments in one place,
-        # but we don't have the profiling information in buildCommandLine().
-        if url.find(' -tp') != -1:
-            command_args.extend(['-tpprofilinginfo',
-                                 json.dumps(profiling_info)])
-        elif url.find('?') != -1:
-            url += '&' + urllib.urlencode(profiling_info)
-        else:
-            url += '?' + urllib.urlencode(profiling_info)
+        # pageloader tests use a tpmanifest browser pref instead of passing in a manifest url
+        # profiling info is handled differently for pageloader vs non-pageloader (startup) tests
+        # for pageloader the profiling info was mirrored already in an env var; so here just
+        # need to setup profiling info for startup / non-pageloader tests
+        if url is not None:
+            # for non-pageloader/non-manifest tests the profiling info is added to the test url
+            if url.find('?') != -1:
+                url += '&' + urllib.urlencode(profiling_info)
+            else:
+                url += '?' + urllib.urlencode(profiling_info)
+            command_args.extend(url.split(' '))
 
-    command_args.extend(url.split(' '))
+    # if there's a url i.e. startup test / non-manifest test, add it to the cmd line args
+    if url is not None:
+        command_args.extend(url.split(' '))
 
     return command_args
 
 
 def indexed_items(itr):
     """
     Generator that allows us to figure out which item is the last one so
     that we can serialize this data properly