a3f5507ec4a5ea333916414b5fb7646f3a0c90b3
[nonrtric.git] / test / common / do_curl_function.sh
1 #!/bin/bash
2
3 #  ============LICENSE_START===============================================
4 #  Copyright (C) 2020 Nordix Foundation. All rights reserved.
5 #  ========================================================================
6 #  Licensed under the Apache License, Version 2.0 (the "License");
7 #  you may not use this file except in compliance with the License.
8 #  You may obtain a copy of the License at
9 #
10 #       http://www.apache.org/licenses/LICENSE-2.0
11 #
12 #  Unless required by applicable law or agreed to in writing, software
13 #  distributed under the License is distributed on an "AS IS" BASIS,
14 #  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 #  See the License for the specific language governing permissions and
16 #  limitations under the License.
17 #  ============LICENSE_END=================================================
18 #
19
20
21
22 # Function to execute curl towards a container (or process) and compare + print result
23 # Intended use is for basic test scripts where testing is done with curl and the returned response and payload need to be checked.
24 # args: GET|PUT|POST|DELETE <url> <target-response-code> [<payload-file>]
25 # All calls made to 'localhost:'<port>.
26 # Expects env PORT set to intended port number
27 # Expects env RESULT to contain the target response body.
28 # Optional env HTTPX shall contain protocol 'http' or 'https'. If not set, 'http' is used. For 'https' all cert errors are ignored
29 #   RESULT="*" means that returned payload is not checked, may contain any text
30 #   RESULT="<text>" means that the returned payload has to match the <text> exactly
31 #   RESULT="json:<returned-payload>" means that the returned json payload is compared with the expected result (order of json keys and index is irrelevant)
32 #   RESULT="json-array-size:<integer-size>" means that the returned json payload shall contain the number of element given by the <integer-size>
33 # Env BODY contains the response body after the call
34 # Any error will stop script execution
35 # How to use in a test script:  source this file into your bash test script to the make the function available.
36 # The function may create a dir 'tmp' for temporary files.
37
38 do_curl() {
39     echo -e $BOLD"TEST(${BASH_LINENO[0]}): ${FUNCNAME[0]}" $@ $EBOLD
40     if [ $# -lt 3 ]; then
41         echo "Need 3 or more parameters, <http-operation> <url> <response-code> [file]: "$@
42         echo "Exting test script....."
43         exit 1
44     fi
45
46     if [ -z $HTTPX ]; then
47         if [ "$HTTPX" != "http" ] && [ "$HTTPX" != "https" ]; then
48             echo "Env var HTTPX shall be set to 'http' or 'https'"
49             echo "Exting test script....."
50             exit 1
51         fi
52         PROT="http"
53     else
54         PROT=$HTTPX
55     fi
56
57     req_content=""
58     if [ -z "$REQ_CONTENT" ]; then
59         if [ $# -gt 3 ]; then
60             req_content="-H Content-Type:application/json" #Assuming json
61         fi
62     else
63         req_content="-H Content-Type:$REQ_CONTENT"
64     fi
65     resp_content=""
66     if [ -z "$RESP_CONTENT" ]; then
67         if [[ "$RESULT" == "json"* ]]; then
68             resp_content="application/json"
69         elif [[ "$RESULT" == "*" ]]; then
70             resp_content=""
71         else
72             resp_content="text/plain"
73         fi
74     else
75         resp_content=$RESP_CONTENT
76     fi
77     curlstr="curl -X "$1" -skw :%{content_type}:%{http_code} ${PROT}://localhost:$PORT$2 -H accept:*/*"
78     if [ $# -gt 3 ]; then
79         curlstr=$curlstr" $req_content --data-binary @"$4
80     fi
81     echo "  CMD:"$curlstr
82     res=$($curlstr)
83     status=${res:${#res}-3}
84     reminder=${res:0:${#res}-4}
85     content_type="${reminder##*:}"
86     body="${reminder%:*}"
87
88     export body
89     if [ $status -ne $3 ]; then
90         echo "  Error status:"$status" Expected status: "$3
91         echo "  Body: "$body
92         echo "Exting test script....."
93         exit 1
94     else
95         echo "  OK, code: "$status"     (Expected)"
96         if [[ "$content_type" == *"$resp_content"* ]]; then
97             echo "  Content type: "$content_type"     (Expected)"
98         else
99             echo "  Expected content type: "$resp_content
100             echo "  Got: "$content_type
101             echo "Exiting....."
102             exit 1
103         fi
104         echo "  Body: "$body
105         if [ "$RESULT" == "*" ]; then
106             echo "  Body contents not checked"
107         elif [[ "$RESULT" == "json:"* ]]; then
108             result=${RESULT:5:${#RESULT}}
109             #Find dir of the common dir
110             DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
111             res=$(python ${DIR}/compare_json.py "$result" "$body")
112             if [ $res -eq 0 ]; then
113                 echo "  Body as expected"
114             else
115                 echo "  Expected json body: "$result
116                 echo "Exiting....."
117                 exit 1
118             fi
119         elif [[ "$RESULT" == "json-array-size:"* ]]; then
120             count=${RESULT:16:${#RESULT}}
121             #Find dir of the common dir
122             DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
123             mkdir -p tmp
124             echo $body > ./tmp/.tmp.json
125             res=$(python ${DIR}/count_json_elements.py ./tmp/.tmp.json)
126             if [ $res -eq $count ]; then
127                 echo "  Body (array size) as expected"
128             else
129                 echo "  Expected json array size: "$count
130                 echo "Exiting....."
131                 exit 1
132             fi
133         else
134             body="$(echo $body | tr -d '\n' )"
135             if [ "$RESULT" == "$body" ]; then
136                 echo "  Body as expected"
137             else
138                 echo "  Expected body: "$RESULT
139                 echo "Exiting....."
140                 exit 1
141             fi
142         fi
143     fi
144 }