blob: 6476711fcf61ce5183156932fc367cbfbbecacef [file] [log] [blame]
#!/bin/bash
# ============LICENSE_START===============================================
# Copyright (C) 2020 Nordix Foundation. All rights reserved.
# ========================================================================
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ============LICENSE_END=================================================
#
# Function to execute curl towards a container (or process) and compare + print result
# Intended use is for basic test scripts where testing is done with curl and the returned response and payload need to be checked.
# args: GET|PUT|POST|DELETE <url> <target-response-code> [<payload-file>]
# All calls made to 'localhost:'<port>.
# Expects env PORT set to intended port number
# Expects env RESULT to contain the target response body.
# Optional env HTTPX shall contain protocol 'http' or 'https'. If not set, 'http' is used. For 'https' all cert errors are ignored
# RESULT="*" means that returned payload is not checked, may contain any text
# RESULT="<text>" means that the returned payload has to match the <text> exactly
# RESULT="json:<returned-payload>" means that the returned json payload is compared with the expected result (order of json keys and index is irrelevant)
# RESULT="json-array-size:<integer-size>" means that the returned json payload shall contain the number of element given by the <integer-size>
# Env BODY contains the response body after the call
# Any error will stop script execution
# How to use in a test script: source this file into your bash test script to the make the function available.
# The function may create a dir 'tmp' for temporary files.
do_curl() {
echo -e $BOLD"TEST(${BASH_LINENO[0]}): ${FUNCNAME[0]}" $@ $EBOLD
if [ $# -lt 3 ]; then
echo "Need 3 or more parameters, <http-operation> <url> <response-code> [file]: "$@
echo "Exting test script....."
exit 1
fi
if [ -z $HTTPX ]; then
if [ "$HTTPX" != "http" ] && [ "$HTTPX" != "https" ]; then
echo "Env var HTTPX shall be set to 'http' or 'https'"
echo "Exting test script....."
exit 1
fi
PROT="http"
else
PROT=$HTTPX
fi
req_content=""
if [ -z "$REQ_CONTENT" ]; then
if [ $# -gt 3 ]; then
req_content="-H Content-Type:application/json" #Assuming json
fi
else
req_content="-H Content-Type:$REQ_CONTENT"
fi
resp_content=""
if [ -z "$RESP_CONTENT" ]; then
if [[ "$RESULT" == "json"* ]]; then
resp_content="application/json"
elif [[ "$RESULT" == "*" ]]; then
resp_content=""
else
resp_content="text/plain"
fi
else
resp_content=$RESP_CONTENT
fi
curlstr="curl -X "$1" -skw :%{content_type}:%{http_code} ${PROT}://localhost:$PORT$2 -H accept:*/*"
if [ $# -gt 3 ]; then
curlstr=$curlstr" $req_content --data-binary @"$4
fi
echo " CMD:"$curlstr
res=$($curlstr)
status=${res:${#res}-3}
reminder=${res:0:${#res}-4}
content_type="${reminder##*:}"
body="${reminder%:*}"
export body
if [ $status -ne $3 ]; then
echo " Error status:"$status" Expected status: "$3
echo " Body: "$body
echo "Exting test script....."
exit 1
else
echo " OK, code: "$status" (Expected)"
if [[ "$resp_content" == '*' ]]; then
:
elif [[ "$content_type" == *"$resp_content"* ]]; then
echo " Content type: "$content_type" (Expected)"
else
echo " Expected content type: "$resp_content
echo " Got: "$content_type
echo "Exiting....."
exit 1
fi
echo " Body: "$body
if [ "$RESULT" == "*" ]; then
echo " Body contents not checked"
elif [[ "$RESULT" == "json:"* ]]; then
result=${RESULT:5:${#RESULT}}
#Find dir of the common dir
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
res=$(python ${DIR}/compare_json.py "$result" "$body")
if [ $res -eq 0 ]; then
echo " Body as expected"
else
echo " Expected json body: "$result
echo "Exiting....."
exit 1
fi
elif [[ "$RESULT" == "json-array-size:"* ]]; then
count=${RESULT:16:${#RESULT}}
#Find dir of the common dir
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
mkdir -p tmp
echo $body > ./tmp/.tmp.json
res=$(python ${DIR}/count_json_elements.py ./tmp/.tmp.json)
if [ $res -eq $count ]; then
echo " Body (array size) as expected"
else
echo " Expected json array size: "$count
echo "Exiting....."
exit 1
fi
else
body="$(echo $body | tr -d '\n' )"
if [ "$RESULT" == "$body" ]; then
echo " Body as expected"
else
echo " Expected body: "$RESULT
echo "Exiting....."
exit 1
fi
fi
fi
}