blob: 9536f8f46a0343f522780fd4c64c30e3245efeaa [file] [log] [blame]
pauljensenc3a04232015-08-14 17:21:011# 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"""Top-level presubmit script for src/components/cronet.
6
7See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts
8for more details about the presubmit API built into depot_tools.
9"""
10
kapishnikov0f15b892017-09-29 13:55:2911import os
12
pauljensen6a6e7832016-05-05 15:43:0313def _PyLintChecks(input_api, output_api):
14 pylint_checks = input_api.canned_checks.GetPylint(input_api, output_api,
15 extra_paths_list=_GetPathsToPrepend(input_api), pylintrc='pylintrc')
16 return input_api.RunTests(pylint_checks)
17
pauljensen6c178be2016-11-18 23:06:5618
pauljensen6a6e7832016-05-05 15:43:0319def _GetPathsToPrepend(input_api):
20 current_dir = input_api.PresubmitLocalPath()
21 chromium_src_dir = input_api.os_path.join(current_dir, '..', '..')
22 return [
23 input_api.os_path.join(current_dir, 'tools'),
24 input_api.os_path.join(current_dir, 'android', 'test', 'javaperftests'),
25 input_api.os_path.join(chromium_src_dir, 'tools', 'perf'),
26 input_api.os_path.join(chromium_src_dir, 'build', 'android'),
27 input_api.os_path.join(chromium_src_dir, 'build', 'android', 'gyp', 'util'),
Misha Efimovb427f9862017-11-30 21:32:5328 input_api.os_path.join(chromium_src_dir,
29 'mojo', 'public', 'tools', 'bindings', 'pylib'),
pauljensen6a6e7832016-05-05 15:43:0330 input_api.os_path.join(chromium_src_dir, 'net', 'tools', 'net_docs'),
31 input_api.os_path.join(chromium_src_dir, 'tools'),
32 input_api.os_path.join(chromium_src_dir, 'third_party'),
33 input_api.os_path.join(chromium_src_dir,
34 'third_party', 'catapult', 'telemetry'),
35 input_api.os_path.join(chromium_src_dir,
36 'third_party', 'catapult', 'devil'),
37 ]
38
pauljensen6c178be2016-11-18 23:06:5639
pauljensen17ebec652016-09-14 18:53:2240def _PackageChecks(input_api, output_api):
41 """Verify API classes are in org.chromium.net package, and implementation
42 classes are not in org.chromium.net package."""
43 api_file_pattern = input_api.re.compile(
44 r'^components/cronet/android/api/.*\.(java|template)$')
45 impl_file_pattern = input_api.re.compile(
46 r'^components/cronet/android/java/.*\.(java|template)$')
47 api_package_pattern = input_api.re.compile(r'^package (?!org.chromium.net;)')
48 impl_package_pattern = input_api.re.compile(r'^package org.chromium.net;')
49
50 source_filter = lambda path: input_api.FilterSourceFile(path,
51 white_list=[r'^components/cronet/android/.*\.(java|template)$'])
52
53 problems = []
54 for f in input_api.AffectedSourceFiles(source_filter):
55 local_path = f.LocalPath()
56 for line_number, line in f.ChangedContents():
57 if (api_file_pattern.search(local_path)):
58 if (api_package_pattern.search(line)):
59 problems.append(
60 '%s:%d\n %s' % (local_path, line_number, line.strip()))
61 elif (impl_file_pattern.search(local_path)):
62 if (impl_package_pattern.search(line)):
63 problems.append(
64 '%s:%d\n %s' % (local_path, line_number, line.strip()))
65
66 if problems:
67 return [output_api.PresubmitError(
68 'API classes must be in org.chromium.net package, and implementation\n'
69 'classes must not be in org.chromium.net package.',
70 problems)]
71 else:
72 return []
73
pauljensen6c178be2016-11-18 23:06:5674
pauljensen8c990542017-01-03 19:44:3175def _RunUnittests(input_api, output_api):
76 return input_api.canned_checks.RunUnitTestsInDirectory(
77 input_api, output_api, '.', [ r'^.+_unittest\.py$'])
78
79
kapishnikov0f15b892017-09-29 13:55:2980def _ChangeAffectsCronetForAndroid(change):
81 """ Returns |true| if the change may affect Cronet for Android. """
82
83 for affected_file in change.AffectedFiles():
84 path = affected_file.LocalPath()
85 if not path.startswith(os.path.join('components', 'cronet', 'ios')):
86 return True
87 return False
88
89
90def _ChangeAffectsCronetForIos(change):
91 """ Returns |true| if the change may affect Cronet for iOS. """
92
93 for affected_file in change.AffectedFiles():
94 path = affected_file.LocalPath()
95 if not path.startswith(os.path.join('components', 'cronet', 'android')):
96 return True
97 return False
98
99
pauljensenc3a04232015-08-14 17:21:01100def CheckChangeOnUpload(input_api, output_api):
pauljensen6a6e7832016-05-05 15:43:03101 results = []
102 results.extend(_PyLintChecks(input_api, output_api))
pauljensen17ebec652016-09-14 18:53:22103 results.extend(_PackageChecks(input_api, output_api))
pauljensen8c990542017-01-03 19:44:31104 results.extend(_RunUnittests(input_api, output_api))
pauljensen6a6e7832016-05-05 15:43:03105 return results
pauljensen6c178be2016-11-18 23:06:56106
107
pauljensen8c990542017-01-03 19:44:31108def CheckChangeOnCommit(input_api, output_api):
109 return _RunUnittests(input_api, output_api)
110
111
pauljensen6c178be2016-11-18 23:06:56112def PostUploadHook(cl, change, output_api):
113 """git cl upload will call this hook after the issue is created/modified.
114
115 This hook adds an extra try bot to the CL description in order to run Cronet
116 tests in addition to CQ try bots.
117 """
kapishnikov0f15b892017-09-29 13:55:29118
119 try_bots = []
120 if _ChangeAffectsCronetForAndroid(change):
121 try_bots.append('master.tryserver.chromium.android:android_cronet_tester')
122 if _ChangeAffectsCronetForIos(change):
123 try_bots.append('master.tryserver.chromium.mac:ios-simulator-cronet')
124
kbr43842632017-02-16 19:06:56125 return output_api.EnsureCQIncludeTrybotsAreAdded(
kapishnikov0f15b892017-09-29 13:55:29126 cl, try_bots, 'Automatically added Cronet trybots to run tests on CQ.')