| OLD | NEW |
| 1 #!/usr/bin/python | 1 #!/usr/bin/python |
| 2 # Copyright (c) 2010 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2010 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 """Unit tests for presubmit_support.py and presubmit_canned_checks.py.""" | 6 """Unit tests for presubmit_support.py and presubmit_canned_checks.py.""" |
| 7 | 7 |
| 8 # pylint is too confused. | 8 # pylint is too confused. |
| 9 # pylint: disable=E1101,E1103,W0212,W0403 | 9 # pylint: disable=E1101,E1103,W0212,W0403 |
| 10 | 10 |
| (...skipping 682 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 693 def testMembersChanged(self): | 693 def testMembersChanged(self): |
| 694 self.mox.ReplayAll() | 694 self.mox.ReplayAll() |
| 695 members = [ | 695 members = [ |
| 696 'AbsoluteLocalPaths', 'AffectedFiles', 'AffectedSourceFiles', | 696 'AbsoluteLocalPaths', 'AffectedFiles', 'AffectedSourceFiles', |
| 697 'AffectedTextFiles', | 697 'AffectedTextFiles', |
| 698 'DEFAULT_BLACK_LIST', 'DEFAULT_WHITE_LIST', | 698 'DEFAULT_BLACK_LIST', 'DEFAULT_WHITE_LIST', |
| 699 'DepotToLocalPath', 'FilterSourceFile', 'LocalPaths', | 699 'DepotToLocalPath', 'FilterSourceFile', 'LocalPaths', |
| 700 'LocalToDepotPath', | 700 'LocalToDepotPath', |
| 701 'PresubmitLocalPath', 'ReadFile', 'RightHandSideLines', 'ServerPaths', | 701 'PresubmitLocalPath', 'ReadFile', 'RightHandSideLines', 'ServerPaths', |
| 702 'basename', 'cPickle', 'cStringIO', 'canned_checks', 'change', 'environ', | 702 'basename', 'cPickle', 'cStringIO', 'canned_checks', 'change', 'environ', |
| 703 'is_committing', 'json', 'marshal', 'os_path', 'owners_db', 'pickle', | 703 'host_url', 'is_committing', 'json', 'marshal', 'os_path', |
| 704 'platform', 'python_executable', 're', 'subprocess', 'tempfile', | 704 'owners_db', 'pickle', 'platform', 'python_executable', 're', |
| 705 'traceback', 'unittest', 'urllib2', 'version', | 705 'subprocess', 'tbr', 'tempfile', 'traceback', 'unittest', 'urllib2', |
| 706 'version', |
| 706 ] | 707 ] |
| 707 # If this test fails, you should add the relevant test. | 708 # If this test fails, you should add the relevant test. |
| 708 self.compareMembers(presubmit.InputApi(self.fake_change, './.', False), | 709 self.compareMembers(presubmit.InputApi(self.fake_change, './.', False), |
| 709 members) | 710 members) |
| 710 | 711 |
| 711 def testDepotToLocalPath(self): | 712 def testDepotToLocalPath(self): |
| 712 presubmit.scm.SVN.CaptureInfo('svn://foo/smurf').AndReturn( | 713 presubmit.scm.SVN.CaptureInfo('svn://foo/smurf').AndReturn( |
| 713 {'Path': 'prout'}) | 714 {'Path': 'prout'}) |
| 714 presubmit.scm.SVN.CaptureInfo('svn:/foo/notfound/burp').AndReturn({}) | 715 presubmit.scm.SVN.CaptureInfo('svn:/foo/notfound/burp').AndReturn({}) |
| 715 self.mox.ReplayAll() | 716 self.mox.ReplayAll() |
| (...skipping 464 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1180 self.failUnless(len(output) == 1) | 1181 self.failUnless(len(output) == 1) |
| 1181 self.failUnless(files[0] == output[0]) | 1182 self.failUnless(files[0] == output[0]) |
| 1182 | 1183 |
| 1183 | 1184 |
| 1184 class GclChangeUnittest(PresubmitTestsBase): | 1185 class GclChangeUnittest(PresubmitTestsBase): |
| 1185 def testMembersChanged(self): | 1186 def testMembersChanged(self): |
| 1186 members = [ | 1187 members = [ |
| 1187 'AbsoluteLocalPaths', 'AffectedFiles', 'AffectedTextFiles', | 1188 'AbsoluteLocalPaths', 'AffectedFiles', 'AffectedTextFiles', |
| 1188 'DescriptionText', 'FullDescriptionText', 'LocalPaths', 'Name', | 1189 'DescriptionText', 'FullDescriptionText', 'LocalPaths', 'Name', |
| 1189 'RepositoryRoot', 'RightHandSideLines', 'ServerPaths', | 1190 'RepositoryRoot', 'RightHandSideLines', 'ServerPaths', |
| 1190 'approvers', 'issue', 'patchset', 'scm', 'tags', | 1191 'issue', 'patchset', 'scm', 'tags', |
| 1191 ] | 1192 ] |
| 1192 # If this test fails, you should add the relevant test. | 1193 # If this test fails, you should add the relevant test. |
| 1193 self.mox.ReplayAll() | 1194 self.mox.ReplayAll() |
| 1194 | 1195 |
| 1195 change = presubmit.Change('foo', 'foo', self.fake_root_dir, [('M', 'AA')], | 1196 change = presubmit.Change('foo', 'foo', self.fake_root_dir, [('M', 'AA')], |
| 1196 0, 0) | 1197 0, 0) |
| 1197 self.compareMembers(change, members) | 1198 self.compareMembers(change, members) |
| 1198 | 1199 |
| 1199 | 1200 |
| 1200 class CannedChecksUnittest(PresubmitTestsBase): | 1201 class CannedChecksUnittest(PresubmitTestsBase): |
| 1201 """Tests presubmit_canned_checks.py.""" | 1202 """Tests presubmit_canned_checks.py.""" |
| 1202 | 1203 |
| 1203 def setUp(self): | 1204 def setUp(self): |
| 1204 PresubmitTestsBase.setUp(self) | 1205 PresubmitTestsBase.setUp(self) |
| 1205 | 1206 |
| 1206 def MockInputApi(self, change, committing): | 1207 def MockInputApi(self, change, committing): |
| 1207 input_api = self.mox.CreateMock(presubmit.InputApi) | 1208 input_api = self.mox.CreateMock(presubmit.InputApi) |
| 1208 input_api.cStringIO = presubmit.cStringIO | 1209 input_api.cStringIO = presubmit.cStringIO |
| 1209 input_api.os_path = presubmit.os.path | 1210 input_api.os_path = presubmit.os.path |
| 1210 input_api.re = presubmit.re | 1211 input_api.re = presubmit.re |
| 1211 input_api.traceback = presubmit.traceback | 1212 input_api.traceback = presubmit.traceback |
| 1212 input_api.urllib2 = self.mox.CreateMock(presubmit.urllib2) | 1213 input_api.urllib2 = self.mox.CreateMock(presubmit.urllib2) |
| 1213 input_api.unittest = unittest | 1214 input_api.unittest = unittest |
| 1214 input_api.subprocess = self.mox.CreateMock(presubmit.subprocess) | 1215 input_api.subprocess = self.mox.CreateMock(presubmit.subprocess) |
| 1215 | 1216 |
| 1216 input_api.change = change | 1217 input_api.change = change |
| 1218 input_api.host_url = 'http://localhost' |
| 1217 input_api.is_committing = committing | 1219 input_api.is_committing = committing |
| 1220 input_api.tbr = False |
| 1218 input_api.python_executable = 'pyyyyython' | 1221 input_api.python_executable = 'pyyyyython' |
| 1219 return input_api | 1222 return input_api |
| 1220 | 1223 |
| 1221 def testMembersChanged(self): | 1224 def testMembersChanged(self): |
| 1222 self.mox.ReplayAll() | 1225 self.mox.ReplayAll() |
| 1223 members = [ | 1226 members = [ |
| 1224 'CheckChangeHasBugField', 'CheckChangeHasDescription', | 1227 'CheckChangeHasBugField', 'CheckChangeHasDescription', |
| 1225 'CheckChangeHasNoStrayWhitespace', | 1228 'CheckChangeHasNoStrayWhitespace', |
| 1226 'CheckChangeHasOnlyOneEol', 'CheckChangeHasNoCR', | 1229 'CheckChangeHasOnlyOneEol', 'CheckChangeHasNoCR', |
| 1227 'CheckChangeHasNoCrAndHasOnlyOneEol', 'CheckChangeHasNoTabs', | 1230 'CheckChangeHasNoCrAndHasOnlyOneEol', 'CheckChangeHasNoTabs', |
| (...skipping 622 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1850 }""") | 1853 }""") |
| 1851 connection.close() | 1854 connection.close() |
| 1852 self.mox.ReplayAll() | 1855 self.mox.ReplayAll() |
| 1853 | 1856 |
| 1854 results = presubmit_canned_checks.CheckBuildbotPendingBuilds( | 1857 results = presubmit_canned_checks.CheckBuildbotPendingBuilds( |
| 1855 input_api, presubmit.OutputApi, 'uurl', 2, ('foo')) | 1858 input_api, presubmit.OutputApi, 'uurl', 2, ('foo')) |
| 1856 self.assertEquals(len(results), 1) | 1859 self.assertEquals(len(results), 1) |
| 1857 self.assertEquals(results[0].__class__, | 1860 self.assertEquals(results[0].__class__, |
| 1858 presubmit.OutputApi.PresubmitNotifyResult) | 1861 presubmit.OutputApi.PresubmitNotifyResult) |
| 1859 | 1862 |
| 1860 def OwnersTest(self, is_committing, change_tags=None, | 1863 def OwnersTest(self, is_committing, tbr=False, change_tags=None, |
| 1861 suggested_reviewers=None, approvers=None, | 1864 suggested_reviewers=None, approvers=None, |
| 1862 uncovered_files=None, expected_results=None): | 1865 uncovered_files=None, expected_results=None): |
| 1863 affected_file = self.mox.CreateMock(presubmit.SvnAffectedFile) | 1866 affected_file = self.mox.CreateMock(presubmit.SvnAffectedFile) |
| 1864 affected_file.LocalPath().AndReturn('foo.cc') | 1867 affected_file.LocalPath().AndReturn('foo.cc') |
| 1865 change = self.mox.CreateMock(presubmit.Change) | 1868 change = self.mox.CreateMock(presubmit.Change) |
| 1866 change.AffectedFiles(None).AndReturn([affected_file]) | 1869 change.AffectedFiles(None).AndReturn([affected_file]) |
| 1867 | 1870 |
| 1868 input_api = self.MockInputApi(change, False) | 1871 input_api = self.MockInputApi(change, False) |
| 1869 fake_db = self.mox.CreateMock(owners.Database) | 1872 fake_db = self.mox.CreateMock(owners.Database) |
| 1873 fake_db.email_regexp = input_api.re.compile(owners.BASIC_EMAIL_REGEXP) |
| 1870 input_api.owners_db = fake_db | 1874 input_api.owners_db = fake_db |
| 1871 input_api.is_committing = is_committing | 1875 input_api.is_committing = is_committing |
| 1876 input_api.tbr = tbr |
| 1872 | 1877 |
| 1873 if is_committing: | 1878 if is_committing and not tbr: |
| 1874 change.approvers = approvers | 1879 change.issue = '1' |
| 1880 messages = list('{"sender": "' + a + '","text": "lgtm"}' for |
| 1881 a in approvers) |
| 1882 rietveld_response = ('{"owner": "john@example.com",' |
| 1883 '"messages": [' + ','.join(messages) + ']}') |
| 1884 input_api.urllib2.urlopen( |
| 1885 input_api.host_url + '/api/1?messages=true').AndReturn( |
| 1886 StringIO.StringIO(rietveld_response)) |
| 1887 input_api.json = presubmit.json |
| 1875 fake_db.files_not_covered_by(set(['foo.cc']), approvers).AndReturn( | 1888 fake_db.files_not_covered_by(set(['foo.cc']), approvers).AndReturn( |
| 1876 uncovered_files) | 1889 uncovered_files) |
| 1877 else: | 1890 elif not is_committing: |
| 1878 change.tags = change_tags | 1891 change.tags = change_tags |
| 1879 if not change_tags.get('R'): | 1892 if not change_tags.get('R'): |
| 1880 fake_db.reviewers_for(set(['foo.cc'])).AndReturn(suggested_reviewers) | 1893 fake_db.reviewers_for(set(['foo.cc'])).AndReturn(suggested_reviewers) |
| 1881 | 1894 |
| 1882 self.mox.ReplayAll() | 1895 self.mox.ReplayAll() |
| 1883 results = presubmit_canned_checks.CheckOwners(input_api, | 1896 results = presubmit_canned_checks.CheckOwners(input_api, |
| 1884 presubmit.OutputApi, None) | 1897 presubmit.OutputApi) |
| 1885 self.assertEquals(len(results), len(expected_results)) | 1898 self.assertEquals(len(results), len(expected_results)) |
| 1886 if results and expected_results: | 1899 if results and expected_results: |
| 1887 output = StringIO.StringIO() | 1900 output = StringIO.StringIO() |
| 1888 unused_input = StringIO.StringIO() | 1901 unused_input = StringIO.StringIO() |
| 1889 results[0]._Handle(output, unused_input) | 1902 results[0]._Handle(output, unused_input) |
| 1890 self.assertEquals(output.getvalue(), expected_results[0]) | 1903 self.assertEquals(output.getvalue(), expected_results[0]) |
| 1891 | 1904 |
| 1892 def testCannedCheckOwners_WithReviewer(self): | 1905 def testCannedCheckOwners_WithReviewer(self): |
| 1893 self.OwnersTest(is_committing=False, change_tags={'R': 'ben@example.com'}, | 1906 self.OwnersTest(is_committing=False, change_tags={'R': 'ben@example.com'}, |
| 1894 expected_results=[]) | 1907 expected_results=[]) |
| 1908 self.OwnersTest(is_committing=False, tbr=True, |
| 1909 change_tags={'R': 'ben@example.com'}, expected_results=[]) |
| 1895 | 1910 |
| 1896 def testCannedCheckOwners_NoReviewer(self): | 1911 def testCannedCheckOwners_NoReviewer(self): |
| 1897 self.OwnersTest(is_committing=False, change_tags={}, | 1912 self.OwnersTest(is_committing=False, change_tags={}, |
| 1898 suggested_reviewers=['ben@example.com'], | 1913 suggested_reviewers=['ben@example.com'], |
| 1899 expected_results=['ADD: R=ben@example.com\n']) | 1914 expected_results=['ADD: R=ben@example.com\n']) |
| 1915 self.OwnersTest(is_committing=False, tbr=True, change_tags={}, |
| 1916 suggested_reviewers=['ben@example.com'], |
| 1917 expected_results=['ADD: R=ben@example.com\n']) |
| 1900 | 1918 |
| 1901 def testCannedCheckOwners_CommittingWithoutOwnerLGTM(self): | 1919 def testCannedCheckOwners_CommittingWithoutOwnerLGTM(self): |
| 1902 self.OwnersTest(is_committing=True, | 1920 self.OwnersTest(is_committing=True, |
| 1903 approvers=set(), | 1921 approvers=set(), |
| 1904 uncovered_files=set(['foo.cc']), | 1922 uncovered_files=set(['foo.cc']), |
| 1905 expected_results=['Missing owner LGTM for: foo.cc\n']) | 1923 expected_results=['Missing LGTM from an OWNER for: foo.cc\n']) |
| 1906 | 1924 |
| 1907 def testCannedCheckOwners_CommittingWithLGTMs(self): | 1925 def testCannedCheckOwners_CommittingWithLGTMs(self): |
| 1908 self.OwnersTest(is_committing=True, | 1926 self.OwnersTest(is_committing=True, |
| 1909 approvers=set('ben@example.com'), | 1927 approvers=set(['ben@example.com']), |
| 1910 uncovered_files=set(), | 1928 uncovered_files=set(), |
| 1911 expected_results=[]) | 1929 expected_results=[]) |
| 1912 | 1930 |
| 1931 def testCannedCheckOwners_TBR(self): |
| 1932 self.OwnersTest(is_committing=True, tbr=True, |
| 1933 approvers=set(), |
| 1934 uncovered_files=set(), |
| 1935 expected_results=['--tbr was specified, skipping OWNERS check\n']) |
| 1913 | 1936 |
| 1914 if __name__ == '__main__': | 1937 if __name__ == '__main__': |
| 1915 import unittest | 1938 import unittest |
| 1916 unittest.main() | 1939 unittest.main() |
| OLD | NEW |