3 #==================================================================================
4 # Copyright (c) 2018-2019 AT&T Intellectual Property.
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
10 # http://www.apache.org/licenses/LICENSE-2.0
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 #==================================================================================
21 # Mnemonic: run_unit_test.ksh
22 # Abstract: This drives unit testing setting up working directories
23 # and such. This expects that RMR dev package(s) is/are
24 # installed. Some CI envirpnments don't provide this, or
25 # the ability to pre-install before running this test, so
26 # we will force one to be there if we don't find it in /usr.
29 # For the Jenkins jobs to capture trigger data allowing sonar
30 # analysis, we must force a build in the ../src directory.
31 # CI mode is on by default, to force this build, but can be
32 # turned off with the -c option for local builds/testing.
34 # Date: 10 December 2019
35 # Author: E. Scott Daniels
36 # -------------------------------------------------------------------------
38 function abort_after {
43 echo "abort: unit test running too long, killing ${2:-nojobgiven}"
50 mkdir -p /tmp/mc_listener_test/final
51 mkdir -p /tmp/mc_listener_test/stage
53 mv_src=/tmp/mc_listener_test/mv_src # source that will be renamed rather than copied
54 mv_dest=/tmp/mc_listener_test/mv_dest
57 copy_src=/tmp/mc_listener_test/copy_src
58 copy_dest=/tmp/mc_listener_test/copy_dest
61 src_md5=$( cat $copy_src | md5sum ) # use cat so that filename doesn't factor in to output
66 rm -fr /tmp/mc_listener_test
69 # This is a hack! There seems not to be an easy way to have the LF
70 # environment add RMR (or other needed packages) for testing. If we don't
71 # find RMR in the /usr/local part of the filesystem, we'll force it into
72 # /tmp which doesn't require root. We'll be smart and get the desired
73 # rmr version from the repo root juas as we _expected_ the CI environmnt
74 # woudl do (but seems not to).
76 function ensure_pkgs {
82 if (( force_rmr_load )) || [[ -d /usr/local/include/rmr ]]
84 echo "[INFO] found RMR installed in /usr/local"
88 rv=$( grep "version:" ../../rmr-version.yaml | awk '{ print $NF; exit( 0 ) }' )
89 rr=$( grep "repo:" ../../rmr-version.yaml | awk '{ print $NF; exit( 0 ) }' )
92 rv="4.2.1" # some sane version if not found
98 echo "[INFO] RMR seems not to be installed in /usr/local; pulling private copy: v=$rv"
105 opts="-nv --content-disposition"
106 url_base="https://packagecloud.io/o-ran-sc/$rr/packages/debian/stretch"
108 wget $opts ${url_base}/rmr_${rv}_amd64.deb/download.deb
109 wget $opts ${url_base}/rmr-dev_${rv}_amd64.deb/download.deb
118 echo "[FAIL] unable to install one or more RMR packages"
122 LD_LIBRARY_PATH=$pkg_dir/usr/local/lib:$LD_LIBRARY_PATH
123 LIBRARY_PATH=$pkg_dir/usr/local/lib:$LIBRARY_PATH
124 export C_INCLUDE_PATH="$pkg_dir/usr/local/include:$C_INCLUDE_PATH"
127 # ------------------------------------------------------------------------------------------------
129 # these aren't set by default in some of the CI environments
131 export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
132 export LIBRARY_PATH=/usr/local/lib:$LIBRARY_PATH
134 # defined in the CI configuration where jenkins jobs are looking for gcov files
135 gcov_dir=/tmp/gcov_rpts
136 if [[ ! -d $cov_dir ]]
138 echo "[INFO] making $gcov_dir"
142 running=/tmp/PID$$.running
144 ci_mode=1 # -c turns off; see the flower box above
151 -f) force_rmr_load=1;;
152 -N) no_rmr_load=1;; # for local testing
155 *) echo "unrecognised option: $1"
163 if [[ $1 == "purge" ]] # just purge
169 ensure_pkgs # ensure that we have RMR; some CI environments are lacking
171 if (( ci_mode )) # in CI mode we must force a build in the src so build wrapper captures trigger data
173 echo "unit_test: building in src for sonar build wrapper capture"
176 export TEST_COV_OPTS="-ftest-coverage -fprofile-arcs" # picked up by make so we get coverage on tools for sonar
181 echo "[INFO] unit_test: building unit test(s)"
182 if ! make -B unit_test # ensure that it's fresh
184 echo "[FAIL] cannot make unit_test"
187 echo "[INFO] unit_test: unit test(s) successfully built"
190 echo "[INFO] unit_test: directories set up"
192 if [[ $1 == "set"* ]] # setup only
194 echo "[INFO] unit_test: setup only; exiting good"
198 rm -fr *.gcov *.gcda # ditch any previously generated coverage info
200 echo "[INFO] unit_test: running tests -- may take as long as 120 seconds"
201 ./unit_test >/tmp/PID$$.utlog 2>&1 &
203 abort_after 60 $pid &
207 echo "<FAIL> run_unit_test: wait popped"
216 echo "[PASS] base unit tests all pass"
217 echo "[INFO] file/directory verification begins...."
219 # validate files that should have been created/copied
223 ls -al /tmp/mc_listener_test/* >/tmp/PID$$.fdlog 2>&1
225 if [[ -e $copy_src ]]
227 echo "[FAIL] copy source test should have been unlinked but was there!"
230 dest_md5=$( cat $copy_dest | md5sum ) # use cat so that filename doesn't factor in to output
231 if [[ $dest_md5 != $src_md5 ]]
233 echo "[FAIL] md5 of copy test file didn't match soruce"
235 echo "$dest_md5 $src_md5"
247 ./show_coverage.ksh unit_test.c # compute coverage and generate .gcov files
248 echo "Coverage with discounting (raw values in parens)"
249 ./discount_chk.ksh $(ls *gcov|egrep -v "^test_|unit_test.c")
254 echo "[FAIL] overall test fails"
256 echo "[PASS] overall test passes"
257 rm -f *test*.gcov # ditch test specific coverage files first
258 #cp *.gcov $gcov_dir/ # make avilable to jenkins job(s)
259 ./publish_cov.ksh # push to reports dir and fix internal source filenames