blob: eac9b5141d503c436e39deed8266d0adb52afd76 [file] [log] [blame]
Tarek Ziadé811d6242009-02-13 22:26:15 +00001"""Tests for distutils.util."""
Tarek Ziadé811d6242009-02-13 22:26:15 +00002import os
3import sys
4import unittest
Tarek Ziadé822e1d42009-04-13 12:37:57 +00005from copy import copy
Éric Araujo70ec44a2010-11-06 02:44:43 +00006from test.support import run_unittest
Tarek Ziadé811d6242009-02-13 22:26:15 +00007
Tarek Ziadé04fe7c02009-10-25 23:08:47 +00008from distutils.errors import DistutilsPlatformError, DistutilsByteCompileError
Tarek Ziadé36797272010-07-22 12:50:05 +00009from distutils.util import (get_platform, convert_path, change_root,
Tarek Ziadébbf1f182009-05-10 12:20:44 +000010 check_environ, split_quoted, strtobool,
Tarek Ziadé36797272010-07-22 12:50:05 +000011 rfc822_escape, byte_compile)
12from distutils import util # used to patch _environ_checked
13from distutils.sysconfig import get_config_vars
14from distutils import sysconfig
Tarek Ziadébbf1f182009-05-10 12:20:44 +000015from distutils.tests import support
Ned Deilydf8aa2b2012-07-21 05:36:30 -070016import _osx_support
Tarek Ziadé811d6242009-02-13 22:26:15 +000017
Tarek Ziadébbf1f182009-05-10 12:20:44 +000018class UtilTestCase(support.EnvironGuard, unittest.TestCase):
Tarek Ziadé811d6242009-02-13 22:26:15 +000019
20 def setUp(self):
Tarek Ziadébbf1f182009-05-10 12:20:44 +000021 super(UtilTestCase, self).setUp()
Tarek Ziadé811d6242009-02-13 22:26:15 +000022 # saving the environment
23 self.name = os.name
24 self.platform = sys.platform
25 self.version = sys.version
26 self.sep = os.sep
Tarek Ziadé811d6242009-02-13 22:26:15 +000027 self.join = os.path.join
28 self.isabs = os.path.isabs
29 self.splitdrive = os.path.splitdrive
Tarek Ziadé36797272010-07-22 12:50:05 +000030 self._config_vars = copy(sysconfig._config_vars)
Tarek Ziadé811d6242009-02-13 22:26:15 +000031
32 # patching os.uname
33 if hasattr(os, 'uname'):
34 self.uname = os.uname
35 self._uname = os.uname()
Tarek Ziadé811d6242009-02-13 22:26:15 +000036 else:
37 self.uname = None
38 self._uname = None
Tarek Ziadé8c201892009-02-13 23:48:11 +000039
Tarek Ziadé36797272010-07-22 12:50:05 +000040 os.uname = self._get_uname
Tarek Ziadéf8926b22009-07-16 16:18:19 +000041
Tarek Ziadé811d6242009-02-13 22:26:15 +000042 def tearDown(self):
Tarek Ziadé822e1d42009-04-13 12:37:57 +000043 # getting back the environment
Tarek Ziadé811d6242009-02-13 22:26:15 +000044 os.name = self.name
45 sys.platform = self.platform
46 sys.version = self.version
47 os.sep = self.sep
Tarek Ziadé811d6242009-02-13 22:26:15 +000048 os.path.join = self.join
49 os.path.isabs = self.isabs
50 os.path.splitdrive = self.splitdrive
51 if self.uname is not None:
52 os.uname = self.uname
Tarek Ziadé516db942009-03-11 12:52:00 +000053 else:
54 del os.uname
Tarek Ziadé36797272010-07-22 12:50:05 +000055 sysconfig._config_vars = copy(self._config_vars)
Tarek Ziadébbf1f182009-05-10 12:20:44 +000056 super(UtilTestCase, self).tearDown()
Tarek Ziadé811d6242009-02-13 22:26:15 +000057
58 def _set_uname(self, uname):
59 self._uname = uname
60
61 def _get_uname(self):
62 return self._uname
63
Tarek Ziadé8b441d02010-01-29 11:46:31 +000064 def test_get_platform(self):
Tarek Ziadé36797272010-07-22 12:50:05 +000065
66 # windows XP, 32bits
67 os.name = 'nt'
68 sys.version = ('2.4.4 (#71, Oct 18 2006, 08:34:43) '
69 '[MSC v.1310 32 bit (Intel)]')
70 sys.platform = 'win32'
Ezio Melottib3aedd42010-11-20 19:04:17 +000071 self.assertEqual(get_platform(), 'win32')
Tarek Ziadé36797272010-07-22 12:50:05 +000072
73 # windows XP, amd64
74 os.name = 'nt'
75 sys.version = ('2.4.4 (#71, Oct 18 2006, 08:34:43) '
76 '[MSC v.1310 32 bit (Amd64)]')
77 sys.platform = 'win32'
Ezio Melottib3aedd42010-11-20 19:04:17 +000078 self.assertEqual(get_platform(), 'win-amd64')
Tarek Ziadé36797272010-07-22 12:50:05 +000079
80 # windows XP, itanium
81 os.name = 'nt'
82 sys.version = ('2.4.4 (#71, Oct 18 2006, 08:34:43) '
83 '[MSC v.1310 32 bit (Itanium)]')
84 sys.platform = 'win32'
Ezio Melottib3aedd42010-11-20 19:04:17 +000085 self.assertEqual(get_platform(), 'win-ia64')
Tarek Ziadé36797272010-07-22 12:50:05 +000086
87 # macbook
88 os.name = 'posix'
89 sys.version = ('2.5 (r25:51918, Sep 19 2006, 08:49:13) '
90 '\n[GCC 4.0.1 (Apple Computer, Inc. build 5341)]')
91 sys.platform = 'darwin'
92 self._set_uname(('Darwin', 'macziade', '8.11.1',
93 ('Darwin Kernel Version 8.11.1: '
94 'Wed Oct 10 18:23:28 PDT 2007; '
95 'root:xnu-792.25.20~1/RELEASE_I386'), 'i386'))
Ned Deilydf8aa2b2012-07-21 05:36:30 -070096 _osx_support._remove_original_values(get_config_vars())
Ronald Oussoren222e89a2011-05-15 16:46:11 +020097 get_config_vars()['MACOSX_DEPLOYMENT_TARGET'] = '10.3'
Tarek Ziadé36797272010-07-22 12:50:05 +000098
99 get_config_vars()['CFLAGS'] = ('-fno-strict-aliasing -DNDEBUG -g '
100 '-fwrapv -O3 -Wall -Wstrict-prototypes')
101
102 cursize = sys.maxsize
103 sys.maxsize = (2 ** 31)-1
104 try:
Ezio Melottib3aedd42010-11-20 19:04:17 +0000105 self.assertEqual(get_platform(), 'macosx-10.3-i386')
Tarek Ziadé36797272010-07-22 12:50:05 +0000106 finally:
107 sys.maxsize = cursize
108
109 # macbook with fat binaries (fat, universal or fat64)
Ned Deilydf8aa2b2012-07-21 05:36:30 -0700110 _osx_support._remove_original_values(get_config_vars())
Ronald Oussoren222e89a2011-05-15 16:46:11 +0200111 get_config_vars()['MACOSX_DEPLOYMENT_TARGET'] = '10.4'
Tarek Ziadé36797272010-07-22 12:50:05 +0000112 get_config_vars()['CFLAGS'] = ('-arch ppc -arch i386 -isysroot '
113 '/Developer/SDKs/MacOSX10.4u.sdk '
114 '-fno-strict-aliasing -fno-common '
115 '-dynamic -DNDEBUG -g -O3')
116
Ezio Melottib3aedd42010-11-20 19:04:17 +0000117 self.assertEqual(get_platform(), 'macosx-10.4-fat')
Tarek Ziadé36797272010-07-22 12:50:05 +0000118
Ned Deilydf8aa2b2012-07-21 05:36:30 -0700119 _osx_support._remove_original_values(get_config_vars())
Ronald Oussoren222e89a2011-05-15 16:46:11 +0200120 os.environ['MACOSX_DEPLOYMENT_TARGET'] = '10.1'
121 self.assertEqual(get_platform(), 'macosx-10.4-fat')
122
123
Ned Deilydf8aa2b2012-07-21 05:36:30 -0700124 _osx_support._remove_original_values(get_config_vars())
Tarek Ziadé36797272010-07-22 12:50:05 +0000125 get_config_vars()['CFLAGS'] = ('-arch x86_64 -arch i386 -isysroot '
126 '/Developer/SDKs/MacOSX10.4u.sdk '
127 '-fno-strict-aliasing -fno-common '
128 '-dynamic -DNDEBUG -g -O3')
129
Ezio Melottib3aedd42010-11-20 19:04:17 +0000130 self.assertEqual(get_platform(), 'macosx-10.4-intel')
Tarek Ziadé36797272010-07-22 12:50:05 +0000131
Ned Deilydf8aa2b2012-07-21 05:36:30 -0700132 _osx_support._remove_original_values(get_config_vars())
Tarek Ziadé36797272010-07-22 12:50:05 +0000133 get_config_vars()['CFLAGS'] = ('-arch x86_64 -arch ppc -arch i386 -isysroot '
134 '/Developer/SDKs/MacOSX10.4u.sdk '
135 '-fno-strict-aliasing -fno-common '
136 '-dynamic -DNDEBUG -g -O3')
Ezio Melottib3aedd42010-11-20 19:04:17 +0000137 self.assertEqual(get_platform(), 'macosx-10.4-fat3')
Tarek Ziadé36797272010-07-22 12:50:05 +0000138
Ned Deilydf8aa2b2012-07-21 05:36:30 -0700139 _osx_support._remove_original_values(get_config_vars())
Tarek Ziadé36797272010-07-22 12:50:05 +0000140 get_config_vars()['CFLAGS'] = ('-arch ppc64 -arch x86_64 -arch ppc -arch i386 -isysroot '
141 '/Developer/SDKs/MacOSX10.4u.sdk '
142 '-fno-strict-aliasing -fno-common '
143 '-dynamic -DNDEBUG -g -O3')
Ezio Melottib3aedd42010-11-20 19:04:17 +0000144 self.assertEqual(get_platform(), 'macosx-10.4-universal')
Tarek Ziadé36797272010-07-22 12:50:05 +0000145
Ned Deilydf8aa2b2012-07-21 05:36:30 -0700146 _osx_support._remove_original_values(get_config_vars())
Tarek Ziadé36797272010-07-22 12:50:05 +0000147 get_config_vars()['CFLAGS'] = ('-arch x86_64 -arch ppc64 -isysroot '
148 '/Developer/SDKs/MacOSX10.4u.sdk '
149 '-fno-strict-aliasing -fno-common '
150 '-dynamic -DNDEBUG -g -O3')
151
Ezio Melottib3aedd42010-11-20 19:04:17 +0000152 self.assertEqual(get_platform(), 'macosx-10.4-fat64')
Tarek Ziadé36797272010-07-22 12:50:05 +0000153
154 for arch in ('ppc', 'i386', 'x86_64', 'ppc64'):
Ned Deilydf8aa2b2012-07-21 05:36:30 -0700155 _osx_support._remove_original_values(get_config_vars())
Tarek Ziadé36797272010-07-22 12:50:05 +0000156 get_config_vars()['CFLAGS'] = ('-arch %s -isysroot '
157 '/Developer/SDKs/MacOSX10.4u.sdk '
158 '-fno-strict-aliasing -fno-common '
159 '-dynamic -DNDEBUG -g -O3'%(arch,))
160
Ezio Melottib3aedd42010-11-20 19:04:17 +0000161 self.assertEqual(get_platform(), 'macosx-10.4-%s'%(arch,))
Tarek Ziadé36797272010-07-22 12:50:05 +0000162
Ronald Oussoren222e89a2011-05-15 16:46:11 +0200163
Tarek Ziadé36797272010-07-22 12:50:05 +0000164 # linux debian sarge
165 os.name = 'posix'
166 sys.version = ('2.3.5 (#1, Jul 4 2007, 17:28:59) '
167 '\n[GCC 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)]')
168 sys.platform = 'linux2'
169 self._set_uname(('Linux', 'aglae', '2.6.21.1dedibox-r7',
170 '#1 Mon Apr 30 17:25:38 CEST 2007', 'i686'))
171
Ezio Melottib3aedd42010-11-20 19:04:17 +0000172 self.assertEqual(get_platform(), 'linux-i686')
Tarek Ziadé36797272010-07-22 12:50:05 +0000173
174 # XXX more platforms to tests here
Tarek Ziadé811d6242009-02-13 22:26:15 +0000175
176 def test_convert_path(self):
177 # linux/mac
178 os.sep = '/'
179 def _join(path):
180 return '/'.join(path)
181 os.path.join = _join
182
Ezio Melottib3aedd42010-11-20 19:04:17 +0000183 self.assertEqual(convert_path('/home/to/my/stuff'),
184 '/home/to/my/stuff')
Tarek Ziadé811d6242009-02-13 22:26:15 +0000185
186 # win
187 os.sep = '\\'
188 def _join(*path):
189 return '\\'.join(path)
190 os.path.join = _join
191
192 self.assertRaises(ValueError, convert_path, '/home/to/my/stuff')
193 self.assertRaises(ValueError, convert_path, 'home/to/my/stuff/')
194
Ezio Melottib3aedd42010-11-20 19:04:17 +0000195 self.assertEqual(convert_path('home/to/my/stuff'),
196 'home\\to\\my\\stuff')
197 self.assertEqual(convert_path('.'),
198 os.curdir)
Tarek Ziadé811d6242009-02-13 22:26:15 +0000199
200 def test_change_root(self):
201 # linux/mac
202 os.name = 'posix'
203 def _isabs(path):
204 return path[0] == '/'
205 os.path.isabs = _isabs
Tarek Ziadé8c201892009-02-13 23:48:11 +0000206 def _join(*path):
207 return '/'.join(path)
208 os.path.join = _join
Tarek Ziadé811d6242009-02-13 22:26:15 +0000209
Ezio Melottib3aedd42010-11-20 19:04:17 +0000210 self.assertEqual(change_root('/root', '/old/its/here'),
211 '/root/old/its/here')
212 self.assertEqual(change_root('/root', 'its/here'),
213 '/root/its/here')
Tarek Ziadé811d6242009-02-13 22:26:15 +0000214
215 # windows
216 os.name = 'nt'
217 def _isabs(path):
218 return path.startswith('c:\\')
219 os.path.isabs = _isabs
220 def _splitdrive(path):
221 if path.startswith('c:'):
222 return ('', path.replace('c:', ''))
223 return ('', path)
224 os.path.splitdrive = _splitdrive
225 def _join(*path):
226 return '\\'.join(path)
227 os.path.join = _join
228
Ezio Melottib3aedd42010-11-20 19:04:17 +0000229 self.assertEqual(change_root('c:\\root', 'c:\\old\\its\\here'),
230 'c:\\root\\old\\its\\here')
231 self.assertEqual(change_root('c:\\root', 'its\\here'),
232 'c:\\root\\its\\here')
Tarek Ziadé811d6242009-02-13 22:26:15 +0000233
234 # BugsBunny os (it's a great os)
235 os.name = 'BugsBunny'
236 self.assertRaises(DistutilsPlatformError,
237 change_root, 'c:\\root', 'its\\here')
238
239 # XXX platforms to be covered: os2, mac
240
241 def test_check_environ(self):
242 util._environ_checked = 0
Tarek Ziadé430fb632009-10-18 11:34:51 +0000243 if 'HOME' in os.environ:
244 del os.environ['HOME']
Tarek Ziadé811d6242009-02-13 22:26:15 +0000245
246 # posix without HOME
247 if os.name == 'posix': # this test won't run on windows
Tarek Ziadébbf1f182009-05-10 12:20:44 +0000248 check_environ()
249 import pwd
Ezio Melottib3aedd42010-11-20 19:04:17 +0000250 self.assertEqual(os.environ['HOME'], pwd.getpwuid(os.getuid())[5])
Tarek Ziadé811d6242009-02-13 22:26:15 +0000251 else:
252 check_environ()
253
Ezio Melottib3aedd42010-11-20 19:04:17 +0000254 self.assertEqual(os.environ['PLAT'], get_platform())
255 self.assertEqual(util._environ_checked, 1)
Tarek Ziadé811d6242009-02-13 22:26:15 +0000256
257 def test_split_quoted(self):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000258 self.assertEqual(split_quoted('""one"" "two" \'three\' \\four'),
259 ['one', 'two', 'three', 'four'])
Tarek Ziadé811d6242009-02-13 22:26:15 +0000260
261 def test_strtobool(self):
262 yes = ('y', 'Y', 'yes', 'True', 't', 'true', 'True', 'On', 'on', '1')
263 no = ('n', 'no', 'f', 'false', 'off', '0', 'Off', 'No', 'N')
264
265 for y in yes:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000266 self.assertTrue(strtobool(y))
Tarek Ziadé811d6242009-02-13 22:26:15 +0000267
268 for n in no:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000269 self.assertTrue(not strtobool(n))
Tarek Ziadé811d6242009-02-13 22:26:15 +0000270
271 def test_rfc822_escape(self):
272 header = 'I am a\npoor\nlonesome\nheader\n'
273 res = rfc822_escape(header)
274 wanted = ('I am a%(8s)spoor%(8s)slonesome%(8s)s'
275 'header%(8s)s') % {'8s': '\n'+8*' '}
Ezio Melottib3aedd42010-11-20 19:04:17 +0000276 self.assertEqual(res, wanted)
Tarek Ziadé811d6242009-02-13 22:26:15 +0000277
Tarek Ziadé04fe7c02009-10-25 23:08:47 +0000278 def test_dont_write_bytecode(self):
279 # makes sure byte_compile raise a DistutilsError
280 # if sys.dont_write_bytecode is True
281 old_dont_write_bytecode = sys.dont_write_bytecode
282 sys.dont_write_bytecode = True
283 try:
284 self.assertRaises(DistutilsByteCompileError, byte_compile, [])
285 finally:
286 sys.dont_write_bytecode = old_dont_write_bytecode
287
Tarek Ziadé811d6242009-02-13 22:26:15 +0000288def test_suite():
Tarek Ziadébbf1f182009-05-10 12:20:44 +0000289 return unittest.makeSuite(UtilTestCase)
Tarek Ziadé811d6242009-02-13 22:26:15 +0000290
291if __name__ == "__main__":
Éric Araujo70ec44a2010-11-06 02:44:43 +0000292 run_unittest(test_suite())