Merge branch 'jl/maint-submodule-relative'
[git/raj.git] / t / t0300-credentials.sh
blob20e28e34e7dc63aaf9ee9c6bdabcf311e0240615
1 #!/bin/sh
3 test_description='basic credential helper tests'
4 . ./test-lib.sh
5 . "$TEST_DIRECTORY"/lib-credential.sh
7 test_expect_success 'setup helper scripts' '
8 cat >dump <<-\EOF &&
9 whoami=`echo $0 | sed s/.*git-credential-//`
10 echo >&2 "$whoami: $*"
11 OIFS=$IFS
12 IFS==
13 while read key value; do
14 echo >&2 "$whoami: $key=$value"
15 eval "$key=$value"
16 done
17 IFS=$OIFS
18 EOF
20 write_script git-credential-useless <<-\EOF &&
21 . ./dump
22 exit 0
23 EOF
25 write_script git-credential-verbatim <<-\EOF &&
26 user=$1; shift
27 pass=$1; shift
28 . ./dump
29 test -z "$user" || echo username=$user
30 test -z "$pass" || echo password=$pass
31 EOF
33 PATH="$PWD:$PATH"
36 test_expect_success 'credential_fill invokes helper' '
37 check fill "verbatim foo bar" <<-\EOF
39 username=foo
40 password=bar
42 verbatim: get
43 EOF
46 test_expect_success 'credential_fill invokes multiple helpers' '
47 check fill useless "verbatim foo bar" <<-\EOF
49 username=foo
50 password=bar
52 useless: get
53 verbatim: get
54 EOF
57 test_expect_success 'credential_fill stops when we get a full response' '
58 check fill "verbatim one two" "verbatim three four" <<-\EOF
60 username=one
61 password=two
63 verbatim: get
64 EOF
67 test_expect_success 'credential_fill continues through partial response' '
68 check fill "verbatim one \"\"" "verbatim two three" <<-\EOF
70 username=two
71 password=three
73 verbatim: get
74 verbatim: get
75 verbatim: username=one
76 EOF
79 test_expect_success 'credential_fill passes along metadata' '
80 check fill "verbatim one two" <<-\EOF
81 protocol=ftp
82 host=example.com
83 path=foo.git
85 username=one
86 password=two
88 verbatim: get
89 verbatim: protocol=ftp
90 verbatim: host=example.com
91 verbatim: path=foo.git
92 EOF
95 test_expect_success 'credential_approve calls all helpers' '
96 check approve useless "verbatim one two" <<-\EOF
97 username=foo
98 password=bar
101 useless: store
102 useless: username=foo
103 useless: password=bar
104 verbatim: store
105 verbatim: username=foo
106 verbatim: password=bar
110 test_expect_success 'do not bother storing password-less credential' '
111 check approve useless <<-\EOF
112 username=foo
119 test_expect_success 'credential_reject calls all helpers' '
120 check reject useless "verbatim one two" <<-\EOF
121 username=foo
122 password=bar
125 useless: erase
126 useless: username=foo
127 useless: password=bar
128 verbatim: erase
129 verbatim: username=foo
130 verbatim: password=bar
134 test_expect_success 'usernames can be preserved' '
135 check fill "verbatim \"\" three" <<-\EOF
136 username=one
138 username=one
139 password=three
141 verbatim: get
142 verbatim: username=one
146 test_expect_success 'usernames can be overridden' '
147 check fill "verbatim two three" <<-\EOF
148 username=one
150 username=two
151 password=three
153 verbatim: get
154 verbatim: username=one
158 test_expect_success 'do not bother completing already-full credential' '
159 check fill "verbatim three four" <<-\EOF
160 username=one
161 password=two
163 username=one
164 password=two
169 # We can't test the basic terminal password prompt here because
170 # getpass() tries too hard to find the real terminal. But if our
171 # askpass helper is run, we know the internal getpass is working.
172 test_expect_success 'empty helper list falls back to internal getpass' '
173 check fill <<-\EOF
175 username=askpass-username
176 password=askpass-password
178 askpass: Username:
179 askpass: Password:
183 test_expect_success 'internal getpass does not ask for known username' '
184 check fill <<-\EOF
185 username=foo
187 username=foo
188 password=askpass-password
190 askpass: Password:
194 HELPER="!f() {
195 cat >/dev/null
196 echo username=foo
197 echo password=bar
198 }; f"
199 test_expect_success 'respect configured credentials' '
200 test_config credential.helper "$HELPER" &&
201 check fill <<-\EOF
203 username=foo
204 password=bar
209 test_expect_success 'match configured credential' '
210 test_config credential.https://example.com.helper "$HELPER" &&
211 check fill <<-\EOF
212 protocol=https
213 host=example.com
214 path=repo.git
216 username=foo
217 password=bar
222 test_expect_success 'do not match configured credential' '
223 test_config credential.https://foo.helper "$HELPER" &&
224 check fill <<-\EOF
225 protocol=https
226 host=bar
228 username=askpass-username
229 password=askpass-password
231 askpass: Username for '\''https://bar'\'':
232 askpass: Password for '\''https://askpass-username@bar'\'':
236 test_expect_success 'pull username from config' '
237 test_config credential.https://example.com.username foo &&
238 check fill <<-\EOF
239 protocol=https
240 host=example.com
242 username=foo
243 password=askpass-password
245 askpass: Password for '\''https://foo@example.com'\'':
249 test_expect_success 'http paths can be part of context' '
250 check fill "verbatim foo bar" <<-\EOF &&
251 protocol=https
252 host=example.com
253 path=foo.git
255 username=foo
256 password=bar
258 verbatim: get
259 verbatim: protocol=https
260 verbatim: host=example.com
262 test_config credential.https://example.com.useHttpPath true &&
263 check fill "verbatim foo bar" <<-\EOF
264 protocol=https
265 host=example.com
266 path=foo.git
268 username=foo
269 password=bar
271 verbatim: get
272 verbatim: protocol=https
273 verbatim: host=example.com
274 verbatim: path=foo.git
278 test_done