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 < 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,15 +378,18 @@ 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}")" [ -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") } @@ -488,10 +495,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/ @@ -506,9 +513,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 @@ -574,7 +578,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 @@ -591,6 +595,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" @@ -976,6 +984,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" @@ -985,7 +994,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/aptInstall.bats b/src/tests/bats/aptInstall.bats new file mode 100644 index 00000000..3ea47432 --- /dev/null +++ b/src/tests/bats/aptInstall.bats @@ -0,0 +1,92 @@ + +#!/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 +} + +# bats test_tags=integrationTest +@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" + +} + +# bats test_tags=integrationTest +@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" +} + +# bats test_tags=integrationTest +@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 659554bb..8425be5f 100644 --- a/src/tests/bats/entry.bats +++ b/src/tests/bats/entry.bats @@ -7,34 +7,54 @@ 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="${BATS_SUITE_TMPDIR}/log" + + set -a + source /entry.sh + set +a +} + +teardown_file() { + sleep 0 + rm -f /tmp/log + rm -rf /opt/fhem/* +} + + + 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/ } + +# 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()" { - export FHEM_DIR="/opt/fhem" - export -f prependFhemDirPath run bash -c 'OUT=$(prependFhemDirPath "") ; echo $OUT' assert_output "/opt/fhem" @@ -49,73 +69,9 @@ teardown() { } -@test "check getGlobalAttr()" { - bats_require_minimum_version 1.5.0 - - export FHEM_DIR="/opt/fhem" - export -f getGlobalAttr - - 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" { - - 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 - 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" - 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 - 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" -} - - - +# bats test_tags=unitTest @test "check fhemUpdateInstall()" { - export FHEM_DIR="/tmp/fhem" + export FHEM_DIR=${BATS_TEST_TMPDIR}"/fhemUpdateInstall" mkdir -p ${FHEM_DIR}/FHEM run fhemUpdateInstall @@ -123,9 +79,10 @@ 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} } +# bats test_tags=unitTest @test "ceck tailFileToConsoleStop() Logfile monitoring" { # mock some functions LOGFILE="fhem-%Y-%m-%d.log" @@ -135,16 +92,13 @@ teardown() { echo "1" } - export -f tailFileToConsoleStart - export -f tailFileToConsoleStop - export -f getFhemPidNum - tailFileToConsoleStart ${realLogFile} -b run tailFileToConsoleStop echo $gCurrentTailPid | assert_output "" } +# bats test_tags=unitTest @test "ceck tailFileToConsoleStart() Logfile monitoring" { # mock some functions function getFhemPidNum() { @@ -152,11 +106,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 "" @@ -171,43 +125,20 @@ teardown() { refute_output "hello" } - -@test "verify before clean install FHEM" { - assert_file_exists /fhem/FHEM/99_DockerImageInfo.pm - assert_not_exists /opt/fhem/fhem.pl -} - +# bats test_tags=integrationTest @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 } -@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" -} - - +# bats test_tags=unitTest @test "verify is_absolutePath" { bats_require_minimum_version 1.5.0 @@ -220,42 +151,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" { - #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/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" -} diff --git a/src/tests/bats/health-check.bats b/src/tests/bats/health-check.bats index 97fa9b25..6b12b2ad 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 } - - +# bats test_tags=unitTest @test "healthcheck without url file" { bats_require_minimum_version 1.5.0 @@ -25,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 @@ -36,16 +46,19 @@ teardown() { rm -r /tmp/health-check.urls } +# bats test_tags=integrationTest @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 +67,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..6f6c9094 --- /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} & + export ENTRY_PID=$! + waitForTextInFile ${LOG_FILE} "Server started" 15 # wait max 15 seconds + 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} & + 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 + 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=$! + 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 + 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/pidfile.bats b/src/tests/bats/pidfile.bats new file mode 100644 index 00000000..687cdfe2 --- /dev/null +++ b/src/tests/bats/pidfile.bats @@ -0,0 +1,146 @@ +#!/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="${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 /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/ +} + + +# 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" + + run bash -c 'setGlobal_PIDFILE ; echo $PIDFILE' + assert_output "/run/lock/fhem.pid" +} + +# bats test_tags=unitTest +@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" +} + + +# bats test_tags=integrationTest +@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 + + # 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} & + 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 + + # 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 +} + +# bats test_tags=integrationTest +@test "integration: absoulte pidfile set in environment" { + # Container setup + 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} & + 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 + + # Execute save via http and check confgfile + echo -e "save" | fhemcl.sh + 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! +} + +# bats test_tags=integrationTest +@test "integration: default pidfile" { + # Container setup + 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} & + 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' + 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! +} + diff --git a/src/tests/bats/setup_suite.bash b/src/tests/bats/setup_suite.bash index 18ceecb0..2b0da9a8 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_DIR="/opt/fhem" + export FHEM_CFG_FILE="${FHEM_DIR}/fhem.cfg" + mkdir -p /tmp/fhem/FHEM + cp -r /fhem/FHEM/* /tmp/fhem/FHEM/ + } teardown_suite() { sleep 0 + rm -r /tmp/fhem } +