Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(307)

Side by Side Diff: PRESUBMIT.py

Issue 589123002: Add a PRESUBMIT check that production code does not call test code (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # Copyright 2012 the V8 project authors. All rights reserved. 1 # Copyright 2012 the V8 project authors. All rights reserved.
2 # Redistribution and use in source and binary forms, with or without 2 # Redistribution and use in source and binary forms, with or without
3 # modification, are permitted provided that the following conditions are 3 # modification, are permitted provided that the following conditions are
4 # met: 4 # met:
5 # 5 #
6 # * Redistributions of source code must retain the above copyright 6 # * Redistributions of source code must retain the above copyright
7 # notice, this list of conditions and the following disclaimer. 7 # notice, this list of conditions and the following disclaimer.
8 # * Redistributions in binary form must reproduce the above 8 # * Redistributions in binary form must reproduce the above
9 # copyright notice, this list of conditions and the following 9 # copyright notice, this list of conditions and the following
10 # disclaimer in the documentation and/or other materials provided 10 # disclaimer in the documentation and/or other materials provided
(...skipping 16 matching lines...) Expand all
27 27
28 """Top-level presubmit script for V8. 28 """Top-level presubmit script for V8.
29 29
30 See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts 30 See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts
31 for more details about the presubmit API built into gcl. 31 for more details about the presubmit API built into gcl.
32 """ 32 """
33 33
34 import sys 34 import sys
35 35
36 36
37 _EXCLUDED_PATHS = (
38 r"^test[\\\/].*",
39 r"^testing[\\\/].*",
40 r"^third_party[\\\/].*",
41 r"^tools[\\\/].*",
42 )
43
44
45 # Regular expression that matches code only used for test binaries
46 # (best effort).
47 _TEST_CODE_EXCLUDED_PATHS = (
48 r'.+-unittest\.cc',
49 # Has a method VisitForTest().
Michael Starzinger 2014/09/22 22:25:51 Please turn this into a TODO(mstarzinger), I'll pr
50 r'src[\\\/]compiler[\\\/]ast-graph-builder\.cc',
51 # Test extension.
52 r'src[\\\/]extensions[\\\/]gc-extension\.cc',
53 )
54
55
56 _TEST_ONLY_WARNING = (
57 'You might be calling functions intended only for testing from\n'
58 'production code. It is OK to ignore this warning if you know what\n'
59 'you are doing, as the heuristics used to detect the situation are\n'
60 'not perfect. The commit queue will not block on this warning.')
61
62
37 def _V8PresubmitChecks(input_api, output_api): 63 def _V8PresubmitChecks(input_api, output_api):
38 """Runs the V8 presubmit checks.""" 64 """Runs the V8 presubmit checks."""
39 import sys 65 import sys
40 sys.path.append(input_api.os_path.join( 66 sys.path.append(input_api.os_path.join(
41 input_api.PresubmitLocalPath(), 'tools')) 67 input_api.PresubmitLocalPath(), 'tools'))
42 from presubmit import CppLintProcessor 68 from presubmit import CppLintProcessor
43 from presubmit import SourceProcessor 69 from presubmit import SourceProcessor
44 from presubmit import CheckRuntimeVsNativesNameClashes 70 from presubmit import CheckRuntimeVsNativesNameClashes
45 from presubmit import CheckExternalReferenceRegistration 71 from presubmit import CheckExternalReferenceRegistration
46 72
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
106 error_descriptions)) 132 error_descriptions))
107 if warning_descriptions: 133 if warning_descriptions:
108 results.append(output_api.PresubmitPromptOrNotify( 134 results.append(output_api.PresubmitPromptOrNotify(
109 'You added one or more #includes of files that are temporarily\n' 135 'You added one or more #includes of files that are temporarily\n'
110 'allowed but being removed. Can you avoid introducing the\n' 136 'allowed but being removed. Can you avoid introducing the\n'
111 '#include? See relevant DEPS file(s) for details and contacts.', 137 '#include? See relevant DEPS file(s) for details and contacts.',
112 warning_descriptions)) 138 warning_descriptions))
113 return results 139 return results
114 140
115 141
142 def _CheckNoProductionCodeUsingTestOnlyFunctions(input_api, output_api):
143 """Attempts to prevent use of functions intended only for testing in
144 non-testing code. For now this is just a best-effort implementation
145 that ignores header files and may have some false positives. A
146 better implementation would probably need a proper C++ parser.
147 """
148 # We only scan .cc files, as the declaration of for-testing functions in
149 # header files are hard to distinguish from calls to such functions without a
150 # proper C++ parser.
151 file_inclusion_pattern = r'.+\.cc'
152
153 base_function_pattern = r'[ :]test::[^\s]+|ForTest(ing)?|for_test(ing)?'
154 inclusion_pattern = input_api.re.compile(r'(%s)\s*\(' % base_function_pattern)
155 comment_pattern = input_api.re.compile(r'//.*(%s)' % base_function_pattern)
156 exclusion_pattern = input_api.re.compile(
157 r'::[A-Za-z0-9_]+(%s)|(%s)[^;]+\{' % (
158 base_function_pattern, base_function_pattern))
159
160 def FilterFile(affected_file):
161 black_list = (_EXCLUDED_PATHS +
162 _TEST_CODE_EXCLUDED_PATHS +
163 input_api.DEFAULT_BLACK_LIST)
164 return input_api.FilterSourceFile(
165 affected_file,
166 white_list=(file_inclusion_pattern, ),
167 black_list=black_list)
168
169 problems = []
170 for f in input_api.AffectedSourceFiles(FilterFile):
171 local_path = f.LocalPath()
172 for line_number, line in f.ChangedContents():
173 if (inclusion_pattern.search(line) and
174 not comment_pattern.search(line) and
175 not exclusion_pattern.search(line)):
176 problems.append(
177 '%s:%d\n %s' % (local_path, line_number, line.strip()))
178
179 if problems:
180 return [output_api.PresubmitPromptOrNotify(_TEST_ONLY_WARNING, problems)]
181 else:
182 return []
183
184
116 def _CommonChecks(input_api, output_api): 185 def _CommonChecks(input_api, output_api):
117 """Checks common to both upload and commit.""" 186 """Checks common to both upload and commit."""
118 results = [] 187 results = []
119 results.extend(input_api.canned_checks.CheckOwners( 188 results.extend(input_api.canned_checks.CheckOwners(
120 input_api, output_api, source_file_filter=None)) 189 input_api, output_api, source_file_filter=None))
121 results.extend(input_api.canned_checks.CheckPatchFormatted( 190 results.extend(input_api.canned_checks.CheckPatchFormatted(
122 input_api, output_api)) 191 input_api, output_api))
123 results.extend(_V8PresubmitChecks(input_api, output_api)) 192 results.extend(_V8PresubmitChecks(input_api, output_api))
124 results.extend(_CheckUnwantedDependencies(input_api, output_api)) 193 results.extend(_CheckUnwantedDependencies(input_api, output_api))
194 results.extend(
195 _CheckNoProductionCodeUsingTestOnlyFunctions(input_api, output_api))
125 return results 196 return results
126 197
127 198
128 def _SkipTreeCheck(input_api, output_api): 199 def _SkipTreeCheck(input_api, output_api):
129 """Check the env var whether we want to skip tree check. 200 """Check the env var whether we want to skip tree check.
130 Only skip if src/version.cc has been updated.""" 201 Only skip if src/version.cc has been updated."""
131 src_version = 'src/version.cc' 202 src_version = 'src/version.cc'
132 FilterFile = lambda file: file.LocalPath() == src_version 203 FilterFile = lambda file: file.LocalPath() == src_version
133 if not input_api.AffectedSourceFiles( 204 if not input_api.AffectedSourceFiles(
134 lambda file: file.LocalPath() == src_version): 205 lambda file: file.LocalPath() == src_version):
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
176 'v8_linux_nosnap_dbg': set(['defaulttests']), 247 'v8_linux_nosnap_dbg': set(['defaulttests']),
177 'v8_linux64_rel': set(['defaulttests']), 248 'v8_linux64_rel': set(['defaulttests']),
178 'v8_linux_arm_dbg': set(['defaulttests']), 249 'v8_linux_arm_dbg': set(['defaulttests']),
179 'v8_linux_arm64_rel': set(['defaulttests']), 250 'v8_linux_arm64_rel': set(['defaulttests']),
180 'v8_linux_layout_dbg': set(['defaulttests']), 251 'v8_linux_layout_dbg': set(['defaulttests']),
181 'v8_mac_rel': set(['defaulttests']), 252 'v8_mac_rel': set(['defaulttests']),
182 'v8_win_rel': set(['defaulttests']), 253 'v8_win_rel': set(['defaulttests']),
183 'v8_win64_compile_rel': set(['defaulttests']), 254 'v8_win64_compile_rel': set(['defaulttests']),
184 }, 255 },
185 } 256 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698