From 3fe1bce75b6a9d4e108e4d721062e272006d4754 Mon Sep 17 00:00:00 2001 From: sidey79 <7968127+sidey79@users.noreply.github.com> Date: Thu, 21 Mar 2024 20:41:26 +0100 Subject: [PATCH 01/10] fix[entry.sh]: handle absolute pidfile correctly and test this --- src/entry.sh | 1 + src/tests/bats/entry.bats | 30 ++++++++++++++++++++++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/entry.sh b/src/entry.sh index 76b1421d..2f7e1893 100755 --- a/src/entry.sh +++ b/src/entry.sh @@ -381,6 +381,7 @@ function setGlobal_PIDFILE() { local cfgFile="$(prependFhemDirPath "${CONFIGTYPE}")" [ -r "$cfgFile" ] || { PIDFILE=$(prependFhemDirPath "$defaultPidfile"); return; } # configfile not readable => default + # Todo: Absolute pidfilename check! local cfgPidDef="$(getGlobalAttr "$cfgFile" "pidfilename" )" [ -n "$cfgPidDef" ] && { PIDFILE=$(prependFhemDirPath "$cfgPidDef"); return; } # found something in the configfile => use this diff --git a/src/tests/bats/entry.bats b/src/tests/bats/entry.bats index 659554bb..878992b3 100644 --- a/src/tests/bats/entry.bats +++ b/src/tests/bats/entry.bats @@ -235,8 +235,7 @@ teardown() { @test "verify absolut pidfile" { - #bats_require_minimum_version 1.5.0 - + export FHEM_DIR="/opt/fhem" export -f setGlobal_PIDFILE export -f prependFhemDirPath @@ -259,3 +258,30 @@ teardown() { run bash -c 'setGlobal_PIDFILE ; echo $PIDFILE' assert_output "/opt/fhem/run/fhem.pid" } + + +@test "absoulte pidfile set in fhem.cfg" { + export FHEM_DIR="/opt/fhem" + + run fhemCleanInstall + assert_file_exists /opt/fhem/fhem.cfg + # Pidfile in config schreiben! + # Pidfile nicht gesetzt über ENV Variable + # Prüfen ob PIDFILE korrekt angelegt ist + + echo "attr global pidfilename /run/lock/fhem.pid" >> ${FHEM_DIR}/fhem.cfg + run timeout 15 /entry.sh start > /dev/null 2> /dev/null & + sleep 10 + cat ${FHEM_DIR}/fhem.cfg + assert_file_contains --partial /run/lock/fhem.pid + assert_file_exists /run/lock/fhem.pid + + export -f setGlobal_PIDFILE + export -f prependFhemDirPath + export -f is_absolutePath + + run bash -c 'setGlobal_PIDFILE ; echo $PIDFILE' + assert_output "/run/lock/fhem.pid" + pkill entry.sh + pkill perl +} From 54bb092f44ee93f7adaf541a293fc4c02fa59c1b Mon Sep 17 00:00:00 2001 From: sidey79 <7968127+sidey79@users.noreply.github.com> Date: Sat, 30 Mar 2024 19:09:44 +0100 Subject: [PATCH 02/10] fix[entry.sh]: svn export and LC setting --- src/entry.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/entry.sh b/src/entry.sh index 2f7e1893..90b965be 100755 --- a/src/entry.sh +++ b/src/entry.sh @@ -489,10 +489,10 @@ function fhemCleanInstall() { printfInfo "Installing FHEM to ${FHEM_DIR}\n" - shopt -s dotglob nullglob 2>&1>/dev/null + shopt -s nullglob 2>&1>/dev/null - svn co https://svn.fhem.de/fhem/trunk/fhem /usr/src/fhem -q - mv /usr/src/fhem/* ${FHEM_DIR} 2>&1>/dev/null + (LC_ALL=en_US.UTF-8 && svn export https://svn.fhem.de/fhem/trunk/fhem /usr/src/fhem -q) + mv /usr/src/fhem/* "${FHEM_DIR}" # 2>&1>/dev/null cp -f /fhem/FHEM/99_DockerImageInfo.pm ${FHEM_DIR}/FHEM/ From 8ab4c03de0d00c50198f6fa8753fe881d9b1f93e Mon Sep 17 00:00:00 2001 From: sidey79 <7968127+sidey79@users.noreply.github.com> Date: Sat, 30 Mar 2024 19:10:16 +0100 Subject: [PATCH 03/10] tests: some improvements for multiple tests in same container --- src/tests/bats/entry.bats | 145 ++++++++------------------------ src/tests/bats/setup_suite.bash | 9 +- 2 files changed, 44 insertions(+), 110 deletions(-) diff --git a/src/tests/bats/entry.bats b/src/tests/bats/entry.bats index 878992b3..1d0179ba 100644 --- a/src/tests/bats/entry.bats +++ b/src/tests/bats/entry.bats @@ -7,20 +7,39 @@ setup() { load '/opt/bats/test_helper/bats-file/load.bash' load '/opt/bats/test_helper/bats-mock/load.bash' - source /entry.sh - export -f printfDebug - export -f printfInfo - # Sometimes perl or grep does not terminate, we will clean up pkill tail || true pkill grep || true - } + +setup_file() { + export BATS_TEST_TIMEOUT=60 + export LOG_FILE="/tmp/log" + + set -a + source /entry.sh + set +a +} + +teardown_file() { + sleep 0 + rm -f /tmp/log +} + + + teardown() { + # cat /opt/fhem/fhem.cfg rm -rf /opt/fhem/* + rm -rf /usr/src/fhem # why is no cleanup in entry.sh? + + mkdir -p /fhem/FHEM + cp /tmp/fhem/FHEM/* /fhem/FHEM/ } + + @test "printf info tests" { run printfInfo 'test output' assert_output 'INFO: test output' @@ -33,8 +52,6 @@ teardown() { } @test "check prependFhemDirPath()" { - export FHEM_DIR="/opt/fhem" - export -f prependFhemDirPath run bash -c 'OUT=$(prependFhemDirPath "") ; echo $OUT' assert_output "/opt/fhem" @@ -51,9 +68,8 @@ teardown() { @test "check getGlobalAttr()" { bats_require_minimum_version 1.5.0 - - export FHEM_DIR="/opt/fhem" - export -f getGlobalAttr + + fhemCleanInstall run ! getGlobalAttr /tmp/test.cfg "logfile" run fhemCleanInstall @@ -70,15 +86,11 @@ teardown() { @test "check setGlobal_LOGFILE from default" { - export -f setGlobal_LOGFILE - export -f prependFhemDirPath - export FHEM_DIR="/opt/fhem" run bash -c 'unset LOGFILE && setGlobal_LOGFILE && echo $LOGFILE' assert_output "/opt/fhem/log/fhem-%Y-%m-%d.log" } @test "check setGlobal_LOGFILE from fhem.cfg" { - export FHEM_DIR="/opt/fhem" run fhemCleanInstall assert_file_exists /opt/fhem/fhem.cfg @@ -87,22 +99,13 @@ teardown() { assert_file_contains /opt/fhem/fhem.cfg "attr global logfile ./log/fhem-%Y-%m.log" export CONFIGTYPE="fhem.cfg" - export -f setGlobal_LOGFILE - export -f prependFhemDirPath - export -f getGlobalAttr run bash -c 'unset LOGFILE && setGlobal_LOGFILE && echo $LOGFILE;' assert_output "${FHEM_DIR}/log/fhem-%Y-%m.log" } @test "check Logfile definition from fhem.cfg" { - export FHEM_DIR="/opt/fhem" export CONFIGTYPE="fhem.cfg" - export -f setGlobal_LOGFILE - export -f prependFhemDirPath - export -f getGlobalAttr - export -f setLogfile_DEFINITION - export -f fhemCleanInstall run setGlobal_LOGFILE run fhemCleanInstall @@ -115,7 +118,7 @@ teardown() { @test "check fhemUpdateInstall()" { - export FHEM_DIR="/tmp/fhem" + export FHEM_DIR=${BATS_TEST_TMPDIR}"/fhemUpdateInstall" mkdir -p ${FHEM_DIR}/FHEM run fhemUpdateInstall @@ -123,7 +126,7 @@ teardown() { assert_file_exists /fhem/FHEM/99_DockerImageInfo.pm assert_file_exists ${FHEM_DIR}/FHEM/99_DockerImageInfo.pm - rm -r ${FHEM_DIR} + #rm -r ${FHEM_DIR} } @test "ceck tailFileToConsoleStop() Logfile monitoring" { @@ -135,10 +138,6 @@ teardown() { echo "1" } - export -f tailFileToConsoleStart - export -f tailFileToConsoleStop - export -f getFhemPidNum - tailFileToConsoleStart ${realLogFile} -b run tailFileToConsoleStop @@ -152,11 +151,11 @@ teardown() { } export LOGFILE="fhem-%Y-%m-%d.log" - export realLogFile="/tmp/$( date +"${LOGFILE}")" + export realLogFile="${BATS_TEST_TMPDIR}/$( date +"${LOGFILE}")" export gCurrentTailPid=0 - export -f tailFileToConsoleStart - export -f tailFileToConsoleStop - export -f getFhemPidNum + export TAIL_PID= + + #touch ${realLogFile} run bash -c 'tailFileToConsoleStart ${realLogFile} -b; sleep 1; tailFileToConsoleStop' assert_output "" @@ -172,18 +171,13 @@ teardown() { } -@test "verify before clean install FHEM" { - assert_file_exists /fhem/FHEM/99_DockerImageInfo.pm - assert_not_exists /opt/fhem/fhem.pl -} - @test "Setup clean install FHEM" { - declare -r FHEM_DIR="/opt/fhem" + run fhemCleanInstall - assert_output --partial 'Installing FHEM to /opt/fhem' - assert_file_exists /opt/fhem/fhem.pl - assert_file_exists /opt/fhem/fhem.cfg.default - assert_file_exists /opt/fhem/FHEM/99_DockerImageInfo.pm + assert_output --partial "Installing FHEM to ${FHEM_DIR}" + assert_file_exists ${FHEM_DIR}/fhem.pl + assert_file_exists ${FHEM_DIR}/fhem.cfg.default + assert_file_exists ${FHEM_DIR}/FHEM/99_DockerImageInfo.pm #assert_file_contains /opt/fhem/fhem.cfg attr global mseclog 1 grep @@ -220,68 +214,3 @@ teardown() { run -1 bash -c 'is_absolutePath .' run -1 bash -c 'is_absolutePath ' } - -@test "verify default pidfile" { - bats_require_minimum_version 1.5.0 - export FHEM_DIR="/opt/fhem" - export -f setGlobal_PIDFILE - export -f prependFhemDirPath - export -f is_absolutePath - #export PIDFILE - - run bash -c 'setGlobal_PIDFILE ; echo $PIDFILE' - assert_output "/opt/fhem/log/fhem.pid" -} - - -@test "verify absolut pidfile" { - - export FHEM_DIR="/opt/fhem" - export -f setGlobal_PIDFILE - export -f prependFhemDirPath - export -f is_absolutePath - export PIDFILE="/run/lock/fhem.pid" - - run bash -c 'setGlobal_PIDFILE ; echo $PIDFILE' - assert_output "/run/lock/fhem.pid" -} - -@test "verify relative pidfile" { - #bats_require_minimum_version 1.5.0 - - export FHEM_DIR="/opt/fhem" - export -f setGlobal_PIDFILE - export -f prependFhemDirPath - export -f is_absolutePath - export PIDFILE="./run/fhem.pid" - - run bash -c 'setGlobal_PIDFILE ; echo $PIDFILE' - assert_output "/opt/fhem/run/fhem.pid" -} - - -@test "absoulte pidfile set in fhem.cfg" { - export FHEM_DIR="/opt/fhem" - - run fhemCleanInstall - assert_file_exists /opt/fhem/fhem.cfg - # Pidfile in config schreiben! - # Pidfile nicht gesetzt über ENV Variable - # Prüfen ob PIDFILE korrekt angelegt ist - - echo "attr global pidfilename /run/lock/fhem.pid" >> ${FHEM_DIR}/fhem.cfg - run timeout 15 /entry.sh start > /dev/null 2> /dev/null & - sleep 10 - cat ${FHEM_DIR}/fhem.cfg - assert_file_contains --partial /run/lock/fhem.pid - assert_file_exists /run/lock/fhem.pid - - export -f setGlobal_PIDFILE - export -f prependFhemDirPath - export -f is_absolutePath - - run bash -c 'setGlobal_PIDFILE ; echo $PIDFILE' - assert_output "/run/lock/fhem.pid" - pkill entry.sh - pkill perl -} diff --git a/src/tests/bats/setup_suite.bash b/src/tests/bats/setup_suite.bash index 18ceecb0..ae81c399 100644 --- a/src/tests/bats/setup_suite.bash +++ b/src/tests/bats/setup_suite.bash @@ -1,9 +1,14 @@ - setup_suite() { - sleep 0 + export FHEM_CFG_FILE="${FHEM_DIR}/fhem.cfg" + export FHEM_DIR="/opt/fhem" + mkdir -p /tmp/fhem/FHEM + cp -r /fhem/FHEM/* /tmp/fhem/FHEM/ + } teardown_suite() { sleep 0 + rm -r /tmp/fhem/FHEM } + From 82dc7a88e8def9ede68d71b1b0d2d3113b9dfe41 Mon Sep 17 00:00:00 2001 From: sidey79 <7968127+sidey79@users.noreply.github.com> Date: Sat, 30 Mar 2024 19:10:38 +0100 Subject: [PATCH 04/10] test[pidfile]: Added tests to verify pidfile behaviour --- src/tests/bats/pidfile.bats | 142 ++++++++++++++++++++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 src/tests/bats/pidfile.bats diff --git a/src/tests/bats/pidfile.bats b/src/tests/bats/pidfile.bats new file mode 100644 index 00000000..41b1fc7d --- /dev/null +++ b/src/tests/bats/pidfile.bats @@ -0,0 +1,142 @@ +#!/usr/bin/env bats + +setup() { + load '/opt/bats/test_helper/bats-support/load.bash' + load '/opt/bats/test_helper/bats-assert/load.bash' + load '/opt/bats/test_helper/bats-file/load.bash' + load '/opt/bats/test_helper/bats-mock/load.bash' + + + #export -f printfDebug + #export -f printfInfo + + + # Sometimes perl or grep does not terminate, we will clean up + #pkill tail || true + #pkill grep || true + +} + +setup_file() { + export BATS_TEST_TIMEOUT=60 + export LOG_FILE="/tmp/log" + + set -a + source /entry.sh + set +a + + wget https://raw.githubusercontent.com/heinz-otto/fhemcl/master/fhemcl.sh -O /usr/local/bin/fhemcl.sh + chmod +x /usr/local/bin/fhemcl.sh + +} +teardown_file() { + sleep 0 + rm -f /tmp/log + rm /usr/local/bin/fhemcl.sh +} + +teardown() { + # cat /opt/fhem/fhem.cfg + rm -rf /opt/fhem/* + rm -rf /usr/src/fhem # why is no cleanup in entry.sh? + + # Sometimes perl or grep does not terminate, we will clean up + pkill entry.sh || true + pkill perl || true + #pkill grep || true + + mkdir -p /fhem/FHEM + cp /tmp/fhem/FHEM/* /fhem/FHEM/ +} + + + +@test "verify setGlobal_PIDFILE default pidfile" { + export PIDFILE + + run bash -c 'setGlobal_PIDFILE ; echo $PIDFILE' + assert_output "/opt/fhem/log/fhem.pid" +} + + +@test "verify setGlobal_PIDFILE absolut pidfile" { + export PIDFILE="/run/lock/fhem.pid" + + run bash -c 'setGlobal_PIDFILE ; echo $PIDFILE' + assert_output "/run/lock/fhem.pid" +} + +@test "verify setGlobal_PIDFILE relative pidfile" { + export PIDFILE="./run/fhem.pid" + + run bash -c 'setGlobal_PIDFILE ; echo $PIDFILE' + assert_output "/opt/fhem/run/fhem.pid" +} + +### cd /opt/fhem && timeout 33 bats /code/pidfile.bats -f fhem.cfg; cat /tmp/log; ps aux ; +@test "absoulte pidfile set in fhem.cfg" { + # ContainerSetup + run bash -c 'cd $FHEM_DIR && initialContainerSetup > ${LOG_FILE}' + assert_file_exists ${FHEM_DIR}/fhem.cfg + + # Pidfile in config schreiben! + echo "attr global pidfilename /run/lock/fhem.pid" >> ${FHEM_CFG_FILE} + + # Prüfen ob PIDFILE korrekt angelegt wird + /entry.sh start &>> ${LOG_FILE} & + sleep 6 + export ENTRY_PID=$! + assert_file_contains ${FHEM_CFG_FILE} '/run/lock/fhem.pid' grep + assert_file_exists /run/lock/fhem.pid + + # Execute save via http and check confgfile + echo -e "save" | fhemcl.sh + assert_file_contains ${FHEM_CFG_FILE} '/run/lock/fhem.pid' grep # No save is executed! + + kill $ENTRY_PID # fail it the process already finished due to error! + assert_file_contains ${LOG_FILE} 'From the FHEM_GLOBALATTR environment: attr global pidfilename /run/lock/fhem.pid' grep +} + +@test "absoulte pidfile set in environment" { + # ContainerSetup + run bash -c 'cd $FHEM_DIR && initialContainerSetup > ${LOG_FILE}' + assert_file_exists ${FHEM_CFG_FILE} + + # Pidfile in ENV schreiben! + export PIDFILE=/var/run/lock/fhem.pid + + # Prüfen ob PIDFILE korrekt angelegt wird + /entry.sh start &>> ${LOG_FILE} & + sleep 6 + export ENTRY_PID=$! + + assert_file_contains ${LOG_FILE} 'From the FHEM_GLOBALATTR environment: attr global pidfilename /var/run/lock/fhem.pid' grep + assert_file_not_contains ${FHEM_CFG_FILE} 'attr global pidfilename /var/run/lock/fhem.pid' grep # pidfile should not be set in configfile + assert_file_exists /var/run/lock/fhem.pid + + # Execute save via http and check confgfile + echo -e "save" | fhemcl.sh + assert_file_contains ${FHEM_CFG_FILE} '/var/run/lock/fhem.pid' grep # No save is executed! + + kill $ENTRY_PID # fail it the process already finished due to error! +} + +@test "default pidfile " { + # ContainerSetup + run bash -c 'cd $FHEM_DIR && initialContainerSetup > ${LOG_FILE}' + assert_file_exists ${FHEM_CFG_FILE} + + unset PIDFILE + + # Prüfen ob PIDFILE korrekt angelegt ist + /entry.sh start &>> ${LOG_FILE} & + sleep 6 + export ENTRY_PID=$! + + assert_file_contains ${LOG_FILE} 'From the FHEM_GLOBALATTR environment: attr global pidfilename log/fhem.pid' + assert_file_not_contains ${FHEM_CFG_FILE} 'fhem.pid' grep # pidfile should not be set in configfile + assert_file_exists ${FHEM_DIR}/log/fhem.pid + + kill $ENTRY_PID # fail it the process already finished due to error! +} + From ecbc4f73c4567b9da5017faf3b5deb928ff80b60 Mon Sep 17 00:00:00 2001 From: sidey79 <7968127+sidey79@users.noreply.github.com> Date: Sun, 31 Mar 2024 13:26:27 +0200 Subject: [PATCH 05/10] fix[entry.sh]: Added tests and fixes for logfile handling --- src/entry.sh | 42 +++++++++++++++------------ src/tests/bats/entry.bats | 50 --------------------------------- src/tests/bats/pidfile.bats | 19 ++++++------- src/tests/bats/setup_suite.bash | 2 +- 4 files changed, 34 insertions(+), 79 deletions(-) diff --git a/src/entry.sh b/src/entry.sh index 90b965be..d4bfbb84 100755 --- a/src/entry.sh +++ b/src/entry.sh @@ -18,7 +18,7 @@ set -o pipefail # Distribute an error exit status through the whole pipe #--- Constants ------------------------------------------------------------------------------------------------------- -declare -r FHEM_DIR="/opt/fhem" +declare -r FHEM_DIR="/opt/fhem" declare -i gEnableDebug=0 @@ -27,7 +27,6 @@ declare -i gEnableDebug=0 export TZ="${TZ:-Europe/Berlin}" - #--- Environment variables, configurable from outside ---------------------------------------------------------------- declare -ri TIMEOUT_STOPPING=${TIMEOUT_STOPPING:-30} @@ -289,9 +288,9 @@ function collectDockerInfo() { # function setGlobal_LOGFILE() { local -r defaultLogfile="./log/fhem-%Y-%m-%d.log" - - + + [ -n "${LOGFILE+x}" ] && { is_absolutePath "$LOGFILE" && return; } # PIDFILE is already an absolute path, skip other modifications [ -n "${LOGFILE+x}" ] && { LOGFILE=$(prependFhemDirPath "$LOGFILE"); return; } # LOGFILE already set => use this [ "${CONFIGTYPE}" == "configDB" ] && { LOGFILE=$(prependFhemDirPath "$defaultLogfile"); return; } # config is done inside DB => default @@ -299,7 +298,9 @@ function setGlobal_LOGFILE() { [ -r "$cfgFile" ] || { LOGFILE=$(prependFhemDirPath "$defaultLogfile"); return; } # configfile not readable => default local cfgLogDef="$(getGlobalAttr "$cfgFile" "logfile" )" - [ -n "$cfgLogDef" ] && { LOGFILE=$(prependFhemDirPath "$cfgLogDef"); return; } # found something in the configfile => use this + [ -n "$cfgLogDef" ] && is_absolutePath "$cfgLogDef" && { LOGFILE=$cfgLogDef; return; } # found absolute path in the configfile => use this + [ -n "$cfgLogDef" ] && { LOGFILE=$(prependFhemDirPath "$cfgLogDef"); return; } # found something in the configfile => use this + LOGFILE=$(prependFhemDirPath "$defaultLogfile") } @@ -351,17 +352,20 @@ function setTelnet_DEFINITION() # function setLogfile_DEFINITION() { - [ "${CONFIGTYPE}" == "configDB" ] && { echo ' HINT: Make sure to have your FHEM configuration properly prepared for compatibility with this Docker Image _before_ using configDB !'; return; } # config is done inside DB => abort + + local cfgFile="$(prependFhemDirPath "${CONFIGTYPE}")" - ## Find Logfile definition - if [ -z "$(grep -P "^define Logfile FileLog" ${FHEM_DIR}/${CONFIGTYPE})" ]; then - echo "define Logfile FileLog ${LOGFILE} Logfile" >> ${FHEM_DIR}/${CONFIGTYPE} + if [ -z "$(grep -P "^define Logfile FileLog" $cfgFile)" ]; then + echo "define Logfile FileLog ${LOGFILE} Logfile" >> $cfgFile + else + local logFile=${LOGFILE#${FHEM_DIR}/} + is_absolutePath "$logFile" || logFile="./$logFile" # add ./ if not an absolute path + sed -i "s,define Logfile FileLog ./log/fhem-\S*\ Logfile$,define Logfile FileLog $logFile Logfile," $cfgFile fi - sed -i "s,define Logfile FileLog ./log/fhem-\S*\ Logfile$,define Logfile FileLog ${LOGFILE#${FHEM_DIR}/} Logfile," ${FHEM_DIR}/${CONFIGTYPE} } @@ -374,8 +378,8 @@ function setLogfile_DEFINITION() function setGlobal_PIDFILE() { local -r defaultPidfile="./log/fhem.pid" - [ -n "${PIDFILE+x}" ] && { is_absolutePath "$PIDFILE" && return; } # PIDFILE is already an absolute path, skip other modifications - [ -n "${PIDFILE+x}" ] && { PIDFILE=$(prependFhemDirPath "$PIDFILE"); return; } # PIDFILE already set => use this + [ -n "${PIDFILE+x}" ] && { is_absolutePath "$PIDFILE" && return; } # PIDFILE is already an absolute path, skip other modifications + [ -n "${PIDFILE+x}" ] && { PIDFILE=$(prependFhemDirPath "$PIDFILE"); return; } # PIDFILE already set => use this [ "${CONFIGTYPE}" == "configDB" ] && { PIDFILE=$(prependFhemDirPath "$defaultPidfile"); return; } # config is done inside DB => default local cfgFile="$(prependFhemDirPath "${CONFIGTYPE}")" @@ -383,7 +387,7 @@ function setGlobal_PIDFILE() { # Todo: Absolute pidfilename check! local cfgPidDef="$(getGlobalAttr "$cfgFile" "pidfilename" )" - [ -n "$cfgPidDef" ] && { PIDFILE=$(prependFhemDirPath "$cfgPidDef"); return; } # found something in the configfile => use this + [ -n "$cfgPidDef" ] && { PIDFILE=$(prependFhemDirPath "$cfgPidDef"); return; } # found something in the configfile => use this PIDFILE=$(prependFhemDirPath "$defaultPidfile") } @@ -507,9 +511,6 @@ function fhemCleanInstall() { getGlobalAttr "${FHEM_DIR}/fhem.cfg" "commandref" >/dev/null || echo "attr global commandref modular" >> ${FHEM_DIR}/fhem.cfg getGlobalAttr "${FHEM_DIR}/fhem.cfg" "mseclog" >/dev/null || echo "attr global mseclog 1" >> ${FHEM_DIR}/fhem.cfg - printfInfo " Patching fhem.cfg Logfile configuration\n" - setTelnet_DEFINITION - printfInfo " Adding pre-defined devices to fhem.cfg\n" cat >> $fhemCfgFile <<- END_OF_INLINE @@ -575,7 +576,7 @@ function fhemUpdateInstall() { # Global vars: FHEM_DIR # function initialContainerSetup() { - [ -d "/fhem" ] || return # /fhem signals that the container is brand new. It holds the default installation that is moved later. + [ -d "/fhem" ] || { setGlobal_LOGFILE; return; } # /fhem signals that the container is brand new. It holds the default installation that is moved later. local -i isFhemCleanInstall [ -s "${FHEM_DIR}/fhem.pl" ] && isFhemCleanInstall=0 || isFhemCleanInstall=1 @@ -592,6 +593,10 @@ function initialContainerSetup() { fhemCleanInstall fi + printfInfo " Patching fhem.cfg Logfile configuration\n" + setGlobal_LOGFILE + setLogfile_DEFINITION + runScript "/post-init.sh" runScript "/docker/post-init.sh" @@ -977,6 +982,7 @@ if [ "$#" -eq 1 ] && [ "$1" = "start" ]; then collectDockerInfo + initialContainerSetup if [ ! -s "${FHEM_DIR}/fhem.pl" ]; then printfErr "Fatal: Unable to find FHEM installation in ${FHEM_DIR}/fhem.pl\n" @@ -986,7 +992,7 @@ if [ "$#" -eq 1 ] && [ "$1" = "start" ]; then # used by other maintenance scripts (can we get rid of that?) [ ! -f /image_info.EMPTY ] && touch /image_info.EMPTY - setGlobal_LOGFILE + setGlobal_PIDFILE prepareFhemUser diff --git a/src/tests/bats/entry.bats b/src/tests/bats/entry.bats index 1d0179ba..8b6655bd 100644 --- a/src/tests/bats/entry.bats +++ b/src/tests/bats/entry.bats @@ -66,56 +66,6 @@ teardown() { } -@test "check getGlobalAttr()" { - bats_require_minimum_version 1.5.0 - - fhemCleanInstall - - run ! getGlobalAttr /tmp/test.cfg "logfile" - run fhemCleanInstall - - assert_file_exists /opt/fhem/fhem.cfg - run ! getGlobalAttr /opt/fhem/fhem.cfg "some" - run -0 getGlobalAttr /opt/fhem/fhem.cfg "logfile" - - assert_file_contains /opt/fhem/fhem.cfg "attr global logfile" - run -0 getGlobalAttr /opt/fhem/fhem.cfg "logfile" - -} - - -@test "check setGlobal_LOGFILE from default" { - - run bash -c 'unset LOGFILE && setGlobal_LOGFILE && echo $LOGFILE' - assert_output "/opt/fhem/log/fhem-%Y-%m-%d.log" -} - -@test "check setGlobal_LOGFILE from fhem.cfg" { - run fhemCleanInstall - - assert_file_exists /opt/fhem/fhem.cfg - assert_file_contains /opt/fhem/fhem.cfg "define Logfile FileLog ./log/fhem-%Y-%m.log Logfile" - assert_file_contains /opt/fhem/fhem.cfg "define DockerImageInfo DockerImageInfo" - assert_file_contains /opt/fhem/fhem.cfg "attr global logfile ./log/fhem-%Y-%m.log" - - export CONFIGTYPE="fhem.cfg" - - run bash -c 'unset LOGFILE && setGlobal_LOGFILE && echo $LOGFILE;' - assert_output "${FHEM_DIR}/log/fhem-%Y-%m.log" -} - -@test "check Logfile definition from fhem.cfg" { - export CONFIGTYPE="fhem.cfg" - - run setGlobal_LOGFILE - run fhemCleanInstall - run setLogfile_DEFINITION - - assert_file_exists /opt/fhem/fhem.cfg - assert_file_contains /opt/fhem/fhem.cfg "define Logfile FileLog ./log/fhem-%Y-%m-%d.log Logfile" -} - - @test "check fhemUpdateInstall()" { export FHEM_DIR=${BATS_TEST_TMPDIR}"/fhemUpdateInstall" diff --git a/src/tests/bats/pidfile.bats b/src/tests/bats/pidfile.bats index 41b1fc7d..28fedb2c 100644 --- a/src/tests/bats/pidfile.bats +++ b/src/tests/bats/pidfile.bats @@ -52,13 +52,11 @@ teardown() { @test "verify setGlobal_PIDFILE default pidfile" { - export PIDFILE - run bash -c 'setGlobal_PIDFILE ; echo $PIDFILE' + run bash -c 'unset PIDFILE; setGlobal_PIDFILE ; echo $PIDFILE' assert_output "/opt/fhem/log/fhem.pid" } - @test "verify setGlobal_PIDFILE absolut pidfile" { export PIDFILE="/run/lock/fhem.pid" @@ -73,9 +71,10 @@ teardown() { assert_output "/opt/fhem/run/fhem.pid" } + ### cd /opt/fhem && timeout 33 bats /code/pidfile.bats -f fhem.cfg; cat /tmp/log; ps aux ; -@test "absoulte pidfile set in fhem.cfg" { - # ContainerSetup +@test "integration: absoulte pidfile set in fhem.cfg" { + # Container setup run bash -c 'cd $FHEM_DIR && initialContainerSetup > ${LOG_FILE}' assert_file_exists ${FHEM_DIR}/fhem.cfg @@ -97,8 +96,8 @@ teardown() { assert_file_contains ${LOG_FILE} 'From the FHEM_GLOBALATTR environment: attr global pidfilename /run/lock/fhem.pid' grep } -@test "absoulte pidfile set in environment" { - # ContainerSetup +@test "integration: absoulte pidfile set in environment" { + # Container setup run bash -c 'cd $FHEM_DIR && initialContainerSetup > ${LOG_FILE}' assert_file_exists ${FHEM_CFG_FILE} @@ -116,13 +115,13 @@ teardown() { # Execute save via http and check confgfile echo -e "save" | fhemcl.sh - assert_file_contains ${FHEM_CFG_FILE} '/var/run/lock/fhem.pid' grep # No save is executed! + assert_file_contains ${FHEM_CFG_FILE} '/var/run/lock/fhem.pid' grep # save is executed! kill $ENTRY_PID # fail it the process already finished due to error! } -@test "default pidfile " { - # ContainerSetup +@test "integration: default pidfile" { + # Container setup run bash -c 'cd $FHEM_DIR && initialContainerSetup > ${LOG_FILE}' assert_file_exists ${FHEM_CFG_FILE} diff --git a/src/tests/bats/setup_suite.bash b/src/tests/bats/setup_suite.bash index ae81c399..5a9f2b52 100644 --- a/src/tests/bats/setup_suite.bash +++ b/src/tests/bats/setup_suite.bash @@ -1,6 +1,6 @@ setup_suite() { - export FHEM_CFG_FILE="${FHEM_DIR}/fhem.cfg" export FHEM_DIR="/opt/fhem" + export FHEM_CFG_FILE="${FHEM_DIR}/fhem.cfg" mkdir -p /tmp/fhem/FHEM cp -r /fhem/FHEM/* /tmp/fhem/FHEM/ From 8ade5e7543d15019e36831652776fcc42edba5b6 Mon Sep 17 00:00:00 2001 From: sidey79 <7968127+sidey79@users.noreply.github.com> Date: Sun, 31 Mar 2024 13:41:16 +0200 Subject: [PATCH 06/10] build[dockerfile]: pin git repo version if possible --- Dockerfile-bullseye | 6 +++--- Dockerfile-threaded-bullseye | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Dockerfile-bullseye b/Dockerfile-bullseye index f60c8943..8b8f622d 100644 --- a/Dockerfile-bullseye +++ b/Dockerfile-bullseye @@ -290,15 +290,15 @@ EOF # FROM with-fhem as with-fhem-bats -ADD https://github.com/bats-core/bats-core.git /tmp/bats +ADD https://github.com/bats-core/bats-core.git#v1.10.0 /tmp/bats RUN < Date: Sun, 31 Mar 2024 13:48:51 +0200 Subject: [PATCH 07/10] fix[entry.sh]: pidfile handling and tests added --- src/entry.sh | 4 +++- src/tests/bats/entry.bats | 3 ++- src/tests/bats/pidfile.bats | 3 ++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/entry.sh b/src/entry.sh index d4bfbb84..df6c028d 100755 --- a/src/entry.sh +++ b/src/entry.sh @@ -385,9 +385,11 @@ function setGlobal_PIDFILE() { local cfgFile="$(prependFhemDirPath "${CONFIGTYPE}")" [ -r "$cfgFile" ] || { PIDFILE=$(prependFhemDirPath "$defaultPidfile"); return; } # configfile not readable => default + # Todo: Absolute pidfilename check! local cfgPidDef="$(getGlobalAttr "$cfgFile" "pidfilename" )" - [ -n "$cfgPidDef" ] && { PIDFILE=$(prependFhemDirPath "$cfgPidDef"); return; } # found something in the configfile => use this + [ -n "$cfgPidDef" ] && is_absolutePath "$cfgPidDef" && { PIDFILE=$cfgPidDef; return; } # found absolute path in the configfile => use this + [ -n "$cfgPidDef" ] && { PIDFILE=$(prependFhemDirPath "$cfgPidDef"); return; } # found something in the configfile => use this PIDFILE=$(prependFhemDirPath "$defaultPidfile") } diff --git a/src/tests/bats/entry.bats b/src/tests/bats/entry.bats index 8b6655bd..1d56edbd 100644 --- a/src/tests/bats/entry.bats +++ b/src/tests/bats/entry.bats @@ -15,7 +15,7 @@ setup() { setup_file() { export BATS_TEST_TIMEOUT=60 - export LOG_FILE="/tmp/log" + export LOG_FILE="${BATS_SUITE_TMPDIR}/log" set -a source /entry.sh @@ -25,6 +25,7 @@ setup_file() { teardown_file() { sleep 0 rm -f /tmp/log + rm -rf /opt/fhem/* } diff --git a/src/tests/bats/pidfile.bats b/src/tests/bats/pidfile.bats index 28fedb2c..f2945813 100644 --- a/src/tests/bats/pidfile.bats +++ b/src/tests/bats/pidfile.bats @@ -19,7 +19,8 @@ setup() { setup_file() { export BATS_TEST_TIMEOUT=60 - export LOG_FILE="/tmp/log" + export LOG_FILE="${BATS_SUITE_TMPDIR}/log" + export CONFIGTYPE="fhem.cfg" set -a source /entry.sh From c709cab4da75ad9cdcb5c0df5a51cf764a68204b Mon Sep 17 00:00:00 2001 From: sidey79 <7968127+sidey79@users.noreply.github.com> Date: Mon, 1 Apr 2024 01:21:57 +0200 Subject: [PATCH 08/10] tests: cleanup, after test and optimized --- src/tests/bats/aptInstall.bats | 90 ++++++++++++++ src/tests/bats/entry.bats | 19 --- src/tests/bats/health-check.bats | 26 +++-- src/tests/bats/logfile.bats | 193 +++++++++++++++++++++++++++++++ src/tests/bats/setup_suite.bash | 2 +- 5 files changed, 303 insertions(+), 27 deletions(-) create mode 100644 src/tests/bats/aptInstall.bats create mode 100644 src/tests/bats/logfile.bats diff --git a/src/tests/bats/aptInstall.bats b/src/tests/bats/aptInstall.bats new file mode 100644 index 00000000..3bd478b7 --- /dev/null +++ b/src/tests/bats/aptInstall.bats @@ -0,0 +1,90 @@ + +#!/usr/bin/env bats + +setup() { + load '/opt/bats/test_helper/bats-support/load.bash' + load '/opt/bats/test_helper/bats-assert/load.bash' + load '/opt/bats/test_helper/bats-file/load.bash' + load '/opt/bats/test_helper/bats-mock/load.bash' +} + + +setup_file() { + export BATS_TEST_TIMEOUT=60 + export LOG_FILE="${BATS_SUITE_TMPDIR}/log" + + set -a + source /entry.sh + set +a +} + +teardown_file() { + sleep 0 +} + + + +teardown() { + DEBIAN_FRONTEND=noninteractive apt-get remove dummydroid -y && apt-get autoremove -y # cleanup +} + + +@test "check aptInstall() new package" { + bats_require_minimum_version 1.5.0 + + gAptUpdateHasRun=0 + local installLog=${BATS_TEST_TMPDIR}/aptInstall.log + run -0 aptInstall "test message" ${installLog} dummydroid + + cat ${installLog} + assert_file_contains ${installLog} "Get:" grep + assert_file_contains ${installLog} "Fetched " grep + assert_file_contains ${installLog} "Setting up dummydroid" grep + assert_output --partial "test message" + +} + +@test "check aptInstall() already installed package" { + bats_require_minimum_version 1.5.0 + + gAptUpdateHasRun=0 + local installLog=${BATS_TEST_TMPDIR}/aptInstall.log + run -0 aptInstall "test message2" ${installLog} grep + cat ${installLog} + assert_file_contains ${installLog} "grep is already the newest version" grep + assert_output --partial "test message2" +} + +@test "check aptInstall() twice executed" { + bats_require_minimum_version 1.5.0 + + # remove package lists + rm -rf /var/lib/apt/lists/* + + # First Update + gAptUpdateHasRun=0 + export gAptUpdateHasRun + local installLog=${BATS_TEST_TMPDIR}/aptInstall.log + run -0 aptInstall "test message2" ${installLog} dummydroid + cat ${installLog} + assert_file_contains ${installLog} "Get:" grep # Packagelist is downloaded + assert_file_not_contains ${installLog} "Hit:" grep + + # Second Update + gAptUpdateHasRun=0 + export gAptUpdateHasRun + local installLog=${BATS_TEST_TMPDIR}/aptInstall2.log + run -0 aptInstall "test message3" ${installLog} dummydroid + assert_file_contains ${installLog} "Hit:" grep # Packagelist was already there + assert_file_not_contains ${installLog} "Get:" grep + assert_output --partial "test message3" + + # Update is skipped + gAptUpdateHasRun=1 + export gAptUpdateHasRun + local installLog=${BATS_TEST_TMPDIR}/aptInstall3.log + run -0 aptInstall "test message4" ${installLog} dummydroid + assert_file_not_contains ${installLog} "Hit:" grep # no update command was run + assert_file_not_contains ${installLog} "Get:" grep # no update command was run + assert_output --partial "test message4" +} \ No newline at end of file diff --git a/src/tests/bats/entry.bats b/src/tests/bats/entry.bats index 1d56edbd..ab14d0e8 100644 --- a/src/tests/bats/entry.bats +++ b/src/tests/bats/entry.bats @@ -134,25 +134,6 @@ teardown() { } -@test "check aptInstall()" { - bats_require_minimum_version 1.5.0 - - export -f aptInstall - export gAptUpdateHasRun=0 - - run -0 aptInstall "test message" /tmp/aptInstall.log grep - - assert_file_contains /tmp/aptInstall.log Get: - assert_file_contains /tmp/aptInstall.log update - assert_file_contains /tmp/aptInstall.log grep - assert_output --partial "test message" - - run -0 aptInstall "test message2" /tmp/aptInstall2.log grep - assert_file_not_contains /tmp/aptInstall2.log Get: - assert_output --partial "test message2" -} - - @test "verify is_absolutePath" { bats_require_minimum_version 1.5.0 diff --git a/src/tests/bats/health-check.bats b/src/tests/bats/health-check.bats index 97fa9b25..5beb9759 100644 --- a/src/tests/bats/health-check.bats +++ b/src/tests/bats/health-check.bats @@ -8,16 +8,25 @@ setup() { load '/opt/bats/test_helper/bats-mock/load.bash' } +setup_file() { + export LOG_FILE="${BATS_SUITE_TMPDIR}/log" +} + +teardown_file() { + mkdir -p /fhem/FHEM + cp /tmp/fhem/FHEM/* /fhem/FHEM/ +} + teardown() { - rm -rf /opt/fhem/* + rm -rf ${FHEM_DIR}/* + rm -rf /usr/src/fhem # why is no cleanup in entry.sh? # Sometimes perl or grep does not terminate, we will clean up + pkill entry.sh || true pkill perl || true - pkill grep || true } - @test "healthcheck without url file" { bats_require_minimum_version 1.5.0 @@ -36,16 +45,19 @@ teardown() { rm -r /tmp/health-check.urls } +# bats test_tags=unitTest @test "healthcheck with running fhem" { bats_require_minimum_version 1.5.0 - run /entry.sh start > /dev/null 2> /dev/null & - sleep 5 + cd ${FHEM_DIR} && /entry.sh start &> ${LOG_FILE} & + export ENTRY_PID=$! + sleep 6 + while ! nc -vz localhost 8083 > /dev/null 2>&1 ; do # echo sleeping sleep 0.5 - ((c++)) && ((c==50)) && echo "#fhem did not start" && break + ((c++)) && ((c==50)) && echo "# fhem did not start" && break done sleep 5 assert_file_contains /tmp/health-check.urls "http://localhost:8083" @@ -54,5 +66,5 @@ teardown() { assert_output --partial "http://localhost:8083/fhem/" assert_output --partial "OK" - pkill entry.sh + kill $ENTRY_PID # fail it the process already finished due to error! } \ No newline at end of file diff --git a/src/tests/bats/logfile.bats b/src/tests/bats/logfile.bats new file mode 100644 index 00000000..c9af0cd7 --- /dev/null +++ b/src/tests/bats/logfile.bats @@ -0,0 +1,193 @@ +#!/usr/bin/env bats + +setup() { + load '/opt/bats/test_helper/bats-support/load.bash' + load '/opt/bats/test_helper/bats-assert/load.bash' + load '/opt/bats/test_helper/bats-file/load.bash' + load '/opt/bats/test_helper/bats-mock/load.bash' +} + +setup_file() { + export BATS_TEST_TIMEOUT=60 + export LOG_FILE="${BATS_SUITE_TMPDIR}/log" + export CONFIGTYPE="fhem.cfg" + + set -a + source /entry.sh + set +a + + wget https://raw.githubusercontent.com/heinz-otto/fhemcl/master/fhemcl.sh -O /usr/local/bin/fhemcl.sh + chmod +x /usr/local/bin/fhemcl.sh + +} +teardown_file() { + sleep 0 + rm -f /tmp/log + rm /usr/local/bin/fhemcl.sh +} + +teardown() { + # cat /opt/fhem/fhem.cfg + rm -rf ${FHEM_DIR}/* + rm -rf /usr/src/fhem # why is no cleanup in entry.sh? + + # Sometimes perl or grep does not terminate, we will clean up + pkill entry.sh || true + pkill perl || true + + mkdir -p /fhem/FHEM + cp /tmp/fhem/FHEM/* /fhem/FHEM/ +} + + +# bats test_tags=unitTest +@test "check getGlobalAttr()" { + bats_require_minimum_version 1.5.0 + + run ! getGlobalAttr /tmp/test.cfg "logfile" + assert_file_not_exists ${FHEM_DIR}/fhem.cfg + + run fhemCleanInstall + + assert_file_exists ${FHEM_DIR}/fhem.cfg + run ! getGlobalAttr ${FHEM_DIR}/fhem.cfg "some" + cat ${FHEM_DIR}/fhem.cfg > ${LOG_FILE} + run -0 getGlobalAttr ${FHEM_DIR}/fhem.cfg "logfile" + + assert_file_contains ${FHEM_DIR}/fhem.cfg "attr global logfile" + run -0 getGlobalAttr ${FHEM_DIR}/fhem.cfg "logfile" +} + +# bats test_tags=unitTest +@test "check setGlobal_LOGFILE from default" { + + run bash -c 'unset LOGFILE && setGlobal_LOGFILE && echo $LOGFILE' + assert_output "${FHEM_DIR}/log/fhem-%Y-%m-%d.log" +} + + +# bats test_tags=unitTest +@test "check setGlobal_LOGFILE from fhem.cfg" { + export LOGFILE= + + fhemCleanInstall + assert_file_exists ${FHEM_DIR}/fhem.cfg + assert_file_contains ${FHEM_DIR}/fhem.cfg "attr global logfile ./log/fhem-%Y-%m.log" + + unset LOGFILE + setGlobal_LOGFILE + run echo $LOGFILE + assert_output "${FHEM_DIR}/log/fhem-%Y-%m.log" + + mkdir -p "/fhem" + run bash -c 'initialContainerSetup && echo $LOGFILE' + assert_output --partial "${FHEM_DIR}/log/fhem-%Y-%m.log" + + assert_file_exists ${FHEM_DIR}/fhem.cfg + cat ${FHEM_DIR}/fhem.cfg + assert_file_contains ${FHEM_DIR}/fhem.cfg "define Logfile FileLog ./log/fhem-%Y-%m.log Logfile" grep +} + + +# bats test_tags=unitTest +@test "check setGlobal_LOGFILE from environment" { + export LOGFILE="/opt/log/fhem-%Y-%m-%d.log" + + run bash -c 'setGlobal_LOGFILE && echo $LOGFILE' + assert_output "/opt/log/fhem-%Y-%m-%d.log" +} + + +# bats test_tags=unitTest +@test "check Logfile definition from fhem.cfg" { + run setGlobal_LOGFILE + run fhemCleanInstall + + assert_file_exists ${FHEM_DIR}/fhem.cfg + assert_file_contains ${FHEM_DIR}/fhem.cfg "define Logfile FileLog ./log/fhem-%Y-%m.log Logfile" +} + + +# bats test_tags=integrationTest +@test "integration: default LOGFILE" { + unset LOGFILE + local logfile_FMT="./log/fhem-%Y-%m.log" + + # Container setup + run bash -c 'cd $FHEM_DIR && initialContainerSetup > ${LOG_FILE}' + assert_file_exists ${FHEM_CFG_FILE} + + # Prüfen ob LOGFILE korrekt angelegt wird + /entry.sh start &>> ${LOG_FILE} & + sleep 6 + export ENTRY_PID=$! + local realLogFile="$( date +"$logfile_FMT")" + + #cat ${LOG_FILE} + assert_file_contains ${LOG_FILE} "From the FHEM_GLOBALATTR environment: attr global logfile ${logfile_FMT#./}" grep + assert_file_exists "${FHEM_DIR}/$realLogFile" + assert_file_contains ${FHEM_CFG_FILE} "$logfile_FMT" grep # logfile should be set in configfile because it's per default + + kill $ENTRY_PID # fail it the process already finished due to error! +} + +# bats test_tags=integrationTest +@test "integration: environment set LOGFILE relative" { + export LOGFILE="log/fhem-%Y-%m-%d.log" + local logfile_FMT="log/fhem-%Y-%m-%d.log" + LOG_FILE="/tmp/log" + # Container setup + run bash -c 'cd $FHEM_DIR && initialContainerSetup > ${LOG_FILE}' + cat ${LOG_FILE} + + assert_file_exists ${FHEM_CFG_FILE} + + # Prüfen ob LOGFILE korrekt angelegt wird + /entry.sh start &>> ${LOG_FILE} & + sleep 6 + export ENTRY_PID=$! + local realLogFile="$( date +"$logfile_FMT")" + + assert_file_contains ${LOG_FILE} "From the FHEM_GLOBALATTR environment: attr global logfile $logfile_FMT" grep + assert_file_exists "${FHEM_DIR}/$realLogFile" + assert_file_not_contains ${FHEM_CFG_FILE} "attr global logfile ./$logfile_FMT" grep # attr logfile should not be updated in configfile + assert_file_contains ${FHEM_CFG_FILE} "define Logfile FileLog ./$logfile_FMT" grep # FileLog should be set by ENV Variable + #cat ${FHEM_CFG_FILE} 3>& + # Execute save via http and check confgfile + echo -e "save" | fhemcl.sh + cat ${FHEM_CFG_FILE} + + assert_file_contains ${FHEM_CFG_FILE} "attr global logfile $logfile_FMT" grep # save is executed! + assert_file_contains ${FHEM_CFG_FILE} "define Logfile FileLog ./$logfile_FMT" grep # save is executed! + + kill $ENTRY_PID # fail it the process already finished due to error! +} + +# bats test_tags=integrationTest +@test "integration: environment set LOGFILE absolute" { + export LOGFILE="/opt/log/fhem-%Y-%m-%d.log" + local logfile_FMT="/opt/log/fhem-%Y-%m-%d.log" + export LOG_FILE=${LOG_FILE:-/tmp/log} + # Container setup + run bash -c 'cd $FHEM_DIR && initialContainerSetup > ${LOG_FILE}' + assert_file_exists ${FHEM_CFG_FILE} + + # Prüfen ob LOGFILE korrekt angelegt wird + /entry.sh start &>> ${LOG_FILE} & + export ENTRY_PID=$! + sleep 6 + local realLogFile="$( date +"$logfile_FMT")" + + assert_file_contains ${LOG_FILE} "From the FHEM_GLOBALATTR environment: attr global logfile $logfile_FMT" grep + assert_file_exists "$realLogFile" + assert_file_not_contains ${FHEM_CFG_FILE} "attr global logfile $logfile_FMT" grep # attr logfile should not be updated in configfile + assert_file_contains ${FHEM_CFG_FILE} "define Logfile FileLog $logfile_FMT" grep # FileLog should be set by ENV Variable + #cat ${FHEM_CFG_FILE} 3>& + # Execute save via http and check confgfile + echo -e "save" | fhemcl.sh + cat ${FHEM_CFG_FILE} + assert_file_contains ${FHEM_CFG_FILE} "attr global logfile $logfile_FMT" grep # save is executed! + assert_file_contains ${FHEM_CFG_FILE} "define Logfile FileLog $logfile_FMT" grep # save is executed! + + kill $ENTRY_PID # fail it the process already finished due to error! +} diff --git a/src/tests/bats/setup_suite.bash b/src/tests/bats/setup_suite.bash index 5a9f2b52..2b0da9a8 100644 --- a/src/tests/bats/setup_suite.bash +++ b/src/tests/bats/setup_suite.bash @@ -9,6 +9,6 @@ setup_suite() { teardown_suite() { sleep 0 - rm -r /tmp/fhem/FHEM + rm -r /tmp/fhem } From b4e931e5fdbf839b6be3f27d303434a6754d27d5 Mon Sep 17 00:00:00 2001 From: sidey79 <7968127+sidey79@users.noreply.github.com> Date: Mon, 1 Apr 2024 02:10:21 +0200 Subject: [PATCH 09/10] tests[pidfile.bats]: test new option to wait for server is started --- src/tests/bats/logfile.bats | 6 +++--- src/tests/bats/pidfile.bats | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/tests/bats/logfile.bats b/src/tests/bats/logfile.bats index c9af0cd7..6f6c9094 100644 --- a/src/tests/bats/logfile.bats +++ b/src/tests/bats/logfile.bats @@ -119,8 +119,8 @@ teardown() { # Prüfen ob LOGFILE korrekt angelegt wird /entry.sh start &>> ${LOG_FILE} & - sleep 6 export ENTRY_PID=$! + waitForTextInFile ${LOG_FILE} "Server started" 15 # wait max 15 seconds local realLogFile="$( date +"$logfile_FMT")" #cat ${LOG_FILE} @@ -144,8 +144,8 @@ teardown() { # Prüfen ob LOGFILE korrekt angelegt wird /entry.sh start &>> ${LOG_FILE} & - sleep 6 export ENTRY_PID=$! + waitForTextInFile ${LOG_FILE} "Server started" 15 # wait max 15 seconds local realLogFile="$( date +"$logfile_FMT")" assert_file_contains ${LOG_FILE} "From the FHEM_GLOBALATTR environment: attr global logfile $logfile_FMT" grep @@ -175,7 +175,7 @@ teardown() { # Prüfen ob LOGFILE korrekt angelegt wird /entry.sh start &>> ${LOG_FILE} & export ENTRY_PID=$! - sleep 6 + waitForTextInFile ${LOG_FILE} "Server started" 15 # wait max 15 seconds local realLogFile="$( date +"$logfile_FMT")" assert_file_contains ${LOG_FILE} "From the FHEM_GLOBALATTR environment: attr global logfile $logfile_FMT" grep diff --git a/src/tests/bats/pidfile.bats b/src/tests/bats/pidfile.bats index f2945813..e55e087f 100644 --- a/src/tests/bats/pidfile.bats +++ b/src/tests/bats/pidfile.bats @@ -84,7 +84,7 @@ teardown() { # Prüfen ob PIDFILE korrekt angelegt wird /entry.sh start &>> ${LOG_FILE} & - sleep 6 + waitForTextInFile ${LOG_FILE} "Server started" 15 # wait max 15 seconds export ENTRY_PID=$! assert_file_contains ${FHEM_CFG_FILE} '/run/lock/fhem.pid' grep assert_file_exists /run/lock/fhem.pid @@ -107,9 +107,9 @@ teardown() { # Prüfen ob PIDFILE korrekt angelegt wird /entry.sh start &>> ${LOG_FILE} & - sleep 6 export ENTRY_PID=$! - + waitForTextInFile ${LOG_FILE} "Server started" 15 # wait max 15 seconds + assert_file_contains ${LOG_FILE} 'From the FHEM_GLOBALATTR environment: attr global pidfilename /var/run/lock/fhem.pid' grep assert_file_not_contains ${FHEM_CFG_FILE} 'attr global pidfilename /var/run/lock/fhem.pid' grep # pidfile should not be set in configfile assert_file_exists /var/run/lock/fhem.pid @@ -130,7 +130,7 @@ teardown() { # Prüfen ob PIDFILE korrekt angelegt ist /entry.sh start &>> ${LOG_FILE} & - sleep 6 + waitForTextInFile ${LOG_FILE} "Server started" 15 # wait max 15 seconds export ENTRY_PID=$! assert_file_contains ${LOG_FILE} 'From the FHEM_GLOBALATTR environment: attr global pidfilename log/fhem.pid' From 16f7facf51d708ce6aeccdaec4209136d8462280 Mon Sep 17 00:00:00 2001 From: sidey79 <7968127+sidey79@users.noreply.github.com> Date: Mon, 1 Apr 2024 02:58:41 +0200 Subject: [PATCH 10/10] test: added test tags --- src/tests/bats/aptInstall.bats | 4 +++- src/tests/bats/entry.bats | 11 ++++++++--- src/tests/bats/health-check.bats | 5 +++-- src/tests/bats/pidfile.bats | 8 ++++++-- 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/tests/bats/aptInstall.bats b/src/tests/bats/aptInstall.bats index 3bd478b7..3ea47432 100644 --- a/src/tests/bats/aptInstall.bats +++ b/src/tests/bats/aptInstall.bats @@ -28,7 +28,7 @@ teardown() { DEBIAN_FRONTEND=noninteractive apt-get remove dummydroid -y && apt-get autoremove -y # cleanup } - +# bats test_tags=integrationTest @test "check aptInstall() new package" { bats_require_minimum_version 1.5.0 @@ -44,6 +44,7 @@ teardown() { } +# bats test_tags=integrationTest @test "check aptInstall() already installed package" { bats_require_minimum_version 1.5.0 @@ -55,6 +56,7 @@ teardown() { assert_output --partial "test message2" } +# bats test_tags=integrationTest @test "check aptInstall() twice executed" { bats_require_minimum_version 1.5.0 diff --git a/src/tests/bats/entry.bats b/src/tests/bats/entry.bats index ab14d0e8..8425be5f 100644 --- a/src/tests/bats/entry.bats +++ b/src/tests/bats/entry.bats @@ -40,18 +40,20 @@ teardown() { } - +# bats test_tags=unitTest @test "printf info tests" { run printfInfo 'test output' assert_output 'INFO: test output' } +# bats test_tags=unitTest @test "printf debug tests" { declare -i gEnableDebug=1 run printfDebug 'test output' assert_output 'DEBUG: bats_merge_stdout_and_stderr: test output' } +# bats test_tags=unitTest @test "check prependFhemDirPath()" { run bash -c 'OUT=$(prependFhemDirPath "") ; echo $OUT' @@ -67,7 +69,7 @@ teardown() { } - +# bats test_tags=unitTest @test "check fhemUpdateInstall()" { export FHEM_DIR=${BATS_TEST_TMPDIR}"/fhemUpdateInstall" mkdir -p ${FHEM_DIR}/FHEM @@ -80,6 +82,7 @@ teardown() { #rm -r ${FHEM_DIR} } +# bats test_tags=unitTest @test "ceck tailFileToConsoleStop() Logfile monitoring" { # mock some functions LOGFILE="fhem-%Y-%m-%d.log" @@ -95,6 +98,7 @@ teardown() { echo $gCurrentTailPid | assert_output "" } +# bats test_tags=unitTest @test "ceck tailFileToConsoleStart() Logfile monitoring" { # mock some functions function getFhemPidNum() { @@ -121,7 +125,7 @@ teardown() { refute_output "hello" } - +# bats test_tags=integrationTest @test "Setup clean install FHEM" { run fhemCleanInstall @@ -134,6 +138,7 @@ teardown() { } +# bats test_tags=unitTest @test "verify is_absolutePath" { bats_require_minimum_version 1.5.0 diff --git a/src/tests/bats/health-check.bats b/src/tests/bats/health-check.bats index 5beb9759..6b12b2ad 100644 --- a/src/tests/bats/health-check.bats +++ b/src/tests/bats/health-check.bats @@ -26,7 +26,7 @@ teardown() { pkill perl || true } - +# bats test_tags=unitTest @test "healthcheck without url file" { bats_require_minimum_version 1.5.0 @@ -34,6 +34,7 @@ teardown() { assert_output --partial "Cannot read url file" } +# bats test_tags=unitTest @test "healthcheck without running fhem" { bats_require_minimum_version 1.5.0 @@ -45,7 +46,7 @@ teardown() { rm -r /tmp/health-check.urls } -# bats test_tags=unitTest +# bats test_tags=integrationTest @test "healthcheck with running fhem" { bats_require_minimum_version 1.5.0 diff --git a/src/tests/bats/pidfile.bats b/src/tests/bats/pidfile.bats index e55e087f..687cdfe2 100644 --- a/src/tests/bats/pidfile.bats +++ b/src/tests/bats/pidfile.bats @@ -51,13 +51,14 @@ teardown() { } - +# bats test_tags=unitTest @test "verify setGlobal_PIDFILE default pidfile" { run bash -c 'unset PIDFILE; setGlobal_PIDFILE ; echo $PIDFILE' assert_output "/opt/fhem/log/fhem.pid" } +# bats test_tags=unitTest @test "verify setGlobal_PIDFILE absolut pidfile" { export PIDFILE="/run/lock/fhem.pid" @@ -65,6 +66,7 @@ teardown() { assert_output "/run/lock/fhem.pid" } +# bats test_tags=unitTest @test "verify setGlobal_PIDFILE relative pidfile" { export PIDFILE="./run/fhem.pid" @@ -73,7 +75,7 @@ teardown() { } -### cd /opt/fhem && timeout 33 bats /code/pidfile.bats -f fhem.cfg; cat /tmp/log; ps aux ; +# bats test_tags=integrationTest @test "integration: absoulte pidfile set in fhem.cfg" { # Container setup run bash -c 'cd $FHEM_DIR && initialContainerSetup > ${LOG_FILE}' @@ -97,6 +99,7 @@ teardown() { assert_file_contains ${LOG_FILE} 'From the FHEM_GLOBALATTR environment: attr global pidfilename /run/lock/fhem.pid' grep } +# bats test_tags=integrationTest @test "integration: absoulte pidfile set in environment" { # Container setup run bash -c 'cd $FHEM_DIR && initialContainerSetup > ${LOG_FILE}' @@ -121,6 +124,7 @@ teardown() { kill $ENTRY_PID # fail it the process already finished due to error! } +# bats test_tags=integrationTest @test "integration: default pidfile" { # Container setup run bash -c 'cd $FHEM_DIR && initialContainerSetup > ${LOG_FILE}'