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