summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_platform.py
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@redhat.com>2018-12-05 13:04:52 (GMT)
committerGitHub <noreply@github.com>2018-12-05 13:04:52 (GMT)
commit476b113ed8531b9fbb0bd023a05eb3af21996600 (patch)
tree820e7430ff8bcbcd4ed46cde4fcb6ac487e0e7eb /Lib/test/test_platform.py
parent2a893430c9c8378cbdfac95895a64fa07aaff9ed (diff)
downloadcpython-476b113ed8531b9fbb0bd023a05eb3af21996600.zip
cpython-476b113ed8531b9fbb0bd023a05eb3af21996600.tar.gz
cpython-476b113ed8531b9fbb0bd023a05eb3af21996600.tar.bz2
bpo-35389: platform.libc_ver() uses os.confstr() (GH-10891)
platform.libc_ver() now uses os.confstr('CS_GNU_LIBC_VERSION') if available and the *executable* parameter is not set. The default value of the libc_ver() *executable* parameter becomes None. Quick benchmark on Fedora 29: python3 -m perf command ./python -S -c 'import platform; platform.libc_ver()' 94.9 ms +- 4.3 ms -> 33.2 ms +- 1.4 ms: 2.86x faster (-65%)
Diffstat (limited to 'Lib/test/test_platform.py')
-rw-r--r--Lib/test/test_platform.py41
1 files changed, 35 insertions, 6 deletions
diff --git a/Lib/test/test_platform.py b/Lib/test/test_platform.py
index 686f454..978d2f7 100644
--- a/Lib/test/test_platform.py
+++ b/Lib/test/test_platform.py
@@ -3,7 +3,9 @@ import platform
import subprocess
import sys
import sysconfig
+import tempfile
import unittest
+from unittest import mock
from test import support
@@ -263,19 +265,46 @@ class PlatformTest(unittest.TestCase):
self.assertEqual(sts, 0)
def test_libc_ver(self):
+ # check that libc_ver(executable) doesn't raise an exception
if os.path.isdir(sys.executable) and \
os.path.exists(sys.executable+'.exe'):
# Cygwin horror
executable = sys.executable + '.exe'
else:
executable = sys.executable
- res = platform.libc_ver(executable)
-
- self.addCleanup(support.unlink, support.TESTFN)
- with open(support.TESTFN, 'wb') as f:
- f.write(b'x'*(16384-10))
+ platform.libc_ver(executable)
+
+ filename = support.TESTFN
+ self.addCleanup(support.unlink, filename)
+
+ with mock.patch('os.confstr', create=True, return_value='mock 1.0'):
+ # test os.confstr() code path
+ self.assertEqual(platform.libc_ver(), ('mock', '1.0'))
+
+ # test the different regular expressions
+ for data, expected in (
+ (b'__libc_init', ('libc', '')),
+ (b'GLIBC_2.9', ('glibc', '2.9')),
+ (b'libc.so.1.2.5', ('libc', '1.2.5')),
+ (b'libc_pthread.so.1.2.5', ('libc', '1.2.5_pthread')),
+ (b'', ('', '')),
+ ):
+ with open(filename, 'wb') as fp:
+ fp.write(b'[xxx%sxxx]' % data)
+ fp.flush()
+
+ # os.confstr() must not be used if executable is set
+ self.assertEqual(platform.libc_ver(executable=filename),
+ expected)
+
+ # binary containing multiple versions: get the most recent,
+ # make sure that 1.9 is seen as older than 1.23.4
+ chunksize = 16384
+ with open(filename, 'wb') as f:
+ # test match at chunk boundary
+ f.write(b'x'*(chunksize - 10))
f.write(b'GLIBC_1.23.4\0GLIBC_1.9\0GLIBC_1.21\0')
- self.assertEqual(platform.libc_ver(support.TESTFN),
+ self.assertEqual(platform.libc_ver(filename, chunksize=chunksize),
('glibc', '1.23.4'))
@support.cpython_only