Alexandre Vassalotti | e9f305f | 2008-05-16 04:39:54 +0000 | [diff] [blame] | 1 | import sys |
Benjamin Peterson | 856ff5f | 2008-05-29 21:22:40 +0000 | [diff] [blame] | 2 | import os |
Walter Dörwald | c69d1c4 | 2005-11-21 17:48:12 +0000 | [diff] [blame] | 3 | import unittest |
Walter Dörwald | c69d1c4 | 2005-11-21 17:48:12 +0000 | [diff] [blame] | 4 | import platform |
Hirokazu Yamamoto | e674840 | 2008-10-06 04:51:11 +0000 | [diff] [blame] | 5 | import subprocess |
Walter Dörwald | c69d1c4 | 2005-11-21 17:48:12 +0000 | [diff] [blame] | 6 | |
Benjamin Peterson | ee8712c | 2008-05-20 21:35:26 +0000 | [diff] [blame] | 7 | from test import support |
Alexandre Vassalotti | e9f305f | 2008-05-16 04:39:54 +0000 | [diff] [blame] | 8 | |
Walter Dörwald | c69d1c4 | 2005-11-21 17:48:12 +0000 | [diff] [blame] | 9 | class PlatformTest(unittest.TestCase): |
| 10 | def test_architecture(self): |
| 11 | res = platform.architecture() |
| 12 | |
Brian Curtin | d40e6f7 | 2010-07-08 21:39:08 +0000 | [diff] [blame] | 13 | @support.skip_unless_symlink |
| 14 | def test_architecture_via_symlink(self): # issue3762 |
| 15 | # On Windows, the EXE needs to know where pythonXY.dll is at so we have |
| 16 | # to add the directory to the path. |
| 17 | if sys.platform == "win32": |
Brian Curtin | 74e4561 | 2010-07-09 15:58:59 +0000 | [diff] [blame] | 18 | os.environ["Path"] = "{};{}".format( |
| 19 | os.path.dirname(sys.executable), os.environ["Path"]) |
Brian Curtin | d40e6f7 | 2010-07-08 21:39:08 +0000 | [diff] [blame] | 20 | |
| 21 | def get(python): |
| 22 | cmd = [python, '-c', |
| 23 | 'import platform; print(platform.architecture())'] |
| 24 | p = subprocess.Popen(cmd, stdout=subprocess.PIPE) |
| 25 | return p.communicate() |
| 26 | real = os.path.realpath(sys.executable) |
| 27 | link = os.path.abspath(support.TESTFN) |
| 28 | os.symlink(real, link) |
| 29 | try: |
| 30 | self.assertEqual(get(real), get(link)) |
| 31 | finally: |
| 32 | os.remove(link) |
Hirokazu Yamamoto | e674840 | 2008-10-06 04:51:11 +0000 | [diff] [blame] | 33 | |
Walter Dörwald | c69d1c4 | 2005-11-21 17:48:12 +0000 | [diff] [blame] | 34 | def test_platform(self): |
| 35 | for aliased in (False, True): |
| 36 | for terse in (False, True): |
| 37 | res = platform.platform(aliased, terse) |
| 38 | |
Benjamin Peterson | 5f28b7b | 2009-03-26 21:49:58 +0000 | [diff] [blame] | 39 | def test_system(self): |
| 40 | res = platform.system() |
| 41 | |
| 42 | def test_node(self): |
| 43 | res = platform.node() |
| 44 | |
| 45 | def test_release(self): |
| 46 | res = platform.release() |
| 47 | |
| 48 | def test_version(self): |
| 49 | res = platform.version() |
| 50 | |
| 51 | def test_machine(self): |
| 52 | res = platform.machine() |
| 53 | |
Walter Dörwald | c69d1c4 | 2005-11-21 17:48:12 +0000 | [diff] [blame] | 54 | def test_processor(self): |
| 55 | res = platform.processor() |
| 56 | |
Benjamin Peterson | e549ead | 2009-03-28 21:42:05 +0000 | [diff] [blame] | 57 | def setUp(self): |
| 58 | self.save_version = sys.version |
| 59 | self.save_subversion = sys.subversion |
| 60 | self.save_platform = sys.platform |
Benjamin Peterson | 5f28b7b | 2009-03-26 21:49:58 +0000 | [diff] [blame] | 61 | |
Benjamin Peterson | e549ead | 2009-03-28 21:42:05 +0000 | [diff] [blame] | 62 | def tearDown(self): |
| 63 | sys.version = self.save_version |
| 64 | sys.subversion = self.save_subversion |
| 65 | sys.platform = self.save_platform |
Benjamin Peterson | 5f28b7b | 2009-03-26 21:49:58 +0000 | [diff] [blame] | 66 | |
Benjamin Peterson | e549ead | 2009-03-28 21:42:05 +0000 | [diff] [blame] | 67 | def test_sys_version(self): |
| 68 | # Old test. |
| 69 | for input, output in ( |
| 70 | ('2.4.3 (#1, Jun 21 2006, 13:54:21) \n[GCC 3.3.4 (pre 3.3.5 20040809)]', |
| 71 | ('CPython', '2.4.3', '', '', '1', 'Jun 21 2006 13:54:21', 'GCC 3.3.4 (pre 3.3.5 20040809)')), |
| 72 | ('IronPython 1.0.60816 on .NET 2.0.50727.42', |
| 73 | ('IronPython', '1.0.60816', '', '', '', '', '.NET 2.0.50727.42')), |
| 74 | ('IronPython 1.0 (1.0.61005.1977) on .NET 2.0.50727.42', |
| 75 | ('IronPython', '1.0.0', '', '', '', '', '.NET 2.0.50727.42')), |
| 76 | ): |
| 77 | # branch and revision are not "parsed", but fetched |
| 78 | # from sys.subversion. Ignore them |
| 79 | (name, version, branch, revision, buildno, builddate, compiler) \ |
| 80 | = platform._sys_version(input) |
| 81 | self.assertEqual( |
| 82 | (name, version, '', '', buildno, builddate, compiler), output) |
Benjamin Peterson | 5f28b7b | 2009-03-26 21:49:58 +0000 | [diff] [blame] | 83 | |
Benjamin Peterson | e549ead | 2009-03-28 21:42:05 +0000 | [diff] [blame] | 84 | # Tests for python_implementation(), python_version(), python_branch(), |
| 85 | # python_revision(), python_build(), and python_compiler(). |
| 86 | sys_versions = { |
| 87 | ("2.6.1 (r261:67515, Dec 6 2008, 15:26:00) \n[GCC 4.0.1 (Apple Computer, Inc. build 5370)]", |
| 88 | ('CPython', 'tags/r261', '67515'), self.save_platform) |
| 89 | : |
| 90 | ("CPython", "2.6.1", "tags/r261", "67515", |
| 91 | ('r261:67515', 'Dec 6 2008 15:26:00'), |
| 92 | 'GCC 4.0.1 (Apple Computer, Inc. build 5370)'), |
| 93 | ("IronPython 2.0 (2.0.0.0) on .NET 2.0.50727.3053", None, "cli") |
| 94 | : |
| 95 | ("IronPython", "2.0.0", "", "", ("", ""), |
| 96 | ".NET 2.0.50727.3053"), |
| 97 | ("2.5 (trunk:6107, Mar 26 2009, 13:02:18) \n[Java HotSpot(TM) Client VM (\"Apple Computer, Inc.\")]", |
| 98 | ('Jython', 'trunk', '6107'), "java1.5.0_16") |
| 99 | : |
| 100 | ("Jython", "2.5.0", "trunk", "6107", |
| 101 | ('trunk:6107', 'Mar 26 2009'), "java1.5.0_16"), |
| 102 | ("2.5.2 (63378, Mar 26 2009, 18:03:29)\n[PyPy 1.0.0]", |
| 103 | ('PyPy', 'trunk', '63378'), self.save_platform) |
| 104 | : |
| 105 | ("PyPy", "2.5.2", "trunk", "63378", ('63378', 'Mar 26 2009'), |
| 106 | "") |
| 107 | } |
| 108 | for (version_tag, subversion, sys_platform), info in \ |
| 109 | sys_versions.items(): |
| 110 | sys.version = version_tag |
| 111 | if subversion is None: |
| 112 | if hasattr(sys, "subversion"): |
| 113 | del sys.subversion |
| 114 | else: |
| 115 | sys.subversion = subversion |
| 116 | if sys_platform is not None: |
| 117 | sys.platform = sys_platform |
| 118 | self.assertEqual(platform.python_implementation(), info[0]) |
| 119 | self.assertEqual(platform.python_version(), info[1]) |
| 120 | self.assertEqual(platform.python_branch(), info[2]) |
| 121 | self.assertEqual(platform.python_revision(), info[3]) |
| 122 | self.assertEqual(platform.python_build(), info[4]) |
| 123 | self.assertEqual(platform.python_compiler(), info[5]) |
Walter Dörwald | c69d1c4 | 2005-11-21 17:48:12 +0000 | [diff] [blame] | 124 | |
Walter Dörwald | c69d1c4 | 2005-11-21 17:48:12 +0000 | [diff] [blame] | 125 | def test_system_alias(self): |
| 126 | res = platform.system_alias( |
| 127 | platform.system(), |
| 128 | platform.release(), |
| 129 | platform.version(), |
| 130 | ) |
| 131 | |
| 132 | def test_uname(self): |
| 133 | res = platform.uname() |
Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 134 | self.assertTrue(any(res)) |
Walter Dörwald | c69d1c4 | 2005-11-21 17:48:12 +0000 | [diff] [blame] | 135 | |
R. David Murray | ca2edce | 2010-03-22 17:48:48 +0000 | [diff] [blame] | 136 | @unittest.skipUnless(sys.platform.startswith('win'), "windows only test") |
| 137 | def test_uname_win32_ARCHITEW6432(self): |
| 138 | # Issue 7860: make sure we get architecture from the correct variable |
| 139 | # on 64 bit Windows: if PROCESSOR_ARCHITEW6432 exists we should be |
| 140 | # using it, per |
| 141 | # http://blogs.msdn.com/david.wang/archive/2006/03/26/HOWTO-Detect-Process-Bitness.aspx |
| 142 | try: |
R. David Murray | a113554 | 2010-03-24 00:29:21 +0000 | [diff] [blame] | 143 | with support.EnvironmentVarGuard() as environ: |
R. David Murray | ca2edce | 2010-03-22 17:48:48 +0000 | [diff] [blame] | 144 | if 'PROCESSOR_ARCHITEW6432' in environ: |
| 145 | del environ['PROCESSOR_ARCHITEW6432'] |
| 146 | environ['PROCESSOR_ARCHITECTURE'] = 'foo' |
| 147 | platform._uname_cache = None |
| 148 | system, node, release, version, machine, processor = platform.uname() |
| 149 | self.assertEqual(machine, 'foo') |
| 150 | environ['PROCESSOR_ARCHITEW6432'] = 'bar' |
| 151 | platform._uname_cache = None |
| 152 | system, node, release, version, machine, processor = platform.uname() |
| 153 | self.assertEqual(machine, 'bar') |
| 154 | finally: |
| 155 | platform._uname_cache = None |
| 156 | |
Walter Dörwald | c69d1c4 | 2005-11-21 17:48:12 +0000 | [diff] [blame] | 157 | def test_java_ver(self): |
| 158 | res = platform.java_ver() |
Alexandre Vassalotti | e9f305f | 2008-05-16 04:39:54 +0000 | [diff] [blame] | 159 | if sys.platform == 'java': |
Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 160 | self.assertTrue(all(res)) |
Walter Dörwald | c69d1c4 | 2005-11-21 17:48:12 +0000 | [diff] [blame] | 161 | |
| 162 | def test_win32_ver(self): |
| 163 | res = platform.win32_ver() |
| 164 | |
| 165 | def test_mac_ver(self): |
| 166 | res = platform.mac_ver() |
Benjamin Peterson | 856ff5f | 2008-05-29 21:22:40 +0000 | [diff] [blame] | 167 | |
Amaury Forgeot d'Arc | 3b40927 | 2008-06-10 21:44:58 +0000 | [diff] [blame] | 168 | if platform.uname()[0] == 'Darwin': |
Benjamin Peterson | 856ff5f | 2008-05-29 21:22:40 +0000 | [diff] [blame] | 169 | # We're on a MacOSX system, check that |
| 170 | # the right version information is returned |
| 171 | fd = os.popen('sw_vers', 'r') |
| 172 | real_ver = None |
| 173 | for ln in fd: |
| 174 | if ln.startswith('ProductVersion:'): |
| 175 | real_ver = ln.strip().split()[-1] |
| 176 | break |
| 177 | fd.close() |
Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 178 | self.assertFalse(real_ver is None) |
Brett Cannon | 353411d | 2009-09-03 21:29:20 +0000 | [diff] [blame] | 179 | result_list = res[0].split('.') |
| 180 | expect_list = real_ver.split('.') |
| 181 | len_diff = len(result_list) - len(expect_list) |
| 182 | # On Snow Leopard, sw_vers reports 10.6.0 as 10.6 |
| 183 | if len_diff > 0: |
| 184 | expect_list.extend(['0'] * len_diff) |
| 185 | self.assertEquals(result_list, expect_list) |
Benjamin Peterson | 856ff5f | 2008-05-29 21:22:40 +0000 | [diff] [blame] | 186 | |
| 187 | # res[1] claims to contain |
| 188 | # (version, dev_stage, non_release_version) |
| 189 | # That information is no longer available |
| 190 | self.assertEquals(res[1], ('', '', '')) |
| 191 | |
| 192 | if sys.byteorder == 'little': |
| 193 | self.assertEquals(res[2], 'i386') |
| 194 | else: |
| 195 | self.assertEquals(res[2], 'PowerPC') |
Walter Dörwald | c69d1c4 | 2005-11-21 17:48:12 +0000 | [diff] [blame] | 196 | |
Ronald Oussoren | e186e38 | 2010-07-23 11:54:59 +0000 | [diff] [blame] | 197 | |
| 198 | @unittest.skipUnless(sys.platform == 'darwin', "OSX only test") |
| 199 | def test_mac_ver_with_fork(self): |
| 200 | # Issue7895: platform.mac_ver() crashes when using fork without exec |
| 201 | # |
| 202 | # This test checks that the fix for that issue works. |
| 203 | # |
| 204 | pid = os.fork() |
| 205 | if pid == 0: |
| 206 | # child |
| 207 | info = platform.mac_ver() |
| 208 | os._exit(0) |
| 209 | |
| 210 | else: |
| 211 | # parent |
| 212 | cpid, sts = os.waitpid(pid, 0) |
| 213 | self.assertEquals(cpid, pid) |
| 214 | self.assertEquals(sts, 0) |
| 215 | |
Walter Dörwald | c69d1c4 | 2005-11-21 17:48:12 +0000 | [diff] [blame] | 216 | def test_dist(self): |
| 217 | res = platform.dist() |
| 218 | |
| 219 | def test_libc_ver(self): |
Thomas Wouters | 49fd7fa | 2006-04-21 10:40:58 +0000 | [diff] [blame] | 220 | import os |
Alexandre Vassalotti | e9f305f | 2008-05-16 04:39:54 +0000 | [diff] [blame] | 221 | if os.path.isdir(sys.executable) and \ |
| 222 | os.path.exists(sys.executable+'.exe'): |
Thomas Wouters | 49fd7fa | 2006-04-21 10:40:58 +0000 | [diff] [blame] | 223 | # Cygwin horror |
Georg Brandl | 89fad14 | 2010-03-14 10:23:39 +0000 | [diff] [blame] | 224 | executable = sys.executable + '.exe' |
| 225 | else: |
| 226 | executable = sys.executable |
| 227 | res = platform.libc_ver(executable) |
Walter Dörwald | c69d1c4 | 2005-11-21 17:48:12 +0000 | [diff] [blame] | 228 | |
Benjamin Peterson | 1a6e0d0 | 2008-10-25 15:49:17 +0000 | [diff] [blame] | 229 | def test_parse_release_file(self): |
| 230 | |
| 231 | for input, output in ( |
| 232 | # Examples of release file contents: |
| 233 | ('SuSE Linux 9.3 (x86-64)', ('SuSE Linux ', '9.3', 'x86-64')), |
| 234 | ('SUSE LINUX 10.1 (X86-64)', ('SUSE LINUX ', '10.1', 'X86-64')), |
| 235 | ('SUSE LINUX 10.1 (i586)', ('SUSE LINUX ', '10.1', 'i586')), |
| 236 | ('Fedora Core release 5 (Bordeaux)', ('Fedora Core', '5', 'Bordeaux')), |
| 237 | ('Red Hat Linux release 8.0 (Psyche)', ('Red Hat Linux', '8.0', 'Psyche')), |
| 238 | ('Red Hat Linux release 9 (Shrike)', ('Red Hat Linux', '9', 'Shrike')), |
| 239 | ('Red Hat Enterprise Linux release 4 (Nahant)', ('Red Hat Enterprise Linux', '4', 'Nahant')), |
| 240 | ('CentOS release 4', ('CentOS', '4', None)), |
| 241 | ('Rocks release 4.2.1 (Cydonia)', ('Rocks', '4.2.1', 'Cydonia')), |
Benjamin Peterson | 2500147 | 2010-01-25 03:37:42 +0000 | [diff] [blame] | 242 | ('', ('', '', '')), # If there's nothing there. |
Benjamin Peterson | 1a6e0d0 | 2008-10-25 15:49:17 +0000 | [diff] [blame] | 243 | ): |
| 244 | self.assertEqual(platform._parse_release_file(input), output) |
| 245 | |
Benjamin Peterson | 1a6e0d0 | 2008-10-25 15:49:17 +0000 | [diff] [blame] | 246 | |
Walter Dörwald | c69d1c4 | 2005-11-21 17:48:12 +0000 | [diff] [blame] | 247 | def test_main(): |
Benjamin Peterson | ee8712c | 2008-05-20 21:35:26 +0000 | [diff] [blame] | 248 | support.run_unittest( |
Walter Dörwald | c69d1c4 | 2005-11-21 17:48:12 +0000 | [diff] [blame] | 249 | PlatformTest |
| 250 | ) |
| 251 | |
| 252 | if __name__ == '__main__': |
| 253 | test_main() |