@@ -2559,6 +2559,42 @@ def test_expanduser(self):
2559
2559
self .assertEqual (p6 .expanduser (), p6 )
2560
2560
self .assertRaises (RuntimeError , p7 .expanduser )
2561
2561
2562
+ @unittest .skipUnless (hasattr (pwd , 'getpwall' ),
2563
+ 'pwd module does not expose getpwall()' )
2564
+ @unittest .skipIf (sys .platform == "vxworks" ,
2565
+ "no home directory on VxWorks" )
2566
+ def test_home (self ):
2567
+ P = self .cls
2568
+ import_helper .import_module ('pwd' )
2569
+ import pwd
2570
+ pwdent = pwd .getpwuid (os .getuid ())
2571
+ username = pwdent .pw_name
2572
+ userhome = pwdent .pw_dir .rstrip ('/' ) or '/'
2573
+ # Find arbitrary different user (if exists).
2574
+ for pwdent in pwd .getpwall ():
2575
+ othername = pwdent .pw_name
2576
+ otherhome = pwdent .pw_dir .rstrip ('/' )
2577
+ if othername != username and otherhome :
2578
+ break
2579
+ else :
2580
+ othername = username
2581
+ otherhome = userhome
2582
+
2583
+ with os_helper .EnvironmentVarGuard () as env :
2584
+ env .pop ('HOME' , None )
2585
+
2586
+ self .assertEqual (P .home (), P (userhome ))
2587
+ self .assertEqual (P .home (username ), P (userhome ))
2588
+ self .assertEqual (P .home (othername ), P (otherhome ))
2589
+ self .assertRaises (RuntimeError , P .home , 'missinguser' )
2590
+
2591
+ env ['HOME' ] = '/tmp'
2592
+
2593
+ self .assertEqual (P .home (), P ('/tmp' ))
2594
+ self .assertEqual (P .home (username ), P (userhome ))
2595
+ self .assertEqual (P .home (othername ), P (otherhome ))
2596
+ self .assertRaises (RuntimeError , P .home , 'missinguser' )
2597
+
2562
2598
@unittest .skipIf (sys .platform != "darwin" ,
2563
2599
"Bad file descriptor in /dev/fd affects only macOS" )
2564
2600
def test_handling_bad_descriptor (self ):
@@ -2654,6 +2690,43 @@ def check():
2654
2690
env ['HOME' ] = 'C:\\ Users\\ eve'
2655
2691
check ()
2656
2692
2693
+ def test_home (self ):
2694
+ P = self .cls
2695
+ with os_helper .EnvironmentVarGuard () as env :
2696
+ env .pop ('HOME' , None )
2697
+ env .pop ('USERPROFILE' , None )
2698
+ env .pop ('HOMEPATH' , None )
2699
+ env .pop ('HOMEDRIVE' , None )
2700
+ env ['USERNAME' ] = 'alice'
2701
+
2702
+ self .assertRaises (RuntimeError , P .home )
2703
+ self .assertRaises (RuntimeError , P .home , 'alice' )
2704
+ self .assertRaises (RuntimeError , P .home , 'bob' )
2705
+
2706
+ def check ():
2707
+ env .pop ('USERNAME' , None )
2708
+ self .assertEqual (P .home (), P ('C:/Users/alice' ))
2709
+ self .assertRaises (RuntimeError , P .home , 'alice' )
2710
+ env ['USERNAME' ] = 'alice'
2711
+ self .assertEqual (P .home ('alice' ), P ('C:/Users/alice' ))
2712
+ self .assertEqual (P .home ('bob' ), P ('C:/Users/bob' ))
2713
+
2714
+ env ['HOMEPATH' ] = 'C:\\ Users\\ alice'
2715
+ check ()
2716
+
2717
+ env ['HOMEDRIVE' ] = 'C:\\ '
2718
+ env ['HOMEPATH' ] = 'Users\\ alice'
2719
+ check ()
2720
+
2721
+ env .pop ('HOMEDRIVE' , None )
2722
+ env .pop ('HOMEPATH' , None )
2723
+ env ['USERPROFILE' ] = 'C:\\ Users\\ alice'
2724
+ check ()
2725
+
2726
+ # bpo-38883: ignore `HOME` when set on windows
2727
+ env ['HOME' ] = 'C:\\ Users\\ eve'
2728
+ check ()
2729
+
2657
2730
2658
2731
class CompatiblePathTest (unittest .TestCase ):
2659
2732
"""
0 commit comments