#!/usr/bin/env python
# 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/.
import os
import subprocess
import sys
import etlparser
import xtalos
from xperf_analyzer
import (
ProcessStart,
SessionStoreWindowRestored,
XPerfAttribute,
XPerfFile,
XPerfInterval,
)
def run_session_restore_analysis(debug=
False, **kwargs):
required = (
"csv_filename",
"outputFile")
for r
in required:
if r
not in kwargs:
raise xtalos.XTalosError(
"%s required" % r)
final_output_file =
"%s_session_restore_stats%s" % os.path.splitext(
kwargs[
"outputFile"]
)
output =
"time_to_session_store_window_restored_ms\n"
with XPerfFile(csvfile=kwargs[
"csv_filename"], debug=debug)
as xperf:
fx_start = ProcessStart(
"firefox.exe")
ss_window_restored = SessionStoreWindowRestored()
interval = XPerfInterval(fx_start, ss_window_restored)
xperf.add_attr(interval)
xperf.analyze()
results = interval.get_results()
if results != {}:
output +=
"%.3f\n" % (results[XPerfAttribute.RESULT])
with open(final_output_file,
"w")
as out:
out.write(output)
if debug:
etlparser.uploadFile(final_output_file)
def stop(xperf_path, debug=
False):
xperf_cmd = [xperf_path,
"-stop",
"-stop",
"talos_ses"]
if debug:
print(
"executing '%s'" % subprocess.list2cmdline(xperf_cmd))
subprocess.call(xperf_cmd)
def stop_from_config(config_file=
None, debug=
False, **kwargs):
"""start from a YAML config file"""
# required options and associated error messages
required = {
"xperf_path":
"xperf_path not given",
"etl_filename":
"No etl_filename given",
}
for key
in required:
if key
not in kwargs:
kwargs[key] =
None
if config_file:
# override options from YAML config file
kwargs = xtalos.options_from_config(kwargs, config_file)
# ensure the required options are given
for key, msg
in required.items():
if not kwargs.get(key):
raise xtalos.XTalosError(msg)
# ensure path to xperf actually exists
if not os.path.exists(kwargs[
"xperf_path"]):
raise xtalos.XTalosError(
"ERROR: xperf_path '%s' does not exist" % kwargs[
"xperf_path"]
)
# make calling arguments
stopargs = {}
stopargs[
"xperf_path"] = kwargs[
"xperf_path"]
stopargs[
"debug"] = debug
# call start
stop(**stopargs)
etlparser.etlparser_from_config(
config_file,
approot=kwargs[
"approot"],
error_filename=kwargs[
"error_filename"],
processID=kwargs[
"processID"],
)
csv_base =
"%s.csv" % kwargs[
"etl_filename"]
run_session_restore_analysis(csv_filename=csv_base, debug=debug, **kwargs)
if not debug:
os.remove(csv_base)
def main(args=sys.argv[1:]):
# parse command line arguments
parser = xtalos.XtalosOptions()
args = parser.parse_args(args)
# stop xperf
try:
stop_from_config(
config_file=args.configFile,
debug=args.debug_level >= xtalos.DEBUG_INFO,
**args.__dict__
)
except xtalos.XTalosError
as e:
parser.error(str(e))
if __name__ ==
"__main__":
main()