Home | History | Annotate | Download | only in tests
      1 """Tests for distutils.spawn."""
      2 import os
      3 import stat
      4 import sys
      5 import time
      6 import unittest
      7 from test.support import captured_stdout, run_unittest
      8 from test import support as test_support
      9 
     10 from distutils.spawn import _nt_quote_args
     11 from distutils.spawn import spawn, find_executable
     12 from distutils.errors import DistutilsExecError
     13 from distutils.tests import support
     14 
     15 class SpawnTestCase(support.TempdirManager,
     16                     support.LoggingSilencer,
     17                     unittest.TestCase):
     18 
     19     def test_nt_quote_args(self):
     20 
     21         for (args, wanted) in ((['with space', 'nospace'],
     22                                 ['"with space"', 'nospace']),
     23                                (['nochange', 'nospace'],
     24                                 ['nochange', 'nospace'])):
     25             res = _nt_quote_args(args)
     26             self.assertEqual(res, wanted)
     27 
     28 
     29     @unittest.skipUnless(os.name in ('nt', 'posix'),
     30                          'Runs only under posix or nt')
     31     def test_spawn(self):
     32         tmpdir = self.mkdtemp()
     33 
     34         # creating something executable
     35         # through the shell that returns 1
     36         if os.name == 'posix':
     37             exe = os.path.join(tmpdir, 'foo.sh')
     38             self.write_file(exe, '#!/bin/sh\nexit 1')
     39             os.chmod(exe, 0777)
     40         else:
     41             exe = os.path.join(tmpdir, 'foo.bat')
     42             self.write_file(exe, 'exit 1')
     43 
     44         os.chmod(exe, 0777)
     45         self.assertRaises(DistutilsExecError, spawn, [exe])
     46 
     47         # now something that works
     48         if os.name == 'posix':
     49             exe = os.path.join(tmpdir, 'foo.sh')
     50             self.write_file(exe, '#!/bin/sh\nexit 0')
     51             os.chmod(exe, 0777)
     52         else:
     53             exe = os.path.join(tmpdir, 'foo.bat')
     54             self.write_file(exe, 'exit 0')
     55 
     56         os.chmod(exe, 0777)
     57         spawn([exe])  # should work without any error
     58 
     59     def test_find_executable(self):
     60         with test_support.temp_dir() as tmp_dir:
     61             # use TESTFN to get a pseudo-unique filename
     62             program_noeext = test_support.TESTFN
     63             # Give the temporary program an ".exe" suffix for all.
     64             # It's needed on Windows and not harmful on other platforms.
     65             program = program_noeext + ".exe"
     66 
     67             filename = os.path.join(tmp_dir, program)
     68             with open(filename, "wb"):
     69                 pass
     70             os.chmod(filename, stat.S_IXUSR)
     71 
     72             # test path parameter
     73             rv = find_executable(program, path=tmp_dir)
     74             self.assertEqual(rv, filename)
     75 
     76             if sys.platform == 'win32':
     77                 # test without ".exe" extension
     78                 rv = find_executable(program_noeext, path=tmp_dir)
     79                 self.assertEqual(rv, filename)
     80 
     81             # test find in the current directory
     82             with test_support.change_cwd(tmp_dir):
     83                 rv = find_executable(program)
     84                 self.assertEqual(rv, program)
     85 
     86             # test non-existent program
     87             dont_exist_program = "dontexist_" + program
     88             rv = find_executable(dont_exist_program , path=tmp_dir)
     89             self.assertIsNone(rv)
     90 
     91             # test os.defpath: missing PATH environment variable
     92             with test_support.EnvironmentVarGuard() as env:
     93                 from distutils import spawn
     94                 with test_support.swap_attr(spawn.os, 'defpath', tmp_dir):
     95                     env.pop('PATH')
     96 
     97                     rv = find_executable(program)
     98                     self.assertEqual(rv, filename)
     99 
    100 
    101 def test_suite():
    102     return unittest.makeSuite(SpawnTestCase)
    103 
    104 if __name__ == "__main__":
    105     run_unittest(test_suite())
    106