|
| 1 | +#!/bin/sh |
| 2 | + |
| 3 | +test_description='test git-http-backend' |
| 4 | +. ./test-lib.sh |
| 5 | + |
| 6 | +if test -n "$NO_CURL"; then |
| 7 | + say 'skipping test, git built without http support' |
| 8 | + test_done |
| 9 | +fi |
| 10 | + |
| 11 | +LIB_HTTPD_PORT=${LIB_HTTPD_PORT-'5560'} |
| 12 | +. "$TEST_DIRECTORY"/lib-httpd.sh |
| 13 | +start_httpd |
| 14 | + |
| 15 | +find_file() { |
| 16 | + cd "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" && |
| 17 | + find $1 -type f | |
| 18 | + sed -e 1q |
| 19 | +} |
| 20 | + |
| 21 | +config() { |
| 22 | + git --git-dir="$HTTPD_DOCUMENT_ROOT_PATH/repo.git" config $1 $2 |
| 23 | +} |
| 24 | + |
| 25 | +GET() { |
| 26 | + curl --include "$HTTPD_URL/smart/repo.git/$1" >out 2>/dev/null && |
| 27 | + tr '\015' Q <out | |
| 28 | + sed ' |
| 29 | + s/Q$// |
| 30 | + 1q |
| 31 | + ' >act && |
| 32 | + echo "HTTP/1.1 $2" >exp && |
| 33 | + test_cmp exp act |
| 34 | +} |
| 35 | + |
| 36 | +POST() { |
| 37 | + curl --include --data "$2" \ |
| 38 | + --header "Content-Type: application/x-$1-request" \ |
| 39 | + "$HTTPD_URL/smart/repo.git/$1" >out 2>/dev/null && |
| 40 | + tr '\015' Q <out | |
| 41 | + sed ' |
| 42 | + s/Q$// |
| 43 | + 1q |
| 44 | + ' >act && |
| 45 | + echo "HTTP/1.1 $3" >exp && |
| 46 | + test_cmp exp act |
| 47 | +} |
| 48 | + |
| 49 | +log_div() { |
| 50 | + echo >>"$HTTPD_ROOT_PATH"/access.log |
| 51 | + echo "### $1" >>"$HTTPD_ROOT_PATH"/access.log |
| 52 | + echo "###" >>"$HTTPD_ROOT_PATH"/access.log |
| 53 | +} |
| 54 | + |
| 55 | +test_expect_success 'setup repository' ' |
| 56 | + echo content >file && |
| 57 | + git add file && |
| 58 | + git commit -m one && |
| 59 | +
|
| 60 | + mkdir "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" && |
| 61 | + (cd "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" && |
| 62 | + git --bare init && |
| 63 | + : >objects/info/alternates && |
| 64 | + : >objects/info/http-alternates |
| 65 | + ) && |
| 66 | + git remote add public "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" && |
| 67 | + git push public master:master && |
| 68 | +
|
| 69 | + (cd "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" && |
| 70 | + git repack -a -d |
| 71 | + ) && |
| 72 | +
|
| 73 | + echo other >file && |
| 74 | + git add file && |
| 75 | + git commit -m two && |
| 76 | + git push public master:master && |
| 77 | +
|
| 78 | + LOOSE_URL=$(find_file objects/??) && |
| 79 | + PACK_URL=$(find_file objects/pack/*.pack) && |
| 80 | + IDX_URL=$(find_file objects/pack/*.idx) |
| 81 | +' |
| 82 | + |
| 83 | +get_static_files() { |
| 84 | + GET HEAD "$1" && |
| 85 | + GET info/refs "$1" && |
| 86 | + GET objects/info/packs "$1" && |
| 87 | + GET objects/info/alternates "$1" && |
| 88 | + GET objects/info/http-alternates "$1" && |
| 89 | + GET $LOOSE_URL "$1" && |
| 90 | + GET $PACK_URL "$1" && |
| 91 | + GET $IDX_URL "$1" |
| 92 | +} |
| 93 | + |
| 94 | +test_expect_success 'direct refs/heads/master not found' ' |
| 95 | + log_div "refs/heads/master" |
| 96 | + GET refs/heads/master "404 Not Found" |
| 97 | +' |
| 98 | +test_expect_success 'static file is ok' ' |
| 99 | + log_div "getanyfile default" |
| 100 | + get_static_files "200 OK" |
| 101 | +' |
| 102 | +test_expect_success 'static file if http.getanyfile true is ok' ' |
| 103 | + log_div "getanyfile true" |
| 104 | + config http.getanyfile true && |
| 105 | + get_static_files "200 OK" |
| 106 | +' |
| 107 | +test_expect_success 'static file if http.getanyfile false fails' ' |
| 108 | + log_div "getanyfile false" |
| 109 | + config http.getanyfile false && |
| 110 | + get_static_files "403 Forbidden" |
| 111 | +' |
| 112 | + |
| 113 | +test_expect_success 'http.uploadpack default enabled' ' |
| 114 | + log_div "uploadpack default" |
| 115 | + GET info/refs?service=git-upload-pack "200 OK" && |
| 116 | + POST git-upload-pack 0000 "200 OK" |
| 117 | +' |
| 118 | +test_expect_success 'http.uploadpack true' ' |
| 119 | + log_div "uploadpack true" |
| 120 | + config http.uploadpack true && |
| 121 | + GET info/refs?service=git-upload-pack "200 OK" && |
| 122 | + POST git-upload-pack 0000 "200 OK" |
| 123 | +' |
| 124 | +test_expect_success 'http.uploadpack false' ' |
| 125 | + log_div "uploadpack false" |
| 126 | + config http.uploadpack false && |
| 127 | + GET info/refs?service=git-upload-pack "403 Forbidden" && |
| 128 | + POST git-upload-pack 0000 "403 Forbidden" |
| 129 | +' |
| 130 | + |
| 131 | +test_expect_success 'http.receivepack default disabled' ' |
| 132 | + log_div "receivepack default" |
| 133 | + GET info/refs?service=git-receive-pack "403 Forbidden" && |
| 134 | + POST git-receive-pack 0000 "403 Forbidden" |
| 135 | +' |
| 136 | +test_expect_success 'http.receivepack true' ' |
| 137 | + log_div "receivepack true" |
| 138 | + config http.receivepack true && |
| 139 | + GET info/refs?service=git-receive-pack "200 OK" && |
| 140 | + POST git-receive-pack 0000 "200 OK" |
| 141 | +' |
| 142 | +test_expect_success 'http.receivepack false' ' |
| 143 | + log_div "receivepack false" |
| 144 | + config http.receivepack false && |
| 145 | + GET info/refs?service=git-receive-pack "403 Forbidden" && |
| 146 | + POST git-receive-pack 0000 "403 Forbidden" |
| 147 | +' |
| 148 | + |
| 149 | +cat >exp <<EOF |
| 150 | +
|
| 151 | +### refs/heads/master |
| 152 | +### |
| 153 | +GET /smart/repo.git/refs/heads/master HTTP/1.1 404 - |
| 154 | +
|
| 155 | +### getanyfile default |
| 156 | +### |
| 157 | +GET /smart/repo.git/HEAD HTTP/1.1 200 |
| 158 | +GET /smart/repo.git/info/refs HTTP/1.1 200 |
| 159 | +GET /smart/repo.git/objects/info/packs HTTP/1.1 200 |
| 160 | +GET /smart/repo.git/objects/info/alternates HTTP/1.1 200 - |
| 161 | +GET /smart/repo.git/objects/info/http-alternates HTTP/1.1 200 - |
| 162 | +GET /smart/repo.git/$LOOSE_URL HTTP/1.1 200 |
| 163 | +GET /smart/repo.git/$PACK_URL HTTP/1.1 200 |
| 164 | +GET /smart/repo.git/$IDX_URL HTTP/1.1 200 |
| 165 | +
|
| 166 | +### getanyfile true |
| 167 | +### |
| 168 | +GET /smart/repo.git/HEAD HTTP/1.1 200 |
| 169 | +GET /smart/repo.git/info/refs HTTP/1.1 200 |
| 170 | +GET /smart/repo.git/objects/info/packs HTTP/1.1 200 |
| 171 | +GET /smart/repo.git/objects/info/alternates HTTP/1.1 200 - |
| 172 | +GET /smart/repo.git/objects/info/http-alternates HTTP/1.1 200 - |
| 173 | +GET /smart/repo.git/$LOOSE_URL HTTP/1.1 200 |
| 174 | +GET /smart/repo.git/$PACK_URL HTTP/1.1 200 |
| 175 | +GET /smart/repo.git/$IDX_URL HTTP/1.1 200 |
| 176 | +
|
| 177 | +### getanyfile false |
| 178 | +### |
| 179 | +GET /smart/repo.git/HEAD HTTP/1.1 403 - |
| 180 | +GET /smart/repo.git/info/refs HTTP/1.1 403 - |
| 181 | +GET /smart/repo.git/objects/info/packs HTTP/1.1 403 - |
| 182 | +GET /smart/repo.git/objects/info/alternates HTTP/1.1 403 - |
| 183 | +GET /smart/repo.git/objects/info/http-alternates HTTP/1.1 403 - |
| 184 | +GET /smart/repo.git/$LOOSE_URL HTTP/1.1 403 - |
| 185 | +GET /smart/repo.git/$PACK_URL HTTP/1.1 403 - |
| 186 | +GET /smart/repo.git/$IDX_URL HTTP/1.1 403 - |
| 187 | +
|
| 188 | +### uploadpack default |
| 189 | +### |
| 190 | +GET /smart/repo.git/info/refs?service=git-upload-pack HTTP/1.1 200 |
| 191 | +POST /smart/repo.git/git-upload-pack HTTP/1.1 200 - |
| 192 | +
|
| 193 | +### uploadpack true |
| 194 | +### |
| 195 | +GET /smart/repo.git/info/refs?service=git-upload-pack HTTP/1.1 200 |
| 196 | +POST /smart/repo.git/git-upload-pack HTTP/1.1 200 - |
| 197 | +
|
| 198 | +### uploadpack false |
| 199 | +### |
| 200 | +GET /smart/repo.git/info/refs?service=git-upload-pack HTTP/1.1 403 - |
| 201 | +POST /smart/repo.git/git-upload-pack HTTP/1.1 403 - |
| 202 | +
|
| 203 | +### receivepack default |
| 204 | +### |
| 205 | +GET /smart/repo.git/info/refs?service=git-receive-pack HTTP/1.1 403 - |
| 206 | +POST /smart/repo.git/git-receive-pack HTTP/1.1 403 - |
| 207 | +
|
| 208 | +### receivepack true |
| 209 | +### |
| 210 | +GET /smart/repo.git/info/refs?service=git-receive-pack HTTP/1.1 200 |
| 211 | +POST /smart/repo.git/git-receive-pack HTTP/1.1 200 - |
| 212 | +
|
| 213 | +### receivepack false |
| 214 | +### |
| 215 | +GET /smart/repo.git/info/refs?service=git-receive-pack HTTP/1.1 403 - |
| 216 | +POST /smart/repo.git/git-receive-pack HTTP/1.1 403 - |
| 217 | +EOF |
| 218 | +test_expect_success 'server request log matches test results' ' |
| 219 | + sed -e " |
| 220 | + s/^.* \"// |
| 221 | + s/\"// |
| 222 | + s/ [1-9][0-9]*\$// |
| 223 | + s/^GET /GET / |
| 224 | + " >act <"$HTTPD_ROOT_PATH"/access.log && |
| 225 | + test_cmp exp act |
| 226 | +' |
| 227 | + |
| 228 | +stop_httpd |
| 229 | +test_done |
0 commit comments