]> git.ipfire.org Git - thirdparty/git.git/blame - t/lib-credential.sh
Merge branch 'ab/detox-gettext-tests'
[thirdparty/git.git] / t / lib-credential.sh
CommitLineData
f27491d5
JK
1# Shell library for testing credential handling including helpers. See t0302
2# for an example of testing a specific helper.
abca927d
JK
3
4# Try a set of credential helpers; the expected stdin,
5# stdout and stderr should be provided on stdin,
6# separated by "--".
7check() {
e30b2feb
JRI
8 credential_opts=
9 credential_cmd=$1
10 shift
11 for arg in "$@"; do
12 credential_opts="$credential_opts -c credential.helper='$arg'"
13 done
abca927d
JK
14 read_chunk >stdin &&
15 read_chunk >expect-stdout &&
16 read_chunk >expect-stderr &&
e30b2feb
JRI
17 if ! eval "git $credential_opts credential $credential_cmd <stdin >stdout 2>stderr"; then
18 echo "git credential failed with code $?" &&
19 cat stderr &&
20 false
21 fi &&
abca927d 22 test_cmp expect-stdout stdout &&
1108cea7 23 test_cmp expect-stderr stderr
abca927d
JK
24}
25
26read_chunk() {
27 while read line; do
28 case "$line" in
29 --) break ;;
30 *) echo "$line" ;;
31 esac
32 done
33}
34
e2770979
JK
35# Clear any residual data from previous tests. We only
36# need this when testing third-party helpers which read and
37# write outside of our trash-directory sandbox.
38#
39# Don't bother checking for success here, as it is
40# outside the scope of tests and represents a best effort to
41# clean up after ourselves.
42helper_test_clean() {
43 reject $1 https example.com store-user
44 reject $1 https example.com user1
45 reject $1 https example.com user2
46 reject $1 http path.tld user
47 reject $1 https timeout.tld user
3c90bda6 48 reject $1 https sso.tld
e2770979
JK
49}
50
51reject() {
52 (
53 echo protocol=$2
54 echo host=$3
55 echo username=$4
e30b2feb 56 ) | git -c credential.helper=$1 credential reject
e2770979
JK
57}
58
59helper_test() {
60 HELPER=$1
61
62 test_expect_success "helper ($HELPER) has no existing data" '
63 check fill $HELPER <<-\EOF
64 protocol=https
65 host=example.com
66 --
2d6dc182
MM
67 protocol=https
68 host=example.com
e2770979
JK
69 username=askpass-username
70 password=askpass-password
71 --
72 askpass: Username for '\''https://example.com'\'':
73 askpass: Password for '\''https://askpass-username@example.com'\'':
74 EOF
75 '
76
77 test_expect_success "helper ($HELPER) stores password" '
78 check approve $HELPER <<-\EOF
79 protocol=https
80 host=example.com
81 username=store-user
82 password=store-pass
83 EOF
84 '
85
86 test_expect_success "helper ($HELPER) can retrieve password" '
87 check fill $HELPER <<-\EOF
88 protocol=https
89 host=example.com
90 --
2d6dc182
MM
91 protocol=https
92 host=example.com
e2770979
JK
93 username=store-user
94 password=store-pass
95 --
96 EOF
97 '
98
99 test_expect_success "helper ($HELPER) requires matching protocol" '
100 check fill $HELPER <<-\EOF
101 protocol=http
102 host=example.com
103 --
2d6dc182
MM
104 protocol=http
105 host=example.com
e2770979
JK
106 username=askpass-username
107 password=askpass-password
108 --
109 askpass: Username for '\''http://example.com'\'':
110 askpass: Password for '\''http://askpass-username@example.com'\'':
111 EOF
112 '
113
114 test_expect_success "helper ($HELPER) requires matching host" '
115 check fill $HELPER <<-\EOF
116 protocol=https
117 host=other.tld
118 --
2d6dc182
MM
119 protocol=https
120 host=other.tld
e2770979
JK
121 username=askpass-username
122 password=askpass-password
123 --
124 askpass: Username for '\''https://other.tld'\'':
125 askpass: Password for '\''https://askpass-username@other.tld'\'':
126 EOF
127 '
128
129 test_expect_success "helper ($HELPER) requires matching username" '
130 check fill $HELPER <<-\EOF
131 protocol=https
132 host=example.com
133 username=other
134 --
2d6dc182
MM
135 protocol=https
136 host=example.com
e2770979
JK
137 username=other
138 password=askpass-password
139 --
140 askpass: Password for '\''https://other@example.com'\'':
141 EOF
142 '
143
144 test_expect_success "helper ($HELPER) requires matching path" '
145 test_config credential.usehttppath true &&
146 check approve $HELPER <<-\EOF &&
147 protocol=http
148 host=path.tld
149 path=foo.git
150 username=user
151 password=pass
152 EOF
153 check fill $HELPER <<-\EOF
154 protocol=http
155 host=path.tld
156 path=bar.git
157 --
2d6dc182
MM
158 protocol=http
159 host=path.tld
160 path=bar.git
e2770979
JK
161 username=askpass-username
162 password=askpass-password
163 --
164 askpass: Username for '\''http://path.tld/bar.git'\'':
165 askpass: Password for '\''http://askpass-username@path.tld/bar.git'\'':
166 EOF
167 '
168
169 test_expect_success "helper ($HELPER) can forget host" '
170 check reject $HELPER <<-\EOF &&
171 protocol=https
172 host=example.com
173 EOF
174 check fill $HELPER <<-\EOF
175 protocol=https
176 host=example.com
177 --
2d6dc182
MM
178 protocol=https
179 host=example.com
e2770979
JK
180 username=askpass-username
181 password=askpass-password
182 --
183 askpass: Username for '\''https://example.com'\'':
184 askpass: Password for '\''https://askpass-username@example.com'\'':
185 EOF
186 '
187
188 test_expect_success "helper ($HELPER) can store multiple users" '
189 check approve $HELPER <<-\EOF &&
190 protocol=https
191 host=example.com
192 username=user1
193 password=pass1
194 EOF
195 check approve $HELPER <<-\EOF &&
196 protocol=https
197 host=example.com
198 username=user2
199 password=pass2
200 EOF
201 check fill $HELPER <<-\EOF &&
202 protocol=https
203 host=example.com
204 username=user1
205 --
2d6dc182
MM
206 protocol=https
207 host=example.com
e2770979
JK
208 username=user1
209 password=pass1
210 EOF
211 check fill $HELPER <<-\EOF
212 protocol=https
213 host=example.com
214 username=user2
215 --
2d6dc182
MM
216 protocol=https
217 host=example.com
e2770979
JK
218 username=user2
219 password=pass2
220 EOF
221 '
222
223 test_expect_success "helper ($HELPER) can forget user" '
224 check reject $HELPER <<-\EOF &&
225 protocol=https
226 host=example.com
227 username=user1
228 EOF
229 check fill $HELPER <<-\EOF
230 protocol=https
231 host=example.com
232 username=user1
233 --
2d6dc182
MM
234 protocol=https
235 host=example.com
e2770979
JK
236 username=user1
237 password=askpass-password
238 --
239 askpass: Password for '\''https://user1@example.com'\'':
240 EOF
241 '
242
243 test_expect_success "helper ($HELPER) remembers other user" '
244 check fill $HELPER <<-\EOF
245 protocol=https
246 host=example.com
247 username=user2
248 --
2d6dc182
MM
249 protocol=https
250 host=example.com
e2770979
JK
251 username=user2
252 password=pass2
253 EOF
254 '
3c90bda6
JB
255
256 test_expect_success "helper ($HELPER) can store empty username" '
257 check approve $HELPER <<-\EOF &&
258 protocol=https
259 host=sso.tld
260 username=
261 password=
262 EOF
263 check fill $HELPER <<-\EOF
264 protocol=https
265 host=sso.tld
266 --
267 protocol=https
268 host=sso.tld
269 username=
270 password=
271 EOF
272 '
e2770979
JK
273}
274
275helper_test_timeout() {
276 HELPER="$*"
277
278 test_expect_success "helper ($HELPER) times out" '
279 check approve "$HELPER" <<-\EOF &&
280 protocol=https
281 host=timeout.tld
282 username=user
283 password=pass
284 EOF
285 sleep 2 &&
286 check fill "$HELPER" <<-\EOF
287 protocol=https
288 host=timeout.tld
289 --
2d6dc182
MM
290 protocol=https
291 host=timeout.tld
e2770979
JK
292 username=askpass-username
293 password=askpass-password
294 --
295 askpass: Username for '\''https://timeout.tld'\'':
296 askpass: Password for '\''https://askpass-username@timeout.tld'\'':
297 EOF
298 '
299}
abca927d 300
c049216f 301write_script askpass <<\EOF
abca927d 302echo >&2 askpass: $*
5a435202 303what=$(echo $1 | cut -d" " -f1 | tr A-Z a-z | tr -cd a-z)
abca927d
JK
304echo "askpass-$what"
305EOF
abca927d
JK
306GIT_ASKPASS="$PWD/askpass"
307export GIT_ASKPASS