blob: 8ac9ce0fdeb17dcbb51ea7e9d5660c8ea35c0900 [file] [log] [blame]
Bram Moolenaar48340b62017-08-29 22:08:53 +02001" Test for $HOME on Windows.
2
3if !has('win32')
Bram Moolenaarb46fecd2019-06-15 17:58:09 +02004 throw 'Skipped: not on MS-Windows'
Bram Moolenaar48340b62017-08-29 22:08:53 +02005endif
6
7let s:env = {}
8
9func s:restore_env()
10 for i in keys(s:env)
11 exe 'let ' . i . '=s:env["' . i . '"]'
12 endfor
13endfunc
14
15func s:save_env(...)
16 for i in a:000
17 exe 'let s:env["' . i . '"]=' . i
18 endfor
19endfunc
20
21func s:unlet_env(...)
22 for i in a:000
23 exe 'let ' . i . '=""'
24 endfor
25endfunc
26
27func CheckHomeIsMissingFromSubprocessEnvironment()
28 silent! let out = system('set')
29 let env = filter(split(out, "\n"), 'v:val=~"^HOME="')
30 call assert_equal(0, len(env))
31endfunc
32
33func CheckHomeIsInSubprocessEnvironment(exp)
34 silent! let out = system('set')
35 let env = filter(split(out, "\n"), 'v:val=~"^HOME="')
36 let home = len(env) == 0 ? "" : substitute(env[0], '[^=]\+=', '', '')
37 call assert_equal(a:exp, home)
38endfunc
39
40func CheckHome(exp, ...)
Bram Moolenaardde60342017-08-30 14:55:42 +020041 call assert_equal(a:exp, $HOME)
42 call assert_equal(a:exp, expand('~', ':p'))
Bram Moolenaar48340b62017-08-29 22:08:53 +020043 if !a:0
44 call CheckHomeIsMissingFromSubprocessEnvironment()
45 else
Bram Moolenaardde60342017-08-30 14:55:42 +020046 call CheckHomeIsInSubprocessEnvironment(a:1)
Bram Moolenaar48340b62017-08-29 22:08:53 +020047 endif
48endfunc
49
Bram Moolenaardde60342017-08-30 14:55:42 +020050func Test_WindowsHome()
Bram Moolenaar48340b62017-08-29 22:08:53 +020051 command! -nargs=* SaveEnv call <SID>save_env(<f-args>)
52 command! -nargs=* RestoreEnv call <SID>restore_env()
53 command! -nargs=* UnletEnv call <SID>unlet_env(<f-args>)
Bram Moolenaardde60342017-08-30 14:55:42 +020054 set noshellslash
Bram Moolenaar48340b62017-08-29 22:08:53 +020055
Bram Moolenaardde60342017-08-30 14:55:42 +020056 let save_home = $HOME
57 SaveEnv $USERPROFILE $HOMEDRIVE $HOMEPATH
Bram Moolenaar48340b62017-08-29 22:08:53 +020058 try
Bram Moolenaardde60342017-08-30 14:55:42 +020059 " Normal behavior: use $HOMEDRIVE and $HOMEPATH, ignore $USERPROFILE
60 let $USERPROFILE = 'unused'
Bram Moolenaar48340b62017-08-29 22:08:53 +020061 let $HOMEDRIVE = 'C:'
62 let $HOMEPATH = '\foobar'
Bram Moolenaardde60342017-08-30 14:55:42 +020063 let $HOME = '' " Force recomputing "homedir"
Bram Moolenaar48340b62017-08-29 22:08:53 +020064 call CheckHome('C:\foobar')
65
Bram Moolenaardde60342017-08-30 14:55:42 +020066 " Same, but with $HOMEPATH not set
67 UnletEnv $HOMEPATH
68 let $HOME = '' " Force recomputing "homedir"
69 call CheckHome('C:\')
70
71 " Use $USERPROFILE if $HOMEPATH and $HOMEDRIVE are empty
72 UnletEnv $HOMEDRIVE $HOMEPATH
Bram Moolenaar48340b62017-08-29 22:08:53 +020073 let $USERPROFILE = 'C:\foo'
Bram Moolenaardde60342017-08-30 14:55:42 +020074 let $HOME = '' " Force recomputing "homedir"
Bram Moolenaar48340b62017-08-29 22:08:53 +020075 call CheckHome('C:\foo')
76
Bram Moolenaardde60342017-08-30 14:55:42 +020077 " If $HOME is set the others don't matter
Bram Moolenaar48340b62017-08-29 22:08:53 +020078 let $HOME = 'C:\bar'
Bram Moolenaardde60342017-08-30 14:55:42 +020079 let $USERPROFILE = 'unused'
80 let $HOMEDRIVE = 'unused'
81 let $HOMEPATH = 'unused'
82 call CheckHome('C:\bar', 'C:\bar')
Bram Moolenaar48340b62017-08-29 22:08:53 +020083
Bram Moolenaardde60342017-08-30 14:55:42 +020084 " If $HOME contains %USERPROFILE% it is expanded
85 let $USERPROFILE = 'C:\foo'
Bram Moolenaar48340b62017-08-29 22:08:53 +020086 let $HOME = '%USERPROFILE%\bar'
Bram Moolenaardde60342017-08-30 14:55:42 +020087 let $HOMEDRIVE = 'unused'
88 let $HOMEPATH = 'unused'
89 call CheckHome('C:\foo\bar', '%USERPROFILE%\bar')
Bram Moolenaar48340b62017-08-29 22:08:53 +020090
Bram Moolenaardde60342017-08-30 14:55:42 +020091 " Invalid $HOME is kept
92 let $USERPROFILE = 'C:\foo'
Bram Moolenaar48340b62017-08-29 22:08:53 +020093 let $HOME = '%USERPROFILE'
Bram Moolenaardde60342017-08-30 14:55:42 +020094 let $HOMEDRIVE = 'unused'
95 let $HOMEPATH = 'unused'
96 call CheckHome('%USERPROFILE', '%USERPROFILE')
Bram Moolenaar48340b62017-08-29 22:08:53 +020097
Bram Moolenaardde60342017-08-30 14:55:42 +020098 " %USERPROFILE% not at start of $HOME is not expanded
99 let $USERPROFILE = 'unused'
Bram Moolenaar48340b62017-08-29 22:08:53 +0200100 let $HOME = 'C:\%USERPROFILE%'
Bram Moolenaardde60342017-08-30 14:55:42 +0200101 let $HOMEDRIVE = 'unused'
102 let $HOMEPATH = 'unused'
103 call CheckHome('C:\%USERPROFILE%', 'C:\%USERPROFILE%')
Bram Moolenaar48340b62017-08-29 22:08:53 +0200104
105 if has('channel')
106 RestoreEnv
Bram Moolenaardde60342017-08-30 14:55:42 +0200107 let $HOME = save_home
Bram Moolenaar48340b62017-08-29 22:08:53 +0200108 let env = ''
109 let job = job_start('cmd /c set', {'out_cb': {ch,x->[env,execute('let env=x')]}})
110 sleep 1
111 let env = filter(split(env, "\n"), 'v:val=="HOME"')
112 let home = len(env) == 0 ? "" : env[0]
113 call assert_equal('', home)
114 endif
115 finally
116 RestoreEnv
117 delcommand SaveEnv
118 delcommand RestoreEnv
119 delcommand UnletEnv
120 endtry
121endfunc