diff options
-rwxr-xr-x | tools/build_test_env.sh | 121 | ||||
-rwxr-xr-x | tools/functional_tests.sh | 147 | ||||
-rwxr-xr-x | tools/py_functional_tests.sh | 28 |
3 files changed, 169 insertions, 127 deletions
diff --git a/tools/build_test_env.sh b/tools/build_test_env.sh index bb185f3..7881c18 100755 --- a/tools/build_test_env.sh +++ b/tools/build_test_env.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/sh # Copyright (C) 2016 Gauvain Pocentek <gauvain@pocentek.net> # # This program is free software: you can redistribute it and/or modify @@ -14,50 +14,108 @@ # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. +pecho() { printf %s\\n "$*"; } +log() { + [ "$#" -eq 0 ] || { pecho "$@"; return 0; } + while IFS= read -r log_line || [ -n "${log_line}" ]; do + log "${log_line}" + done +} +error() { log "ERROR: $@" >&2; } +fatal() { error "$@"; exit 1; } +try() { "$@" || fatal "'$@' failed"; } + PY_VER=2 while getopts :p: opt "$@"; do case $opt in - p) - PY_VER=$OPTARG;; - *) - echo "Unknown option: $opt" - exit 1;; + p) PY_VER=$OPTARG;; + :) fatal "Option -${OPTARG} requires a value";; + '?') fatal "Unknown option: -${OPTARG}";; + *) fatal "Internal error: opt=${opt}";; esac done case $PY_VER in 2) VENV_CMD=virtualenv;; 3) VENV_CMD=pyvenv;; - *) - echo "Wrong python version (2 or 3)" - exit 1;; + *) fatal "Wrong python version (2 or 3)";; esac -docker run --name gitlab-test --detach --publish 8080:80 --publish 2222:22 gpocentek/test-python-gitlab:latest >/dev/null 2>&1 +for req in \ + curl \ + docker \ + "${VENV_CMD}" \ + ; +do + command -v "${req}" >/dev/null 2>&1 || fatal "${req} is required" +done + +VENV=$(pwd)/.venv || exit 1 +CONFIG=/tmp/python-gitlab.cfg + +cleanup() { + rm -f "${CONFIG}" + log "Stopping gitlab-test docker container..." + docker stop gitlab-test >/dev/null & + docker_stop_pid=$! + log "Waiting for gitlab-test docker container to exit..." + docker wait gitlab-test >/dev/null + wait "${docker_stop_pid}" + log "Removing gitlab-test docker container..." + docker rm gitlab-test >/dev/null + log "Deactivating Python virtualenv..." + command -v deactivate >/dev/null 2>&1 && deactivate || true + log "Deleting python virtualenv..." + rm -rf "$VENV" + log "Done." +} +[ -z "${BUILD_TEST_ENV_AUTO_CLEANUP+set}" ] || { + trap cleanup EXIT + trap 'exit 1' HUP INT TERM +} + +try docker run --name gitlab-test --detach --publish 8080:80 \ + --publish 2222:22 gpocentek/test-python-gitlab:latest >/dev/null LOGIN='root' PASSWORD='5iveL!fe' -CONFIG=/tmp/python-gitlab.cfg +GITLAB() { gitlab --config-file "$CONFIG" "$@"; } GREEN='\033[0;32m' NC='\033[0m' -OK="echo -e ${GREEN}OK${NC}" +OK() { printf "${GREEN}OK${NC}\\n"; } +testcase() { + testname=$1; shift + testscript=$1; shift + printf %s "Testing ${testname}... " + eval "${testscript}" || fatal "test failed" + OK +} -echo -n "Waiting for gitlab to come online... " +log "Waiting for gitlab to come online... " I=0 while :; do - sleep 5 - curl -s http://localhost:8080/users/sign_in 2>/dev/null | grep -q "GitLab Community Edition" && break - let I=I+5 - [ $I -eq 120 ] && exit 1 + sleep 1 + docker top gitlab-test >/dev/null 2>&1 || fatal "docker failed to start" + sleep 4 + curl -s http://localhost:8080/users/sign_in 2>/dev/null \ + | grep -q "GitLab Community Edition" && break + I=$((I+5)) + [ "$I" -lt 120 ] || fatal "timed out" done sleep 5 -$OK # Get the token -TOKEN=$(curl -s http://localhost:8080/api/v3/session \ - -X POST \ - --data "login=$LOGIN&password=$PASSWORD" \ - | python -c 'import sys, json; print(json.load(sys.stdin)["private_token"])') +log "Getting GitLab token..." +TOKEN_JSON=$( + try curl -s http://localhost:8080/api/v3/session \ + -X POST \ + --data "login=$LOGIN&password=$PASSWORD" +) || exit 1 +TOKEN=$( + pecho "${TOKEN_JSON}" | + try python -c \ + 'import sys, json; print(json.load(sys.stdin)["private_token"])' +) || exit 1 cat > $CONFIG << EOF [global] @@ -69,5 +127,20 @@ url = http://localhost:8080 private_token = $TOKEN EOF -echo "Config file content ($CONFIG):" -cat $CONFIG +log "Config file content ($CONFIG):" +log <$CONFIG + +log "Creating Python virtualenv..." +try "$VENV_CMD" "$VENV" +. "$VENV"/bin/activate || fatal "failed to activate Python virtual environment" + +log "Installing dependencies into virtualenv..." +try pip install -rrequirements.txt + +log "Installing into virtualenv..." +try pip install -e . + +log "Pausing to give GitLab some time to finish starting up..." +sleep 20 + +log "Test environment initialized." diff --git a/tools/functional_tests.sh b/tools/functional_tests.sh index 6cb868d..fefb5af 100755 --- a/tools/functional_tests.sh +++ b/tools/functional_tests.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/sh # Copyright (C) 2015 Gauvain Pocentek <gauvain@pocentek.net> # # This program is free software: you can redistribute it and/or modify @@ -14,82 +14,69 @@ # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. -cleanup() { - rm -f /tmp/python-gitlab.cfg - docker kill gitlab-test >/dev/null 2>&1 - docker rm gitlab-test >/dev/null 2>&1 - deactivate || true - rm -rf $VENV -} -trap cleanup EXIT - -setenv_script=$(dirname $0)/build_test_env.sh - -. $setenv_script "$@" - -CONFIG=/tmp/python-gitlab.cfg -GITLAB="gitlab --config-file $CONFIG" -GREEN='\033[0;32m' -NC='\033[0m' -OK="echo -e ${GREEN}OK${NC}" - -VENV=$(pwd)/.venv - -$VENV_CMD $VENV -. $VENV/bin/activate -pip install -rrequirements.txt -pip install -e . - -# NOTE(gpocentek): the first call might fail without a little delay -sleep 20 - -set -e - -echo -n "Testing project creation... " -PROJECT_ID=$($GITLAB project create --name test-project1 | grep ^id: | cut -d' ' -f2) -$GITLAB project list | grep -q test-project1 -$OK - -echo -n "Testing project update... " -$GITLAB project update --id $PROJECT_ID --description "My New Description" -$OK - -echo -n "Testing user creation... " -USER_ID=$($GITLAB user create --email fake@email.com --username user1 --name "User One" --password fakepassword | grep ^id: | cut -d' ' -f2) -$OK - -echo -n "Testing verbose output... " -$GITLAB -v user list | grep -q avatar-url -$OK - -echo -n "Testing CLI args not in output... " -$GITLAB -v user list | grep -qv config-file -$OK - -echo -n "Testing adding member to a project... " -$GITLAB project-member create --project-id $PROJECT_ID --user-id $USER_ID --access-level 40 >/dev/null 2>&1 -$OK - -echo -n "Testing file creation... " -$GITLAB project-file create --project-id $PROJECT_ID --file-path README --branch-name master --content "CONTENT" --commit-message "Initial commit" >/dev/null 2>&1 -$OK - -echo -n "Testing issue creation... " -ISSUE_ID=$($GITLAB project-issue create --project-id $PROJECT_ID --title "my issue" --description "my issue description" | grep ^id: | cut -d' ' -f2) -$OK - -echo -n "Testing note creation... " -$GITLAB project-issue-note create --project-id $PROJECT_ID --issue-id $ISSUE_ID --body "the body" >/dev/null 2>&1 -$OK - -echo -n "Testing branch creation... " -$GITLAB project-branch create --project-id $PROJECT_ID --branch-name branch1 --ref master >/dev/null 2>&1 -$OK - -echo -n "Testing branch deletion... " -$GITLAB project-branch delete --project-id $PROJECT_ID --name branch1 >/dev/null 2>&1 -$OK - -echo -n "Testing project deletion... " -$GITLAB project delete --id $PROJECT_ID -$OK +setenv_script=$(dirname "$0")/build_test_env.sh || exit 1 +BUILD_TEST_ENV_AUTO_CLEANUP=true +. "$setenv_script" "$@" || exit 1 + +testcase "project creation" ' + OUTPUT=$(try GITLAB project create --name test-project1) || exit 1 + PROJECT_ID=$(pecho "${OUTPUT}" | grep ^id: | cut -d" " -f2) + OUTPUT=$(try GITLAB project list) || exit 1 + pecho "${OUTPUT}" | grep -q test-project1 +' + +testcase "project update" ' + GITLAB project update --id "$PROJECT_ID" --description "My New Description" +' + +testcase "user creation" ' + OUTPUT=$(GITLAB user create --email fake@email.com --username user1 \ + --name "User One" --password fakepassword) +' +USER_ID=$(pecho "${OUTPUT}" | grep ^id: | cut -d' ' -f2) + +testcase "verbose output" ' + OUTPUT=$(try GITLAB -v user list) || exit 1 + pecho "${OUTPUT}" | grep -q avatar-url +' + +testcase "CLI args not in output" ' + OUTPUT=$(try GITLAB -v user list) || exit 1 + pecho "${OUTPUT}" | grep -qv config-file +' + +testcase "adding member to a project" ' + GITLAB project-member create --project-id "$PROJECT_ID" \ + --user-id "$USER_ID" --access-level 40 >/dev/null 2>&1 +' + +testcase "file creation" ' + GITLAB project-file create --project-id "$PROJECT_ID" \ + --file-path README --branch-name master --content "CONTENT" \ + --commit-message "Initial commit" >/dev/null 2>&1 +' + +testcase "issue creation" ' + OUTPUT=$(GITLAB project-issue create --project-id "$PROJECT_ID" \ + --title "my issue" --description "my issue description") +' +ISSUE_ID=$(pecho "${OUTPUT}" | grep ^id: | cut -d' ' -f2) + +testcase "note creation" ' + GITLAB project-issue-note create --project-id "$PROJECT_ID" \ + --issue-id "$ISSUE_ID" --body "the body" >/dev/null 2>&1 +' + +testcase "branch creation" ' + GITLAB project-branch create --project-id "$PROJECT_ID" \ + --branch-name branch1 --ref master >/dev/null 2>&1 +' + +testcase "branch deletion" ' + GITLAB project-branch delete --project-id "$PROJECT_ID" \ + --name branch1 >/dev/null 2>&1 +' + +testcase "project deletion" ' + GITLAB project delete --id "$PROJECT_ID" +' diff --git a/tools/py_functional_tests.sh b/tools/py_functional_tests.sh index f37aaea..0d00c5f 100755 --- a/tools/py_functional_tests.sh +++ b/tools/py_functional_tests.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/sh # Copyright (C) 2015 Gauvain Pocentek <gauvain@pocentek.net> # # This program is free software: you can redistribute it and/or modify @@ -14,26 +14,8 @@ # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. -cleanup() { - rm -f /tmp/python-gitlab.cfg - docker kill gitlab-test >/dev/null 2>&1 - docker rm gitlab-test >/dev/null 2>&1 - deactivate || true - rm -rf $VENV -} -trap cleanup EXIT +setenv_script=$(dirname "$0")/build_test_env.sh || exit 1 +BUILD_TEST_ENV_AUTO_CLEANUP=true +. "$setenv_script" "$@" || exit 1 -setenv_script=$(dirname $0)/build_test_env.sh - -. $setenv_script "$@" - -VENV=$(pwd)/.venv - -$VENV_CMD $VENV -. $VENV/bin/activate -pip install -rrequirements.txt -pip install -e . - -sleep 20 - -python $(dirname $0)/python_test.py +try python "$(dirname "$0")"/python_test.py |