http: use credential API to get passwords
[git] / t / t5550-http-fetch.sh
1 #!/bin/sh
2
3 test_description='test dumb fetching over http via static file'
4 . ./test-lib.sh
5
6 if test -n "$NO_CURL"; then
7         skip_all='skipping test, git built without http support'
8         test_done
9 fi
10
11 LIB_HTTPD_PORT=${LIB_HTTPD_PORT-'5550'}
12 . "$TEST_DIRECTORY"/lib-httpd.sh
13 start_httpd
14
15 test_expect_success 'setup repository' '
16         echo content >file &&
17         git add file &&
18         git commit -m one
19 '
20
21 test_expect_success 'create http-accessible bare repository' '
22         mkdir "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
23         (cd "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
24          git --bare init &&
25          echo "exec git update-server-info" >hooks/post-update &&
26          chmod +x hooks/post-update
27         ) &&
28         git remote add public "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
29         git push public master:master
30 '
31
32 test_expect_success 'clone http repository' '
33         git clone $HTTPD_URL/dumb/repo.git clone-tmpl &&
34         cp -R clone-tmpl clone &&
35         test_cmp file clone/file
36 '
37
38 test_expect_success 'create password-protected repository' '
39         mkdir "$HTTPD_DOCUMENT_ROOT_PATH/auth/" &&
40         cp -Rf "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" \
41                "$HTTPD_DOCUMENT_ROOT_PATH/auth/repo.git"
42 '
43
44 test_expect_success 'setup askpass helpers' '
45         cat >askpass <<-EOF &&
46         #!/bin/sh
47         echo >>"$PWD/askpass-query" "askpass: \$*" &&
48         cat "$PWD/askpass-response"
49         EOF
50         chmod +x askpass &&
51         GIT_ASKPASS="$PWD/askpass" &&
52         export GIT_ASKPASS
53 '
54
55 expect_askpass() {
56         dest=$HTTPD_DEST/auth/repo.git
57         {
58                 case "$1" in
59                 none)
60                         ;;
61                 pass)
62                         echo "askpass: Password for 'http://$2@$dest': "
63                         ;;
64                 both)
65                         echo "askpass: Username for 'http://$dest': "
66                         echo "askpass: Password for 'http://$2@$dest': "
67                         ;;
68                 *)
69                         false
70                         ;;
71                 esac
72         } >askpass-expect &&
73         test_cmp askpass-expect askpass-query
74 }
75
76 test_expect_success 'cloning password-protected repository can fail' '
77         >askpass-query &&
78         echo wrong >askpass-response &&
79         test_must_fail git clone "$HTTPD_URL/auth/repo.git" clone-auth-fail &&
80         expect_askpass both wrong
81 '
82
83 test_expect_success 'http auth can use user/pass in URL' '
84         >askpass-query &&
85         echo wrong >askpass-response &&
86         git clone "$HTTPD_URL_USER_PASS/auth/repo.git" clone-auth-none &&
87         expect_askpass none
88 '
89
90 test_expect_success 'http auth can use just user in URL' '
91         >askpass-query &&
92         echo user@host >askpass-response &&
93         git clone "$HTTPD_URL_USER/auth/repo.git" clone-auth-pass &&
94         expect_askpass pass user@host
95 '
96
97 test_expect_success 'http auth can request both user and pass' '
98         >askpass-query &&
99         echo user@host >askpass-response &&
100         git clone "$HTTPD_URL/auth/repo.git" clone-auth-both &&
101         expect_askpass both user@host
102 '
103
104 test_expect_success 'fetch changes via http' '
105         echo content >>file &&
106         git commit -a -m two &&
107         git push public &&
108         (cd clone && git pull) &&
109         test_cmp file clone/file
110 '
111
112 test_expect_success 'fetch changes via manual http-fetch' '
113         cp -R clone-tmpl clone2 &&
114
115         HEAD=$(git rev-parse --verify HEAD) &&
116         (cd clone2 &&
117          git http-fetch -a -w heads/master-new $HEAD $(git config remote.origin.url) &&
118          git checkout master-new &&
119          test $HEAD = $(git rev-parse --verify HEAD)) &&
120         test_cmp file clone2/file
121 '
122
123 test_expect_success 'http remote detects correct HEAD' '
124         git push public master:other &&
125         (cd clone &&
126          git remote set-head origin -d &&
127          git remote set-head origin -a &&
128          git symbolic-ref refs/remotes/origin/HEAD > output &&
129          echo refs/remotes/origin/master > expect &&
130          test_cmp expect output
131         )
132 '
133
134 test_expect_success 'fetch packed objects' '
135         cp -R "$HTTPD_DOCUMENT_ROOT_PATH"/repo.git "$HTTPD_DOCUMENT_ROOT_PATH"/repo_pack.git &&
136         (cd "$HTTPD_DOCUMENT_ROOT_PATH"/repo_pack.git &&
137          git --bare repack &&
138          git --bare prune-packed
139         ) &&
140         git clone $HTTPD_URL/dumb/repo_pack.git
141 '
142
143 test_expect_success 'fetch notices corrupt pack' '
144         cp -R "$HTTPD_DOCUMENT_ROOT_PATH"/repo_pack.git "$HTTPD_DOCUMENT_ROOT_PATH"/repo_bad1.git &&
145         (cd "$HTTPD_DOCUMENT_ROOT_PATH"/repo_bad1.git &&
146          p=`ls objects/pack/pack-*.pack` &&
147          chmod u+w $p &&
148          printf %0256d 0 | dd of=$p bs=256 count=1 seek=1 conv=notrunc
149         ) &&
150         mkdir repo_bad1.git &&
151         (cd repo_bad1.git &&
152          git --bare init &&
153          test_must_fail git --bare fetch $HTTPD_URL/dumb/repo_bad1.git &&
154          test 0 = `ls objects/pack/pack-*.pack | wc -l`
155         )
156 '
157
158 test_expect_success 'fetch notices corrupt idx' '
159         cp -R "$HTTPD_DOCUMENT_ROOT_PATH"/repo_pack.git "$HTTPD_DOCUMENT_ROOT_PATH"/repo_bad2.git &&
160         (cd "$HTTPD_DOCUMENT_ROOT_PATH"/repo_bad2.git &&
161          p=`ls objects/pack/pack-*.idx` &&
162          chmod u+w $p &&
163          printf %0256d 0 | dd of=$p bs=256 count=1 seek=1 conv=notrunc
164         ) &&
165         mkdir repo_bad2.git &&
166         (cd repo_bad2.git &&
167          git --bare init &&
168          test_must_fail git --bare fetch $HTTPD_URL/dumb/repo_bad2.git &&
169          test 0 = `ls objects/pack | wc -l`
170         )
171 '
172
173 test_expect_success 'did not use upload-pack service' '
174         grep '/git-upload-pack' <"$HTTPD_ROOT_PATH"/access.log >act
175         : >exp
176         test_cmp exp act
177 '
178
179 stop_httpd
180 test_done