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

Side by Side Diff: PRESUBMIT_test.py

Issue 11441035: PRESUBMIT #include check enhancements. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebased Created 8 years 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 | « PRESUBMIT.py ('k') | 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 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 import os 6 import os
7 import re 7 import re
8 import unittest 8 import unittest
9 9
10 import PRESUBMIT 10 import PRESUBMIT
(...skipping 10 matching lines...) Expand all
21 21
22 22
23 class MockOutputApi(object): 23 class MockOutputApi(object):
24 class PresubmitResult(object): 24 class PresubmitResult(object):
25 def __init__(self, message, items=None, long_text=''): 25 def __init__(self, message, items=None, long_text=''):
26 self.message = message 26 self.message = message
27 self.items = items 27 self.items = items
28 self.long_text = long_text 28 self.long_text = long_text
29 29
30 class PresubmitError(PresubmitResult): 30 class PresubmitError(PresubmitResult):
31 pass 31 def __init__(self, message, items, long_text=''):
32 MockOutputApi.PresubmitResult.__init__(self, message, items, long_text)
32 33
33 class PresubmitPromptWarning(PresubmitResult): 34 class PresubmitPromptWarning(PresubmitResult):
34 pass 35 def __init__(self, message, items, long_text=''):
36 MockOutputApi.PresubmitResult.__init__(self, message, items, long_text)
35 37
36 class PresubmitNotifyResult(PresubmitResult): 38 class PresubmitNotifyResult(PresubmitResult):
37 pass 39 def __init__(self, message, items, long_text=''):
40 MockOutputApi.PresubmitResult.__init__(self, message, items, long_text)
38 41
39 42
40 class MockFile(object): 43 class MockFile(object):
41 def __init__(self, local_path, new_contents): 44 def __init__(self, local_path, new_contents):
42 self._local_path = local_path 45 self._local_path = local_path
43 self._new_contents = new_contents 46 self._new_contents = new_contents
44 self._changed_contents = [(i + 1, l) for i, l in enumerate(new_contents)] 47 self._changed_contents = [(i + 1, l) for i, l in enumerate(new_contents)]
45 48
46 def ChangedContents(self): 49 def ChangedContents(self):
47 return self._changed_contents 50 return self._changed_contents
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
113 self.assertTrue('15' in warnings[0]) 116 self.assertTrue('15' in warnings[0])
114 self.assertTrue('25' in warnings[1]) 117 self.assertTrue('25' in warnings[1])
115 self.assertTrue('35' in warnings[2]) 118 self.assertTrue('35' in warnings[2])
116 119
117 def testSpecialFirstInclude1(self): 120 def testSpecialFirstInclude1(self):
118 mock_input_api = MockInputApi() 121 mock_input_api = MockInputApi()
119 contents = ['#include "some/path/foo.h"', 122 contents = ['#include "some/path/foo.h"',
120 '#include "a/header.h"'] 123 '#include "a/header.h"']
121 mock_file = MockFile('some/path/foo.cc', contents) 124 mock_file = MockFile('some/path/foo.cc', contents)
122 warnings = PRESUBMIT._CheckIncludeOrderInFile( 125 warnings = PRESUBMIT._CheckIncludeOrderInFile(
123 mock_input_api, mock_file, True, range(1, len(contents) + 1)) 126 mock_input_api, mock_file, range(1, len(contents) + 1))
124 self.assertEqual(0, len(warnings)) 127 self.assertEqual(0, len(warnings))
125 128
126 def testSpecialFirstInclude2(self): 129 def testSpecialFirstInclude2(self):
127 mock_input_api = MockInputApi() 130 mock_input_api = MockInputApi()
128 contents = ['#include "some/other/path/foo.h"', 131 contents = ['#include "some/other/path/foo.h"',
129 '#include "a/header.h"'] 132 '#include "a/header.h"']
130 mock_file = MockFile('some/path/foo.cc', contents) 133 mock_file = MockFile('some/path/foo.cc', contents)
131 warnings = PRESUBMIT._CheckIncludeOrderInFile( 134 warnings = PRESUBMIT._CheckIncludeOrderInFile(
132 mock_input_api, mock_file, True, range(1, len(contents) + 1)) 135 mock_input_api, mock_file, range(1, len(contents) + 1))
133 self.assertEqual(0, len(warnings)) 136 self.assertEqual(0, len(warnings))
134 137
135 def testSpecialFirstInclude3(self): 138 def testSpecialFirstInclude3(self):
136 mock_input_api = MockInputApi() 139 mock_input_api = MockInputApi()
137 contents = ['#include "some/path/foo.h"', 140 contents = ['#include "some/path/foo.h"',
138 '#include "a/header.h"'] 141 '#include "a/header.h"']
139 mock_file = MockFile('some/path/foo_platform.cc', contents) 142 mock_file = MockFile('some/path/foo_platform.cc', contents)
140 warnings = PRESUBMIT._CheckIncludeOrderInFile( 143 warnings = PRESUBMIT._CheckIncludeOrderInFile(
141 mock_input_api, mock_file, True, range(1, len(contents) + 1)) 144 mock_input_api, mock_file, range(1, len(contents) + 1))
142 self.assertEqual(0, len(warnings)) 145 self.assertEqual(0, len(warnings))
143 146
144 def testSpecialFirstInclude4(self): 147 def testSpecialFirstInclude4(self):
145 mock_input_api = MockInputApi() 148 mock_input_api = MockInputApi()
146 contents = ['#include "some/path/bar.h"', 149 contents = ['#include "some/path/bar.h"',
147 '#include "a/header.h"'] 150 '#include "a/header.h"']
148 mock_file = MockFile('some/path/foo_platform.cc', contents) 151 mock_file = MockFile('some/path/foo_platform.cc', contents)
149 warnings = PRESUBMIT._CheckIncludeOrderInFile( 152 warnings = PRESUBMIT._CheckIncludeOrderInFile(
150 mock_input_api, mock_file, True, range(1, len(contents) + 1)) 153 mock_input_api, mock_file, range(1, len(contents) + 1))
151 self.assertEqual(1, len(warnings)) 154 self.assertEqual(1, len(warnings))
152 self.assertTrue('2' in warnings[0]) 155 self.assertTrue('2' in warnings[0])
153 156
157 def testSpecialFirstInclude5(self):
158 mock_input_api = MockInputApi()
159 contents = ['#include "some/other/path/foo.h"',
160 '#include "a/header.h"']
161 mock_file = MockFile('some/path/foo-suffix.h', contents)
162 warnings = PRESUBMIT._CheckIncludeOrderInFile(
163 mock_input_api, mock_file, range(1, len(contents) + 1))
164 self.assertEqual(0, len(warnings))
165
154 def testOrderAlreadyWrong(self): 166 def testOrderAlreadyWrong(self):
155 scope = [(1, '#include "b.h"'), 167 scope = [(1, '#include "b.h"'),
156 (2, '#include "a.h"'), 168 (2, '#include "a.h"'),
157 (3, '#include "c.h"')] 169 (3, '#include "c.h"')]
158 mock_input_api = MockInputApi() 170 mock_input_api = MockInputApi()
159 warnings = PRESUBMIT._CheckIncludeOrderForScope(scope, mock_input_api, 171 warnings = PRESUBMIT._CheckIncludeOrderForScope(scope, mock_input_api,
160 '', [3]) 172 '', [3])
161 self.assertEqual(0, len(warnings)) 173 self.assertEqual(0, len(warnings))
162 174
163 def testConflictAdded1(self): 175 def testConflictAdded1(self):
(...skipping 12 matching lines...) Expand all
176 (3, '#include "d.h"')] 188 (3, '#include "d.h"')]
177 mock_input_api = MockInputApi() 189 mock_input_api = MockInputApi()
178 warnings = PRESUBMIT._CheckIncludeOrderForScope(scope, mock_input_api, 190 warnings = PRESUBMIT._CheckIncludeOrderForScope(scope, mock_input_api,
179 '', [2]) 191 '', [2])
180 self.assertEqual(1, len(warnings)) 192 self.assertEqual(1, len(warnings))
181 self.assertTrue('2' in warnings[0]) 193 self.assertTrue('2' in warnings[0])
182 194
183 def testIfElifElseEndif(self): 195 def testIfElifElseEndif(self):
184 mock_input_api = MockInputApi() 196 mock_input_api = MockInputApi()
185 contents = ['#include "e.h"', 197 contents = ['#include "e.h"',
198 '#define foo',
199 '#include "f.h"',
200 '#undef foo',
201 '#include "e.h"',
186 '#if foo', 202 '#if foo',
187 '#include "d.h"', 203 '#include "d.h"',
188 '#elif bar', 204 '#elif bar',
189 '#include "c.h"', 205 '#include "c.h"',
190 '#else', 206 '#else',
191 '#include "b.h"', 207 '#include "b.h"',
192 '#endif', 208 '#endif',
193 '#include "a.h"'] 209 '#include "a.h"']
194 mock_file = MockFile('', contents) 210 mock_file = MockFile('', contents)
195 warnings = PRESUBMIT._CheckIncludeOrderInFile( 211 warnings = PRESUBMIT._CheckIncludeOrderInFile(
196 mock_input_api, mock_file, True, range(1, len(contents) + 1)) 212 mock_input_api, mock_file, range(1, len(contents) + 1))
197 self.assertEqual(0, len(warnings)) 213 self.assertEqual(0, len(warnings))
198 214
199 def testSysIncludes(self): 215 def testSysIncludes(self):
200 # #include <sys/...>'s can appear in any order. 216 # #include <sys/...>'s can appear in any order.
201 mock_input_api = MockInputApi() 217 mock_input_api = MockInputApi()
202 contents = ['#include <sys/b.h>', 218 contents = ['#include <sys/b.h>',
203 '#include <sys/a.h>'] 219 '#include <sys/a.h>']
204 mock_file = MockFile('', contents) 220 mock_file = MockFile('', contents)
205 warnings = PRESUBMIT._CheckIncludeOrderInFile( 221 warnings = PRESUBMIT._CheckIncludeOrderInFile(
206 mock_input_api, mock_file, True, range(1, len(contents) + 1)) 222 mock_input_api, mock_file, range(1, len(contents) + 1))
207 self.assertEqual(0, len(warnings)) 223 self.assertEqual(0, len(warnings))
208 224
225 def testCheckOnlyCFiles(self):
226 mock_input_api = MockInputApi()
227 mock_output_api = MockOutputApi()
228 contents = ['#include <b.h>',
229 '#include <a.h>']
230 mock_file_cc = MockFile('something.cc', contents)
231 mock_file_h = MockFile('something.h', contents)
232 mock_file_other = MockFile('something.py', contents)
233 mock_input_api.files = [mock_file_cc, mock_file_h, mock_file_other]
234 warnings = PRESUBMIT._CheckIncludeOrder(mock_input_api, mock_output_api)
235 self.assertEqual(1, len(warnings))
236 self.assertEqual(2, len(warnings[0].items))
237
209 238
210 class VersionControlerConflictsTest(unittest.TestCase): 239 class VersionControlerConflictsTest(unittest.TestCase):
211 def testTypicalConflict(self): 240 def testTypicalConflict(self):
212 lines = ['<<<<<<< HEAD', 241 lines = ['<<<<<<< HEAD',
213 ' base::ScopedTempDir temp_dir_;', 242 ' base::ScopedTempDir temp_dir_;',
214 '=======', 243 '=======',
215 ' ScopedTempDir temp_dir_;', 244 ' ScopedTempDir temp_dir_;',
216 '>>>>>>> master'] 245 '>>>>>>> master']
217 errors = PRESUBMIT._CheckForVersionControlConflictsInFile( 246 errors = PRESUBMIT._CheckForVersionControlConflictsInFile(
218 MockInputApi(), MockFile('some/path/foo_platform.cc', lines)) 247 MockInputApi(), MockFile('some/path/foo_platform.cc', lines))
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
255 mock_input_api.files = [ 284 mock_input_api.files = [
256 MockFile('other/path/qux.h', ''), 285 MockFile('other/path/qux.h', ''),
257 MockFile('other/path/qux.cc', ''), 286 MockFile('other/path/qux.cc', ''),
258 ] 287 ]
259 results = PRESUBMIT._CheckPatchFiles(mock_input_api, MockOutputApi()) 288 results = PRESUBMIT._CheckPatchFiles(mock_input_api, MockOutputApi())
260 self.assertEqual(0, len(results)) 289 self.assertEqual(0, len(results))
261 290
262 291
263 if __name__ == '__main__': 292 if __name__ == '__main__':
264 unittest.main() 293 unittest.main()
OLDNEW
« no previous file with comments | « PRESUBMIT.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698