Merge "Fix potential nil ptr seg fault and CI test issue"
diff --git a/CHANGES_CORE.txt b/CHANGES_CORE.txt
index a118752..4e382e8 100644
--- a/CHANGES_CORE.txt
+++ b/CHANGES_CORE.txt
@@ -5,6 +5,10 @@
 # API and build change  and fix summaries. Doc correctsions
 # and/or changes are not mentioned here; see the commit messages.
 
+2020 April 1; version 3.6.4
+	Correct potential nil pointer use in the NNG interface (RIC-303)
+	Correct issue preventing CI build without a container
+
 2020 March 30; version 3.6.3
 	Correct the max receive message size constant in rmr.h (RIC-301)
 
diff --git a/CMakeLists.txt b/CMakeLists.txt
index d0d6a9e..076448e 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -40,7 +40,7 @@
 
 set( major_version "3" )		# should be automatically populated from git tag later, but until CI process sets a tag we use this
 set( minor_version "6" )
-set( patch_level "3" )
+set( patch_level "4" )
 
 set( install_root "${CMAKE_INSTALL_PREFIX}" )
 set( install_inc "include/rmr" )
@@ -297,9 +297,10 @@
 
 # ------------- testing -------------------------------------------------------
 enable_testing()
+# cmake cannot set env vars, so we have to passed desired vars on the wrapper command
 add_test(
 		NAME drive_unit_tests
-		COMMAND bash ../test/unit_test.ksh -q 
+		COMMAND bash ../test/run_unit_tests.sh CMBUILD=${CMAKE_CURRENT_BINARY_DIR}
 		WORKING_DIRECTORY ../test
 )
 
@@ -307,7 +308,7 @@
 # a dummy script in ./test that does the obvious thing.
 add_test(
 		NAME drive_app
-		COMMAND bash  ./run_app_tests LD_LIBRARY_PATH=${install_root}/lib C_INCLUDE_PATH=${install_root}/include
+		COMMAND bash  ./run_app_tests.sh LD_LIBRARY_PATH=${install_root}/lib C_INCLUDE_PATH=${install_root}/include CMBUILD=${CMAKE_CURRENT_BINARY_DIR}
 		WORKING_DIRECTORY ../test
 )
 
@@ -343,7 +344,7 @@
 unset( DEV_PKG  CACHE )			# prevent from being a hidden setting if user redoes things
 
 # install any nano/nng libraries in to the deb as well, but ONLY if asked for on the 'cmake ..' command
-# (sure would be nice if FILEs allowed for globbing; sadlyy it does not.)
+# (sure would be nice if FILEs allowed for globbing; sadly it does not.)
 #
 if( PACK_EXTERNALS )
 	message( "+++ including nano and nng libraries in the deb" )
diff --git a/src/rmr/nng/src/rmr_nng.c b/src/rmr/nng/src/rmr_nng.c
index 8d55b44..8a7c6d0 100644
--- a/src/rmr/nng/src/rmr_nng.c
+++ b/src/rmr/nng/src/rmr_nng.c
@@ -1054,7 +1054,7 @@
 		seconds = 1;										// use as flag later to invoked timed wait
 	}
 
