Home | History | Annotate | Download | only in telemetry
      1 # Copyright 2012 The Chromium Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 
      6 def _CommonChecks(input_api, output_api):
      7   results = []
      8 
      9   results += input_api.RunTests(input_api.canned_checks.GetPylint(
     10       input_api, output_api, extra_paths_list=_GetPathsToPrepend(input_api),
     11       pylintrc='pylintrc'))
     12   results += _CheckNoMoreUsageOfDeprecatedCode(
     13       input_api, output_api, deprecated_code='GetChromiumSrcDir()',
     14       crbug_number=511332)
     15   return results
     16 
     17 
     18 def _RunArgs(args, input_api):
     19   p = input_api.subprocess.Popen(args, stdout=input_api.subprocess.PIPE,
     20                                  stderr=input_api.subprocess.STDOUT)
     21   out, _ = p.communicate()
     22   return (out, p.returncode)
     23 
     24 
     25 def _ValidateDependenciesFile(input_api, output_api, dependencies_path):
     26   """ Check that binary_dependencies.json has valid format and content.
     27 
     28   This check should only be done in CheckChangeOnUpload() only since it invokes
     29   network I/O.
     30   """
     31   results = []
     32   telemetry_dir = input_api.PresubmitLocalPath()
     33   for f in input_api.AffectedFiles():
     34     if not f.AbsoluteLocalPath() == dependencies_path:
     35       continue
     36     out, return_code = _RunArgs([
     37         input_api.python_executable,
     38         input_api.os_path.join(telemetry_dir, 'json_format'),
     39         dependencies_path], input_api)
     40     if return_code:
     41       results.append(output_api.PresubmitError(
     42            'Validating %s failed:' % dependencies_path, long_text=out))
     43       break
     44     out, return_code = _RunArgs([
     45         input_api.python_executable,
     46         input_api.os_path.join(telemetry_dir, 'validate_binary_dependencies'),
     47         dependencies_path], input_api)
     48     if return_code:
     49       results.append(output_api.PresubmitError(
     50           'Validating %s failed:' % dependencies_path, long_text=out))
     51       break
     52   return results
     53 
     54 
     55 def _CheckNoMoreUsageOfDeprecatedCode(
     56     input_api, output_api, deprecated_code, crbug_number):
     57   results = []
     58   # These checks are not perfcet but should be good enough for most of our
     59   # usecases.
     60   def _IsAddedLine(line):
     61     return line.startswith('+') and not line.startswith('+++ ')
     62   def _IsRemovedLine(line):
     63     return line.startswith('-') and not line.startswith('--- ')
     64 
     65   presubmit_dir = input_api.os_path.join(
     66       input_api.PresubmitLocalPath(), 'PRESUBMIT.py')
     67 
     68   added_calls = 0
     69   removed_calls = 0
     70   for affected_file in input_api.AffectedFiles():
     71     # Do not do the check on PRESUBMIT.py itself.
     72     if affected_file.AbsoluteLocalPath() == presubmit_dir:
     73       continue
     74     for line in affected_file.GenerateScmDiff().splitlines():
     75       if _IsAddedLine(line) and deprecated_code in line:
     76         added_calls += 1
     77       elif _IsRemovedLine(line) and deprecated_code in line:
     78         removed_calls += 1
     79 
     80   if added_calls > removed_calls:
     81     results.append(output_api.PresubmitError(
     82         'Your patch adds more instances of %s. Please see crbug.com/%i for'
     83         'how to proceed.' % (deprecated_code, crbug_number)))
     84   return results
     85 
     86 
     87 def _GetPathsToPrepend(input_api):
     88   telemetry_dir = input_api.PresubmitLocalPath()
     89   catapult_dir = input_api.os_path.join(telemetry_dir, '..')
     90   return [
     91       telemetry_dir,
     92 
     93       input_api.os_path.join(telemetry_dir, 'third_party', 'altgraph'),
     94       input_api.os_path.join(telemetry_dir, 'third_party', 'modulegraph'),
     95       input_api.os_path.join(telemetry_dir, 'third_party', 'pexpect'),
     96       input_api.os_path.join(telemetry_dir, 'third_party', 'png'),
     97       input_api.os_path.join(telemetry_dir, 'third_party', 'web-page-replay'),
     98       input_api.os_path.join(telemetry_dir, 'third_party', 'websocket-client'),
     99 
    100       input_api.os_path.join(catapult_dir, 'common', 'py_utils'),
    101       input_api.os_path.join(catapult_dir, 'dependency_manager'),
    102       input_api.os_path.join(catapult_dir, 'devil'),
    103       input_api.os_path.join(catapult_dir, 'systrace'),
    104       input_api.os_path.join(catapult_dir, 'tracing'),
    105       input_api.os_path.join(catapult_dir, 'common', 'battor'),
    106       input_api.os_path.join(catapult_dir, 'common', 'py_trace_event'),
    107 
    108       input_api.os_path.join(catapult_dir, 'third_party', 'mock'),
    109       input_api.os_path.join(catapult_dir, 'third_party', 'pyfakefs'),
    110       input_api.os_path.join(catapult_dir, 'third_party', 'pyserial'),
    111       input_api.os_path.join(catapult_dir, 'third_party', 'typ'),
    112   ]
    113 
    114 
    115 def _ValidateAllDependenciesFiles(input_api, output_api):
    116   results = []
    117   telemetry_dir = input_api.PresubmitLocalPath()
    118   binary_dependencies = input_api.os_path.join(
    119       telemetry_dir, 'telemetry', 'internal', 'binary_dependencies.json')
    120   telemetry_unittest_dependencies = input_api.os_path.join(
    121       telemetry_dir, 'telemetry', 'telemetry_unittest_deps.json')
    122   for path in [binary_dependencies, telemetry_unittest_dependencies]:
    123     results += _ValidateDependenciesFile(input_api, output_api, path)
    124   return results
    125 
    126 
    127 def CheckChangeOnUpload(input_api, output_api):
    128   results = []
    129   results += _CommonChecks(input_api, output_api)
    130   results += _ValidateAllDependenciesFiles(input_api, output_api)
    131   return results
    132 
    133 
    134 def CheckChangeOnCommit(input_api, output_api):
    135   results = []
    136   results += _CommonChecks(input_api, output_api)
    137   return results
    138