908ba079d27b8273521f62f305b2577c670869a4
   1#!/bin/sh
   2
   3test_description='test git-http-backend'
   4. ./test-lib.sh
   5
   6if test -n "$NO_CURL"; then
   7        say 'skipping test, git built without http support'
   8        test_done
   9fi
  10
  11LIB_HTTPD_PORT=${LIB_HTTPD_PORT-'5560'}
  12. "$TEST_DIRECTORY"/lib-httpd.sh
  13start_httpd
  14
  15find_file() {
  16        cd "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
  17        find $1 -type f |
  18        sed -e 1q
  19}
  20
  21config() {
  22        git --git-dir="$HTTPD_DOCUMENT_ROOT_PATH/repo.git" config $1 $2
  23}
  24
  25GET() {
  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
  36POST() {
  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
  49log_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
  55test_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
  83get_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
  94test_expect_success 'direct refs/heads/master not found' '
  95        log_div "refs/heads/master"
  96        GET refs/heads/master "404 Not Found"
  97'
  98test_expect_success 'static file is ok' '
  99        log_div "getanyfile default"
 100        get_static_files "200 OK"
 101'
 102test_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'
 107test_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
 113test_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'
 118test_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'
 124test_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
 131test_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'
 136test_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'
 142test_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
 149cat >exp <<EOF
 150
 151###  refs/heads/master
 152###
 153GET  /smart/repo.git/refs/heads/master HTTP/1.1 404 -
 154
 155###  getanyfile default
 156###
 157GET  /smart/repo.git/HEAD HTTP/1.1 200
 158GET  /smart/repo.git/info/refs HTTP/1.1 200
 159GET  /smart/repo.git/objects/info/packs HTTP/1.1 200
 160GET  /smart/repo.git/objects/info/alternates HTTP/1.1 200 -
 161GET  /smart/repo.git/objects/info/http-alternates HTTP/1.1 200 -
 162GET  /smart/repo.git/$LOOSE_URL HTTP/1.1 200
 163GET  /smart/repo.git/$PACK_URL HTTP/1.1 200
 164GET  /smart/repo.git/$IDX_URL HTTP/1.1 200
 165
 166###  getanyfile true
 167###
 168GET  /smart/repo.git/HEAD HTTP/1.1 200
 169GET  /smart/repo.git/info/refs HTTP/1.1 200
 170GET  /smart/repo.git/objects/info/packs HTTP/1.1 200
 171GET  /smart/repo.git/objects/info/alternates HTTP/1.1 200 -
 172GET  /smart/repo.git/objects/info/http-alternates HTTP/1.1 200 -
 173GET  /smart/repo.git/$LOOSE_URL HTTP/1.1 200
 174GET  /smart/repo.git/$PACK_URL HTTP/1.1 200
 175GET  /smart/repo.git/$IDX_URL HTTP/1.1 200
 176
 177###  getanyfile false
 178###
 179GET  /smart/repo.git/HEAD HTTP/1.1 403 -
 180GET  /smart/repo.git/info/refs HTTP/1.1 403 -
 181GET  /smart/repo.git/objects/info/packs HTTP/1.1 403 -
 182GET  /smart/repo.git/objects/info/alternates HTTP/1.1 403 -
 183GET  /smart/repo.git/objects/info/http-alternates HTTP/1.1 403 -
 184GET  /smart/repo.git/$LOOSE_URL HTTP/1.1 403 -
 185GET  /smart/repo.git/$PACK_URL HTTP/1.1 403 -
 186GET  /smart/repo.git/$IDX_URL HTTP/1.1 403 -
 187
 188###  uploadpack default
 189###
 190GET  /smart/repo.git/info/refs?service=git-upload-pack HTTP/1.1 200
 191POST /smart/repo.git/git-upload-pack HTTP/1.1 200 -
 192
 193###  uploadpack true
 194###
 195GET  /smart/repo.git/info/refs?service=git-upload-pack HTTP/1.1 200
 196POST /smart/repo.git/git-upload-pack HTTP/1.1 200 -
 197
 198###  uploadpack false
 199###
 200GET  /smart/repo.git/info/refs?service=git-upload-pack HTTP/1.1 403 -
 201POST /smart/repo.git/git-upload-pack HTTP/1.1 403 -
 202
 203###  receivepack default
 204###
 205GET  /smart/repo.git/info/refs?service=git-receive-pack HTTP/1.1 403 -
 206POST /smart/repo.git/git-receive-pack HTTP/1.1 403 -
 207
 208###  receivepack true
 209###
 210GET  /smart/repo.git/info/refs?service=git-receive-pack HTTP/1.1 200
 211POST /smart/repo.git/git-receive-pack HTTP/1.1 200 -
 212
 213###  receivepack false
 214###
 215GET  /smart/repo.git/info/refs?service=git-receive-pack HTTP/1.1 403 -
 216POST /smart/repo.git/git-receive-pack HTTP/1.1 403 -
 217EOF
 218test_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
 228stop_httpd
 229test_done