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

Side by Side Diff: tests/presubmit_unittest.py

Issue 621533002: Added orphaned compiled Python file checks. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/tools/depot_tools
Patch Set: Created 6 years, 2 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 | « presubmit_support.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 """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: disable=E1101,E1103 8 # pylint: disable=E1101,E1103
9 9
10 import __builtin__
11
12 import contextlib
10 import functools 13 import functools
11 import itertools 14 import itertools
12 import logging 15 import logging
13 import os 16 import os
14 import StringIO 17 import StringIO
15 import sys 18 import sys
16 import time 19 import time
17 import unittest 20 import unittest
18 21
19 _ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 22 _ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
126 """ 129 """
127 130
128 def setUp(self): 131 def setUp(self):
129 SuperMoxTestBase.setUp(self) 132 SuperMoxTestBase.setUp(self)
130 class FakeChange(object): 133 class FakeChange(object):
131 def __init__(self, obj): 134 def __init__(self, obj):
132 self._root = obj.fake_root_dir 135 self._root = obj.fake_root_dir
133 def RepositoryRoot(self): 136 def RepositoryRoot(self):
134 return self._root 137 return self._root
135 138
139 self.UnMock(presubmit.os, 'walk')
szager1 2014/10/28 17:08:14 Can you group this together with the other presubm
dnj 2014/10/28 18:37:35 Must have been late - didn't realize SuperMoxTestB
136 self.mox.StubOutWithMock(presubmit, 'random') 140 self.mox.StubOutWithMock(presubmit, 'random')
137 self.mox.StubOutWithMock(presubmit, 'warn') 141 self.mox.StubOutWithMock(presubmit, 'warn')
142 self.mox.StubOutWithMock(presubmit.os, 'walk')
138 presubmit._ASKED_FOR_FEEDBACK = False 143 presubmit._ASKED_FOR_FEEDBACK = False
139 self.fake_root_dir = self.RootDir() 144 self.fake_root_dir = self.RootDir()
140 self.fake_change = FakeChange(self) 145 self.fake_change = FakeChange(self)
141 146
142 # Special mocks. 147 # Special mocks.
143 def MockAbsPath(f): 148 def MockAbsPath(f):
144 return f 149 return f
145 def MockChdir(f): 150 def MockChdir(f):
146 return None 151 return None
147 # SuperMoxTestBase already mock these but simplify our life. 152 # SuperMoxTestBase already mock these but simplify our life.
(...skipping 22 matching lines...) Expand all
170 'GitChange', 'InputApi', 'ListRelevantPresubmitFiles', 'Main', 175 'GitChange', 'InputApi', 'ListRelevantPresubmitFiles', 'Main',
171 'NonexistantCannedCheckFilter', 'OutputApi', 'ParseFiles', 176 'NonexistantCannedCheckFilter', 'OutputApi', 'ParseFiles',
172 'PresubmitFailure', 'PresubmitExecuter', 'PresubmitOutput', 'ScanSubDirs', 177 'PresubmitFailure', 'PresubmitExecuter', 'PresubmitOutput', 'ScanSubDirs',
173 'SvnAffectedFile', 'SvnChange', 'cPickle', 'cpplint', 'cStringIO', 178 'SvnAffectedFile', 'SvnChange', 'cPickle', 'cpplint', 'cStringIO',
174 'contextlib', 'canned_check_filter', 'fix_encoding', 'fnmatch', 179 'contextlib', 'canned_check_filter', 'fix_encoding', 'fnmatch',
175 'gclient_utils', 'glob', 'inspect', 'json', 'load_files', 'logging', 180 'gclient_utils', 'glob', 'inspect', 'json', 'load_files', 'logging',
176 'marshal', 'normpath', 'optparse', 'os', 'owners', 'pickle', 181 'marshal', 'normpath', 'optparse', 'os', 'owners', 'pickle',
177 'presubmit_canned_checks', 'random', 're', 'rietveld', 'scm', 182 'presubmit_canned_checks', 'random', 're', 'rietveld', 'scm',
178 'subprocess', 'sys', 'tempfile', 'time', 'traceback', 'types', 'unittest', 183 'subprocess', 'sys', 'tempfile', 'time', 'traceback', 'types', 'unittest',
179 'urllib2', 'warn', 'multiprocessing', 'DoGetTryMasters', 184 'urllib2', 'warn', 'multiprocessing', 'DoGetTryMasters',
180 'GetTryMastersExecuter', 'itertools', 185 'GetTryMastersExecuter', 'itertools', 'CleanOrphanedCompiledPython',
186 'IsCompiledPython',
181 ] 187 ]
182 # If this test fails, you should add the relevant test. 188 # If this test fails, you should add the relevant test.
183 self.compareMembers(presubmit, members) 189 self.compareMembers(presubmit, members)
184 190
185 def testCannedCheckFilter(self): 191 def testCannedCheckFilter(self):
186 canned = presubmit.presubmit_canned_checks 192 canned = presubmit.presubmit_canned_checks
187 orig = canned.CheckOwners 193 orig = canned.CheckOwners
188 with presubmit.canned_check_filter(['CheckOwners']): 194 with presubmit.canned_check_filter(['CheckOwners']):
189 self.assertNotEqual(canned.CheckOwners, orig) 195 self.assertNotEqual(canned.CheckOwners, orig)
190 self.assertEqual(canned.CheckOwners(None, None), []) 196 self.assertEqual(canned.CheckOwners(None, None), [])
(...skipping 484 matching lines...) Expand 10 before | Expand all | Expand 10 after
675 inherit_path = presubmit.os.path.join(self.fake_root_dir, 681 inherit_path = presubmit.os.path.join(self.fake_root_dir,
676 self._INHERIT_SETTINGS) 682 self._INHERIT_SETTINGS)
677 presubmit.os.path.isfile(inherit_path).AndReturn(False) 683 presubmit.os.path.isfile(inherit_path).AndReturn(False)
678 presubmit.os.path.isfile(root_path).AndReturn(True) 684 presubmit.os.path.isfile(root_path).AndReturn(True)
679 presubmit.os.path.isfile(haspresubmit_path).AndReturn(True) 685 presubmit.os.path.isfile(haspresubmit_path).AndReturn(True)
680 presubmit.gclient_utils.FileRead(root_path, 686 presubmit.gclient_utils.FileRead(root_path,
681 'rU').AndReturn(self.presubmit_text) 687 'rU').AndReturn(self.presubmit_text)
682 presubmit.gclient_utils.FileRead(haspresubmit_path, 688 presubmit.gclient_utils.FileRead(haspresubmit_path,
683 'rU').AndReturn(self.presubmit_text) 689 'rU').AndReturn(self.presubmit_text)
684 presubmit.random.randint(0, 4).AndReturn(1) 690 presubmit.random.randint(0, 4).AndReturn(1)
691 presubmit.os.walk(self.fake_root_dir).AndReturn([])
685 self.mox.ReplayAll() 692 self.mox.ReplayAll()
686 693
687 input_buf = StringIO.StringIO('y\n') 694 input_buf = StringIO.StringIO('y\n')
688 change = presubmit.Change( 695 change = presubmit.Change(
689 'mychange', 696 'mychange',
690 '\n'.join(description_lines), 697 '\n'.join(description_lines),
691 self.fake_root_dir, 698 self.fake_root_dir,
692 files, 699 files,
693 0, 700 0,
694 0, 701 0,
(...skipping 20 matching lines...) Expand all
715 for _ in range(2): 722 for _ in range(2):
716 presubmit.os.path.isfile(inherit_path).AndReturn(False) 723 presubmit.os.path.isfile(inherit_path).AndReturn(False)
717 presubmit.os.path.isfile(presubmit_path).AndReturn(True) 724 presubmit.os.path.isfile(presubmit_path).AndReturn(True)
718 presubmit.os.path.isfile(haspresubmit_path).AndReturn(True) 725 presubmit.os.path.isfile(haspresubmit_path).AndReturn(True)
719 presubmit.gclient_utils.FileRead(presubmit_path, 'rU' 726 presubmit.gclient_utils.FileRead(presubmit_path, 'rU'
720 ).AndReturn(self.presubmit_text) 727 ).AndReturn(self.presubmit_text)
721 presubmit.gclient_utils.FileRead(haspresubmit_path, 'rU' 728 presubmit.gclient_utils.FileRead(haspresubmit_path, 'rU'
722 ).AndReturn(self.presubmit_text) 729 ).AndReturn(self.presubmit_text)
723 presubmit.random.randint(0, 4).AndReturn(1) 730 presubmit.random.randint(0, 4).AndReturn(1)
724 presubmit.random.randint(0, 4).AndReturn(1) 731 presubmit.random.randint(0, 4).AndReturn(1)
732 presubmit.os.walk(self.fake_root_dir).AndReturn([])
733 presubmit.os.walk(self.fake_root_dir).AndReturn([])
725 self.mox.ReplayAll() 734 self.mox.ReplayAll()
726 735
727 input_buf = StringIO.StringIO('n\n') # say no to the warning 736 input_buf = StringIO.StringIO('n\n') # say no to the warning
728 change = presubmit.Change( 737 change = presubmit.Change(
729 'mychange', 738 'mychange',
730 '\n'.join(description_lines), 739 '\n'.join(description_lines),
731 self.fake_root_dir, 740 self.fake_root_dir,
732 files, 741 files,
733 0, 742 0,
734 0, 743 0,
(...skipping 26 matching lines...) Expand all
761 inherit_path = presubmit.os.path.join(self.fake_root_dir, 770 inherit_path = presubmit.os.path.join(self.fake_root_dir,
762 self._INHERIT_SETTINGS) 771 self._INHERIT_SETTINGS)
763 presubmit.os.path.isfile(inherit_path).AndReturn(False) 772 presubmit.os.path.isfile(inherit_path).AndReturn(False)
764 presubmit.os.path.isfile(presubmit_path).AndReturn(True) 773 presubmit.os.path.isfile(presubmit_path).AndReturn(True)
765 presubmit.os.path.isfile(haspresubmit_path).AndReturn(True) 774 presubmit.os.path.isfile(haspresubmit_path).AndReturn(True)
766 presubmit.gclient_utils.FileRead(presubmit_path, 'rU' 775 presubmit.gclient_utils.FileRead(presubmit_path, 'rU'
767 ).AndReturn(self.presubmit_text) 776 ).AndReturn(self.presubmit_text)
768 presubmit.gclient_utils.FileRead(haspresubmit_path, 'rU').AndReturn( 777 presubmit.gclient_utils.FileRead(haspresubmit_path, 'rU').AndReturn(
769 self.presubmit_text) 778 self.presubmit_text)
770 presubmit.random.randint(0, 4).AndReturn(1) 779 presubmit.random.randint(0, 4).AndReturn(1)
780 presubmit.os.walk(self.fake_root_dir).AndReturn([])
771 self.mox.ReplayAll() 781 self.mox.ReplayAll()
772 782
773 change = presubmit.Change( 783 change = presubmit.Change(
774 'mychange', 784 'mychange',
775 '\n'.join(description_lines), 785 '\n'.join(description_lines),
776 self.fake_root_dir, 786 self.fake_root_dir,
777 files, 787 files,
778 0, 788 0,
779 0, 789 0,
780 None) 790 None)
(...skipping 21 matching lines...) Expand all
802 """ 812 """
803 inherit_path = presubmit.os.path.join(self.fake_root_dir, 813 inherit_path = presubmit.os.path.join(self.fake_root_dir,
804 self._INHERIT_SETTINGS) 814 self._INHERIT_SETTINGS)
805 presubmit.os.path.isfile(inherit_path).AndReturn(False) 815 presubmit.os.path.isfile(inherit_path).AndReturn(False)
806 presubmit.os.path.isfile(join(self.fake_root_dir, 'PRESUBMIT.py') 816 presubmit.os.path.isfile(join(self.fake_root_dir, 'PRESUBMIT.py')
807 ).AndReturn(False) 817 ).AndReturn(False)
808 presubmit.os.path.isfile(join(self.fake_root_dir, 818 presubmit.os.path.isfile(join(self.fake_root_dir,
809 'haspresubmit', 819 'haspresubmit',
810 'PRESUBMIT.py')).AndReturn(False) 820 'PRESUBMIT.py')).AndReturn(False)
811 presubmit.random.randint(0, 4).AndReturn(0) 821 presubmit.random.randint(0, 4).AndReturn(0)
822 presubmit.os.walk(self.fake_root_dir).AndReturn([])
812 self.mox.ReplayAll() 823 self.mox.ReplayAll()
813 824
814 input_buf = StringIO.StringIO('y\n') 825 input_buf = StringIO.StringIO('y\n')
815 # Always fail. 826 # Always fail.
816 change = presubmit.Change( 827 change = presubmit.Change(
817 'mychange', 828 'mychange',
818 '\n'.join(description_lines), 829 '\n'.join(description_lines),
819 self.fake_root_dir, 830 self.fake_root_dir,
820 files, 831 files,
821 0, 832 0,
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
884 return [output_api.PresubmitError('Tag parsing failed. 5 ' + 895 return [output_api.PresubmitError('Tag parsing failed. 5 ' +
885 input_api.change.FullDescriptionText())] 896 input_api.change.FullDescriptionText())]
886 return [output_api.PresubmitNotifyResult(input_api.change.tags['STORY'])] 897 return [output_api.PresubmitNotifyResult(input_api.change.tags['STORY'])]
887 def CheckChangeOnCommit(input_api, output_api): 898 def CheckChangeOnCommit(input_api, output_api):
888 raise Exception("Test error") 899 raise Exception("Test error")
889 """ 900 """
890 presubmit.random.randint(0, 4).AndReturn(1) 901 presubmit.random.randint(0, 4).AndReturn(1)
891 inherit_path = presubmit.os.path.join(self.fake_root_dir, 902 inherit_path = presubmit.os.path.join(self.fake_root_dir,
892 self._INHERIT_SETTINGS) 903 self._INHERIT_SETTINGS)
893 presubmit.os.path.isfile(inherit_path).AndReturn(False) 904 presubmit.os.path.isfile(inherit_path).AndReturn(False)
905 presubmit.os.walk(self.fake_root_dir).AndReturn([])
894 self.mox.ReplayAll() 906 self.mox.ReplayAll()
895 907
896 output = StringIO.StringIO() 908 output = StringIO.StringIO()
897 input_buf = StringIO.StringIO('y\n') 909 input_buf = StringIO.StringIO('y\n')
898 change = presubmit.Change( 910 change = presubmit.Change(
899 'foo', 911 'foo',
900 'Blah Blah\n\nSTORY=http://tracker.com/42\nBUG=boo\n', 912 'Blah Blah\n\nSTORY=http://tracker.com/42\nBUG=boo\n',
901 self.fake_root_dir, 913 self.fake_root_dir,
902 None, 914 None,
903 0, 915 0,
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after
1168 'presubmit_unittest.py: error: For unversioned directory, <files> is ' 1180 'presubmit_unittest.py: error: For unversioned directory, <files> is '
1169 'not optional.\n') 1181 'not optional.\n')
1170 self.mox.ReplayAll() 1182 self.mox.ReplayAll()
1171 1183
1172 try: 1184 try:
1173 presubmit.Main(['--root', self.fake_root_dir]) 1185 presubmit.Main(['--root', self.fake_root_dir])
1174 self.fail() 1186 self.fail()
1175 except SystemExit, e: 1187 except SystemExit, e:
1176 self.assertEquals(2, e.code) 1188 self.assertEquals(2, e.code)
1177 1189
1190 def testCleanOrphanedCompiledPython(self):
1191 self.mox.StubOutWithMock(presubmit, 'IsCompiledPython')
1192 py_path = os.path.join(self.fake_root_dir, 'myfile.py')
1193 pyc_path = os.path.join(self.fake_root_dir, 'myfile.pyc')
1194
1195 presubmit.os.walk(self.fake_root_dir).AndReturn([
1196 (self.fake_root_dir, [], ['myfile.pyc']),
1197 ])
1198 presubmit.os.path.isfile(py_path).AndReturn(False)
1199 presubmit.IsCompiledPython(pyc_path).AndReturn(True)
szager1 2014/10/28 17:08:14 Probably should also test by adding a mock invocat
dnj 2014/10/28 18:37:35 I'm actually going to switch gears here - have one
1200 self.mox.ReplayAll()
1201
1202 output = StringIO.StringIO()
1203 presubmit.CleanOrphanedCompiledPython(output, self.fake_root_dir, False)
1204
1205 def testCleanNonOrphanedCompiledPython(self):
1206 self.mox.StubOutWithMock(presubmit, 'IsCompiledPython')
1207 py_path = os.path.join(self.fake_root_dir, 'myfile.py')
1208
1209 presubmit.os.walk(self.fake_root_dir).AndReturn([
1210 (self.fake_root_dir, [], ['myfile.pyc', 'myfile.py']),
1211 ])
1212 presubmit.os.path.isfile(py_path).AndReturn(True)
1213 self.mox.ReplayAll()
1214
1215 output = StringIO.StringIO()
1216 presubmit.CleanOrphanedCompiledPython(output, self.fake_root_dir, False)
1217
1218 def testCleanOrphanedCompiledPythonAvoidsOtherFiles(self):
1219 self.mox.StubOutWithMock(presubmit, 'IsCompiledPython')
1220
1221 presubmit.os.walk(self.fake_root_dir).AndReturn([
1222 (self.fake_root_dir, [], ['otherfile.txt']),
1223 ])
1224 self.mox.ReplayAll()
1225
1226 output = StringIO.StringIO()
1227 presubmit.CleanOrphanedCompiledPython(output, self.fake_root_dir, False)
1228
1229 def testIsCompiledPython(self):
1230 self.mox.StubOutWithMock(__builtin__, 'open')
1231 pyc_path = os.path.join(self.fake_root_dir, 'testfile.pyc')
1232 open(pyc_path, 'rb').AndReturn(contextlib.closing(
1233 StringIO.StringIO('\x00\x00\x0d\x0a\x00\x00\x00\x00')))
1234 self.mox.ReplayAll()
1235
1236 self.assertTrue(presubmit.IsCompiledPython(pyc_path))
1237
1238 def testIsCompiledPythonFailsForInvalidMagic(self):
1239 self.mox.StubOutWithMock(__builtin__, 'open')
1240 pyc_path = os.path.join(self.fake_root_dir, 'testfile.pyc')
1241 open(pyc_path, 'rb').AndReturn(contextlib.closing(
1242 StringIO.StringIO('\xca\xfe\xba\xbe\x00\x00\x00\x00')))
1243 self.mox.ReplayAll()
1244
1245 self.assertFalse(presubmit.IsCompiledPython(pyc_path))
1246
1247 def testIsCompiledPythonFailsForInvalidSize(self):
1248 self.mox.StubOutWithMock(__builtin__, 'open')
1249 pyc_path = os.path.join(self.fake_root_dir, 'testfile.pyc')
1250 open(pyc_path, 'rb').AndReturn(contextlib.closing(
1251 StringIO.StringIO('\x00\x00\x0d\x0a\x00\x00\x00')))
1252 self.mox.ReplayAll()
1253
1254 self.assertFalse(presubmit.IsCompiledPython(pyc_path))
1255
1178 1256
1179 class InputApiUnittest(PresubmitTestsBase): 1257 class InputApiUnittest(PresubmitTestsBase):
1180 """Tests presubmit.InputApi.""" 1258 """Tests presubmit.InputApi."""
1181 def testMembersChanged(self): 1259 def testMembersChanged(self):
1182 self.mox.ReplayAll() 1260 self.mox.ReplayAll()
1183 members = [ 1261 members = [
1184 'AbsoluteLocalPaths', 'AffectedFiles', 'AffectedSourceFiles', 1262 'AbsoluteLocalPaths', 'AffectedFiles', 'AffectedSourceFiles',
1185 'AffectedTextFiles', 1263 'AffectedTextFiles',
1186 'DEFAULT_BLACK_LIST', 'DEFAULT_WHITE_LIST', 1264 'DEFAULT_BLACK_LIST', 'DEFAULT_WHITE_LIST',
1187 'DepotToLocalPath', 'FilterSourceFile', 'LocalPaths', 1265 'DepotToLocalPath', 'FilterSourceFile', 'LocalPaths',
(...skipping 1731 matching lines...) Expand 10 before | Expand all | Expand 10 after
2919 owners_check=False) 2997 owners_check=False)
2920 self.assertEqual(1, len(results)) 2998 self.assertEqual(1, len(results))
2921 self.assertEqual( 2999 self.assertEqual(
2922 'Found line ending with white spaces in:', results[0]._message) 3000 'Found line ending with white spaces in:', results[0]._message)
2923 self.checkstdout('') 3001 self.checkstdout('')
2924 3002
2925 3003
2926 if __name__ == '__main__': 3004 if __name__ == '__main__':
2927 import unittest 3005 import unittest
2928 unittest.main() 3006 unittest.main()
OLDNEW
« no previous file with comments | « presubmit_support.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698