| Index: tests/presubmit_unittest.py | 
| diff --git a/tests/presubmit_unittest.py b/tests/presubmit_unittest.py | 
| index 3bf7d79e317d9c848693e8f0f47f52160e2501aa..b2cb19083dabf683b7e3add0f3bc588907d7b06b 100755 | 
| --- a/tests/presubmit_unittest.py | 
| +++ b/tests/presubmit_unittest.py | 
| @@ -119,6 +119,7 @@ def GetPreferredTrySlaves(): | 
| presubmit.os.path.abspath = MockAbsPath | 
| presubmit.os.getcwd = self.RootDir | 
| presubmit.os.chdir = MockChdir | 
| +    self.mox.StubOutWithMock(presubmit.scm, 'determine_scm') | 
| self.mox.StubOutWithMock(presubmit.scm.SVN, 'CaptureInfo') | 
| self.mox.StubOutWithMock(presubmit.scm.SVN, 'GetFileProperty') | 
| self.mox.StubOutWithMock(presubmit.gclient_utils, 'FileRead') | 
| @@ -135,12 +136,12 @@ class PresubmitUnittest(PresubmitTestsBase): | 
| self.mox.ReplayAll() | 
| members = [ | 
| 'AffectedFile', 'Change', 'DoGetTrySlaves', 'DoPresubmitChecks', | 
| -      'GetTrySlavesExecuter', 'GitAffectedFile', 'GitChange', | 
| -      'InputApi', 'ListRelevantPresubmitFiles', 'Main', | 
| +      'GetTrySlavesExecuter', 'GitAffectedFile', | 
| +      'GitChange', 'InputApi', 'ListRelevantPresubmitFiles', 'Main', | 
| 'NotImplementedException', 'OutputApi', 'ParseFiles', | 
| 'PresubmitExecuter', 'PresubmitOutput', 'ScanSubDirs', | 
| 'SvnAffectedFile', 'SvnChange', 'cPickle', 'cStringIO', | 
| -      'exceptions', 'fnmatch', 'gclient_utils', 'glob', 'json', | 
| +      'exceptions', 'fnmatch', 'gclient_utils', 'glob', 'json', 'load_files', | 
| 'logging', 'marshal', 'normpath', 'optparse', 'os', 'owners', 'pickle', | 
| 'presubmit_canned_checks', 'random', 're', 'scm', 'subprocess', | 
| 'sys', 'tempfile', 'time', 'traceback', 'types', 'unittest', 'urllib2', | 
| @@ -662,19 +663,14 @@ def CheckChangeOnCommit(input_api, output_api): | 
| self.fake_root_dir, None, False, | 
| output)) | 
|  | 
| -  def testMain(self): | 
| +  def testMainUnversioned(self): | 
| # OptParser calls presubmit.os.path.exists and is a pain when mocked. | 
| self.UnMock(presubmit.os.path, 'exists') | 
| self.mox.StubOutWithMock(presubmit, 'DoPresubmitChecks') | 
| self.mox.StubOutWithMock(presubmit, 'ParseFiles') | 
| -    presubmit.os.path.isdir(presubmit.os.path.join(self.fake_root_dir, '.svn') | 
| -        ).AndReturn(False) | 
| -    presubmit.os.path.isdir(presubmit.os.path.join(self.fake_root_dir, '.git') | 
| -        ).AndReturn(False) | 
| -    presubmit.subprocess.call( | 
| -        ['git', 'rev-parse', '--show-cdup'], | 
| -        cwd=self.fake_root_dir, | 
| -        stdout=presubmit.subprocess.PIPE).AndReturn(1) | 
| +    presubmit.scm.determine_scm(self.fake_root_dir).AndReturn(None) | 
| +    presubmit.ParseFiles(['random_file.txt'], None | 
| +        ).AndReturn(['random_file.txt']) | 
| output = self.mox.CreateMock(presubmit.PresubmitOutput) | 
| output.should_continue().AndReturn(False) | 
|  | 
| @@ -684,9 +680,30 @@ def CheckChangeOnCommit(input_api, output_api): | 
| None, False).AndReturn(output) | 
| self.mox.ReplayAll() | 
|  | 
| -    self.assertEquals(True, | 
| -                      presubmit.Main(['presubmit', '--root', | 
| -                                      self.fake_root_dir])) | 
| +    self.assertEquals( | 
| +        True, | 
| +        presubmit.Main(['--root', self.fake_root_dir, 'random_file.txt'])) | 
| + | 
| +  def testMainUnversionedFail(self): | 
| +    # OptParser calls presubmit.os.path.exists and is a pain when mocked. | 
| +    self.UnMock(presubmit.os.path, 'exists') | 
| +    self.mox.StubOutWithMock(presubmit, 'DoPresubmitChecks') | 
| +    self.mox.StubOutWithMock(presubmit, 'ParseFiles') | 
| +    presubmit.scm.determine_scm(self.fake_root_dir).AndReturn(None) | 
| +    self.mox.StubOutWithMock(presubmit.sys, 'stderr') | 
| +    presubmit.sys.stderr.write( | 
| +        'Usage: presubmit_unittest.py [options] <files...>\n') | 
| +    presubmit.sys.stderr.write('\n') | 
| +    presubmit.sys.stderr.write( | 
| +        'presubmit_unittest.py: error: For unversioned directory, <files> is ' | 
| +        'not optional.\n') | 
| +    self.mox.ReplayAll() | 
| + | 
| +    try: | 
| +      presubmit.Main(['--root', self.fake_root_dir]) | 
| +      self.fail() | 
| +    except SystemExit, e: | 
| +      self.assertEquals(2, e.code) | 
|  | 
|  | 
| class InputApiUnittest(PresubmitTestsBase): | 
|  |