mirror of
https://github.com/python/cpython.git
synced 2025-12-10 11:00:14 +00:00
bpo-10496: posixpath.expanduser() catchs pwd.getpwuid() error (GH-10919)
* posixpath.expanduser() now returns the input path unchanged if the HOME environment variable is not set and pwd.getpwuid() raises KeyError (the current user identifier doesn't exist in the password database). * Add test_no_home_directory() to test_site.
This commit is contained in:
parent
398bd27967
commit
f2f4555d82
4 changed files with 98 additions and 29 deletions
|
|
@ -5,6 +5,7 @@ import warnings
|
|||
from posixpath import realpath, abspath, dirname, basename
|
||||
from test import support, test_genericpath
|
||||
from test.support import FakePath
|
||||
from unittest import mock
|
||||
|
||||
try:
|
||||
import posix
|
||||
|
|
@ -242,42 +243,61 @@ class PosixPathTest(unittest.TestCase):
|
|||
def test_expanduser(self):
|
||||
self.assertEqual(posixpath.expanduser("foo"), "foo")
|
||||
self.assertEqual(posixpath.expanduser(b"foo"), b"foo")
|
||||
|
||||
def test_expanduser_home_envvar(self):
|
||||
with support.EnvironmentVarGuard() as env:
|
||||
env['HOME'] = '/home/victor'
|
||||
self.assertEqual(posixpath.expanduser("~"), "/home/victor")
|
||||
|
||||
# expanduser() strips trailing slash
|
||||
env['HOME'] = '/home/victor/'
|
||||
self.assertEqual(posixpath.expanduser("~"), "/home/victor")
|
||||
|
||||
for home in '/', '', '//', '///':
|
||||
with self.subTest(home=home):
|
||||
env['HOME'] = home
|
||||
self.assertEqual(posixpath.expanduser("~"), "/")
|
||||
self.assertEqual(posixpath.expanduser("~/"), "/")
|
||||
self.assertEqual(posixpath.expanduser("~/foo"), "/foo")
|
||||
try:
|
||||
import pwd
|
||||
except ImportError:
|
||||
pass
|
||||
else:
|
||||
self.assertIsInstance(posixpath.expanduser("~/"), str)
|
||||
self.assertIsInstance(posixpath.expanduser(b"~/"), bytes)
|
||||
# if home directory == root directory, this test makes no sense
|
||||
if posixpath.expanduser("~") != '/':
|
||||
self.assertEqual(
|
||||
posixpath.expanduser("~") + "/",
|
||||
posixpath.expanduser("~/")
|
||||
)
|
||||
self.assertEqual(
|
||||
posixpath.expanduser(b"~") + b"/",
|
||||
posixpath.expanduser(b"~/")
|
||||
)
|
||||
self.assertIsInstance(posixpath.expanduser("~root/"), str)
|
||||
self.assertIsInstance(posixpath.expanduser("~foo/"), str)
|
||||
self.assertIsInstance(posixpath.expanduser(b"~root/"), bytes)
|
||||
self.assertIsInstance(posixpath.expanduser(b"~foo/"), bytes)
|
||||
|
||||
with support.EnvironmentVarGuard() as env:
|
||||
# expanduser should fall back to using the password database
|
||||
del env['HOME']
|
||||
home = pwd.getpwuid(os.getuid()).pw_dir
|
||||
# $HOME can end with a trailing /, so strip it (see #17809)
|
||||
home = home.rstrip("/") or '/'
|
||||
self.assertEqual(posixpath.expanduser("~"), home)
|
||||
def test_expanduser_pwd(self):
|
||||
pwd = support.import_module('pwd')
|
||||
|
||||
self.assertIsInstance(posixpath.expanduser("~/"), str)
|
||||
self.assertIsInstance(posixpath.expanduser(b"~/"), bytes)
|
||||
|
||||
# if home directory == root directory, this test makes no sense
|
||||
if posixpath.expanduser("~") != '/':
|
||||
self.assertEqual(
|
||||
posixpath.expanduser("~") + "/",
|
||||
posixpath.expanduser("~/")
|
||||
)
|
||||
self.assertEqual(
|
||||
posixpath.expanduser(b"~") + b"/",
|
||||
posixpath.expanduser(b"~/")
|
||||
)
|
||||
self.assertIsInstance(posixpath.expanduser("~root/"), str)
|
||||
self.assertIsInstance(posixpath.expanduser("~foo/"), str)
|
||||
self.assertIsInstance(posixpath.expanduser(b"~root/"), bytes)
|
||||
self.assertIsInstance(posixpath.expanduser(b"~foo/"), bytes)
|
||||
|
||||
with support.EnvironmentVarGuard() as env:
|
||||
# expanduser should fall back to using the password database
|
||||
del env['HOME']
|
||||
|
||||
home = pwd.getpwuid(os.getuid()).pw_dir
|
||||
# $HOME can end with a trailing /, so strip it (see #17809)
|
||||
home = home.rstrip("/") or '/'
|
||||
self.assertEqual(posixpath.expanduser("~"), home)
|
||||
|
||||
# bpo-10496: If the HOME environment variable is not set and the
|
||||
# user (current identifier or name in the path) doesn't exist in
|
||||
# the password database (pwd.getuid() or pwd.getpwnam() fail),
|
||||
# expanduser() must return the path unchanged.
|
||||
with mock.patch.object(pwd, 'getpwuid', side_effect=KeyError), \
|
||||
mock.patch.object(pwd, 'getpwnam', side_effect=KeyError):
|
||||
for path in ('~', '~/.local', '~vstinner/'):
|
||||
self.assertEqual(posixpath.expanduser(path), path)
|
||||
|
||||
def test_normpath(self):
|
||||
self.assertEqual(posixpath.normpath(""), ".")
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue