Source code

Revision control

Copy as Markdown

Other Tools

# 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 argparse
import json
import os
DEBUG_CRITICAL = 0
DEBUG_ERROR = 1
DEBUG_WARNING = 2
DEBUG_INFO = 3
DEBUG_VERBOSE = 4
class XTalosError(Exception):
"""error related to xtalos invocation"""
def options_from_config(options, config_file):
"""override options from a json config file; returns the dictionary
- options: a dictionary with default options
- config_file: path to a json config file
"""
with open(config_file, "r") as config:
conf = json.load(config)
for optname, value in options.items():
options[optname] = conf.get(optname, value)
return options
class XtalosOptions(argparse.ArgumentParser):
def __init__(self, **kwargs):
argparse.ArgumentParser.__init__(self, **kwargs)
defaults = {}
self.add_argument(
"--pid", dest="processID", help="process ID of the process we launch"
)
defaults["processID"] = None
self.add_argument(
"-x",
"--xperf",
dest="xperf_path",
help="location of xperf tool, defaults to" " 'xperf.exe'",
)
defaults["xperf_path"] = "xperf.exe"
self.add_argument(
"-e",
"--etl_filename",
dest="etl_filename",
help="Name of the .etl file to work with." " Defaults to 'output.etl'",
)
defaults["etl_filename"] = "test.etl"
self.add_argument(
"-d",
"--debug",
type=int,
dest="debug_level",
help="debug level for output from tool (0-5, 5"
" being everything), defaults to 1",
)
defaults["debug_level"] = 1
self.add_argument(
"-o",
"--output-file",
dest="outputFile",
help="Filename to write all output to, default" " is stdout",
)
defaults["outputFile"] = "etl_output.csv"
self.add_argument(
"-r",
"--providers",
dest="xperf_providers",
action="append",
help="xperf providers to collect data from",
)
defaults["xperf_providers"] = []
self.add_argument(
"--user-providers",
dest="xperf_user_providers",
action="append",
help="user mode xperf providers to collect data" " from",
)
defaults["xperf_user_providers"] = []
self.add_argument(
"-s",
"--stackwalk",
dest="xperf_stackwalk",
action="append",
help="xperf stackwalk arguments to collect",
)
defaults["xperf_stackwalk"] = []
self.add_argument(
"-c",
"--config-file",
dest="configFile",
help="Name of the json config file with test run"
" and browser information",
)
defaults["configFile"] = None
self.add_argument(
"-w",
"--allowlist-file",
dest="allowlist_file",
help="Name of allowlist file",
)
defaults["allowlist_file"] = None
self.add_argument(
"-i",
"--all-stages",
dest="all_stages",
action="store_true",
help="Include all stages in file I/O output," "not just startup",
)
defaults["all_stages"] = False
self.add_argument(
"-t",
"--all-threads",
dest="all_threads",
action="store_true",
help="Include all threads in file I/O output," " not just main",
)
defaults["all_threads"] = False
self.add_argument(
"-a",
"--approot",
dest="approot",
help="Provide the root directory of the application"
" we are testing to find related files (i.e."
" dependentlibs.list)",
)
defaults["approot"] = None
self.add_argument(
"--error-filename",
dest="error_filename",
help="Filename to store the failures detected" " while runnning the test",
)
defaults["error_filename"] = None
self.set_defaults(**defaults)
def verifyOptions(self, options):
# override options from config file
if options.configFile:
options_from_config(options.__dict__, options.configFile)
# ensure xperf path exists
options.xperf_path = os.path.abspath(options.xperf_path)
if not os.path.exists(options.xperf_path):
print("ERROR: xperf_path '%s' does not exist" % options.xperf_path)
return None
return options