[go: nahoru, domu]

blob: dd67eb1a53258bb58c76dff3613a2b6cc5d138d7 [file] [log] [blame]
marja@chromium.org2299dcf2012-11-15 19:56:241#!/usr/bin/env python
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
4# found in the LICENSE file.
5
yoz@chromium.org99171a92014-06-03 08:44:476import glob
7import json
marja@chromium.org2299dcf2012-11-15 19:56:248import os
9import re
yoz@chromium.org99171a92014-06-03 08:44:4710import subprocess
11import sys
marja@chromium.org2299dcf2012-11-15 19:56:2412import unittest
13
14import PRESUBMIT
15
16
yoz@chromium.org99171a92014-06-03 08:44:4717_TEST_DATA_DIR = 'base/test/data/presubmit'
18
19
marja@chromium.org2299dcf2012-11-15 19:56:2420class MockInputApi(object):
21 def __init__(self):
yoz@chromium.org99171a92014-06-03 08:44:4722 self.json = json
marja@chromium.org2299dcf2012-11-15 19:56:2423 self.re = re
24 self.os_path = os.path
yoz@chromium.org99171a92014-06-03 08:44:4725 self.python_executable = sys.executable
26 self.subprocess = subprocess
enne@chromium.orgb8079ae4a2012-12-05 19:56:4927 self.files = []
marja@chromium.org120cf540d2012-12-10 17:55:5328 self.is_committing = False
enne@chromium.orgb8079ae4a2012-12-05 19:56:4929
dominik.rottsches@intel.come120b012014-08-15 19:08:3530 def AffectedFiles(self, file_filter=None):
enne@chromium.orgb8079ae4a2012-12-05 19:56:4931 return self.files
yoz@chromium.org99171a92014-06-03 08:44:4732
33 def PresubmitLocalPath(self):
34 return os.path.dirname(__file__)
35
36 def ReadFile(self, filename, mode='rU'):
37 for file_ in self.files:
38 if file_.LocalPath() == filename:
39 return '\n'.join(file_.NewContents())
40 # Otherwise, file is not in our mock API.
41 raise IOError, "No such file or directory: '%s'" % filename
enne@chromium.orgb8079ae4a2012-12-05 19:56:4942
43
44class MockOutputApi(object):
45 class PresubmitResult(object):
46 def __init__(self, message, items=None, long_text=''):
47 self.message = message
48 self.items = items
49 self.long_text = long_text
50
51 class PresubmitError(PresubmitResult):
marja@chromium.orgac294a12012-12-06 16:38:4352 def __init__(self, message, items, long_text=''):
53 MockOutputApi.PresubmitResult.__init__(self, message, items, long_text)
marja@chromium.org120cf540d2012-12-10 17:55:5354 self.type = 'error'
enne@chromium.orgb8079ae4a2012-12-05 19:56:4955
56 class PresubmitPromptWarning(PresubmitResult):
marja@chromium.orgac294a12012-12-06 16:38:4357 def __init__(self, message, items, long_text=''):
58 MockOutputApi.PresubmitResult.__init__(self, message, items, long_text)
marja@chromium.org120cf540d2012-12-10 17:55:5359 self.type = 'warning'
enne@chromium.orgb8079ae4a2012-12-05 19:56:4960
61 class PresubmitNotifyResult(PresubmitResult):
marja@chromium.orgac294a12012-12-06 16:38:4362 def __init__(self, message, items, long_text=''):
63 MockOutputApi.PresubmitResult.__init__(self, message, items, long_text)
marja@chromium.org120cf540d2012-12-10 17:55:5364 self.type = 'notify'
marja@chromium.org2299dcf2012-11-15 19:56:2465
wez@chromium.orgf7051d52013-04-02 18:31:4266 class PresubmitPromptOrNotify(PresubmitResult):
67 def __init__(self, message, items, long_text=''):
68 MockOutputApi.PresubmitResult.__init__(self, message, items, long_text)
69 self.type = 'promptOrNotify'
70
marja@chromium.org2299dcf2012-11-15 19:56:2471
72class MockFile(object):
73 def __init__(self, local_path, new_contents):
74 self._local_path = local_path
75 self._new_contents = new_contents
dbeam@chromium.org70ca77752012-11-20 03:45:0376 self._changed_contents = [(i + 1, l) for i, l in enumerate(new_contents)]
77
78 def ChangedContents(self):
79 return self._changed_contents
marja@chromium.org2299dcf2012-11-15 19:56:2480
81 def NewContents(self):
82 return self._new_contents
83
84 def LocalPath(self):
85 return self._local_path
86
87
dbeam@chromium.org751b05f2013-01-10 23:12:1788class MockChange(object):
89 def __init__(self, changed_files):
90 self._changed_files = changed_files
91
92 def LocalPaths(self):
93 return self._changed_files
94
95
marja@chromium.org2299dcf2012-11-15 19:56:2496class IncludeOrderTest(unittest.TestCase):
97 def testSystemHeaderOrder(self):
98 scope = [(1, '#include <csystem.h>'),
99 (2, '#include <cppsystem>'),
100 (3, '#include "acustom.h"')]
101 all_linenums = [linenum for (linenum, _) in scope]
102 mock_input_api = MockInputApi()
103 warnings = PRESUBMIT._CheckIncludeOrderForScope(scope, mock_input_api,
104 '', all_linenums)
105 self.assertEqual(0, len(warnings))
106
107 def testSystemHeaderOrderMismatch1(self):
108 scope = [(10, '#include <cppsystem>'),
109 (20, '#include <csystem.h>'),
110 (30, '#include "acustom.h"')]
111 all_linenums = [linenum for (linenum, _) in scope]
112 mock_input_api = MockInputApi()
113 warnings = PRESUBMIT._CheckIncludeOrderForScope(scope, mock_input_api,
114 '', all_linenums)
115 self.assertEqual(1, len(warnings))
116 self.assertTrue('20' in warnings[0])
117
118 def testSystemHeaderOrderMismatch2(self):
119 scope = [(10, '#include <cppsystem>'),
120 (20, '#include "acustom.h"'),
121 (30, '#include <csystem.h>')]
122 all_linenums = [linenum for (linenum, _) in scope]
123 mock_input_api = MockInputApi()
124 warnings = PRESUBMIT._CheckIncludeOrderForScope(scope, mock_input_api,
125 '', all_linenums)
126 self.assertEqual(1, len(warnings))
127 self.assertTrue('30' in warnings[0])
128
129 def testSystemHeaderOrderMismatch3(self):
130 scope = [(10, '#include "acustom.h"'),
131 (20, '#include <csystem.h>'),
132 (30, '#include <cppsystem>')]
133 all_linenums = [linenum for (linenum, _) in scope]
134 mock_input_api = MockInputApi()
135 warnings = PRESUBMIT._CheckIncludeOrderForScope(scope, mock_input_api,
136 '', all_linenums)
137 self.assertEqual(2, len(warnings))
138 self.assertTrue('20' in warnings[0])
139 self.assertTrue('30' in warnings[1])
140
141 def testAlphabeticalOrderMismatch(self):
142 scope = [(10, '#include <csystem.h>'),
143 (15, '#include <bsystem.h>'),
144 (20, '#include <cppsystem>'),
145 (25, '#include <bppsystem>'),
146 (30, '#include "bcustom.h"'),
147 (35, '#include "acustom.h"')]
148 all_linenums = [linenum for (linenum, _) in scope]
149 mock_input_api = MockInputApi()
150 warnings = PRESUBMIT._CheckIncludeOrderForScope(scope, mock_input_api,
151 '', all_linenums)
152 self.assertEqual(3, len(warnings))
153 self.assertTrue('15' in warnings[0])
154 self.assertTrue('25' in warnings[1])
155 self.assertTrue('35' in warnings[2])
156
157 def testSpecialFirstInclude1(self):
158 mock_input_api = MockInputApi()
159 contents = ['#include "some/path/foo.h"',
160 '#include "a/header.h"']
161 mock_file = MockFile('some/path/foo.cc', contents)
162 warnings = PRESUBMIT._CheckIncludeOrderInFile(
marja@chromium.orgac294a12012-12-06 16:38:43163 mock_input_api, mock_file, range(1, len(contents) + 1))
marja@chromium.org2299dcf2012-11-15 19:56:24164 self.assertEqual(0, len(warnings))
165
166 def testSpecialFirstInclude2(self):
167 mock_input_api = MockInputApi()
168 contents = ['#include "some/other/path/foo.h"',
169 '#include "a/header.h"']
170 mock_file = MockFile('some/path/foo.cc', contents)
171 warnings = PRESUBMIT._CheckIncludeOrderInFile(
marja@chromium.orgac294a12012-12-06 16:38:43172 mock_input_api, mock_file, range(1, len(contents) + 1))
marja@chromium.org2299dcf2012-11-15 19:56:24173 self.assertEqual(0, len(warnings))
174
175 def testSpecialFirstInclude3(self):
176 mock_input_api = MockInputApi()
177 contents = ['#include "some/path/foo.h"',
178 '#include "a/header.h"']
179 mock_file = MockFile('some/path/foo_platform.cc', contents)
180 warnings = PRESUBMIT._CheckIncludeOrderInFile(
marja@chromium.orgac294a12012-12-06 16:38:43181 mock_input_api, mock_file, range(1, len(contents) + 1))
marja@chromium.org2299dcf2012-11-15 19:56:24182 self.assertEqual(0, len(warnings))
183
184 def testSpecialFirstInclude4(self):
185 mock_input_api = MockInputApi()
186 contents = ['#include "some/path/bar.h"',
187 '#include "a/header.h"']
188 mock_file = MockFile('some/path/foo_platform.cc', contents)
189 warnings = PRESUBMIT._CheckIncludeOrderInFile(
marja@chromium.orgac294a12012-12-06 16:38:43190 mock_input_api, mock_file, range(1, len(contents) + 1))
marja@chromium.org2299dcf2012-11-15 19:56:24191 self.assertEqual(1, len(warnings))
192 self.assertTrue('2' in warnings[0])
marja@chromium.orgac294a12012-12-06 16:38:43193
194 def testSpecialFirstInclude5(self):
195 mock_input_api = MockInputApi()
196 contents = ['#include "some/other/path/foo.h"',
197 '#include "a/header.h"']
198 mock_file = MockFile('some/path/foo-suffix.h', contents)
199 warnings = PRESUBMIT._CheckIncludeOrderInFile(
200 mock_input_api, mock_file, range(1, len(contents) + 1))
201 self.assertEqual(0, len(warnings))
marja@chromium.org2299dcf2012-11-15 19:56:24202
erikwright@chromium.org3e83618c2013-10-09 22:32:33203 def testSpecialFirstInclude6(self):
204 mock_input_api = MockInputApi()
205 contents = ['#include "some/other/path/foo_win.h"',
206 '#include <set>',
207 '#include "a/header.h"']
208 mock_file = MockFile('some/path/foo_unittest_win.h', contents)
209 warnings = PRESUBMIT._CheckIncludeOrderInFile(
210 mock_input_api, mock_file, range(1, len(contents) + 1))
211 self.assertEqual(0, len(warnings))
212
marja@chromium.org2299dcf2012-11-15 19:56:24213 def testOrderAlreadyWrong(self):
214 scope = [(1, '#include "b.h"'),
215 (2, '#include "a.h"'),
216 (3, '#include "c.h"')]
217 mock_input_api = MockInputApi()
218 warnings = PRESUBMIT._CheckIncludeOrderForScope(scope, mock_input_api,
219 '', [3])
220 self.assertEqual(0, len(warnings))
221
222 def testConflictAdded1(self):
223 scope = [(1, '#include "a.h"'),
224 (2, '#include "c.h"'),
225 (3, '#include "b.h"')]
226 mock_input_api = MockInputApi()
227 warnings = PRESUBMIT._CheckIncludeOrderForScope(scope, mock_input_api,
228 '', [2])
229 self.assertEqual(1, len(warnings))
230 self.assertTrue('3' in warnings[0])
231
232 def testConflictAdded2(self):
233 scope = [(1, '#include "c.h"'),
234 (2, '#include "b.h"'),
235 (3, '#include "d.h"')]
236 mock_input_api = MockInputApi()
237 warnings = PRESUBMIT._CheckIncludeOrderForScope(scope, mock_input_api,
238 '', [2])
239 self.assertEqual(1, len(warnings))
240 self.assertTrue('2' in warnings[0])
241
marja@chromium.org2309b0fa02012-11-16 12:18:27242 def testIfElifElseEndif(self):
243 mock_input_api = MockInputApi()
244 contents = ['#include "e.h"',
marja@chromium.orgac294a12012-12-06 16:38:43245 '#define foo',
246 '#include "f.h"',
247 '#undef foo',
248 '#include "e.h"',
marja@chromium.org2309b0fa02012-11-16 12:18:27249 '#if foo',
250 '#include "d.h"',
251 '#elif bar',
252 '#include "c.h"',
253 '#else',
254 '#include "b.h"',
255 '#endif',
256 '#include "a.h"']
257 mock_file = MockFile('', contents)
258 warnings = PRESUBMIT._CheckIncludeOrderInFile(
marja@chromium.orgac294a12012-12-06 16:38:43259 mock_input_api, mock_file, range(1, len(contents) + 1))
marja@chromium.org2309b0fa02012-11-16 12:18:27260 self.assertEqual(0, len(warnings))
261
marja@chromium.org23093b62013-09-20 12:16:30262 def testExcludedIncludes(self):
marja@chromium.org962f117e2012-11-22 18:11:56263 # #include <sys/...>'s can appear in any order.
264 mock_input_api = MockInputApi()
265 contents = ['#include <sys/b.h>',
266 '#include <sys/a.h>']
267 mock_file = MockFile('', contents)
268 warnings = PRESUBMIT._CheckIncludeOrderInFile(
marja@chromium.orgac294a12012-12-06 16:38:43269 mock_input_api, mock_file, range(1, len(contents) + 1))
marja@chromium.org962f117e2012-11-22 18:11:56270 self.assertEqual(0, len(warnings))
271
marja@chromium.org23093b62013-09-20 12:16:30272 contents = ['#include <atlbase.h>',
273 '#include <aaa.h>']
274 mock_file = MockFile('', contents)
275 warnings = PRESUBMIT._CheckIncludeOrderInFile(
276 mock_input_api, mock_file, range(1, len(contents) + 1))
277 self.assertEqual(0, len(warnings))
278
279 contents = ['#include "build/build_config.h"',
280 '#include "aaa.h"']
281 mock_file = MockFile('', contents)
282 warnings = PRESUBMIT._CheckIncludeOrderInFile(
283 mock_input_api, mock_file, range(1, len(contents) + 1))
284 self.assertEqual(0, len(warnings))
285
marja@chromium.orgac294a12012-12-06 16:38:43286 def testCheckOnlyCFiles(self):
287 mock_input_api = MockInputApi()
288 mock_output_api = MockOutputApi()
289 contents = ['#include <b.h>',
290 '#include <a.h>']
291 mock_file_cc = MockFile('something.cc', contents)
292 mock_file_h = MockFile('something.h', contents)
293 mock_file_other = MockFile('something.py', contents)
294 mock_input_api.files = [mock_file_cc, mock_file_h, mock_file_other]
295 warnings = PRESUBMIT._CheckIncludeOrder(mock_input_api, mock_output_api)
296 self.assertEqual(1, len(warnings))
297 self.assertEqual(2, len(warnings[0].items))
wez@chromium.orgf7051d52013-04-02 18:31:42298 self.assertEqual('promptOrNotify', warnings[0].type)
marja@chromium.orgac294a12012-12-06 16:38:43299
marja@chromium.org0e5c1852012-12-18 20:17:11300 def testUncheckableIncludes(self):
301 mock_input_api = MockInputApi()
302 contents = ['#include <windows.h>',
b.kelemen@samsung.com4436c9e2014-01-07 23:19:54303 '#include "b.h"',
marja@chromium.org0e5c1852012-12-18 20:17:11304 '#include "a.h"']
305 mock_file = MockFile('', contents)
306 warnings = PRESUBMIT._CheckIncludeOrderInFile(
307 mock_input_api, mock_file, range(1, len(contents) + 1))
b.kelemen@samsung.com4436c9e2014-01-07 23:19:54308 self.assertEqual(1, len(warnings))
marja@chromium.org0e5c1852012-12-18 20:17:11309
310 contents = ['#include "gpu/command_buffer/gles_autogen.h"',
b.kelemen@samsung.com4436c9e2014-01-07 23:19:54311 '#include "b.h"',
marja@chromium.org0e5c1852012-12-18 20:17:11312 '#include "a.h"']
313 mock_file = MockFile('', contents)
314 warnings = PRESUBMIT._CheckIncludeOrderInFile(
315 mock_input_api, mock_file, range(1, len(contents) + 1))
b.kelemen@samsung.com4436c9e2014-01-07 23:19:54316 self.assertEqual(1, len(warnings))
marja@chromium.org0e5c1852012-12-18 20:17:11317
318 contents = ['#include "gl_mock_autogen.h"',
b.kelemen@samsung.com4436c9e2014-01-07 23:19:54319 '#include "b.h"',
marja@chromium.org0e5c1852012-12-18 20:17:11320 '#include "a.h"']
321 mock_file = MockFile('', contents)
322 warnings = PRESUBMIT._CheckIncludeOrderInFile(
323 mock_input_api, mock_file, range(1, len(contents) + 1))
b.kelemen@samsung.com4436c9e2014-01-07 23:19:54324 self.assertEqual(1, len(warnings))
marja@chromium.org0e5c1852012-12-18 20:17:11325
326 contents = ['#include "ipc/some_macros.h"',
b.kelemen@samsung.com4436c9e2014-01-07 23:19:54327 '#include "b.h"',
marja@chromium.org0e5c1852012-12-18 20:17:11328 '#include "a.h"']
329 mock_file = MockFile('', contents)
330 warnings = PRESUBMIT._CheckIncludeOrderInFile(
331 mock_input_api, mock_file, range(1, len(contents) + 1))
b.kelemen@samsung.com4436c9e2014-01-07 23:19:54332 self.assertEqual(1, len(warnings))
marja@chromium.org0e5c1852012-12-18 20:17:11333
marja@chromium.org2299dcf2012-11-15 19:56:24334
dbeam@chromium.orgb00342e7f2013-03-26 16:21:54335class VersionControlConflictsTest(unittest.TestCase):
dbeam@chromium.org70ca77752012-11-20 03:45:03336 def testTypicalConflict(self):
337 lines = ['<<<<<<< HEAD',
338 ' base::ScopedTempDir temp_dir_;',
339 '=======',
340 ' ScopedTempDir temp_dir_;',
341 '>>>>>>> master']
342 errors = PRESUBMIT._CheckForVersionControlConflictsInFile(
343 MockInputApi(), MockFile('some/path/foo_platform.cc', lines))
344 self.assertEqual(3, len(errors))
345 self.assertTrue('1' in errors[0])
346 self.assertTrue('3' in errors[1])
347 self.assertTrue('5' in errors[2])
348
349
enne@chromium.orgb8079ae4a2012-12-05 19:56:49350class BadExtensionsTest(unittest.TestCase):
351 def testBadRejFile(self):
352 mock_input_api = MockInputApi()
353 mock_input_api.files = [
354 MockFile('some/path/foo.cc', ''),
355 MockFile('some/path/foo.cc.rej', ''),
356 MockFile('some/path2/bar.h.rej', ''),
357 ]
358
359 results = PRESUBMIT._CheckPatchFiles(mock_input_api, MockOutputApi())
360 self.assertEqual(1, len(results))
361 self.assertEqual(2, len(results[0].items))
362 self.assertTrue('foo.cc.rej' in results[0].items[0])
363 self.assertTrue('bar.h.rej' in results[0].items[1])
364
365 def testBadOrigFile(self):
366 mock_input_api = MockInputApi()
367 mock_input_api.files = [
368 MockFile('other/path/qux.h.orig', ''),
369 MockFile('other/path/qux.h', ''),
370 MockFile('other/path/qux.cc', ''),
371 ]
372
373 results = PRESUBMIT._CheckPatchFiles(mock_input_api, MockOutputApi())
374 self.assertEqual(1, len(results))
375 self.assertEqual(1, len(results[0].items))
376 self.assertTrue('qux.h.orig' in results[0].items[0])
377
378 def testGoodFiles(self):
379 mock_input_api = MockInputApi()
380 mock_input_api.files = [
381 MockFile('other/path/qux.h', ''),
382 MockFile('other/path/qux.cc', ''),
383 ]
384 results = PRESUBMIT._CheckPatchFiles(mock_input_api, MockOutputApi())
385 self.assertEqual(0, len(results))
386
dbeam@chromium.org751b05f2013-01-10 23:12:17387 def testOnlyOwnersFiles(self):
388 mock_change = MockChange([
389 'some/path/OWNERS',
390 'A\Windows\Path\OWNERS',
391 ])
phajdan.jr@chromium.org7468ac52014-03-12 23:35:57392 results = PRESUBMIT.GetPreferredTryMasters(None, mock_change)
393 self.assertEqual({}, results)
dbeam@chromium.org751b05f2013-01-10 23:12:17394
enne@chromium.orgb8079ae4a2012-12-05 19:56:49395
dbeam@chromium.orgb00342e7f2013-03-26 16:21:54396class InvalidOSMacroNamesTest(unittest.TestCase):
397 def testInvalidOSMacroNames(self):
398 lines = ['#if defined(OS_WINDOWS)',
399 ' #elif defined(OS_WINDOW)',
400 ' # if defined(OS_MACOSX) || defined(OS_CHROME)',
401 '# else // defined(OS_MAC)',
402 '#endif // defined(OS_MACOS)']
403 errors = PRESUBMIT._CheckForInvalidOSMacrosInFile(
404 MockInputApi(), MockFile('some/path/foo_platform.cc', lines))
405 self.assertEqual(len(lines), len(errors))
406 self.assertTrue(':1 OS_WINDOWS' in errors[0])
407 self.assertTrue('(did you mean OS_WIN?)' in errors[0])
408
409 def testValidOSMacroNames(self):
410 lines = ['#if defined(%s)' % m for m in PRESUBMIT._VALID_OS_MACROS]
411 errors = PRESUBMIT._CheckForInvalidOSMacrosInFile(
412 MockInputApi(), MockFile('some/path/foo_platform.cc', lines))
413 self.assertEqual(0, len(errors))
414
415
tony@chromium.orgf32e2d1e2013-07-26 21:39:08416class CheckAddedDepsHaveTetsApprovalsTest(unittest.TestCase):
joi@chromium.org14a61312014-01-08 01:15:41417 def testFilesToCheckForIncomingDeps(self):
tony@chromium.orgf32e2d1e2013-07-26 21:39:08418 changed_lines = [
419 '"+breakpad",',
420 '"+chrome/installer",',
421 '"+chrome/plugin/chrome_content_plugin_client.h",',
422 '"+chrome/utility/chrome_content_utility_client.h",',
423 '"+chromeos/chromeos_paths.h",',
philipj3f9d5bde2014-08-28 14:09:09424 '"+components/crash",',
tony@chromium.orgf32e2d1e2013-07-26 21:39:08425 '"+components/nacl/common",',
426 '"+content/public/browser/render_process_host.h",',
joi@chromium.org14a61312014-01-08 01:15:41427 '"+jni/fooblat.h",',
tony@chromium.orgf32e2d1e2013-07-26 21:39:08428 '"+grit", # For generated headers',
429 '"+grit/generated_resources.h",',
430 '"+grit/",',
431 '"+policy", # For generated headers and source',
432 '"+sandbox",',
433 '"+tools/memory_watcher",',
434 '"+third_party/lss/linux_syscall_support.h",',
435 ]
joi@chromium.org14a61312014-01-08 01:15:41436 files_to_check = PRESUBMIT._FilesToCheckForIncomingDeps(re, changed_lines)
tony@chromium.orgf32e2d1e2013-07-26 21:39:08437 expected = set([
438 'breakpad/DEPS',
439 'chrome/installer/DEPS',
joi@chromium.org14a61312014-01-08 01:15:41440 'chrome/plugin/chrome_content_plugin_client.h',
441 'chrome/utility/chrome_content_utility_client.h',
442 'chromeos/chromeos_paths.h',
Robert Sesekabcd8102014-08-27 16:12:44443 'components/crash/DEPS',
tony@chromium.orgf32e2d1e2013-07-26 21:39:08444 'components/nacl/common/DEPS',
joi@chromium.org14a61312014-01-08 01:15:41445 'content/public/browser/render_process_host.h',
tony@chromium.orgf32e2d1e2013-07-26 21:39:08446 'policy/DEPS',
447 'sandbox/DEPS',
448 'tools/memory_watcher/DEPS',
joi@chromium.org14a61312014-01-08 01:15:41449 'third_party/lss/linux_syscall_support.h',
tony@chromium.orgf32e2d1e2013-07-26 21:39:08450 ])
451 self.assertEqual(expected, files_to_check);
452
453
yoz@chromium.org99171a92014-06-03 08:44:47454class JSONParsingTest(unittest.TestCase):
455 def testSuccess(self):
456 input_api = MockInputApi()
457 filename = 'valid_json.json'
458 contents = ['// This is a comment.',
459 '{',
460 ' "key1": ["value1", "value2"],',
461 ' "key2": 3 // This is an inline comment.',
462 '}'
463 ]
464 input_api.files = [MockFile(filename, contents)]
465 self.assertEqual(None,
466 PRESUBMIT._GetJSONParseError(input_api, filename))
467
468 def testFailure(self):
469 input_api = MockInputApi()
470 test_data = [
471 ('invalid_json_1.json',
472 ['{ x }'],
yoz@chromium.orga3343272014-06-17 11:41:53473 'Expecting property name:'),
yoz@chromium.org99171a92014-06-03 08:44:47474 ('invalid_json_2.json',
475 ['// Hello world!',
476 '{ "hello": "world }'],
yoz@chromium.orga3343272014-06-17 11:41:53477 'Unterminated string starting at:'),
yoz@chromium.org99171a92014-06-03 08:44:47478 ('invalid_json_3.json',
479 ['{ "a": "b", "c": "d", }'],
yoz@chromium.orga3343272014-06-17 11:41:53480 'Expecting property name:'),
yoz@chromium.org99171a92014-06-03 08:44:47481 ('invalid_json_4.json',
482 ['{ "a": "b" "c": "d" }'],
yoz@chromium.orga3343272014-06-17 11:41:53483 'Expecting , delimiter:'),
yoz@chromium.org99171a92014-06-03 08:44:47484 ]
485
486 input_api.files = [MockFile(filename, contents)
487 for (filename, contents, _) in test_data]
488
489 for (filename, _, expected_error) in test_data:
490 actual_error = PRESUBMIT._GetJSONParseError(input_api, filename)
yoz@chromium.orga3343272014-06-17 11:41:53491 self.assertTrue(expected_error in str(actual_error),
492 "'%s' not found in '%s'" % (expected_error, actual_error))
yoz@chromium.org99171a92014-06-03 08:44:47493
494 def testNoEatComments(self):
495 input_api = MockInputApi()
496 file_with_comments = 'file_with_comments.json'
497 contents_with_comments = ['// This is a comment.',
498 '{',
499 ' "key1": ["value1", "value2"],',
500 ' "key2": 3 // This is an inline comment.',
501 '}'
502 ]
503 file_without_comments = 'file_without_comments.json'
504 contents_without_comments = ['{',
505 ' "key1": ["value1", "value2"],',
506 ' "key2": 3',
507 '}'
508 ]
509 input_api.files = [MockFile(file_with_comments, contents_with_comments),
510 MockFile(file_without_comments,
511 contents_without_comments)]
512
513 self.assertEqual('No JSON object could be decoded',
514 str(PRESUBMIT._GetJSONParseError(input_api,
515 file_with_comments,
516 eat_comments=False)))
517 self.assertEqual(None,
518 PRESUBMIT._GetJSONParseError(input_api,
519 file_without_comments,
520 eat_comments=False))
521
522
523class IDLParsingTest(unittest.TestCase):
524 def testSuccess(self):
525 input_api = MockInputApi()
526 filename = 'valid_idl_basics.idl'
527 contents = ['// Tests a valid IDL file.',
528 'namespace idl_basics {',
529 ' enum EnumType {',
530 ' name1,',
531 ' name2',
532 ' };',
533 '',
534 ' dictionary MyType1 {',
535 ' DOMString a;',
536 ' };',
537 '',
538 ' callback Callback1 = void();',
539 ' callback Callback2 = void(long x);',
540 ' callback Callback3 = void(MyType1 arg);',
541 ' callback Callback4 = void(EnumType type);',
542 '',
543 ' interface Functions {',
544 ' static void function1();',
545 ' static void function2(long x);',
546 ' static void function3(MyType1 arg);',
547 ' static void function4(Callback1 cb);',
548 ' static void function5(Callback2 cb);',
549 ' static void function6(Callback3 cb);',
550 ' static void function7(Callback4 cb);',
551 ' };',
552 '',
553 ' interface Events {',
554 ' static void onFoo1();',
555 ' static void onFoo2(long x);',
556 ' static void onFoo2(MyType1 arg);',
557 ' static void onFoo3(EnumType type);',
558 ' };',
559 '};'
560 ]
561 input_api.files = [MockFile(filename, contents)]
562 self.assertEqual(None,
563 PRESUBMIT._GetIDLParseError(input_api, filename))
564
565 def testFailure(self):
566 input_api = MockInputApi()
567 test_data = [
568 ('invalid_idl_1.idl',
569 ['//',
570 'namespace test {',
571 ' dictionary {',
572 ' DOMString s;',
573 ' };',
574 '};'],
575 'Unexpected "{" after keyword "dictionary".\n'),
576 # TODO(yoz): Disabled because it causes the IDL parser to hang.
577 # See crbug.com/363830.
578 # ('invalid_idl_2.idl',
579 # (['namespace test {',
580 # ' dictionary MissingSemicolon {',
581 # ' DOMString a',
582 # ' DOMString b;',
583 # ' };',
584 # '};'],
585 # 'Unexpected symbol DOMString after symbol a.'),
586 ('invalid_idl_3.idl',
587 ['//',
588 'namespace test {',
589 ' enum MissingComma {',
590 ' name1',
591 ' name2',
592 ' };',
593 '};'],
594 'Unexpected symbol name2 after symbol name1.'),
595 ('invalid_idl_4.idl',
596 ['//',
597 'namespace test {',
598 ' enum TrailingComma {',
599 ' name1,',
600 ' name2,',
601 ' };',
602 '};'],
603 'Trailing comma in block.'),
604 ('invalid_idl_5.idl',
605 ['//',
606 'namespace test {',
607 ' callback Callback1 = void(;',
608 '};'],
609 'Unexpected ";" after "(".'),
610 ('invalid_idl_6.idl',
611 ['//',
612 'namespace test {',
613 ' callback Callback1 = void(long );',
614 '};'],
615 'Unexpected ")" after symbol long.'),
616 ('invalid_idl_7.idl',
617 ['//',
618 'namespace test {',
619 ' interace Events {',
620 ' static void onFoo1();',
621 ' };',
622 '};'],
623 'Unexpected symbol Events after symbol interace.'),
624 ('invalid_idl_8.idl',
625 ['//',
626 'namespace test {',
627 ' interface NotEvent {',
628 ' static void onFoo1();',
629 ' };',
630 '};'],
631 'Did not process Interface Interface(NotEvent)'),
632 ('invalid_idl_9.idl',
633 ['//',
634 'namespace test {',
635 ' interface {',
636 ' static void function1();',
637 ' };',
638 '};'],
639 'Interface missing name.'),
640 ]
641
642 input_api.files = [MockFile(filename, contents)
643 for (filename, contents, _) in test_data]
644
645 for (filename, _, expected_error) in test_data:
646 actual_error = PRESUBMIT._GetIDLParseError(input_api, filename)
647 self.assertTrue(expected_error in str(actual_error),
648 "'%s' not found in '%s'" % (expected_error, actual_error))
649
650
sergeyberezin@chromium.org0bb112362014-07-26 04:38:32651class TryServerMasterTest(unittest.TestCase):
652 def testTryServerMasters(self):
653 bots = {
654 'tryserver.chromium.gpu': [
655 'mac_gpu',
656 'mac_gpu_triggered_tests',
657 'linux_gpu',
658 'linux_gpu_triggered_tests',
659 'win_gpu',
660 'win_gpu_triggered_tests',
661 ],
662 'tryserver.chromium.mac': [
663 'ios_dbg_simulator',
664 'ios_rel_device',
665 'ios_rel_device_ninja',
666 'mac_asan',
667 'mac_asan_64',
668 'mac_chromium_compile_dbg',
669 'mac_chromium_compile_rel',
670 'mac_chromium_dbg',
671 'mac_chromium_rel',
672 'mac_chromium_rel_swarming',
673 'mac_nacl_sdk',
674 'mac_nacl_sdk_build',
675 'mac_rel_naclmore',
676 'mac_valgrind',
677 'mac_x64_rel',
678 'mac_xcodebuild',
679 ],
680 'tryserver.chromium.linux': [
681 'android_aosp',
682 'android_chromium_gn_compile_dbg',
683 'android_chromium_gn_compile_rel',
684 'android_clang_dbg',
685 'android_dbg',
686 'android_dbg_recipe',
687 'android_dbg_triggered_tests',
688 'android_dbg_triggered_tests_recipe',
689 'android_fyi_dbg',
690 'android_fyi_dbg_triggered_tests',
691 'android_rel',
692 'android_rel_triggered_tests',
693 'android_x86_dbg',
694 'blink_android_compile_dbg',
695 'blink_android_compile_rel',
696 'blink_presubmit',
697 'chromium_presubmit',
698 'linux_arm_cross_compile',
699 'linux_arm_tester',
700 'linux_asan',
701 'linux_browser_asan',
702 'linux_chromeos_asan',
703 'linux_chromeos_browser_asan',
704 'linux_chromeos_valgrind',
705 'linux_chromium_chromeos_clang_dbg',
706 'linux_chromium_chromeos_clang_rel',
707 'linux_chromium_chromeos_dbg',
708 'linux_chromium_chromeos_rel',
709 'linux_chromium_clang_dbg',
710 'linux_chromium_clang_rel',
711 'linux_chromium_compile_dbg',
712 'linux_chromium_compile_rel',
713 'linux_chromium_dbg',
714 'linux_chromium_gn_dbg',
715 'linux_chromium_gn_rel',
716 'linux_chromium_rel',
717 'linux_chromium_rel_swarming',
718 'linux_chromium_trusty32_dbg',
719 'linux_chromium_trusty32_rel',
720 'linux_chromium_trusty_dbg',
721 'linux_chromium_trusty_rel',
722 'linux_clang_tsan',
723 'linux_ecs_ozone',
724 'linux_layout',
725 'linux_layout_asan',
726 'linux_layout_rel',
727 'linux_layout_rel_32',
728 'linux_nacl_sdk',
729 'linux_nacl_sdk_bionic',
730 'linux_nacl_sdk_bionic_build',
731 'linux_nacl_sdk_build',
732 'linux_redux',
733 'linux_rel_naclmore',
734 'linux_rel_precise32',
735 'linux_valgrind',
736 'tools_build_presubmit',
737 ],
738 'tryserver.chromium.win': [
739 'win8_aura',
740 'win8_chromium_dbg',
741 'win8_chromium_rel',
742 'win_chromium_compile_dbg',
743 'win_chromium_compile_rel',
744 'win_chromium_dbg',
745 'win_chromium_rel',
746 'win_chromium_rel',
747 'win_chromium_rel_swarming',
748 'win_chromium_rel_swarming',
749 'win_chromium_x64_dbg',
750 'win_chromium_x64_rel',
751 'win_drmemory',
752 'win_nacl_sdk',
753 'win_nacl_sdk_build',
754 'win_rel_naclmore',
755 ],
756 }
757 for master, bots in bots.iteritems():
758 for bot in bots:
759 self.assertEqual(master, PRESUBMIT.GetTryServerMasterForBot(bot),
760 'bot=%s: expected %s, computed %s' % (
761 bot, master, PRESUBMIT.GetTryServerMasterForBot(bot)))
762
763
marja@chromium.org2299dcf2012-11-15 19:56:24764if __name__ == '__main__':
765 unittest.main()