1"""Tests for distutils.util.""" 2import os 3import sys 4import unittest 5from test.test_support import run_unittest, swap_attr 6 7from distutils.errors import DistutilsByteCompileError 8from distutils.tests import support 9from distutils import util # used to patch _environ_checked 10from distutils.util import (byte_compile, grok_environment_error, 11 check_environ, get_platform) 12 13 14class UtilTestCase(support.EnvironGuard, unittest.TestCase): 15 16 def test_dont_write_bytecode(self): 17 # makes sure byte_compile raise a DistutilsError 18 # if sys.dont_write_bytecode is True 19 old_dont_write_bytecode = sys.dont_write_bytecode 20 sys.dont_write_bytecode = True 21 try: 22 self.assertRaises(DistutilsByteCompileError, byte_compile, []) 23 finally: 24 sys.dont_write_bytecode = old_dont_write_bytecode 25 26 def test_grok_environment_error(self): 27 # test obsolete function to ensure backward compat (#4931) 28 exc = IOError("Unable to find batch file") 29 msg = grok_environment_error(exc) 30 self.assertEqual(msg, "error: Unable to find batch file") 31 32 def test_check_environ(self): 33 util._environ_checked = 0 34 os.environ.pop('HOME', None) 35 36 check_environ() 37 38 self.assertEqual(os.environ['PLAT'], get_platform()) 39 self.assertEqual(util._environ_checked, 1) 40 41 @unittest.skipUnless(os.name == 'posix', 'specific to posix') 42 def test_check_environ_getpwuid(self): 43 util._environ_checked = 0 44 os.environ.pop('HOME', None) 45 46 import pwd 47 48 # only set pw_dir field, other fields are not used 49 def mock_getpwuid(uid): 50 return pwd.struct_passwd((None, None, None, None, None, 51 '/home/distutils', None)) 52 53 with swap_attr(pwd, 'getpwuid', mock_getpwuid): 54 check_environ() 55 self.assertEqual(os.environ['HOME'], '/home/distutils') 56 57 util._environ_checked = 0 58 os.environ.pop('HOME', None) 59 60 # bpo-10496: Catch pwd.getpwuid() error 61 def getpwuid_err(uid): 62 raise KeyError 63 with swap_attr(pwd, 'getpwuid', getpwuid_err): 64 check_environ() 65 self.assertNotIn('HOME', os.environ) 66 67 68def test_suite(): 69 return unittest.makeSuite(UtilTestCase) 70 71if __name__ == "__main__": 72 run_unittest(test_suite()) 73