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