1# Copyright 2015 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"""Presubmit script for devil.
6
7See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts for
8details on the presubmit API built into depot_tools.
9"""
10
11
12def _RunPylint(input_api, output_api):
13  return input_api.RunTests(input_api.canned_checks.RunPylint(
14      input_api, output_api, pylintrc='pylintrc'))
15
16
17def _RunUnitTests(input_api, output_api):
18  def J(*dirs):
19    """Returns a path relative to presubmit directory."""
20    return input_api.os_path.join(
21        input_api.PresubmitLocalPath(), 'devil', *dirs)
22
23  test_env = dict(input_api.environ)
24  test_env.update({
25    'PYTHONDONTWRITEBYTECODE': '1',
26    'PYTHONPATH': ':'.join([J(), J('..')]),
27  })
28
29  return input_api.canned_checks.RunUnitTests(
30      input_api,
31      output_api,
32      unit_tests=[
33          J('devil_env_test.py'),
34          J('android', 'battery_utils_test.py'),
35          J('android', 'device_utils_test.py'),
36          J('android', 'fastboot_utils_test.py'),
37          J('android', 'md5sum_test.py'),
38          J('android', 'logcat_monitor_test.py'),
39          J('android', 'tools', 'script_common_test.py'),
40          J('utils', 'cmd_helper_test.py'),
41          J('utils', 'timeout_retry_unittest.py'),
42      ],
43      env=test_env)
44
45
46def _EnsureNoPylibUse(input_api, output_api):
47  def other_python_files(f):
48    this_presubmit_file = input_api.os_path.join(
49        input_api.PresubmitLocalPath(), 'PRESUBMIT.py')
50    return (f.LocalPath().endswith('.py')
51            and not f.AbsoluteLocalPath() == this_presubmit_file)
52
53  changed_files = input_api.AffectedSourceFiles(other_python_files)
54  import_error_re = input_api.re.compile(
55      r'(from pylib.* import)|(import pylib)')
56
57  errors = []
58  for f in changed_files:
59    errors.extend(
60        '%s:%d' % (f.LocalPath(), line_number)
61        for line_number, line_text in f.ChangedContents()
62        if import_error_re.search(line_text))
63
64  if errors:
65    return [output_api.PresubmitError(
66        'pylib modules should not be imported from devil modules.',
67        items=errors)]
68  return []
69
70
71def CommonChecks(input_api, output_api):
72  output = []
73  output += _RunPylint(input_api, output_api)
74  output += _RunUnitTests(input_api, output_api)
75  output += _EnsureNoPylibUse(input_api, output_api)
76  return output
77
78
79def CheckChangeOnUpload(input_api, output_api):
80  return CommonChecks(input_api, output_api)
81
82
83def CheckChangeOnCommit(input_api, output_api):
84  return CommonChecks(input_api, output_api)
85
86