-	if( ep != NULL ) {
+	if( ep == NULL ) {
 		mbuf = mtosend_msg( ctx, mbuf, 0 );					// use internal function so as not to strip call-id; should be nil on success!
 	} else {
 		mbuf = send_msg( ctx, mbuf, ep->nn_sock, -1 );
diff --git a/test/app_test/Makefile b/test/app_test/Makefile
index 8fd68f0..edff57e 100644
--- a/test/app_test/Makefile
+++ b/test/app_test/Makefile
@@ -36,7 +36,7 @@
 ex_cflags = $(shell echo $$EX_CFLAGS )
 
 build_path ?= ../../.build
-header_path := $(shell find $(build_path) -name 'rmr.h' |head -1 | sed 's!/rmr/.*!!' )
+header_path := $(shell find $(build_path) -name 'rmr.h' 2>/dev/null |head -1 | sed 's!/rmr/.*!!' )
 
 # use from environment if there so as to allow build to reference installed base
 C_INCLUDE_PATH ?= $(header_path)
diff --git a/test/app_test/rebuild.ksh b/test/app_test/rebuild.sh
similarity index 91%
rename from test/app_test/rebuild.ksh
rename to test/app_test/rebuild.sh
index bf95b6d..2d1ce83 100644
--- a/test/app_test/rebuild.ksh
+++ b/test/app_test/rebuild.sh
@@ -20,7 +20,7 @@
 
 # ---------------------------------------------------------------------------------
 #	Mnemonic:	rebuild.ksh
-#	Abstract:	This is a simple script that will cause RMr to be rebuilt. It
+#	Abstract:	This is a simple script that will cause RMR to be rebuilt. It
 #				may be invoked by any of the run_* scripts in this directory.
 #
 #				NOTE:
@@ -35,7 +35,7 @@
 
 parent=${PWD%/*}					# allow us to step up gracefully
 gparent=${parent%/*}
-build_path=${gparent}/.build		# where we'll build
+build_path=${BUILD_PATH:-${gparent}/.build} 	# where we should build; .build by default
 
 echo "$(date) build starts" >&2
 (
@@ -47,8 +47,7 @@
 		git pull						# get the up to date code so if run from an old image it's a good test
 	fi
 	cd $build_path
-	cmake .. -DDEV_PKG=1
-	make package
+	make package install
 ) >/tmp/PID$$.log
 if (( $? != 0 ))
 then
diff --git a/test/app_test/run_all.ksh b/test/app_test/run_all.ksh
index 8cc578c..57e29c8 100644
--- a/test/app_test/run_all.ksh
+++ b/test/app_test/run_all.ksh
@@ -18,7 +18,27 @@
 #==================================================================================
 #
 
-# run all of the tests, building rmr before the first one if -B is on the command line.
+#	Mnemonic:	run_all.ksh (bash compatable)
+#	Abstract:	This script will drive all of the application tests and ensure
+#				that the environment is set up as follows:
+#
+#					Any deb packages which exist in BUILD_PATH are 'installed'
+#					into a /tmp directory so that application builds can reference
+#					them.
+#
+#					References are set up to find the NNG library files in the
+#					BUILD_PATH directory.
+#
+#				The BUILD_PATH environment variable should be set, and if not the
+#				two directories ../.build and ../build are checked for and used.
+#				If the var is not set, and nether of these directories exists,
+#				the tests will not be executed.
+#
+#				At the moment, it assumes a deb based system for tests. 
+#
+#	Author:		E. Scott Daniels
+#	Date:		2019
+# -----------------------------------------------------------------------------------
 
 function run_test {
 	if [[ -n $capture_file ]]
@@ -41,31 +61,76 @@
 si_flag=""				# eventually we'll default to -S to run SI tests over NNG tests
 
 src_root="../.."
-if [[ -d $src_root/.build ]]			# look for build directory in expected places
-then									# run scripts will honour this
-	export BUILD_PATH=$src_root/.build
-else
-	if [[ -d $src_root/build ]]
-	then
-		export BUILD_PATH=$src_root/build
+if [[ -z $BUILD_PATH ]]						# if not explicitly set, assume one of our standard spots
+then
+	if [[ -d $src_root/.build ]]			# look for build directory in expected places
+	then									# run scripts will honour this
+		export BUILD_PATH=$src_root/.build
+	else
+		if [[ -d $src_root/build ]]
+		then
+			export BUILD_PATH=$src_root/build
+		else
+			echo "[ERR]  BUILD_PATH not set and no logical build directory exists to use"
+			echo "[INFO] tried: $src_root/build and $src_root/.build"
+			exit 1
+		fi
 	fi
+	echo "[INFO] using discovered build directory: $BUILD_PATH"
+else
+	echo "[INFO] using externally supplied build directory: $BUILD_PATH"
 fi
 
+# when dpkg is present, unpack the debs in build so we can reference them. When not
+# we assume that the env vars are set properly.
+#
+if which dpkg >/dev/null 2>&1
+then
+	goober_dir=/tmp/PID$$.goober	# private playpen for unpacking deb
+	rm -fr $goober_dir				# this can fail and we don't care
+	if ! mkdir -p $goober_dir		# but we care if this does
+	then
+		echo "[ERR] run_all: cannot set up working directory for lib/header files: $goober_dir"
+		exit 1
+	fi
+
+	for d in $BUILD_PATH/*.deb
+	do
+		echo "[INFO] run_all: unpacking $d"
+		dpkg -x $d ${goober_dir}
+	done
+
+	find ${goober_dir}
+
+	export C_INCLUDE_PATH=$BUILD_PATH/include:${goober_dir}/usr/local/include:$C_INCLUDE_PATH
+	export LIBRARY_PATH=$BUILD_PATH:$BUILD_PATH/.xbuild/lib:${goober_dir}/usr/local/lib:$LD_LIBRARY_PATH
+	export LD_LIBRARY_PATH=$LIBRARY_PATH
+fi
+
+
 if whence ksh >/dev/null 2>&1
 then
 	shell=ksh
 else
 	shell=bash
 fi
+
+verbose=0
+purge=1
 while [[ $1 == "-"* ]]
 do
 	case $1 in
-		-B)	build="-B";;
+		-B)	build="-b";;			# build RMR without pulling
 		-e)	capture_file=$2; >$capture_file; shift;;
 		-i)	installed="-i";;
 		-N)	si_flag="";;			# turn on NNG tests (off si)
+		-P)	build="-B";;			# build RMR with a pull first
+		-p)	purge=0;;				# don't purge binaries to ensure rebuild happens
 		-S)	si_flag="-S";;			# turn on si based tests
 		-s) shell=$2; shift;;
+		-v)	verbose=1;;
+
+		-\?) echo "usage: $0 [-B|-P] [-e err_file] [-i] [-N|-S] [-p] [-s shell] [-v]";;
 
 		*)	echo "'$1' is not a recognised option and is ignored";;
 	esac
@@ -73,16 +138,31 @@
 	shift
 done
 
+if (( verbose ))
+then
+	env | grep PATH
+	if [[ -n $goober_dir ]]
+	then
+		find $goober_dir
+	fi
+fi
+
 export SHELL=$shell
 
+if (( purge ))
+then
+	rm -f sender sender_si receiver receiver_si
+fi
+
 echo "----- app --------------------"
-if which ip >/dev/null 2>&1
+if which ip >/dev/null 2>&1					# ip command rquired for the app test; skip if not found
 then
 	run_test run_app_test.ksh $si_flag -v $installed $build
+	build=""
 fi
 
 echo "----- multi ------------------"
-run_test run_multi_test.ksh $si_flag
+run_test run_multi_test.ksh $si_flag $build
 
 echo "----- round robin -----------"
 run_test run_rr_test.ksh $si_flag
@@ -103,4 +183,6 @@
 	echo "[FAIL] one or more application to application tests failed"
 fi
 
+
+fm -fr goober_dir
 exit $(( !! errors ))
diff --git a/test/app_test/run_all.sh b/test/app_test/run_all.sh
new file mode 100644
index 0000000..51747fb
--- /dev/null
+++ b/test/app_test/run_all.sh
@@ -0,0 +1,190 @@
+#!/usr/bin/env ksh
+# vim: ts=4 sw=4 noet :
+#==================================================================================
+#    Copyright (c) 2019-2020 Nokia
+#    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_all.ksh (bash compatable)
+#	Abstract:	This script will drive all of the application tests and ensure
+#				that the environment is set up as follows:
+#
+#					Any deb packages which exist in BUILD_PATH are 'installed'
+#					into a /tmp directory so that application builds can reference
+#					them.
+#
+#					References are set up to find the NNG library files in the
+#					BUILD_PATH directory.
+#
+#				The BUILD_PATH environment variable should be set, and if not the
+#				two directories ../.build and ../build are checked for and used.
+#				If the var is not set, and nether of these directories exists,
+#				the tests will not be executed.
+#
+#				At the moment, it assumes a deb based system for tests. 
+#
+#	Author:		E. Scott Daniels
+#	Date:		2019
+# -----------------------------------------------------------------------------------
+
+function run_test {
+	if [[ -n $capture_file ]]
+	then
+		if ! $shell $@ >>$capture_file 2>&1
+		then
+			echo "[FAIL] test failed; see $capture_file"
+			(( errors++ ))
+		fi
+	else
+		if ! $shell $@
+		then
+			(( errors++ ))
+		fi
+	fi
+}
+
+build=""
+errors=0
+si_flag=""				# eventually we'll default to -S to run SI tests over NNG tests
+
+src_root="../.."
+if [[ -z $BUILD_PATH ]]						# if not explicitly set, assume one of our standard spots
+then
+	if [[ -d $src_root/.build ]]			# look for build directory in expected places
+	then									# run scripts will honour this
+		export BUILD_PATH=$src_root/.build
+	else
+		if [[ -d $src_root/build ]]
+		then
+			export BUILD_PATH=$src_root/build
+		else
+			echo "[ERR]  BUILD_PATH not set and no logical build directory exists to use"
+			echo "[INFO] tried: $src_root/build and $src_root/.build"
+			exit 1
+		fi
+	fi
+	echo "[INFO] using discovered build directory: $BUILD_PATH"
+else
+	echo "[INFO] using externally supplied build directory: $BUILD_PATH"
+fi
+
+# when dpkg is present, unpack the debs in build so we can reference them. When not
+# we assume that the env vars are set properly.
+#
+if which dpkg >/dev/null 2>&1
+then
+	goober_dir=/tmp/PID$$.goober	# private playpen for unpacking deb
+	rm -fr $goober_dir				# this can fail and we don't care
+	if ! mkdir -p $goober_dir		# but we care if this does
+	then
+		echo "[ERR] run_all: cannot set up working directory for lib/header files: $goober_dir"
+		exit 1
+	fi
+
+	for d in $BUILD_PATH/*.deb
+	do
+		echo "[INFO] run_all: unpacking $d"
+		dpkg -x $d ${goober_dir}
+	done
+
+	find ${goober_dir}
+
+	ginclude=$( find $goober_dir -name include | head -1 )
+	glib=$( find $goober_dir -name lib | head -1 )
+	export C_INCLUDE_PATH=$BUILD_PATH/include:${ginclude}:$C_INCLUDE_PATH
+	export LIBRARY_PATH=$BUILD_PATH:$BUILD_PATH/.xbuild/lib:${glib}:$LD_LIBRARY_PATH
+	export LD_LIBRARY_PATH=$LIBRARY_PATH
+fi
+
+
+if whence ksh >/dev/null 2>&1
+then
+	shell=ksh
+else
+	shell=bash
+fi
+
+verbose=0
+purge=1
+while [[ $1 == "-"* ]]
+do
+	case $1 in
+		-B)	build="-b";;			# build RMR without pulling
+		-e)	capture_file=$2; >$capture_file; shift;;
+		-i)	installed="-i";;
+		-N)	si_flag="";;			# turn on NNG tests (off si)
+		-P)	build="-B";;			# build RMR with a pull first
+		-p)	purge=0;;				# don't purge binaries to ensure rebuild happens
+		-S)	si_flag="-S";;			# turn on si based tests
+		-s) shell=$2; shift;;
+		-v)	verbose=1;;
+
+		-\?) echo "usage: $0 [-B|-P] [-e err_file] [-i] [-N|-S] [-p] [-s shell] [-v]";;
+
+		*)	echo "'$1' is not a recognised option and is ignored";;
+	esac
+
+	shift
+done
+
+if (( verbose ))
+then
+	env | grep PATH
+	if [[ -n $goober_dir ]]
+	then
+		find $goober_dir
+	fi
+fi
+
+export SHELL=$shell
+
+if (( purge ))
+then
+	rm -f sender sender_si receiver receiver_si
+fi
+
+echo "----- app --------------------"
+if which ip >/dev/null 2>&1					# ip command rquired for the app test; skip if not found
+then
+	run_test run_app_test.sh $si_flag -v $installed $build
+	build=""
+fi
+
+echo "----- multi ------------------"
+run_test run_multi_test.sh $si_flag $build
+
+echo "----- round robin -----------"
+run_test run_rr_test.sh $si_flag
+
+echo "----- rts -------------------"
+run_test run_rts_test.sh $si_flag -s 5 -d 100
+
+echo "----- extended payload nocopy no clone------"
+run_test run_exrts_test.sh $si_flag -d 10 -n 1000
+
+echo "----- extended payload copy clone------"
+run_test run_exrts_test.sh $si_flag -d 10 -n 1000 -c 11
+
+if (( errors == 0 ))
+then
+	echo "[PASS] all test pass"
+else
+	echo "[FAIL] one or more application to application tests failed"
+fi
+
+
+fm -fr goober_dir
+exit $(( !! errors ))
diff --git a/test/app_test/run_app_test.ksh b/test/app_test/run_app_test.sh
similarity index 91%
rename from test/app_test/run_app_test.ksh
rename to test/app_test/run_app_test.sh
index ef12a00..11db720 100644
--- a/test/app_test/run_app_test.ksh
+++ b/test/app_test/run_app_test.sh
@@ -98,7 +98,7 @@
 
 nmsg=20						# total number of messages to be exchanged (-n value changes)
 							# need two sent to each receiver to ensure hairpin entries were removed (will fail if they were not)
-delay=500000				# microsec sleep between msg 1,000,000 == 1s
+delay=100000				# microsec sleep between msg 1,000,000 == 1s
 wait=1
 rebuild=0
 nopull=""					# -b sets so that build does not pull
@@ -181,11 +181,14 @@
 		fi
 	fi
 
-	if [[ -d $build_path/lib64 ]]
+	if [[ -z $LD_LIBRARY_PATH ]]		# the cmake test environment will set this; we must use if set
 	then
-		export LD_LIBRARY_PATH=$build_path:$build_path/lib64
-	else
-		export LD_LIBRARY_PATH=$build_path:$build_path/lib
+		if [[ -d $build_path/lib64 ]]
+		then
+			export LD_LIBRARY_PATH=$build_path:$build_path/lib64
+		else
+			export LD_LIBRARY_PATH=$build_path:$build_path/lib
+		fi
 	fi
 	export LIBRARY_PATH=$LD_LIBRARY_PATH
 fi
@@ -196,7 +199,10 @@
 then
 	if ! make -B sender${si} receiver${si} >/tmp/PID$$.clog 2>&1
 	then
-		echo "[FAIL] cannot find sender${si} and/or receiver${si}binary, and cannot make them.... humm?"
+		echo "[FAIL] cannot find sender${si} and/or receiver${si} binary, and cannot make them.... humm?"
+		echo "[INFO] ------------- PATH settings -----------------"
+		env | grep PATH
+		echo "[INFO] ------------- compiler output (head) -----------------"
 		head -50 /tmp/PID$$.clog
 		rm -fr /tmp/PID$$.*
 		exit 1
diff --git a/test/app_test/run_call_test.ksh b/test/app_test/run_call_test.sh
similarity index 91%
rename from test/app_test/run_call_test.ksh
rename to test/app_test/run_call_test.sh
index 1028523..64ed70e 100644
--- a/test/app_test/run_call_test.ksh
+++ b/test/app_test/run_call_test.sh
@@ -170,18 +170,21 @@
 	fi
 fi
 
-if (( dev_base ))							# assume we are testing against what we've built, not what is installed
+if [[ -z $LD_LIBRARY_PATH ]]					# cmake test will set and it must be honoured
 then
-	if [[ -d $build_path/lib64 ]]
+	if (( dev_base ))							# assume we are testing against what we've built, not what is installed
 	then
-		export LD_LIBRARY_PATH=$build_path:$build_path/lib64:$LD_LIBRARY_PATH
-	else
-		export LD_LIBRARY_PATH=$build_path:$build_path/lib:$LD_LIBRARY_PATH
+		if [[ -d $build_path/lib64 ]]
+		then
+			export LD_LIBRARY_PATH=$build_path:$build_path/lib64:$LD_LIBRARY_PATH
+		else
+			export LD_LIBRARY_PATH=$build_path:$build_path/lib:$LD_LIBRARY_PATH
+		fi
+		export LIBRARY_PATH=$LD_LIBRARY_PATH
+	else										# -D option gets us here to test an installed library
+		export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
+		export LIBRARY_PATH=$LD_LIBRARY_PATH
 	fi
-	export LIBRARY_PATH=$LD_LIBRARY_PATH
-else										# -D option gets us here to test an installed library
-	export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
-	export LIBRARY_PATH=$LD_LIBRARY_PATH
 fi
 
 export RMR_SEED_RT=${RMR_SEED_RT:-./caller.rt}		# allow easy testing with different rt
diff --git a/test/app_test/run_exrts_test.ksh b/test/app_test/run_exrts_test.sh
similarity index 95%
rename from test/app_test/run_exrts_test.ksh
rename to test/app_test/run_exrts_test.sh
index 9bd198d..9f0a436 100644
--- a/test/app_test/run_exrts_test.ksh
+++ b/test/app_test/run_exrts_test.sh
@@ -169,11 +169,14 @@
 		fi
 	fi
 
-	if [[ -d $build_path/lib64 ]]
+	if [[ -z $LD_LIBRARY_PATH ]]		# cmake test will set this up and we must honour
 	then
-		export LD_LIBRARY_PATH=$build_path:$build_path/lib64:$LD_LIBRARY_PATH
-	else
-		export LD_LIBRARY_PATH=$build_path:$build_path/lib:$LD_LIBRARY_PATH
+		if [[ -d $build_path/lib64 ]]
+		then
+			export LD_LIBRARY_PATH=$build_path:$build_path/lib64:$LD_LIBRARY_PATH
+		else
+			export LD_LIBRARY_PATH=$build_path:$build_path/lib:$LD_LIBRARY_PATH
+		fi
 	fi
 fi
 
diff --git a/test/app_test/run_lcall_test.ksh b/test/app_test/run_lcall_test.sh
similarity index 95%
rename from test/app_test/run_lcall_test.ksh
rename to test/app_test/run_lcall_test.sh
index 241deb5..944d399 100644
--- a/test/app_test/run_lcall_test.ksh
+++ b/test/app_test/run_lcall_test.sh
@@ -168,11 +168,14 @@
 		fi
 	fi
 
-	if [[ -d $build_path/lib64 ]]
+	if [[ -z $LD_LIBRARY_PATH ]]			# cmake test will set this; we must honour it
 	then
-		export LD_LIBRARY_PATH=$build_path:$build_path/lib64:$LD_LIBRARY_PATH
-	else
-		export LD_LIBRARY_PATH=$build_path:$build_path/lib:$LD_LIBRARY_PATH
+		if [[ -d $build_path/lib64 ]]
+		then
+			export LD_LIBRARY_PATH=$build_path:$build_path/lib64:$LD_LIBRARY_PATH
+		else
+			export LD_LIBRARY_PATH=$build_path:$build_path/lib:$LD_LIBRARY_PATH
+		fi
 	fi
 fi
 
diff --git a/test/app_test/run_multi_test.ksh b/test/app_test/run_multi_test.sh
similarity index 95%
rename from test/app_test/run_multi_test.ksh
rename to test/app_test/run_multi_test.sh
index acc065d..d8cf765 100644
--- a/test/app_test/run_multi_test.ksh
+++ b/test/app_test/run_multi_test.sh
@@ -154,12 +154,16 @@
 	fi
 fi
 
-if [[ -d $build_path/lib64 ]]
+if [[ -z LD_LIBRARY_PATH ]]			# if cmake test sets we must honour
 then
-	export LD_LIBRARY_PATH=$build_path:$build_path/lib64:$LD_LIBRARY_PATH
-else
-	export LD_LIBRARY_PATH=$build_path:$build_path/lib:$LD_LIBRARY_PATH
+	if [[ -d $build_path/lib64 ]]
+	then
+		export LD_LIBRARY_PATH=$build_path:$build_path/lib64:$LD_LIBRARY_PATH
+	else
+		export LD_LIBRARY_PATH=$build_path:$build_path/lib:$LD_LIBRARY_PATH
+	fi
 fi
+
 export LIBRARY_PATH=$LD_LIBRARY_PATH
 export RMR_SEED_RT=./multi.rt
 
diff --git a/test/app_test/run_rr_test.ksh b/test/app_test/run_rr_test.sh
similarity index 95%
rename from test/app_test/run_rr_test.ksh
rename to test/app_test/run_rr_test.sh
index 62aae3b..581f286 100644
--- a/test/app_test/run_rr_test.ksh
+++ b/test/app_test/run_rr_test.sh
@@ -156,12 +156,16 @@
 	fi
 fi
 
-if [[ -d $build_path/lib64 ]]
+if [[ -z $LD_LIBRARY_PATH ]]			# honour if cmake test sets
 then
-	export LD_LIBRARY_PATH=$build_path:$build_path/lib64:$LD_LIBRARY_PATH
-else
-	export LD_LIBRARY_PATH=$build_path:$build_path/lib:$LD_LIBRARY_PATH
+	if [[ -d $build_path/lib64 ]]
+	then
+		export LD_LIBRARY_PATH=$build_path:$build_path/lib64:$LD_LIBRARY_PATH
+	else
+		export LD_LIBRARY_PATH=$build_path:$build_path/lib:$LD_LIBRARY_PATH
+	fi
 fi
+
 export LIBRARY_PATH=$LD_LIBRARY_PATH
 export RMR_SEED_RT=./rr.rt
 
diff --git a/test/app_test/run_rts_test.ksh b/test/app_test/run_rts_test.sh
similarity index 94%
rename from test/app_test/run_rts_test.ksh
rename to test/app_test/run_rts_test.sh
index d268fd3..7ebf4b4 100644
--- a/test/app_test/run_rts_test.ksh
+++ b/test/app_test/run_rts_test.sh
@@ -126,12 +126,16 @@
 	fi
 fi
 
-if [[ -d $build_path/lib64 ]]
+if [[ -z LD_LIBRARY_PATH ]]			# honour if cmake test sets it
 then
-	export LD_LIBRARY_PATH=$build_path:$build_path/lib64:$LD_LIBRARY_PATH
-else
-	export LD_LIBRARY_PATH=$build_path:$build_path/lib:$LD_LIBRARY_PATH
+	if [[ -d $build_path/lib64 ]]
+	then
+		export LD_LIBRARY_PATH=$build_path:$build_path/lib64:$LD_LIBRARY_PATH
+	else
+		export LD_LIBRARY_PATH=$build_path:$build_path/lib:$LD_LIBRARY_PATH
+	fi
 fi
+
 export LIBRARY_PATH=$LD_LIBRARY_PATH
 export RMR_SEED_RT=./rts.rt
 
diff --git a/test/run_app_tests b/test/run_app_tests.sh
similarity index 73%
rename from test/run_app_tests
rename to test/run_app_tests.sh
index 21064d9..3df47e2 100644
--- a/test/run_app_tests
+++ b/test/run_app_tests.sh
@@ -29,9 +29,24 @@
 # To deal with this, all leading positional parms of the form foo=bar are
 # looked at and if we like it we'll export it before starting the test.
 
+# It is also impossible for us to know what the build directory the user
+# created for their build and test. We will auto discover if they used
+# .build or build in the parent to this directory (in that order). If a
+# different directory is desired, then the build directory must be supplied
+# as an environment variable to the make:
+#	cd rmr/.bld
+#	BUILD_PATH=$PWD make test ARGS=-v
+
 while [[ $1 == *"="* ]]
 do
 	case ${1%%=*} in
+		CMBUILD)						# should be cmake build dir
+			if [[ -z $BUILD_PATH ]]		# still allow user to override
+			then
+				export BUILD_PATH=${1##*=}
+			fi
+			;;
+
 		LD_LIBRARY_PATH)
 			export LD_LIBRARY_PATH=${1##*=}
 			;;
@@ -51,4 +66,4 @@
 
 set -e
 cd app_test
-bash ./run_all.ksh -S	# build CI likely doesn't have ksh; Run SI tests
+bash ./run_all.sh  -S	# build CI likely doesn't have ksh; Run SI tests
diff --git a/test/run_unit_tests.sh b/test/run_unit_tests.sh
new file mode 100644
index 0000000..07d84e3
--- /dev/null
+++ b/test/run_unit_tests.sh
@@ -0,0 +1,60 @@
+#!/usr/env bash
+# vim: ts=4 sw=4 noet :
+#==================================================================================
+#    Copyright (c) 2020 Nokia
+#    Copyright (c) 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.
+#==================================================================================
+#
+
+# This is a wrappter to the unit test script which is needed because CMake test
+# is unable to set environment variables before executing the test command.
+# this script assumes that env variables are passed on the command line in x=y
+# format. We will set all that are given; the only exception to this is that
+# we will NOT override the BUILD_PATH variable which allows it to be set 
+# from the script that invokes 'make test'
+
+# We assume that the CMBUILD variable has a good build directory (e.g. .build)
+# but the user can be sure by hard setting BUILD_PATH which will NOT be
+# changed.  For example:
+#	cd rmr/.bld
+#	BUILD_PATH=$PWD make test ARGS="-V"
+
+while [[ $1 == *"="* ]]
+do
+	case ${1%%=*} in
+		CMBUILD)						# should be cmake build dir
+			if [[ -z $BUILD_PATH ]]		# still allow user to override
+			then
+				export BUILD_PATH=${1##*=}
+			fi
+			;;
+
+		LD_LIBRARY_PATH)
+			export LD_LIBRARY_PATH=${1##*=}
+			;;
+
+		C_INCLUDE_PATH)
+			export C_INCLUDE_PATH=${1##*=}
+			;;
+
+		LIBRARY_PATH)
+			export LIBRARY_PATH=${1##*=}
+			;;
+	esac
+
+	shift
+done
+
+bash ./unit_test.ksh -q
diff --git a/test/unit_test.ksh b/test/unit_test.ksh
index 80712a5..ad21465 100755
--- a/test/unit_test.ksh
+++ b/test/unit_test.ksh
@@ -82,7 +82,7 @@
 function add_ignored_func {
 	if [[ ! -r $1 ]]
 	then
-		echo ">>>> can't find file to ignore: $1" 
+		echo ">>>> can't find file to ignore: $1"
 		return
 	fi
 
@@ -215,7 +215,6 @@
 				#printf( "allow discount: %s\n", $0 )
 				if( replace_flags ) {
 					gsub( "#####", "    1", $0 )
-					//gsub( "#####", "=====", $0 )
 				}
 				discount++;
 			}
@@ -312,23 +311,26 @@
 
 # -----------------------------------------------------------------------------------------------------------------
 
-# we assume that the project has been built in the ../[.]build directory
-if [[ -d ../build ]]
+if [[ -z $BUILD_PATH ]]
 then
-	export LD_LIBRARY_PATH=../build/lib:../build/lib64
-	export C_INCLUDE_PATH=../build/include
-else
-	if [[ -d ../.build ]]
-	then
-		export LD_LIBRARY_PATH=../.build/lib:../.build/lib64
-		export C_INCLUDE_PATH=../.build/include
 
+	# we assume that the project has been built in the ../[.]build directory
+	if [[ -d ../build ]]
+	then
+		export BUILD_PATH=../build
 	else
-		echo "[WARN] cannot find build directory (tried ../build and ../.build); things might not work"
-		echo ""
+		if [[ -d ../.build ]]
+		then
+			export BUILD_PATH=../.build
+		else
+			echo "[WARN] cannot find build directory (tried ../build and ../.build); things might not work"
+			echo ""
+		fi
 	fi
 fi
 
+export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$BUILD_PATH/lib:$BUILD_PATH/lib64
+export C_INCLUDE_PATH=$C_INCLUDE_PATH:$BUILD_PATH/include
 export LIBRARY_PATH=$LD_LIBRARY_PATH
 
 # The Makefile sets specific includes for things
@@ -420,7 +422,7 @@
 			then
 				continue
 			fi
-	
+
 			flist="${flist}$tfile "
 		fi
 	done
@@ -483,7 +485,7 @@
 		if ! ./${tfile%.c} >/tmp/PID$$.log 2>&1
 		then
 			echo "[FAIL] unit test failed for: $tfile"
-			if [[ -n $capture_file ]] 
+			if [[ -n $capture_file ]]
 			then
 				echo "all errors captured in $capture_file, listing only fail message on tty"
 				echo "$tfile --------------------------------------" >>$capture_file
@@ -493,7 +495,7 @@
 			else
 				if (( quiet ))
 				then
-					grep "^<" /tmp/PID$$.log|grep -v "^<EM>"	# in quiet mode just dump <...> messages which are assumed from the test programme not appl
+					grep "^<" /tmp/PID$$.log|egrep -v "^<SIEM>|^<EM>"	# in quiet mode just dump <...> messages which are assumed from the test programme not appl
 				else
 					cat /tmp/PID$$.log
 				fi
@@ -501,7 +503,7 @@
 			(( ut_errors++ ))				# cause failure even if not in strict mode
 			if (( ! always_gcov ))
 			then
-				continue						# skip coverage tests for this
+				exit 1						# we are in a subshell, must exit bad
 			fi
 		else
 			if (( show_output ))
@@ -652,6 +654,12 @@
 			done
 		fi
  	)>/tmp/PID$$.noise 2>&1
+	if (( $? != 0 ))
+	then
+		(( ut_errors++ ))
+		cat /tmp/PID$$.noise
+		continue
+	fi
 
 	for x in *.gcov							# merge any previous coverage file with this one
 	do
@@ -667,7 +675,7 @@
 	then
 		cat /tmp/PID$$.noise
 	fi
-done 
+done
 
 echo ""
 echo "[INFO] final discount checks on merged gcov files"