]> granicus.if.org Git - python/commitdiff
Adds a unittest for the internal os._execvpe function.
authorGregory P. Smith <greg@mad-scientist.com>
Sat, 8 May 2010 18:05:46 +0000 (18:05 +0000)
committerGregory P. Smith <greg@mad-scientist.com>
Sat, 8 May 2010 18:05:46 +0000 (18:05 +0000)
Lib/test/test_os.py

index 443d2b9ac1e6f83bfccd2ffb54a7241a615f95ae..453b05836d4f4b42ddb9e7238aac72fdbb25272e 100644 (file)
@@ -633,6 +633,55 @@ class ExecTests(unittest.TestCase):
     def test_execvpe_with_bad_arglist(self):
         self.assertRaises(ValueError, os.execvpe, 'notepad', [], None)
 
+    class _stub_out_for_execvpe_test(object):
+        """
+        Stubs out execv, execve and get_exec_path functions when
+        used as context manager.  Records exec calls.  The mock execv
+        and execve functions always raise an exception as they would
+        normally never return.
+        """
+        def __init__(self):
+            # A list of tuples containing (function name, first arg, args)
+            # of calls to execv or execve that have been made.
+            self.calls = []
+        def _mock_execv(self, name, *args):
+            self.calls.append(('execv', name, args))
+            raise RuntimeError("execv called")
+
+        def _mock_execve(self, name, *args):
+            self.calls.append(('execve', name, args))
+            raise OSError(errno.ENOTDIR, "execve called")
+
+        def _mock_get_exec_path(self, env=None):
+            return ['/p', '/pp']
+
+        def __enter__(self):
+            self.orig_execv = os.execv
+            self.orig_execve = os.execve
+            self.orig_get_exec_path = os.get_exec_path
+            os.execv = self._mock_execv
+            os.execve = self._mock_execve
+            os.get_exec_path = self._mock_get_exec_path
+
+        def __exit__(self, type, value, tb):
+            os.execv = self.orig_execv
+            os.execve = self.orig_execve
+            os.get_exec_path = self.orig_get_exec_path
+
+    @unittest.skipUnless(hasattr(os, '_execvpe'),
+                         "No internal os._execvpe function to test.")
+    def test_internal_execvpe(self):
+        exec_stubbed = self._stub_out_for_execvpe_test()
+        with exec_stubbed:
+            self.assertRaises(RuntimeError, os._execvpe, '/f', ['-a'])
+            self.assertEqual([('execv', '/f', (['-a'],))], exec_stubbed.calls)
+            exec_stubbed.calls = []
+            self.assertRaises(OSError, os._execvpe, 'f', ['-a'],
+                              env={'spam': 'beans'})
+            self.assertEqual([('execve', '/p/f', (['-a'], {'spam': 'beans'})),
+                              ('execve', '/pp/f', (['-a'], {'spam': 'beans'}))],
+                             exec_stubbed.calls)
+
 class Win32ErrorTests(unittest.TestCase):
     def test_rename(self):
         self.assertRaises(WindowsError, os.rename, support.TESTFN, support.TESTFN+".bak")