Address sonar complaints about the listener
[ric-app/mc.git] / sidecars / listener / test / run_app_tests.ksh
diff --git a/sidecars/listener/test/run_app_tests.ksh b/sidecars/listener/test/run_app_tests.ksh
new file mode 100755 (executable)
index 0000000..6866041
--- /dev/null
@@ -0,0 +1,160 @@
+#!/usr/bin/env bash
+
+#==================================================================================
+#        Copyright (c) 2018-2020 AT&T Intellectual Property.
+#
+#   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.
+#==================================================================================
+
+
+#
+#      Mnemonic:       run_app_test.ksh
+#      Abstract:       This script drives various applications (both mc_listener  related
+#                              and testers) to generate coverage stats for sonar.  There is little
+#                              we can validate with these tests other than the programme doesn't
+#                              crash.  The verify scripts are run at code checkin and will flag
+#                              any real problems, so this is just to keep sonar's knickers unbunched.
+#
+#                              Assumptions:
+#                                      - execution directory is listener/test
+#                                      - source directory is ../src
+#
+#      Date:           2 September 2020
+#      Author:         E. Scott Daniels
+# -------------------------------------------------------------------------
+
+
+# This is a hack! There seems not to be an easy way to have the LF
+# environment add RMR (or other needed packages) for testing. If we don't
+# find RMR in the /usr/local part of the filesystem, we'll force it into
+# /tmp which doesn't require root.  We'll be smart and get the desired
+# rmr version from the repo root juas as we _expected_ the CI environmnt
+# woudl do (but seems not to).
+#
+function ensure_pkgs {
+       if (( no_rmr_load ))
+       then
+               return
+       fi
+
+       if (( force_rmr_load )) || [[ -d /usr/local/include/rmr ]]
+       then
+               echo "[INFO] found RMR installed in /usr/local"
+               return
+       fi
+
+       rv=$( grep "version:" ../../rmr-version.yaml | awk '{ print $NF; exit( 0 ) }' )
+       rr=$( grep "repo:" ../../rmr-version.yaml | awk '{ print $NF; exit( 0 ) }' )
+       if [[ -z $rv ]]
+       then
+               rv="4.2.1"                      # some sane version if not found
+       fi
+       if [[ -z $rr ]]
+       then
+               rr="release"
+       fi
+       echo "[INFO] RMR seems not to be installed in /usr/local; pulling private copy: v=$rv"
+
+       pkg_dir=/tmp/ut_pkg
+       mkdir -p $pkg_dir
+
+       (
+               set -e
+               opts="-nv --content-disposition"
+               url_base="https://packagecloud.io/o-ran-sc/$rr/packages/debian/stretch"
+               cd /tmp
+               wget $opts ${url_base}/rmr_${rv}_amd64.deb/download.deb
+               wget $opts ${url_base}/rmr-dev_${rv}_amd64.deb/download.deb
+
+               for x in *rmr*deb
+               do
+                       dpkg -x $x $pkg_dir
+               done
+       )
+       if (( $? != 0 ))
+       then
+               echo "[FAIL] unable to install one or more RMR packages"
+               exit 1
+       fi
+
+       LD_LIBRARY_PATH=$pkg_dir/usr/local/lib:$LD_LIBRARY_PATH
+       LIBRARY_PATH=$pkg_dir/usr/local/lib:$LIBRARY_PATH
+       export C_INCLUDE_PATH="$pkg_dir/usr/local/include:$C_INCLUDE_PATH"
+}
+
+# ------------------------------------------------------------------------------------------------
+
+# these aren't set by default in some of the CI environments
+#
+export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
+export LIBRARY_PATH=/usr/local/lib:$LIBRARY_PATH
+
+force_rmr_load=0
+no_rmr_load=0
+
+while [[ $1 == -* ]]
+do
+       case $1 in
+               -f)     force_rmr_load=1;;
+               -N) no_rmr_load=1;;                                     # for local testing
+
+               *)      echo "unrecognised option: $1"
+                       exit 1
+                       ;;
+       esac
+
+       shift
+done
+
+ensure_pkgs                                                                    # some CI enviroments may not have RMR; get it
+
+script_dir=${PWD%/*}/src
+cd ../src
+
+# build the binaries with coverage options set
+export TEST_COV_OPTS="-ftest-coverage -fprofile-arcs"          # picked up by make so we get coverage on tools for sonar
+make clean                     # ensure coverage files removed
+make -B                                # ensure coverage data is nuked
+
+# drive with full complement to test good branches, then with bad (missing value) to drive exceptions
+mc_listener -p 4567 -q -r 10 -e -d foo -x  >/dev/null 2>&1             # -x (invalid) prevents execution loop
+for x in d p r \? h                                            # drive with missing values for d, p, r and singletons -h and -?
+do
+       mc_listener -$x >/dev/null 2>&1
+done
+
+pipe_reader -d foo -e -f -m 0 -s  -x >/dev/null 2>&1           # drive for all "good" conditions
+for x in d m \? h
+do
+       pipe_reader  -$x >/dev/null 2>&1                # drive each exception (missing value) or 'help'
+done
+
+rdc_replay -d foo -f bar -t 0  -x >/dev/null 2>&1                      # drive for all "good" conditions
+for x in d f t  \? h
+do
+       rdc_replay  -$x >/dev/null 2>&1         # drive each exception (missing value) or 'help'
+done
+
+$script_dir/verify.sh                                  # verify MUST be first (replay relies on its output)
+$script_dir/verify_replay.sh
+
+# generate and copy coverage files to parent which is where the CI jobs are looking for them
+# we do NOT gen stats for the library functions; the unit test script(s) do that
+#
+for x in mc_listener sender rdc_replay pipe_reader
+do
+       gcov $x.c
+       cp $x.c.gcov ../                                # copy only interesting things (not the lib modules if they exist)
+done
+
+exit