| #!/usr/bin/python |
| # Copyright (c) 2009 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """Unit tests for top-level Chromium presubmit script. |
| """ |
| |
| |
| import os |
| import PRESUBMIT |
| import re |
| import unittest |
| |
| |
| class MockInputApi(object): |
| def __init__(self): |
| self.affected_files = [] |
| self.re = re |
| self.os_path = os.path |
| |
| def AffectedFiles(self, include_deletes=True): |
| if include_deletes: |
| return self.affected_files |
| else: |
| return filter(lambda x: x.Action() != 'D', self.affected_files) |
| |
| def AffectedTextFiles(self, include_deletes=True): |
| return self.affected_files |
| |
| |
| class MockAffectedFile(object): |
| def __init__(self, path, action='A'): |
| self.path = path |
| self.action = action |
| |
| def Action(self): |
| return self.action |
| |
| def LocalPath(self): |
| return self.path |
| |
| |
| class MockOutputApi(object): |
| class PresubmitError(object): |
| def __init__(self, msg, items=[], long_text=''): |
| self.msg = msg |
| self.items = items |
| |
| |
| class PresubmitUnittest(unittest.TestCase): |
| def setUp(self): |
| self.file_contents = '' |
| def MockReadFile(path): |
| self.failIf(path.endswith('notsource')) |
| return self.file_contents |
| self._ReadFile = PRESUBMIT.ReadFile |
| PRESUBMIT.ReadFile = MockReadFile |
| |
| def tearDown(self): |
| PRESUBMIT.ReadFile = self._ReadFile |
| |
| def testLocalChecks(self): |
| api = MockInputApi() |
| api.affected_files = [ |
| MockAffectedFile('foo/blat/yoo.notsource'), |
| MockAffectedFile('third_party/blat/source.cc'), |
| MockAffectedFile('foo/blat/source.h'), |
| MockAffectedFile('foo/blat/source.mm'), |
| MockAffectedFile('foo/blat/source.py'), |
| ] |
| self.file_contents = 'file with \n\terror\nhere\r\nyes there' |
| # 3 source files, 2 errors by file + 1 global CR + 1 global EOF error. |
| self.failUnless(len(PRESUBMIT.LocalChecks(api, MockOutputApi)) == 8) |
| |
| self.file_contents = 'file\twith\ttabs\n' |
| # 3 source files, 1 error by file. |
| self.failUnless(len(PRESUBMIT.LocalChecks(api, MockOutputApi)) == 3) |
| |
| self.file_contents = 'file\rusing\rCRs\n' |
| # One global CR error. |
| self.failUnless(len(PRESUBMIT.LocalChecks(api, MockOutputApi)) == 1) |
| self.failUnless( |
| len(PRESUBMIT.LocalChecks(api, MockOutputApi)[0].items) == 3) |
| |
| self.file_contents = 'both\ttabs and\r\nCRLF\n' |
| # 3 source files, 1 error by file + 1 global CR error. |
| self.failUnless(len(PRESUBMIT.LocalChecks(api, MockOutputApi)) == 4) |
| |
| self.file_contents = 'file with\nzero \\t errors \\r\\n\n' |
| self.failIf(PRESUBMIT.LocalChecks(api, MockOutputApi)) |
| |
| def testLocalChecksDeletedFile(self): |
| api = MockInputApi() |
| api.affected_files = [ |
| MockAffectedFile('foo/blat/source.py', 'D'), |
| ] |
| self.file_contents = 'file with \n\terror\nhere\r\nyes there' |
| self.failUnless(len(PRESUBMIT.LocalChecks(api, MockOutputApi)) == 0) |
| |
| |
| if __name__ == '__main__': |
| unittest.main() |