xref: /aosp_15_r20/external/chromium-trace/catapult/tracing/tracing_project.py (revision 1fa4b3da657c0e9ad43c0220bacf9731820715a5)
1*1fa4b3daSHector Dearman# Copyright (c) 2014 The Chromium Authors. All rights reserved.
2*1fa4b3daSHector Dearman# Use of this source code is governed by a BSD-style license that can be
3*1fa4b3daSHector Dearman# found in the LICENSE file.
4*1fa4b3daSHector Dearman
5*1fa4b3daSHector Dearmanimport sys
6*1fa4b3daSHector Dearmanimport os
7*1fa4b3daSHector Dearmanimport re
8*1fa4b3daSHector Dearman
9*1fa4b3daSHector Dearman
10*1fa4b3daSHector Dearmandef _AddToPathIfNeeded(path):
11*1fa4b3daSHector Dearman  if path not in sys.path:
12*1fa4b3daSHector Dearman    sys.path.insert(0, path)
13*1fa4b3daSHector Dearman
14*1fa4b3daSHector Dearman
15*1fa4b3daSHector Dearmandef UpdateSysPathIfNeeded():
16*1fa4b3daSHector Dearman  for path in GetDependencyPaths():
17*1fa4b3daSHector Dearman    _AddToPathIfNeeded(path)
18*1fa4b3daSHector Dearman
19*1fa4b3daSHector Dearman
20*1fa4b3daSHector Dearmandef GetDependencyPaths():
21*1fa4b3daSHector Dearman  # TODO(#3703): Separate the paths that are only used by the dev server into
22*1fa4b3daSHector Dearman  # another call.
23*1fa4b3daSHector Dearman  p = TracingProject()
24*1fa4b3daSHector Dearman  return [
25*1fa4b3daSHector Dearman      p.catapult_path,
26*1fa4b3daSHector Dearman      p.py_vulcanize_path,
27*1fa4b3daSHector Dearman      p.vinn_path,
28*1fa4b3daSHector Dearman      p.protobuf_path,
29*1fa4b3daSHector Dearman      os.path.join(p.catapult_third_party_path, 'WebOb'),
30*1fa4b3daSHector Dearman      os.path.join(p.catapult_third_party_path, 'Paste'),
31*1fa4b3daSHector Dearman      os.path.join(p.catapult_third_party_path, 'six'),
32*1fa4b3daSHector Dearman      os.path.join(p.catapult_third_party_path, 'webapp2'),
33*1fa4b3daSHector Dearman      os.path.join(p.catapult_path, 'common', 'py_utils'),
34*1fa4b3daSHector Dearman      os.path.join(p.tracing_third_party_path, 'symbols')
35*1fa4b3daSHector Dearman  ]
36*1fa4b3daSHector Dearman
37*1fa4b3daSHector Dearman
38*1fa4b3daSHector Dearmandef _FindAllFilesRecursive(source_paths):
39*1fa4b3daSHector Dearman  assert isinstance(source_paths, list)
40*1fa4b3daSHector Dearman  all_filenames = set()
41*1fa4b3daSHector Dearman  for source_path in source_paths:
42*1fa4b3daSHector Dearman    for dirpath, _, filenames in os.walk(source_path):
43*1fa4b3daSHector Dearman      for f in filenames:
44*1fa4b3daSHector Dearman        if f.startswith('.'):
45*1fa4b3daSHector Dearman          continue
46*1fa4b3daSHector Dearman        x = os.path.abspath(os.path.join(dirpath, f))
47*1fa4b3daSHector Dearman        all_filenames.add(x)
48*1fa4b3daSHector Dearman  return all_filenames
49*1fa4b3daSHector Dearman
50*1fa4b3daSHector Dearmandef _IsFilenameATest(x):
51*1fa4b3daSHector Dearman  if x.endswith('_test.js'):
52*1fa4b3daSHector Dearman    return True
53*1fa4b3daSHector Dearman
54*1fa4b3daSHector Dearman  if x.endswith('_test.html'):
55*1fa4b3daSHector Dearman    return True
56*1fa4b3daSHector Dearman
57*1fa4b3daSHector Dearman  if x.endswith('_unittest.js'):
58*1fa4b3daSHector Dearman    return True
59*1fa4b3daSHector Dearman
60*1fa4b3daSHector Dearman  if x.endswith('_unittest.html'):
61*1fa4b3daSHector Dearman    return True
62*1fa4b3daSHector Dearman
63*1fa4b3daSHector Dearman  # TODO(nduca): Add content test?
64*1fa4b3daSHector Dearman  return False
65*1fa4b3daSHector Dearman
66*1fa4b3daSHector Dearman
67*1fa4b3daSHector Dearmanclass TracingProject(object):
68*1fa4b3daSHector Dearman  catapult_path = os.path.abspath(
69*1fa4b3daSHector Dearman      os.path.join(os.path.dirname(__file__), os.path.pardir))
70*1fa4b3daSHector Dearman
71*1fa4b3daSHector Dearman  tracing_root_path = os.path.join(catapult_path, 'tracing')
72*1fa4b3daSHector Dearman  trace_processor_root_path = os.path.join(catapult_path, 'trace_processor')
73*1fa4b3daSHector Dearman  common_root_path = os.path.join(catapult_path, 'common')
74*1fa4b3daSHector Dearman  tracing_src_path = os.path.join(tracing_root_path, 'tracing')
75*1fa4b3daSHector Dearman  extras_path = os.path.join(tracing_src_path, 'extras')
76*1fa4b3daSHector Dearman  ui_extras_path = os.path.join(tracing_src_path, 'ui', 'extras')
77*1fa4b3daSHector Dearman
78*1fa4b3daSHector Dearman  catapult_third_party_path = os.path.join(catapult_path, 'third_party')
79*1fa4b3daSHector Dearman  polymer_path = os.path.join(catapult_third_party_path, 'polymer')
80*1fa4b3daSHector Dearman
81*1fa4b3daSHector Dearman  # We need google.protobuf for tests that use the proto. The dashboard uses
82*1fa4b3daSHector Dearman  # the gae_ts_mon protobuf lib for its tests, so let's do the same for tracing.
83*1fa4b3daSHector Dearman  protobuf_path = os.path.join(
84*1fa4b3daSHector Dearman      catapult_third_party_path, 'gae_ts_mon', 'gae_ts_mon', 'protobuf')
85*1fa4b3daSHector Dearman
86*1fa4b3daSHector Dearman  tracing_third_party_path = os.path.join(tracing_root_path, 'third_party')
87*1fa4b3daSHector Dearman  py_vulcanize_path = os.path.join(common_root_path, 'py_vulcanize')
88*1fa4b3daSHector Dearman  vinn_path = os.path.join(catapult_third_party_path, 'vinn')
89*1fa4b3daSHector Dearman
90*1fa4b3daSHector Dearman  jszip_path = os.path.join(tracing_third_party_path, 'jszip')
91*1fa4b3daSHector Dearman  pako_path = os.path.join(tracing_third_party_path, 'pako')
92*1fa4b3daSHector Dearman  jpegjs_path = os.path.join(tracing_third_party_path, 'jpeg-js')
93*1fa4b3daSHector Dearman
94*1fa4b3daSHector Dearman  glmatrix_path = os.path.join(
95*1fa4b3daSHector Dearman      tracing_third_party_path, 'gl-matrix', 'dist')
96*1fa4b3daSHector Dearman
97*1fa4b3daSHector Dearman  mannwhitneyu_path = os.path.join(
98*1fa4b3daSHector Dearman      tracing_third_party_path, 'mannwhitneyu')
99*1fa4b3daSHector Dearman
100*1fa4b3daSHector Dearman  ui_path = os.path.join(tracing_src_path, 'ui')
101*1fa4b3daSHector Dearman  d3_path = os.path.join(tracing_third_party_path, 'd3')
102*1fa4b3daSHector Dearman  chai_path = os.path.join(tracing_third_party_path, 'chai')
103*1fa4b3daSHector Dearman  mocha_path = os.path.join(tracing_third_party_path, 'mocha')
104*1fa4b3daSHector Dearman  oboe_path = os.path.join(tracing_third_party_path, 'oboe')
105*1fa4b3daSHector Dearman
106*1fa4b3daSHector Dearman  mre_path = os.path.join(tracing_src_path, 'mre')
107*1fa4b3daSHector Dearman
108*1fa4b3daSHector Dearman  metrics_path = os.path.join(tracing_src_path, 'metrics')
109*1fa4b3daSHector Dearman  diagnostics_path = os.path.join(tracing_src_path, 'value', 'diagnostics')
110*1fa4b3daSHector Dearman
111*1fa4b3daSHector Dearman  value_ui_path = os.path.join(tracing_src_path, 'value', 'ui')
112*1fa4b3daSHector Dearman  metrics_ui_path = os.path.join(tracing_src_path, 'metrics', 'ui')
113*1fa4b3daSHector Dearman
114*1fa4b3daSHector Dearman  test_data_path = os.path.join(tracing_root_path, 'test_data')
115*1fa4b3daSHector Dearman  skp_data_path = os.path.join(tracing_root_path, 'skp_data')
116*1fa4b3daSHector Dearman
117*1fa4b3daSHector Dearman  rjsmin_path = os.path.join(
118*1fa4b3daSHector Dearman      tracing_third_party_path, 'tvcm', 'third_party', 'rjsmin')
119*1fa4b3daSHector Dearman  rcssmin_path = os.path.join(
120*1fa4b3daSHector Dearman      tracing_third_party_path, 'tvcm', 'third_party', 'rcssmin')
121*1fa4b3daSHector Dearman
122*1fa4b3daSHector Dearman  def __init__(self):
123*1fa4b3daSHector Dearman    self.source_paths = []
124*1fa4b3daSHector Dearman    self.source_paths.append(self.tracing_root_path)
125*1fa4b3daSHector Dearman    self.source_paths.append(self.polymer_path)
126*1fa4b3daSHector Dearman    self.source_paths.append(self.tracing_third_party_path)
127*1fa4b3daSHector Dearman    self.source_paths.append(self.mre_path)
128*1fa4b3daSHector Dearman    self.source_paths.append(self.jszip_path)
129*1fa4b3daSHector Dearman    self.source_paths.append(self.pako_path)
130*1fa4b3daSHector Dearman    self.source_paths.append(self.jpegjs_path)
131*1fa4b3daSHector Dearman    self.source_paths.append(self.glmatrix_path)
132*1fa4b3daSHector Dearman    self.source_paths.append(self.mannwhitneyu_path)
133*1fa4b3daSHector Dearman    self.source_paths.append(self.d3_path)
134*1fa4b3daSHector Dearman    self.source_paths.append(self.chai_path)
135*1fa4b3daSHector Dearman    self.source_paths.append(self.mocha_path)
136*1fa4b3daSHector Dearman    self.source_paths.append(self.oboe_path)
137*1fa4b3daSHector Dearman
138*1fa4b3daSHector Dearman  def CreateVulcanizer(self):
139*1fa4b3daSHector Dearman    from py_vulcanize import project as project_module
140*1fa4b3daSHector Dearman    return project_module.Project(self.source_paths)
141*1fa4b3daSHector Dearman
142*1fa4b3daSHector Dearman  def IsD8CompatibleFile(self, filename):
143*1fa4b3daSHector Dearman    if filename.startswith(self.ui_path):
144*1fa4b3daSHector Dearman      return False
145*1fa4b3daSHector Dearman
146*1fa4b3daSHector Dearman    if filename.startswith(self.value_ui_path):
147*1fa4b3daSHector Dearman      return False
148*1fa4b3daSHector Dearman
149*1fa4b3daSHector Dearman    if filename.startswith(self.metrics_ui_path):
150*1fa4b3daSHector Dearman      return False
151*1fa4b3daSHector Dearman
152*1fa4b3daSHector Dearman    return True
153*1fa4b3daSHector Dearman
154*1fa4b3daSHector Dearman  def FindAllTestModuleRelPaths(self, pred=None):
155*1fa4b3daSHector Dearman    if pred is None:
156*1fa4b3daSHector Dearman      pred = lambda x: True
157*1fa4b3daSHector Dearman
158*1fa4b3daSHector Dearman    all_filenames = _FindAllFilesRecursive([self.tracing_src_path])
159*1fa4b3daSHector Dearman    test_module_filenames = [x for x in all_filenames if
160*1fa4b3daSHector Dearman                             _IsFilenameATest(x) and pred(x)]
161*1fa4b3daSHector Dearman    test_module_filenames.sort()
162*1fa4b3daSHector Dearman
163*1fa4b3daSHector Dearman    return [os.path.relpath(x, self.tracing_root_path)
164*1fa4b3daSHector Dearman            for x in test_module_filenames]
165*1fa4b3daSHector Dearman
166*1fa4b3daSHector Dearman  def FindAllMetricsModuleRelPaths(self):
167*1fa4b3daSHector Dearman    all_filenames = _FindAllFilesRecursive([self.tracing_src_path])
168*1fa4b3daSHector Dearman    all_metrics_module_filenames = []
169*1fa4b3daSHector Dearman    for x in all_filenames:
170*1fa4b3daSHector Dearman      if x.startswith(self.metrics_path) and not _IsFilenameATest(x):
171*1fa4b3daSHector Dearman        all_metrics_module_filenames.append(x)
172*1fa4b3daSHector Dearman    all_metrics_module_filenames.sort()
173*1fa4b3daSHector Dearman    return [os.path.relpath(x, self.tracing_root_path)
174*1fa4b3daSHector Dearman            for x in all_metrics_module_filenames]
175*1fa4b3daSHector Dearman
176*1fa4b3daSHector Dearman  def FindAllDiagnosticsModuleRelPaths(self):
177*1fa4b3daSHector Dearman    all_filenames = _FindAllFilesRecursive([self.tracing_src_path])
178*1fa4b3daSHector Dearman    all_diagnostics_module_filenames = []
179*1fa4b3daSHector Dearman    for x in all_filenames:
180*1fa4b3daSHector Dearman      if x.startswith(self.diagnostics_path) and not _IsFilenameATest(x):
181*1fa4b3daSHector Dearman        all_diagnostics_module_filenames.append(x)
182*1fa4b3daSHector Dearman    all_diagnostics_module_filenames.sort()
183*1fa4b3daSHector Dearman    return [os.path.relpath(x, self.tracing_root_path)
184*1fa4b3daSHector Dearman            for x in all_diagnostics_module_filenames]
185*1fa4b3daSHector Dearman
186*1fa4b3daSHector Dearman  def FindAllD8TestModuleRelPaths(self):
187*1fa4b3daSHector Dearman    return self.FindAllTestModuleRelPaths(pred=self.IsD8CompatibleFile)
188*1fa4b3daSHector Dearman
189*1fa4b3daSHector Dearman  def GetConfigNames(self):
190*1fa4b3daSHector Dearman    config_files = [
191*1fa4b3daSHector Dearman        os.path.join(self.ui_extras_path, x)
192*1fa4b3daSHector Dearman        for x in os.listdir(self.ui_extras_path)
193*1fa4b3daSHector Dearman        if x.endswith('_config.html')
194*1fa4b3daSHector Dearman    ]
195*1fa4b3daSHector Dearman
196*1fa4b3daSHector Dearman    config_files = [x for x in config_files if os.path.isfile(x)]
197*1fa4b3daSHector Dearman
198*1fa4b3daSHector Dearman    config_basenames = [os.path.basename(x) for x in config_files]
199*1fa4b3daSHector Dearman    config_names = [re.match('(.+)_config.html$', x).group(1)
200*1fa4b3daSHector Dearman                    for x in config_basenames]
201*1fa4b3daSHector Dearman    return config_names
202*1fa4b3daSHector Dearman
203*1fa4b3daSHector Dearman  def GetDefaultConfigName(self):
204*1fa4b3daSHector Dearman    assert 'full' in self.GetConfigNames()
205*1fa4b3daSHector Dearman    return 'full'
206*1fa4b3daSHector Dearman
207*1fa4b3daSHector Dearman  def AddConfigNameOptionToParser(self, parser):
208*1fa4b3daSHector Dearman    choices = self.GetConfigNames()
209*1fa4b3daSHector Dearman    parser.add_argument(
210*1fa4b3daSHector Dearman        '--config', dest='config_name',
211*1fa4b3daSHector Dearman        choices=choices, default=self.GetDefaultConfigName(),
212*1fa4b3daSHector Dearman        help='Picks a browser config. Valid choices: %s' % ', '.join(choices))
213*1fa4b3daSHector Dearman    return choices
214*1fa4b3daSHector Dearman
215*1fa4b3daSHector Dearman  def GetModuleNameForConfigName(self, config_name):
216*1fa4b3daSHector Dearman    return 'tracing.ui.extras.%s_config' % config_name
217*1fa4b3daSHector Dearman
218