source: server/lib/checkrest @ 83f20d1

918-git-images-111dID-1020_logrotateBugID-1037_Mostrar.TipoDisco.WebID-1038_Muestra.el.numero.de.ordenadoresID-1039_Asignar_Disco.Particion.Imagen.AccesoRemotoID-824_Iniciar.Sistema.Restauradoconfigfiledevel-ogadmserver-for-masterdisk-imagemainmaster-1037opengnsys-1.1.1dpreqndtest
Last change on this file since 83f20d1 was cf701e9, checked in by Ramón M. Gómez <ramongomez@…>, 4 years ago

#839: New checkrest script to run automatic tests in the OpenGnsys Server REST API (includes the first 17 test).

  • Property mode set to 100755
File size: 5.1 KB
Line 
1#!/bin/bash
2
3#/**
4#@file    checktest
5#@brief   Run tests to check the OpenGnsys Server REST functions.
6#@usage   checktest [help]
7#@warning This script inserts test data into the database and deletes it before finishing.
8#@version 1.1.1 - Initial version.
9#@author  Ramón M. Gómez - ETSII Univ. Sevilla
10#@date    2019-10-07
11#*/ ##
12
13PROG=$(basename "$0")
14OPENGNSYS=/opt/opengnsys
15CONFIGFILE=$OPENGNSYS/etc/ogAdmServer.cfg
16RESTURL="https://localhost/opengnsys/rest"
17source $OPENGNSYS/lib/ogfunctions.sh || exit 1
18
19# Test a REST ROUTE. Parameters: Route Headers Data Agent
20function route () {
21    local ROUTE PARAM METHOD HEADER DATA AGENT RET STATUS
22    ROUTE="$1"
23    PARAM="$2"
24    HEADER="$3"
25    DATA="$4"
26    AGENT="$5"
27    METHOD="${DATA:+POST}"
28    METHOD="${METHOD:-GET}"
29    RESP=$(curl -4ks -w "%{http_code}" ${HEADER:+-H "$HEADER"} ${DATA:+-d "$DATA"} ${AGENT:+-A "$AGENT"} "$RESTURL$ROUTE")
30    RET=$?
31    CODE="${RESP: -3}"
32    RESP="${RESP::-3}"
33    [ "$PARAM" ] && PARAM="($PARAM: $(jq -r ".$PARAM // \"not found\"" <<<"$RESP"))"
34    case "$CODE" in
35        200) let OK=OK+1
36             STATUS="OK $PARAM" ;;
37        404) let FAIL=FAIL+1
38             STATUS="FAIL ($CODE: $(echo $RESP))" ;;
39        000) let FAIL=FAIL+1
40             STATUS="FAIL (Connection error: $RET)" ;;
41        *)   let FAIL=FAIL+1
42             STATUS="FAIL ($CODE: $(jq -r '.message|gsub(":.*";"")' <<<"$RESP"))" ;;
43    esac
44    printf "%-40s: %s\n" "- $METHOD $ROUTE" "$STATUS"
45}
46
47# Execute database operation.
48function dbexec () {
49    MYCNF=$(mktemp)
50    trap "rm -f $MYCNF" 0 1 2 3 6 9 15
51    touch $MYCNF
52    chmod 600 $MYCNF
53    cat << EOT > $MYCNF
54[client]
55user=$USUARIO
56password=$PASSWORD
57EOT
58    mysql --defaults-extra-file="$MYCNF" -D "$CATALOG" -s -N -e "$1" || \
59        raiseError access "Cannot access the databse"
60}
61
62# Delete test data from the database.
63function deletedata () {
64    # Delete test data, if exists.
65    DATA="
66DELETE FROM centros, administradores_centros USING centros INNER JOIN administradores_centros
67 WHERE centros.idcentro=administradores_centros.idcentro AND centros.nombrecentro='TestOU';
68DELETE FROM repositorios WHERE nombrerepositorio='TestRepo';
69DELETE FROM aulas WHERE nombreaula='TestLab';
70DELETE FROM ordenadores WHERE nombreordenador='TestClnt';
71"
72    dbexec "$DATA"
73}
74
75# Load test data into the database.
76function loaddata () {
77    # Insert test data.
78    DATA="
79INSERT INTO centros (nombrecentro, identidad, comentarios)
80       VALUES ('TestOU', 1, 'Tests');
81SET @ou_id := LAST_INSERT_ID();
82INSERT INTO administradores_centros (idusuario, idcentro)
83       VALUES (1, @ou_id);
84INSERT INTO repositorios (nombrerepositorio, idcentro, ip)
85       VALUES ('TestRepo', @ou_id, '127.0.0.1');
86SET @repo_id := LAST_INSERT_ID();
87INSERT INTO aulas (nombreaula, idcentro, inremotepc)
88       VALUES ('TestLab', @ou_id, 0);
89SET @lab_id := LAST_INSERT_ID();
90INSERT INTO ordenadores (nombreordenador, idrepositorio, idaula, ip, mac)
91       VALUES ('TestClnt', @id_repo, @lab_id, '127.0.0.1', '001122334455');
92SET @clnt_id := LAST_INSERT_ID();
93"
94    dbexec "$DATA"
95}
96
97function runtests () {
98    local OK FAIL
99
100    let OK=FAIL=0
101    echo "Running tests..."
102    route "/info" "release"
103    route "/status" "cpu.usage"
104    DATA='{"username":"'$USUARIO'","password":"'$PASSWORD'"}'
105    route /login "" "" "$DATA"
106    HEADERS="Authorization: $(jq -r '.apikey' <<<"$RESP")"
107    route /ous
108    OU=$(jq -r '.[] | select(.name=="TestOU").id' <<<"$RESP")
109    route "/ous/$OU" "name" "$HEADERS"
110    route "/ous/$OU/repos" "" "$HEADERS"
111    REPO=$(jq -r '.[] | select(.name=="TestRepo").id' <<<"$RESP")
112    route "/ous/$OU/repos/$REPO" "name" "$HEADERS"
113    route "/ous/$OU/labs" "" "$HEADERS"
114    LAB=$(jq -r '.[] | select(.name=="TestLab").id' <<<"$RESP")
115    route "/ous/$OU/labs/$LAB" "name" "$HEADERS"
116    route "/ous/$OU/labs/$LAB/clients" "" "$HEADERS"
117    CLNT=$(jq -r '.[] | select(.name=="TestClnt").id' <<<"$RESP")
118    route "/ous/$OU/labs/$LAB/clients/$CLNT" "name" "$HEADERS"
119    read -r IP MAC <<<$(jq -r '.ip+" "+([.mac[0:2],.mac[2:4],.mac[4:6],.mac[6:8],.mac[8:10],.mac[10:12]] | join(":"))' <<<"$RESP")
120    route "/ous/$OU/labs/$LAB/clients/$CLNT/status" "status" "$HEADERS"
121    route "/ous/$OU/images" "" "$HEADERS"
122    AGENT="python-requests/test"
123    DATA='{"ip":"'$IP'","mac":"'$MAC'","ostype":"Windows","osversion":"Windows Test","secret":"'$(printf "%.sX" {1..32})'"}'
124    route "/ogagent/started" "" "" "$DATA" "$AGENT"
125    DATA='{"ip":"'$IP'","user":"test","language":"en","ostype":"Windows","osversion":"Windows 10 Test"}'
126    route "/ogagent/loggedin" "" "" "$DATA" "$AGENT"
127    route "/ogagent/loggedout" "" "" "$DATA" "$AGENT"
128    DATA='{"ip":"'$IP'","mac":"'$MAC'","ostype":"Windows","osversion":"Windows Test"}'
129    route "/ogagent/stopped" "" "" "$DATA" "$AGENT"
130    echo "Tests OK: $OK"
131    echo "Tests failed: $FAIL"
132}
133
134
135# Main program.
136
137# Show help.
138[ "$*" == "help" ] && help
139[ "$*" ] && raiseError usage
140# Access control.
141[ "$USER" == "root" ] || raiseError access "Need to be root."
142[ -r $CONFIGFILE ] || raiseError access "Configuration file."
143# Check dependencies.
144which jq &>/dev/null || raiseError notfound "Need to install \"jq\"."
145
146source $CONFIGFILE
147deletedata
148loaddata
149runtests
150deletedata
151
Note: See TracBrowser for help on using the repository browser.