forked from ArduPilot/pymavlink
-
Notifications
You must be signed in to change notification settings - Fork 0
/
test_gen_js.sh
executable file
·124 lines (92 loc) · 5.03 KB
/
test_gen_js.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#!/bin/bash
# NextGen node/javascript top-level bindings test/s - there are a few stages of test here..
# 1. ensure we've got the dependencies pre-built, such as js bindings, C bindings, and minimal compiled c targets.
# 2. run the static pre-canned JS create/pack tests in the 'mavlink.tests.js' files (ie assembling packets for sending)
# 3. capture all the packets that the C bindings test suite make, and try to parse them all with JS. ( incoming packet parsing)
# 4. make and run the complete autogenerated 'mocha' test suite/s that does byte-level verification of JS against the C bindings.
# We use '.tests.js' autogenerated javascript to build/pack one of each packet with test data for nominally sending
# utilise the C bindings and test suite to generate a bunch of mavlink data that we can run through the node/javascript parser
# we do this by executing ./generator/C/test/posix/testmav2.0_ardupilotmega to
# run mavlink_test_all() from generator/C/include_v2.0/ardupilotmega/testsuite.h
# this script can be called manually by a human, or it can be triggered by a 'npm test' from the generator/javascript/ folder, so we handle either.
set -e
#set -x
RED='\033[1;31m'
GRN='\033[1;31m'
NC='\033[0m' # No Color
# 0 means low; 1 means some; 2 means high verbosity
VERBOSITY='0'
OUT0="/dev/stdout"
OUT1="/dev/null"
OUT2="/dev/null"
if [ "$VERBOSITY" = "1" ]; then
OUT1="/dev/stdout"
fi
if [ "$VERBOSITY" = "2" ]; then
OUT1="/dev/stdout"
OUT2="/dev/stdout"
fi
test -z "$MDEF" && MDEF="../message_definitions"
# delete the pretests file if more than 1 minute old, this prevents the 'npm test' call near the end having to re-do the pretests
if [ "`find pretests.done.swp -mmin +5 2>/dev/null`" ]; then
rm pretests.done.swp
fi
if [[ ! -f "pretests.done.swp" ]]; then
# build js bindings we want to test
printf "${RED}Generating JS-NextGen bindings to test...${NC}\n\n"
sleep 1
cd generator
./gen_js.sh > $OUT2
cd ..
# build C bindings to test the testsuite.js 'recieve' tester against.
# we quieten them as we really aren't testing THEM here.
printf "${RED}Generating C bindings to test JS-NextGen against...${NC}\n\n"
sleep 1
./tools/mavgen.py --lang C $MDEF/v1.0/ardupilotmega.xml -o generator/C/include_v1.0 --wire-protocol=1.0 > $OUT2
./tools/mavgen.py --lang C $MDEF/v1.0/ardupilotmega.xml -o generator/C/include_v2.0 --wire-protocol=2.0 > $OUT2
# we quieten them as we really aren't testing THEM here.
printf "${RED}Compiling C bindings to test JS-NextGen against...${NC}\n\n"
sleep 1
pushd generator/C/test/posix > $OUT2
make clean testmav1.0_ardupilotmega testmav2.0_ardupilotmega testmav1.0_common testmav2.0_common > $OUT2
popd > $OUT2
# need to install the bindings first to test them?
printf "${RED}Installing just-generated npm package...${NC}\n\n"
cd generator/javascript
npm install 2>/dev/null > /dev/null
cd ../..
printf "${RED}JS-NextGen PRETEST setup done.${NC}\n\n"
touch pretests.done.swp
else
printf "${RED}JS-NextGen PRETEST setup already recently done, skipping.${NC}\n\n"
fi
# 'npm test' sets this env var , so this stops it becoming a recursive call.
if [[ ! -z "${npm_package_scripts_pretest}" ]]; then
# stop here if we are in pre-test
exit 0
fi
# run the automatically generated tool for build/pack, ie create and pack one of everything, no byte-level checking of the packed results tho, comes later.
printf "${RED}Running non-NPM JS-NextGen create/pack tests ...${NC}\n\n"
sleep 1
node generator/javascript/implementations/mavlink_ardupilotmega_v2.0/mavlink.tests.js > $OUT1
node generator/javascript/implementations/mavlink_ardupilotmega_v1.0/mavlink.tests.js > $OUT1
node generator/javascript/implementations/mavlink_common_v2.0/mavlink.tests.js > $OUT1
node generator/javascript/implementations/mavlink_common_v1.0/mavlink.tests.js > $OUT1
# piping the wire-ready hex-output from the C bindings into the node bindings per-packet and receive each of them.
printf "${RED}Streaming C test data into JS-NextGen for pushBuffer/parseBuffer tests${NC}\n\n"
sleep 1
pushd generator/C/test/posix > $OUT2
./testmav1.0_ardupilotmega | grep '^fe' | node ../../../../examples/testparser.js ardupilotmega 1.0 $VERBOSITY
./testmav2.0_ardupilotmega | grep '^fd' | node ../../../../examples/testparser.js ardupilotmega 2.0 $VERBOSITY
./testmav1.0_common | grep '^fe' | node ../../../../examples/testparser.js common 1.0 $VERBOSITY
./testmav2.0_common | grep '^fd' | node ../../../../examples/testparser.js common 2.0 $VERBOSITY
popd > $OUT2
# make big collection ~990 of mocha tests based on C output like the above but more thorough, this includes byte-level checking of the packed results
# run the ~990 or more mocha tests we just made:
#( this uses generator/javascript/package.json -> runs make_tests.py -> outputs made_tests.js -> which are then executed by 'mocha test' )
printf "\n${RED}Running automated JS-NextGen NPM test suite...${NC}\n\n"
sleep 1
cd generator/javascript
npm test 2>/dev/null > $OUT0
cd ../..
printf "\n${RED}JS-NextGen Testing done.${NC}\n\n"