Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Add more Bats tests
Also with other minor enhancements.
mederly committed Sep 28, 2018
1 parent 87f255c commit 8b9b0ed
Showing 7 changed files with 154 additions and 39 deletions.
3 changes: 3 additions & 0 deletions .dockerignore
@@ -0,0 +1,3 @@
demo
.git
tests
34 changes: 7 additions & 27 deletions Jenkinsfile
@@ -34,9 +34,10 @@ pipeline {
steps {
script {
try {
sh './download-midpoint &> debug'
sh 'bin/rebuild.sh &>> debug'
sh 'echo Build output ; cat debug'
sh '(docker image ls ; echo Destroying ; bin/destroy.sh ; docker image ls) 2>&1 | tee debug' // temporary
sh './download-midpoint 2>&1 | tee -a debug'
sh 'bin/rebuild.sh 2>&1 | tee -a debug'
//sh 'echo Build output ; cat debug'
} catch (error) {
def error_details = readFile('./debug')
def message = "BUILD ERROR: There was a problem building ${imagename}:${tag}. \n\n ${error_details}"
@@ -50,9 +51,9 @@ pipeline {
steps {
script {
try {
sh 'bin/test.sh &> debug'
sh '(cd demo/simple ; bats tests ) &>> debug'
sh 'echo Test output ; cat debug'
sh 'bin/test.sh 2>&1 | tee debug'
sh '(cd demo/simple ; bats tests ) 2>&1 | tee -a debug'
// sh 'echo Test output ; cat debug'
} catch (error) {
def error_details = readFile('./debug')
def message = "BUILD ERROR: There was a problem testing ${imagename}:${tag}. \n\n ${error_details}"
@@ -62,27 +63,6 @@ pipeline {
}
}
}
/*
stage ('Test2') {
steps {
script {
try {
try {
sh 'docker pull tier/mariadb:mariadb10' // temporary
sh 'env NOCOLOR=true ./test.sh'
} finally {
sh './cleanup.sh'
}
} catch (error) {
def error_details = readFile('./debug')
def message = "BUILD ERROR: There was a problem building ${imagename}:${tag}. \n\n ${error_details}"
sh "rm -f ./debug"
handleError(message)
}
}
}
}
*/
stage ('Push') {
steps {
script {
12 changes: 10 additions & 2 deletions build.sh
@@ -14,8 +14,16 @@ function normalize_path()
}

cd "$(dirname "$0")"
./download-midpoint
docker build --tag tier/midpoint:latest midpoint-server
SKIP_DOWNLOAD=0
while getopts "nh?" opt; do
case $opt in
n) SKIP_DOWNLOAD=1 ;;
h | ?) echo "Options: -n skip download" ; exit 0 ;;
*) echo "Unknown option: $opt" ; exit 1 ;;
esac
done
if [ "$SKIP_DOWNLOAD" = "0" ]; then ./download-midpoint; fi
docker build --tag tier/midpoint:latest .
echo "---------------------------------------------------------------------------------------"
echo "The midPoint containers were successfully built. To start them, execute the following:"
echo ""
5 changes: 1 addition & 4 deletions demo/simple/.env
@@ -1,3 +1,4 @@
# These parameters can be overridden by setting environment variables before calling docker-compose up
AUTHENTICATION=internal
ENV=demo
USERTOKEN=
@@ -7,8 +8,4 @@ REPO_HOST=midpoint-data
REPO_PORT=default
REPO_DATABASE=registry
REPO_USER=registry_user
REPO_PASSWORD_FILE=/run/secrets/m_database_password.txt
KEYSTORE_PASSWORD_FILE=/run/secrets/m_keystore_password.txt
MEM=2048m
LOGOUT_URL=https://localhost:8443/Shibboleth.sso/Logout
SSO_HEADER=uid
4 changes: 0 additions & 4 deletions demo/simple/docker-compose.yml
@@ -27,11 +27,7 @@ services:
- REPO_PORT
- REPO_DATABASE
- REPO_USER
- REPO_PASSWORD_FILE
- KEYSTORE_PASSWORD_FILE
- MEM
- SSO_HEADER
- LOGOUT_URL
- TIER_BEACON_OPT_OUT
networks:
- back
38 changes: 38 additions & 0 deletions demo/simple/tests/main.bats
@@ -9,6 +9,44 @@ load ../../../library
wait_for_midpoint_start simple_midpoint-server_1
}

@test "010 Check health" {
check_health
}

@test "100 Get 'administrator'" {
check_health
get_and_check_object users 00000000-0000-0000-0000-000000000002 administrator
}

@test "110 And and get 'test110'" {
check_health
echo "<user><name>test110</name></user>" >/tmp/test110.xml
add_object users /tmp/test110.xml
rm /tmp/test110.xml
search_and_check_object users test110
}

@test "300 Check repository preserved between restarts" {
check_health

echo "Creating user test300 and checking its existence"
echo "<user><name>test300</name></user>" >/tmp/test300.xml
add_object users /tmp/test300.xml
rm /tmp/test300.xml
search_and_check_object users test300

echo "Bringing the containers down"
docker-compose down

echo "Re-creating the containers"
docker-compose up --no-start
docker-compose start
wait_for_midpoint_start simple_midpoint-server_1

echo "Searching for the user again"
search_and_check_object users test300
}

@test "999 Clean up" {
docker-compose down -v
}
97 changes: 95 additions & 2 deletions library.bash
@@ -1,6 +1,12 @@
#!/bin/bash

#
# Contains common functions usable for midPoint system tests
#

# Waits until midPoint starts
function wait_for_midpoint_start () {
CONTAINER_NAME=$1
ATTEMPT=0
MAX_ATTEMPTS=20
DELAY=10
@@ -10,9 +16,96 @@ function wait_for_midpoint_start () {
echo "Waiting $DELAY seconds for midPoint to start (attempt $ATTEMPT) ..."
sleep $DELAY
docker ps
( docker logs $1 2>&1 | grep "INFO (com.evolveum.midpoint.web.boot.MidPointSpringApplication): Started MidPointSpringApplication in" ) && return 0
( docker logs $CONTAINER_NAME 2>&1 | grep "INFO (com.evolveum.midpoint.web.boot.MidPointSpringApplication): Started MidPointSpringApplication in" ) && return 0
done

echo midPoint did not start in $(( $MAX_ATTEMPTS * $DELAY )) seconds
echo midPoint did not start in $(( $MAX_ATTEMPTS * $DELAY )) seconds in $CONTAINER_NAME
return 1
}

# Checks the health of midPoint server
function check_health () {
echo Checking health...
(set -o pipefail ; curl -k -f https://localhost:8443/midpoint/actuator/health | tr -d '[:space:]' | grep -q "\"status\":\"UP\"")
status=$?
if [ $status -ne 0 ]; then
echo Error: $status
docker ps
return 1
else
echo OK
return 0
fi
}

# Retrieves XML object and checks if the name matches
function get_and_check_object () {
TYPE=$1
OID=$2
NAME=$3
TMPFILE=$(mktemp /tmp/get.XXXXXX)
echo tmp file is $TMPFILE
curl -k --user administrator:5ecr3t -H "Content-Type: application/xml" -X GET "https://localhost:8443/midpoint/ws/rest/$TYPE/$OID" >$TMPFILE || (rm $TMPFILE ; return 1)
if (grep -q "<name>$NAME</name>" <$TMPFILE); then
echo "Object $TYPE/$OID '$NAME' is OK"
rm $TMPFILE
return 0
else
echo "Object $TYPE/$OID '$NAME' was not found or not retrieved correctly:"
cat $TMPFILE
rm $TMPFILE
return 1
fi
}

# Adds object from a given file
# TODO Returns the OID in OID variable
# it can be found in the following HTTP reader returned: Location: "https://localhost:8443/midpoint/ws/rest/users/85e62669-d36b-41ce-b4f1-1ffdd9f66262"
function add_object () {
TYPE=$1
FILE=$2
echo "Adding to $TYPE from $FILE..."
curl -k --user administrator:5ecr3t -H "Content-Type: application/xml" -X POST "https://localhost:8443/midpoint/ws/rest/$TYPE" -d @$FILE || return 1
#TODO check the returned XML
return 0
}

# Tries to find an object with a given name
# Results of the search are in the $SEARCH_RESULT_FILE
# TODO check if the result is valid (i.e. not an error) - return 1 if invalid, otherwise return 0 ("no objects" is considered OK here)
function search_objects_by_name () {
TYPE=$1
NAME=$2
TMPFILE=$(mktemp /tmp/search.XXXXXX)

curl -k --user administrator:5ecr3t -H "Content-Type: application/xml" -X POST "https://localhost:8443/midpoint/ws/rest/$TYPE/search" -d @- << EOF >$TMPFILE || (rm $TMPFILE ; return 1)
<q:query xmlns:q="http://prism.evolveum.com/xml/ns/public/query-3">
<q:filter>
<q:equal>
<q:path>name</q:path>
<q:value>$NAME</q:value>
</q:equal>
</q:filter>
</q:query>
EOF
SEARCH_RESULT_FILE=$TMPFILE
# TODO check validity of the file
return 0
}

# Searches for object with a given name and verifies it was found
function search_and_check_object () {
TYPE=$1
NAME=$2
search_objects_by_name $TYPE $NAME || return 1
if (grep -q "<name>$NAME</name>" <$SEARCH_RESULT_FILE); then
echo "Object $TYPE/'$NAME' is OK"
rm $SEARCH_RESULT_FILE
return 0
else
echo "Object $TYPE/'$NAME' was not found or not retrieved correctly:"
cat $SEARCH_RESULT_FILE
rm $SEARCH_RESULT_FILE
return 1
fi
}

0 comments on commit 8b9b0ed

Please sign in to comment.