15915a4dcfebf74d0a2c99848ede619f5bf7d2899Benjamin Petersonimport sys
2913c15c1c6641195b492837eee1189369abe04b7Benjamin Petersonimport os
3c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwaldimport unittest
4c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwaldimport platform
56e5e50104c90501477e1ecc739e563f0f9b1129dHirokazu Yamamotoimport subprocess
6c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwald
75915a4dcfebf74d0a2c99848ede619f5bf7d2899Benjamin Petersonfrom test import test_support
85915a4dcfebf74d0a2c99848ede619f5bf7d2899Benjamin Peterson
9c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwaldclass PlatformTest(unittest.TestCase):
10c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwald    def test_architecture(self):
11c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwald        res = platform.architecture()
12c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwald
136e5e50104c90501477e1ecc739e563f0f9b1129dHirokazu Yamamoto    if hasattr(os, "symlink"):
146e5e50104c90501477e1ecc739e563f0f9b1129dHirokazu Yamamoto        def test_architecture_via_symlink(self): # issue3762
156e5e50104c90501477e1ecc739e563f0f9b1129dHirokazu Yamamoto            def get(python):
166e5e50104c90501477e1ecc739e563f0f9b1129dHirokazu Yamamoto                cmd = [python, '-c',
176e5e50104c90501477e1ecc739e563f0f9b1129dHirokazu Yamamoto                    'import platform; print platform.architecture()']
186e5e50104c90501477e1ecc739e563f0f9b1129dHirokazu Yamamoto                p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
196e5e50104c90501477e1ecc739e563f0f9b1129dHirokazu Yamamoto                return p.communicate()
2018c4e8734c7d817163e2c6564eedc246a2c9aa58Hirokazu Yamamoto            real = os.path.realpath(sys.executable)
2118c4e8734c7d817163e2c6564eedc246a2c9aa58Hirokazu Yamamoto            link = os.path.abspath(test_support.TESTFN)
2218c4e8734c7d817163e2c6564eedc246a2c9aa58Hirokazu Yamamoto            os.symlink(real, link)
236e5e50104c90501477e1ecc739e563f0f9b1129dHirokazu Yamamoto            try:
2418c4e8734c7d817163e2c6564eedc246a2c9aa58Hirokazu Yamamoto                self.assertEqual(get(real), get(link))
256e5e50104c90501477e1ecc739e563f0f9b1129dHirokazu Yamamoto            finally:
2618c4e8734c7d817163e2c6564eedc246a2c9aa58Hirokazu Yamamoto                os.remove(link)
276e5e50104c90501477e1ecc739e563f0f9b1129dHirokazu Yamamoto
28c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwald    def test_platform(self):
29c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwald        for aliased in (False, True):
30c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwald            for terse in (False, True):
31c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwald                res = platform.platform(aliased, terse)
32c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwald
33a519cfc9534016725435c23fc1840d7d43d47c3bMarc-André Lemburg    def test_system(self):
34a519cfc9534016725435c23fc1840d7d43d47c3bMarc-André Lemburg        res = platform.system()
35c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwald
36a519cfc9534016725435c23fc1840d7d43d47c3bMarc-André Lemburg    def test_node(self):
37a519cfc9534016725435c23fc1840d7d43d47c3bMarc-André Lemburg        res = platform.node()
38c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwald
39a519cfc9534016725435c23fc1840d7d43d47c3bMarc-André Lemburg    def test_release(self):
40a519cfc9534016725435c23fc1840d7d43d47c3bMarc-André Lemburg        res = platform.release()
41c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwald
42c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwald    def test_version(self):
43a519cfc9534016725435c23fc1840d7d43d47c3bMarc-André Lemburg        res = platform.version()
44a519cfc9534016725435c23fc1840d7d43d47c3bMarc-André Lemburg
45a519cfc9534016725435c23fc1840d7d43d47c3bMarc-André Lemburg    def test_machine(self):
46a519cfc9534016725435c23fc1840d7d43d47c3bMarc-André Lemburg        res = platform.machine()
47a519cfc9534016725435c23fc1840d7d43d47c3bMarc-André Lemburg
48a519cfc9534016725435c23fc1840d7d43d47c3bMarc-André Lemburg    def test_processor(self):
49a519cfc9534016725435c23fc1840d7d43d47c3bMarc-André Lemburg        res = platform.processor()
50a519cfc9534016725435c23fc1840d7d43d47c3bMarc-André Lemburg
51f521b8c6d25544456394e5cd172b6a24d5d958a6Benjamin Peterson    def setUp(self):
52f521b8c6d25544456394e5cd172b6a24d5d958a6Benjamin Peterson        self.save_version = sys.version
53f521b8c6d25544456394e5cd172b6a24d5d958a6Benjamin Peterson        self.save_subversion = sys.subversion
54f521b8c6d25544456394e5cd172b6a24d5d958a6Benjamin Peterson        self.save_platform = sys.platform
55f521b8c6d25544456394e5cd172b6a24d5d958a6Benjamin Peterson
56f521b8c6d25544456394e5cd172b6a24d5d958a6Benjamin Peterson    def tearDown(self):
57f521b8c6d25544456394e5cd172b6a24d5d958a6Benjamin Peterson        sys.version = self.save_version
58f521b8c6d25544456394e5cd172b6a24d5d958a6Benjamin Peterson        sys.subversion = self.save_subversion
59f521b8c6d25544456394e5cd172b6a24d5d958a6Benjamin Peterson        sys.platform = self.save_platform
60f521b8c6d25544456394e5cd172b6a24d5d958a6Benjamin Peterson
6194e4e2a7e583471627d76a2f3b2886c9064b7420Benjamin Peterson    def test_sys_version(self):
6294e4e2a7e583471627d76a2f3b2886c9064b7420Benjamin Peterson        # Old test.
6394e4e2a7e583471627d76a2f3b2886c9064b7420Benjamin Peterson        for input, output in (
6494e4e2a7e583471627d76a2f3b2886c9064b7420Benjamin Peterson            ('2.4.3 (#1, Jun 21 2006, 13:54:21) \n[GCC 3.3.4 (pre 3.3.5 20040809)]',
6594e4e2a7e583471627d76a2f3b2886c9064b7420Benjamin Peterson             ('CPython', '2.4.3', '', '', '1', 'Jun 21 2006 13:54:21', 'GCC 3.3.4 (pre 3.3.5 20040809)')),
6694e4e2a7e583471627d76a2f3b2886c9064b7420Benjamin Peterson            ('IronPython 1.0.60816 on .NET 2.0.50727.42',
6794e4e2a7e583471627d76a2f3b2886c9064b7420Benjamin Peterson             ('IronPython', '1.0.60816', '', '', '', '', '.NET 2.0.50727.42')),
6894e4e2a7e583471627d76a2f3b2886c9064b7420Benjamin Peterson            ('IronPython 1.0 (1.0.61005.1977) on .NET 2.0.50727.42',
6994e4e2a7e583471627d76a2f3b2886c9064b7420Benjamin Peterson             ('IronPython', '1.0.0', '', '', '', '', '.NET 2.0.50727.42')),
70c36364491fb5bedc736957ce123f30d8a7b7023cMartin Panter            ('2.4.3 (truncation, date, t) \n[GCC]',
71c36364491fb5bedc736957ce123f30d8a7b7023cMartin Panter             ('CPython', '2.4.3', '', '', 'truncation', 'date t', 'GCC')),
72c36364491fb5bedc736957ce123f30d8a7b7023cMartin Panter            ('2.4.3 (truncation, date, ) \n[GCC]',
73c36364491fb5bedc736957ce123f30d8a7b7023cMartin Panter             ('CPython', '2.4.3', '', '', 'truncation', 'date', 'GCC')),
74c36364491fb5bedc736957ce123f30d8a7b7023cMartin Panter            ('2.4.3 (truncation, date,) \n[GCC]',
75c36364491fb5bedc736957ce123f30d8a7b7023cMartin Panter             ('CPython', '2.4.3', '', '', 'truncation', 'date', 'GCC')),
76c36364491fb5bedc736957ce123f30d8a7b7023cMartin Panter            ('2.4.3 (truncation, date) \n[GCC]',
77c36364491fb5bedc736957ce123f30d8a7b7023cMartin Panter             ('CPython', '2.4.3', '', '', 'truncation', 'date', 'GCC')),
78c36364491fb5bedc736957ce123f30d8a7b7023cMartin Panter            ('2.4.3 (truncation, d) \n[GCC]',
79c36364491fb5bedc736957ce123f30d8a7b7023cMartin Panter             ('CPython', '2.4.3', '', '', 'truncation', 'd', 'GCC')),
80c36364491fb5bedc736957ce123f30d8a7b7023cMartin Panter            ('2.4.3 (truncation, ) \n[GCC]',
81c36364491fb5bedc736957ce123f30d8a7b7023cMartin Panter             ('CPython', '2.4.3', '', '', 'truncation', '', 'GCC')),
82c36364491fb5bedc736957ce123f30d8a7b7023cMartin Panter            ('2.4.3 (truncation,) \n[GCC]',
83c36364491fb5bedc736957ce123f30d8a7b7023cMartin Panter             ('CPython', '2.4.3', '', '', 'truncation', '', 'GCC')),
84c36364491fb5bedc736957ce123f30d8a7b7023cMartin Panter            ('2.4.3 (truncation) \n[GCC]',
85c36364491fb5bedc736957ce123f30d8a7b7023cMartin Panter             ('CPython', '2.4.3', '', '', 'truncation', '', 'GCC')),
8694e4e2a7e583471627d76a2f3b2886c9064b7420Benjamin Peterson            ):
8794e4e2a7e583471627d76a2f3b2886c9064b7420Benjamin Peterson            # branch and revision are not "parsed", but fetched
8894e4e2a7e583471627d76a2f3b2886c9064b7420Benjamin Peterson            # from sys.subversion.  Ignore them
8994e4e2a7e583471627d76a2f3b2886c9064b7420Benjamin Peterson            (name, version, branch, revision, buildno, builddate, compiler) \
9094e4e2a7e583471627d76a2f3b2886c9064b7420Benjamin Peterson                   = platform._sys_version(input)
9194e4e2a7e583471627d76a2f3b2886c9064b7420Benjamin Peterson            self.assertEqual(
9294e4e2a7e583471627d76a2f3b2886c9064b7420Benjamin Peterson                (name, version, '', '', buildno, builddate, compiler), output)
9394e4e2a7e583471627d76a2f3b2886c9064b7420Benjamin Peterson
94f521b8c6d25544456394e5cd172b6a24d5d958a6Benjamin Peterson        # Tests for python_implementation(), python_version(), python_branch(),
95f521b8c6d25544456394e5cd172b6a24d5d958a6Benjamin Peterson        # python_revision(), python_build(), and python_compiler().
96f521b8c6d25544456394e5cd172b6a24d5d958a6Benjamin Peterson        sys_versions = {
97f521b8c6d25544456394e5cd172b6a24d5d958a6Benjamin Peterson            ("2.6.1 (r261:67515, Dec  6 2008, 15:26:00) \n[GCC 4.0.1 (Apple Computer, Inc. build 5370)]",
98f521b8c6d25544456394e5cd172b6a24d5d958a6Benjamin Peterson             ('CPython', 'tags/r261', '67515'), self.save_platform)
99f521b8c6d25544456394e5cd172b6a24d5d958a6Benjamin Peterson            :
100f521b8c6d25544456394e5cd172b6a24d5d958a6Benjamin Peterson                ("CPython", "2.6.1", "tags/r261", "67515",
101f521b8c6d25544456394e5cd172b6a24d5d958a6Benjamin Peterson                 ('r261:67515', 'Dec  6 2008 15:26:00'),
102f521b8c6d25544456394e5cd172b6a24d5d958a6Benjamin Peterson                 'GCC 4.0.1 (Apple Computer, Inc. build 5370)'),
103bc385481453bf4fe8205b21c1538955517b2955cEzio Melotti
104f521b8c6d25544456394e5cd172b6a24d5d958a6Benjamin Peterson            ("IronPython 2.0 (2.0.0.0) on .NET 2.0.50727.3053", None, "cli")
105f521b8c6d25544456394e5cd172b6a24d5d958a6Benjamin Peterson            :
106f521b8c6d25544456394e5cd172b6a24d5d958a6Benjamin Peterson                ("IronPython", "2.0.0", "", "", ("", ""),
107f521b8c6d25544456394e5cd172b6a24d5d958a6Benjamin Peterson                 ".NET 2.0.50727.3053"),
108bc385481453bf4fe8205b21c1538955517b2955cEzio Melotti
109bc385481453bf4fe8205b21c1538955517b2955cEzio Melotti            ("2.6.1 (IronPython 2.6.1 (2.6.10920.0) on .NET 2.0.50727.1433)", None, "cli")
110bc385481453bf4fe8205b21c1538955517b2955cEzio Melotti            :
111bc385481453bf4fe8205b21c1538955517b2955cEzio Melotti                ("IronPython", "2.6.1", "", "", ("", ""),
112bc385481453bf4fe8205b21c1538955517b2955cEzio Melotti                 ".NET 2.0.50727.1433"),
113bc385481453bf4fe8205b21c1538955517b2955cEzio Melotti
114bc385481453bf4fe8205b21c1538955517b2955cEzio Melotti            ("2.7.4 (IronPython 2.7.4 (2.7.0.40) on Mono 4.0.30319.1 (32-bit))", None, "cli")
115bc385481453bf4fe8205b21c1538955517b2955cEzio Melotti            :
116bc385481453bf4fe8205b21c1538955517b2955cEzio Melotti                ("IronPython", "2.7.4", "", "", ("", ""),
117bc385481453bf4fe8205b21c1538955517b2955cEzio Melotti                 "Mono 4.0.30319.1 (32-bit)"),
118bc385481453bf4fe8205b21c1538955517b2955cEzio Melotti
119f521b8c6d25544456394e5cd172b6a24d5d958a6Benjamin Peterson            ("2.5 (trunk:6107, Mar 26 2009, 13:02:18) \n[Java HotSpot(TM) Client VM (\"Apple Computer, Inc.\")]",
120b457b89323e3110159298bb5aa149f56733aaef8Benjamin Peterson            ('Jython', 'trunk', '6107'), "java1.5.0_16")
121f521b8c6d25544456394e5cd172b6a24d5d958a6Benjamin Peterson            :
122b457b89323e3110159298bb5aa149f56733aaef8Benjamin Peterson                ("Jython", "2.5.0", "trunk", "6107",
123b457b89323e3110159298bb5aa149f56733aaef8Benjamin Peterson                 ('trunk:6107', 'Mar 26 2009'), "java1.5.0_16"),
124bc385481453bf4fe8205b21c1538955517b2955cEzio Melotti
1250ad9b7727d172fc772a5499da37efcc9385ed7b0Benjamin Peterson            ("2.5.2 (63378, Mar 26 2009, 18:03:29)\n[PyPy 1.0.0]",
1260ad9b7727d172fc772a5499da37efcc9385ed7b0Benjamin Peterson             ('PyPy', 'trunk', '63378'), self.save_platform)
1270ad9b7727d172fc772a5499da37efcc9385ed7b0Benjamin Peterson            :
1280ad9b7727d172fc772a5499da37efcc9385ed7b0Benjamin Peterson                ("PyPy", "2.5.2", "trunk", "63378", ('63378', 'Mar 26 2009'),
1290ad9b7727d172fc772a5499da37efcc9385ed7b0Benjamin Peterson                 "")
130f521b8c6d25544456394e5cd172b6a24d5d958a6Benjamin Peterson            }
131f521b8c6d25544456394e5cd172b6a24d5d958a6Benjamin Peterson        for (version_tag, subversion, sys_platform), info in \
132f521b8c6d25544456394e5cd172b6a24d5d958a6Benjamin Peterson                sys_versions.iteritems():
133f521b8c6d25544456394e5cd172b6a24d5d958a6Benjamin Peterson            sys.version = version_tag
134f521b8c6d25544456394e5cd172b6a24d5d958a6Benjamin Peterson            if subversion is None:
135f521b8c6d25544456394e5cd172b6a24d5d958a6Benjamin Peterson                if hasattr(sys, "subversion"):
136f521b8c6d25544456394e5cd172b6a24d5d958a6Benjamin Peterson                    del sys.subversion
137f521b8c6d25544456394e5cd172b6a24d5d958a6Benjamin Peterson            else:
138f521b8c6d25544456394e5cd172b6a24d5d958a6Benjamin Peterson                sys.subversion = subversion
139f521b8c6d25544456394e5cd172b6a24d5d958a6Benjamin Peterson            if sys_platform is not None:
140f521b8c6d25544456394e5cd172b6a24d5d958a6Benjamin Peterson                sys.platform = sys_platform
141f521b8c6d25544456394e5cd172b6a24d5d958a6Benjamin Peterson            self.assertEqual(platform.python_implementation(), info[0])
142f521b8c6d25544456394e5cd172b6a24d5d958a6Benjamin Peterson            self.assertEqual(platform.python_version(), info[1])
143f521b8c6d25544456394e5cd172b6a24d5d958a6Benjamin Peterson            self.assertEqual(platform.python_branch(), info[2])
144f521b8c6d25544456394e5cd172b6a24d5d958a6Benjamin Peterson            self.assertEqual(platform.python_revision(), info[3])
145f521b8c6d25544456394e5cd172b6a24d5d958a6Benjamin Peterson            self.assertEqual(platform.python_build(), info[4])
146f521b8c6d25544456394e5cd172b6a24d5d958a6Benjamin Peterson            self.assertEqual(platform.python_compiler(), info[5])
147c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwald
148c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwald    def test_system_alias(self):
149c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwald        res = platform.system_alias(
150c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwald            platform.system(),
151c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwald            platform.release(),
152c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwald            platform.version(),
153c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwald        )
154c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwald
155c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwald    def test_uname(self):
156c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwald        res = platform.uname()
1575c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(any(res))
158c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwald
159c9d1a7845ba18466ee048666239c6b969c9acd33R. David Murray    @unittest.skipUnless(sys.platform.startswith('win'), "windows only test")
160c9d1a7845ba18466ee048666239c6b969c9acd33R. David Murray    def test_uname_win32_ARCHITEW6432(self):
161c9d1a7845ba18466ee048666239c6b969c9acd33R. David Murray        # Issue 7860: make sure we get architecture from the correct variable
162c9d1a7845ba18466ee048666239c6b969c9acd33R. David Murray        # on 64 bit Windows: if PROCESSOR_ARCHITEW6432 exists we should be
163c9d1a7845ba18466ee048666239c6b969c9acd33R. David Murray        # using it, per
164c9d1a7845ba18466ee048666239c6b969c9acd33R. David Murray        # http://blogs.msdn.com/david.wang/archive/2006/03/26/HOWTO-Detect-Process-Bitness.aspx
165c9d1a7845ba18466ee048666239c6b969c9acd33R. David Murray        try:
166c9d1a7845ba18466ee048666239c6b969c9acd33R. David Murray            with test_support.EnvironmentVarGuard() as environ:
167c9d1a7845ba18466ee048666239c6b969c9acd33R. David Murray                if 'PROCESSOR_ARCHITEW6432' in environ:
168c9d1a7845ba18466ee048666239c6b969c9acd33R. David Murray                    del environ['PROCESSOR_ARCHITEW6432']
169c9d1a7845ba18466ee048666239c6b969c9acd33R. David Murray                environ['PROCESSOR_ARCHITECTURE'] = 'foo'
170c9d1a7845ba18466ee048666239c6b969c9acd33R. David Murray                platform._uname_cache = None
171c9d1a7845ba18466ee048666239c6b969c9acd33R. David Murray                system, node, release, version, machine, processor = platform.uname()
172c9d1a7845ba18466ee048666239c6b969c9acd33R. David Murray                self.assertEqual(machine, 'foo')
173c9d1a7845ba18466ee048666239c6b969c9acd33R. David Murray                environ['PROCESSOR_ARCHITEW6432'] = 'bar'
174c9d1a7845ba18466ee048666239c6b969c9acd33R. David Murray                platform._uname_cache = None
175c9d1a7845ba18466ee048666239c6b969c9acd33R. David Murray                system, node, release, version, machine, processor = platform.uname()
176c9d1a7845ba18466ee048666239c6b969c9acd33R. David Murray                self.assertEqual(machine, 'bar')
177c9d1a7845ba18466ee048666239c6b969c9acd33R. David Murray        finally:
178c9d1a7845ba18466ee048666239c6b969c9acd33R. David Murray            platform._uname_cache = None
179c9d1a7845ba18466ee048666239c6b969c9acd33R. David Murray
180c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwald    def test_java_ver(self):
181c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwald        res = platform.java_ver()
1825915a4dcfebf74d0a2c99848ede619f5bf7d2899Benjamin Peterson        if sys.platform == 'java':
1835c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson            self.assertTrue(all(res))
184c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwald
185c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwald    def test_win32_ver(self):
186c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwald        res = platform.win32_ver()
187c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwald
188c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwald    def test_mac_ver(self):
189c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwald        res = platform.mac_ver()
1907a0f4c75b1d2e3ceb758970ad39d468e95dfc6edRonald Oussoren
191a4e4ef1cea957795b45e9956a6fc6eec76ceebafBenjamin Peterson        try:
192a4e4ef1cea957795b45e9956a6fc6eec76ceebafBenjamin Peterson            import gestalt
193a4e4ef1cea957795b45e9956a6fc6eec76ceebafBenjamin Peterson        except ImportError:
194a4e4ef1cea957795b45e9956a6fc6eec76ceebafBenjamin Peterson            have_toolbox_glue = False
195a4e4ef1cea957795b45e9956a6fc6eec76ceebafBenjamin Peterson        else:
196a4e4ef1cea957795b45e9956a6fc6eec76ceebafBenjamin Peterson            have_toolbox_glue = True
197a4e4ef1cea957795b45e9956a6fc6eec76ceebafBenjamin Peterson
19831296c09ed1f1114a325da4ecafc5a8d8f079284Benjamin Peterson        if have_toolbox_glue and platform.uname()[0] == 'Darwin':
1997a0f4c75b1d2e3ceb758970ad39d468e95dfc6edRonald Oussoren            # We're on a MacOSX system, check that
2007a0f4c75b1d2e3ceb758970ad39d468e95dfc6edRonald Oussoren            # the right version information is returned
2017a0f4c75b1d2e3ceb758970ad39d468e95dfc6edRonald Oussoren            fd = os.popen('sw_vers', 'r')
2027a0f4c75b1d2e3ceb758970ad39d468e95dfc6edRonald Oussoren            real_ver = None
2037a0f4c75b1d2e3ceb758970ad39d468e95dfc6edRonald Oussoren            for ln in fd:
2047a0f4c75b1d2e3ceb758970ad39d468e95dfc6edRonald Oussoren                if ln.startswith('ProductVersion:'):
2057a0f4c75b1d2e3ceb758970ad39d468e95dfc6edRonald Oussoren                    real_ver = ln.strip().split()[-1]
2067a0f4c75b1d2e3ceb758970ad39d468e95dfc6edRonald Oussoren                    break
2077a0f4c75b1d2e3ceb758970ad39d468e95dfc6edRonald Oussoren            fd.close()
2085c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson            self.assertFalse(real_ver is None)
209e7e941e7f7a47be54198be79d2280ab3025e5ff1Brett Cannon            result_list = res[0].split('.')
210e7e941e7f7a47be54198be79d2280ab3025e5ff1Brett Cannon            expect_list = real_ver.split('.')
211e7e941e7f7a47be54198be79d2280ab3025e5ff1Brett Cannon            len_diff = len(result_list) - len(expect_list)
212e7e941e7f7a47be54198be79d2280ab3025e5ff1Brett Cannon            # On Snow Leopard, sw_vers reports 10.6.0 as 10.6
213e7e941e7f7a47be54198be79d2280ab3025e5ff1Brett Cannon            if len_diff > 0:
214e7e941e7f7a47be54198be79d2280ab3025e5ff1Brett Cannon                expect_list.extend(['0'] * len_diff)
2152623a37852153363335956afab010cb0beb7e74eEzio Melotti            self.assertEqual(result_list, expect_list)
2167a0f4c75b1d2e3ceb758970ad39d468e95dfc6edRonald Oussoren
2177a0f4c75b1d2e3ceb758970ad39d468e95dfc6edRonald Oussoren            # res[1] claims to contain
2187a0f4c75b1d2e3ceb758970ad39d468e95dfc6edRonald Oussoren            # (version, dev_stage, non_release_version)
2197a0f4c75b1d2e3ceb758970ad39d468e95dfc6edRonald Oussoren            # That information is no longer available
2202623a37852153363335956afab010cb0beb7e74eEzio Melotti            self.assertEqual(res[1], ('', '', ''))
2217a0f4c75b1d2e3ceb758970ad39d468e95dfc6edRonald Oussoren
2227a0f4c75b1d2e3ceb758970ad39d468e95dfc6edRonald Oussoren            if sys.byteorder == 'little':
2230ab67ee79ea6c536168b9ae51af0a85c9b075a40Ned Deily                self.assertIn(res[2], ('i386', 'x86_64'))
2247a0f4c75b1d2e3ceb758970ad39d468e95dfc6edRonald Oussoren            else:
2252623a37852153363335956afab010cb0beb7e74eEzio Melotti                self.assertEqual(res[2], 'PowerPC')
226c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwald
2273a04a25206208fa0aef9dc206196276b7329ba77Ronald Oussoren
2283a04a25206208fa0aef9dc206196276b7329ba77Ronald Oussoren    @unittest.skipUnless(sys.platform == 'darwin', "OSX only test")
2293a04a25206208fa0aef9dc206196276b7329ba77Ronald Oussoren    def test_mac_ver_with_fork(self):
2303a04a25206208fa0aef9dc206196276b7329ba77Ronald Oussoren        # Issue7895: platform.mac_ver() crashes when using fork without exec
2313a04a25206208fa0aef9dc206196276b7329ba77Ronald Oussoren        #
2323a04a25206208fa0aef9dc206196276b7329ba77Ronald Oussoren        # This test checks that the fix for that issue works.
2333a04a25206208fa0aef9dc206196276b7329ba77Ronald Oussoren        #
2343a04a25206208fa0aef9dc206196276b7329ba77Ronald Oussoren        pid = os.fork()
2353a04a25206208fa0aef9dc206196276b7329ba77Ronald Oussoren        if pid == 0:
2363a04a25206208fa0aef9dc206196276b7329ba77Ronald Oussoren            # child
2373a04a25206208fa0aef9dc206196276b7329ba77Ronald Oussoren            info = platform.mac_ver()
2383a04a25206208fa0aef9dc206196276b7329ba77Ronald Oussoren            os._exit(0)
2393a04a25206208fa0aef9dc206196276b7329ba77Ronald Oussoren
2403a04a25206208fa0aef9dc206196276b7329ba77Ronald Oussoren        else:
2413a04a25206208fa0aef9dc206196276b7329ba77Ronald Oussoren            # parent
2423a04a25206208fa0aef9dc206196276b7329ba77Ronald Oussoren            cpid, sts = os.waitpid(pid, 0)
2432623a37852153363335956afab010cb0beb7e74eEzio Melotti            self.assertEqual(cpid, pid)
2442623a37852153363335956afab010cb0beb7e74eEzio Melotti            self.assertEqual(sts, 0)
2453a04a25206208fa0aef9dc206196276b7329ba77Ronald Oussoren
246c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwald    def test_dist(self):
247c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwald        res = platform.dist()
248c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwald
249c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwald    def test_libc_ver(self):
25006853fc15055686ec02fd2671fd37cda0f69209bAnthony Baxter        import os
2515915a4dcfebf74d0a2c99848ede619f5bf7d2899Benjamin Peterson        if os.path.isdir(sys.executable) and \
2525915a4dcfebf74d0a2c99848ede619f5bf7d2899Benjamin Peterson           os.path.exists(sys.executable+'.exe'):
25306853fc15055686ec02fd2671fd37cda0f69209bAnthony Baxter            # Cygwin horror
254cd4a21bb8ea184c32d33d534d42bc08b57b405fbGeorg Brandl            executable = sys.executable + '.exe'
255cd4a21bb8ea184c32d33d534d42bc08b57b405fbGeorg Brandl        else:
256cd4a21bb8ea184c32d33d534d42bc08b57b405fbGeorg Brandl            executable = sys.executable
257cd4a21bb8ea184c32d33d534d42bc08b57b405fbGeorg Brandl        res = platform.libc_ver(executable)
258c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwald
259fbc0b0ca29c0c8120bcf979bac6cb6d64cc87f60Amaury Forgeot d'Arc    def test_parse_release_file(self):
260fbc0b0ca29c0c8120bcf979bac6cb6d64cc87f60Amaury Forgeot d'Arc
261fbc0b0ca29c0c8120bcf979bac6cb6d64cc87f60Amaury Forgeot d'Arc        for input, output in (
262fbc0b0ca29c0c8120bcf979bac6cb6d64cc87f60Amaury Forgeot d'Arc            # Examples of release file contents:
263fbc0b0ca29c0c8120bcf979bac6cb6d64cc87f60Amaury Forgeot d'Arc            ('SuSE Linux 9.3 (x86-64)', ('SuSE Linux ', '9.3', 'x86-64')),
264fbc0b0ca29c0c8120bcf979bac6cb6d64cc87f60Amaury Forgeot d'Arc            ('SUSE LINUX 10.1 (X86-64)', ('SUSE LINUX ', '10.1', 'X86-64')),
265fbc0b0ca29c0c8120bcf979bac6cb6d64cc87f60Amaury Forgeot d'Arc            ('SUSE LINUX 10.1 (i586)', ('SUSE LINUX ', '10.1', 'i586')),
266fbc0b0ca29c0c8120bcf979bac6cb6d64cc87f60Amaury Forgeot d'Arc            ('Fedora Core release 5 (Bordeaux)', ('Fedora Core', '5', 'Bordeaux')),
267fbc0b0ca29c0c8120bcf979bac6cb6d64cc87f60Amaury Forgeot d'Arc            ('Red Hat Linux release 8.0 (Psyche)', ('Red Hat Linux', '8.0', 'Psyche')),
268fbc0b0ca29c0c8120bcf979bac6cb6d64cc87f60Amaury Forgeot d'Arc            ('Red Hat Linux release 9 (Shrike)', ('Red Hat Linux', '9', 'Shrike')),
269fbc0b0ca29c0c8120bcf979bac6cb6d64cc87f60Amaury Forgeot d'Arc            ('Red Hat Enterprise Linux release 4 (Nahant)', ('Red Hat Enterprise Linux', '4', 'Nahant')),
270fbc0b0ca29c0c8120bcf979bac6cb6d64cc87f60Amaury Forgeot d'Arc            ('CentOS release 4', ('CentOS', '4', None)),
271fbc0b0ca29c0c8120bcf979bac6cb6d64cc87f60Amaury Forgeot d'Arc            ('Rocks release 4.2.1 (Cydonia)', ('Rocks', '4.2.1', 'Cydonia')),
272a43f34cc2a7a55cea794ecb9bda2eea5c685d1f3Benjamin Peterson            ('', ('', '', '')), # If there's nothing there.
273fbc0b0ca29c0c8120bcf979bac6cb6d64cc87f60Amaury Forgeot d'Arc            ):
274fbc0b0ca29c0c8120bcf979bac6cb6d64cc87f60Amaury Forgeot d'Arc            self.assertEqual(platform._parse_release_file(input), output)
275fbc0b0ca29c0c8120bcf979bac6cb6d64cc87f60Amaury Forgeot d'Arc
276fbc0b0ca29c0c8120bcf979bac6cb6d64cc87f60Amaury Forgeot d'Arc
277c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwalddef test_main():
278c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwald    test_support.run_unittest(
279c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwald        PlatformTest
280c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwald    )
281c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwald
282c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwaldif __name__ == '__main__':
283c69d1c498f3896803f78de613a54d17be88bbeafWalter Dörwald    test_main()
284