t0300: use write_script helper
[git] / t / t0300-credentials.sh
1 #!/bin/sh
2
3 test_description='basic credential helper tests'
4 . ./test-lib.sh
5 . "$TEST_DIRECTORY"/lib-credential.sh
6
7 test_expect_success 'setup helper scripts' '
8         cat >dump <<-\EOF &&
9         whoami=`echo $0 | sed s/.*git-credential-//`
10         echo >&2 "$whoami: $*"
11         while IFS== read key value; do
12                 echo >&2 "$whoami: $key=$value"
13                 eval "$key=$value"
14         done
15         EOF
16
17         write_script git-credential-useless <<-\EOF &&
18         . ./dump
19         exit 0
20         EOF
21
22         write_script git-credential-verbatim <<-\EOF &&
23         user=$1; shift
24         pass=$1; shift
25         . ./dump
26         test -z "$user" || echo username=$user
27         test -z "$pass" || echo password=$pass
28         EOF
29
30         PATH="$PWD:$PATH"
31 '
32
33 test_expect_success 'credential_fill invokes helper' '
34         check fill "verbatim foo bar" <<-\EOF
35         --
36         username=foo
37         password=bar
38         --
39         verbatim: get
40         EOF
41 '
42
43 test_expect_success 'credential_fill invokes multiple helpers' '
44         check fill useless "verbatim foo bar" <<-\EOF
45         --
46         username=foo
47         password=bar
48         --
49         useless: get
50         verbatim: get
51         EOF
52 '
53
54 test_expect_success 'credential_fill stops when we get a full response' '
55         check fill "verbatim one two" "verbatim three four" <<-\EOF
56         --
57         username=one
58         password=two
59         --
60         verbatim: get
61         EOF
62 '
63
64 test_expect_success 'credential_fill continues through partial response' '
65         check fill "verbatim one \"\"" "verbatim two three" <<-\EOF
66         --
67         username=two
68         password=three
69         --
70         verbatim: get
71         verbatim: get
72         verbatim: username=one
73         EOF
74 '
75
76 test_expect_success 'credential_fill passes along metadata' '
77         check fill "verbatim one two" <<-\EOF
78         protocol=ftp
79         host=example.com
80         path=foo.git
81         --
82         username=one
83         password=two
84         --
85         verbatim: get
86         verbatim: protocol=ftp
87         verbatim: host=example.com
88         verbatim: path=foo.git
89         EOF
90 '
91
92 test_expect_success 'credential_approve calls all helpers' '
93         check approve useless "verbatim one two" <<-\EOF
94         username=foo
95         password=bar
96         --
97         --
98         useless: store
99         useless: username=foo
100         useless: password=bar
101         verbatim: store
102         verbatim: username=foo
103         verbatim: password=bar
104         EOF
105 '
106
107 test_expect_success 'do not bother storing password-less credential' '
108         check approve useless <<-\EOF
109         username=foo
110         --
111         --
112         EOF
113 '
114
115
116 test_expect_success 'credential_reject calls all helpers' '
117         check reject useless "verbatim one two" <<-\EOF
118         username=foo
119         password=bar
120         --
121         --
122         useless: erase
123         useless: username=foo
124         useless: password=bar
125         verbatim: erase
126         verbatim: username=foo
127         verbatim: password=bar
128         EOF
129 '
130
131 test_expect_success 'usernames can be preserved' '
132         check fill "verbatim \"\" three" <<-\EOF
133         username=one
134         --
135         username=one
136         password=three
137         --
138         verbatim: get
139         verbatim: username=one
140         EOF
141 '
142
143 test_expect_success 'usernames can be overridden' '
144         check fill "verbatim two three" <<-\EOF
145         username=one
146         --
147         username=two
148         password=three
149         --
150         verbatim: get
151         verbatim: username=one
152         EOF
153 '
154
155 test_expect_success 'do not bother completing already-full credential' '
156         check fill "verbatim three four" <<-\EOF
157         username=one
158         password=two
159         --
160         username=one
161         password=two
162         --
163         EOF
164 '
165
166 # We can't test the basic terminal password prompt here because
167 # getpass() tries too hard to find the real terminal. But if our
168 # askpass helper is run, we know the internal getpass is working.
169 test_expect_success 'empty helper list falls back to internal getpass' '
170         check fill <<-\EOF
171         --
172         username=askpass-username
173         password=askpass-password
174         --
175         askpass: Username:
176         askpass: Password:
177         EOF
178 '
179
180 test_expect_success 'internal getpass does not ask for known username' '
181         check fill <<-\EOF
182         username=foo
183         --
184         username=foo
185         password=askpass-password
186         --
187         askpass: Password:
188         EOF
189 '
190
191 HELPER="!f() {
192                 cat >/dev/null
193                 echo username=foo
194                 echo password=bar
195         }; f"
196 test_expect_success 'respect configured credentials' '
197         test_config credential.helper "$HELPER" &&
198         check fill <<-\EOF
199         --
200         username=foo
201         password=bar
202         --
203         EOF
204 '
205
206 test_expect_success 'match configured credential' '
207         test_config credential.https://example.com.helper "$HELPER" &&
208         check fill <<-\EOF
209         protocol=https
210         host=example.com
211         path=repo.git
212         --
213         username=foo
214         password=bar
215         --
216         EOF
217 '
218
219 test_expect_success 'do not match configured credential' '
220         test_config credential.https://foo.helper "$HELPER" &&
221         check fill <<-\EOF
222         protocol=https
223         host=bar
224         --
225         username=askpass-username
226         password=askpass-password
227         --
228         askpass: Username for '\''https://bar'\'':
229         askpass: Password for '\''https://askpass-username@bar'\'':
230         EOF
231 '
232
233 test_expect_success 'pull username from config' '
234         test_config credential.https://example.com.username foo &&
235         check fill <<-\EOF
236         protocol=https
237         host=example.com
238         --
239         username=foo
240         password=askpass-password
241         --
242         askpass: Password for '\''https://foo@example.com'\'':
243         EOF
244 '
245
246 test_expect_success 'http paths can be part of context' '
247         check fill "verbatim foo bar" <<-\EOF &&
248         protocol=https
249         host=example.com
250         path=foo.git
251         --
252         username=foo
253         password=bar
254         --
255         verbatim: get
256         verbatim: protocol=https
257         verbatim: host=example.com
258         EOF
259         test_config credential.https://example.com.useHttpPath true &&
260         check fill "verbatim foo bar" <<-\EOF
261         protocol=https
262         host=example.com
263         path=foo.git
264         --
265         username=foo
266         password=bar
267         --
268         verbatim: get
269         verbatim: protocol=https
270         verbatim: host=example.com
271         verbatim: path=foo.git
272         EOF
273 '
274
275 test_done