Blame src/journal.sh

Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
#
Packit bbb0ff
#   Name: journal.sh - part of the BeakerLib project
Packit bbb0ff
#   Description: Journalling functionality
Packit bbb0ff
#
Packit bbb0ff
#   Author: Petr Muller <pmuller@redhat.com>
Packit bbb0ff
#   Author: Jan Hutar <jhutar@redhat.com>
Packit bbb0ff
#   Author: Ales Zelinka <azelinka@redhat.com>
Packit bbb0ff
#   Author: Petr Splichal <psplicha@redhat.com>
Packit bbb0ff
#
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
#
Packit bbb0ff
#   Copyright (c) 2008-2010 Red Hat, Inc. All rights reserved.
Packit bbb0ff
#
Packit bbb0ff
#   This copyrighted material is made available to anyone wishing
Packit bbb0ff
#   to use, modify, copy, or redistribute it subject to the terms
Packit bbb0ff
#   and conditions of the GNU General Public License version 2.
Packit bbb0ff
#
Packit bbb0ff
#   This program is distributed in the hope that it will be
Packit bbb0ff
#   useful, but WITHOUT ANY WARRANTY; without even the implied
Packit bbb0ff
#   warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
Packit bbb0ff
#   PURPOSE. See the GNU General Public License for more details.
Packit bbb0ff
#
Packit bbb0ff
#   You should have received a copy of the GNU General Public
Packit bbb0ff
#   License along with this program; if not, write to the Free
Packit bbb0ff
#   Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Packit bbb0ff
#   Boston, MA 02110-1301, USA.
Packit bbb0ff
#
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
Packit bbb0ff
: <<'=cut'
Packit bbb0ff
=pod
Packit bbb0ff
Packit bbb0ff
=head1 NAME
Packit bbb0ff
Packit bbb0ff
BeakerLib - journal - journalling functionality
Packit bbb0ff
Packit bbb0ff
=head1 DESCRIPTION
Packit bbb0ff
Packit bbb0ff
Routines for initializing the journalling features and pretty
Packit bbb0ff
printing journal contents.
Packit bbb0ff
Packit bbb0ff
=head1 FUNCTIONS
Packit bbb0ff
Packit bbb0ff
=cut
Packit bbb0ff
Packit bbb0ff
__INTERNAL_JOURNALIST=beakerlib-journalling
Packit bbb0ff
__INTERNAL_TIMEFORMAT_TIME="%H:%M:%S"
Packit bbb0ff
__INTERNAL_TIMEFORMAT_DATE_TIME="%Y-%m-%d %H:%M:%S %Z"
Packit bbb0ff
__INTERNAL_TIMEFORMAT_SHORT="$__INTERNAL_TIMEFORMAT_TIME"
Packit bbb0ff
__INTERNAL_TIMEFORMAT_LONG="$__INTERNAL_TIMEFORMAT_DATE_TIME"
Packit bbb0ff
Packit bbb0ff
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
# rlJournalStart
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
: <<'=cut'
Packit bbb0ff
=pod
Packit bbb0ff
Packit bbb0ff
=head2 Journalling
Packit bbb0ff
Packit bbb0ff
=head3 rlJournalStart
Packit bbb0ff
Packit bbb0ff
Initialize the journal file.
Packit bbb0ff
Packit bbb0ff
    rlJournalStart
Packit bbb0ff
Packit bbb0ff
Run on the very beginning of your script to initialize journalling
Packit bbb0ff
functionality.
Packit bbb0ff
Packit bbb0ff
=cut
Packit bbb0ff
Packit bbb0ff
rlJournalStart(){
Packit bbb0ff
    __INTERNAL_SET_TIMESTAMP
Packit bbb0ff
    export __INTERNAL_STARTTIME="$__INTERNAL_TIMESTAMP"
Packit bbb0ff
    export __INTERNAL_ENDTIME=""
Packit bbb0ff
    # test-specific temporary directory for journal/metadata
Packit bbb0ff
    if [ -n "$BEAKERLIB_DIR" ]; then
Packit bbb0ff
        # try user-provided temporary directory first
Packit bbb0ff
        true
Packit bbb0ff
    elif [ -n "$TESTID" ]; then
Packit bbb0ff
        # if available, use TESTID for the temporary directory
Packit bbb0ff
        # - this is useful for preserving metadata through a system reboot
Packit bbb0ff
        export BEAKERLIB_DIR="$__INTERNAL_PERSISTENT_TMP/beakerlib-$TESTID"
Packit bbb0ff
    else
Packit bbb0ff
        # else generate a random temporary directory
Packit bbb0ff
        export BEAKERLIB_DIR=$(mktemp -d $__INTERNAL_PERSISTENT_TMP/beakerlib-XXXXXXX)
Packit bbb0ff
    fi
Packit bbb0ff
Packit bbb0ff
    [ -d "$BEAKERLIB_DIR" ] || mkdir -p "$BEAKERLIB_DIR" || {
Packit bbb0ff
      __INTERNAL_LogText "could not create BEAKERLIB_DIR $BEAKERLIB_DIR" FATAL
Packit bbb0ff
      exit 1
Packit bbb0ff
    }
Packit bbb0ff
Packit bbb0ff
    # set global internal BeakerLib journal and metafile variables
Packit bbb0ff
    export __INTERNAL_BEAKERLIB_JOURNAL="$BEAKERLIB_DIR/journal.xml"
Packit bbb0ff
    export __INTERNAL_BEAKERLIB_METAFILE="$BEAKERLIB_DIR/journal.meta"
Packit bbb0ff
    export __INTERNAL_BEAKERLIB_JOURNAL_TXT="$BEAKERLIB_DIR/journal.txt"
Packit bbb0ff
    export __INTERNAL_BEAKERLIB_JOURNAL_COLORED="$BEAKERLIB_DIR/journal_colored.txt"
Packit bbb0ff
Packit bbb0ff
    # make sure the directory is ready, otherwise we cannot continue
Packit bbb0ff
    if [ ! -d "$BEAKERLIB_DIR" ] ; then
Packit bbb0ff
        echo "rlJournalStart: Failed to create $BEAKERLIB_DIR directory."
Packit bbb0ff
        echo "rlJournalStart: Cannot continue, exiting..."
Packit bbb0ff
        exit 1
Packit bbb0ff
    fi
Packit bbb0ff
Packit bbb0ff
    # creating queue file
Packit bbb0ff
    touch $__INTERNAL_BEAKERLIB_METAFILE || {
Packit bbb0ff
      __INTERNAL_LogText "could not write to BEAKERLIB_DIR $BEAKERLIB_DIR" FATAL
Packit bbb0ff
      exit 1
Packit bbb0ff
    }
Packit bbb0ff
Packit bbb0ff
    # Initialization of variables holding current state of the test
Packit bbb0ff
    export __INTERNAL_METAFILE_INDENT_LEVEL=0
Packit bbb0ff
    __INTERNAL_PHASE_TYPE=()
Packit bbb0ff
    __INTERNAL_PHASE_NAME=()
Packit c623bd
    export __INTERNAL_PERSISTENT_DATA="$BEAKERLIB_DIR/PersistentData"
Packit c623bd
    export __INTERNAL_TEST_RESULTS="$BEAKERLIB_DIR/TestResults"
Packit bbb0ff
    export __INTERNAL_JOURNAL_OPEN=''
Packit bbb0ff
    export __INTERNAL_PHASES_FAILED=0
Packit bbb0ff
    export __INTERNAL_PHASES_PASSED=0
Packit c623bd
    export __INTERNAL_PHASES_SKIPPED=0
Packit bbb0ff
    export __INTERNAL_PHASES_WORST_RESULT='PASS'
Packit bbb0ff
    export __INTERNAL_TEST_STATE=0
Packit bbb0ff
    __INTERNAL_PHASE_TXTLOG_START=()
Packit bbb0ff
    __INTERNAL_PHASE_FAILED=()
Packit bbb0ff
    __INTERNAL_PHASE_PASSED=()
Packit bbb0ff
    __INTERNAL_PHASE_STARTTIME=()
Packit bbb0ff
    __INTERNAL_PHASE_METRICS=()
Packit bbb0ff
    export __INTERNAL_PHASE_OPEN=0
Packit e5f2ee
    __INTERNAL_PersistentDataLoad
Packit bbb0ff
Packit bbb0ff
    if [[ -z "$__INTERNAL_JOURNAL_OPEN" ]]; then
Packit bbb0ff
      # Create Header for XML journal
Packit bbb0ff
      __INTERNAL_CreateHeader
Packit bbb0ff
      # Create log element for XML journal
Packit e5f2ee
      __INTERNAL_WriteToMetafile log || {
Packit e5f2ee
        __INTERNAL_LogText "could not write to metafile" FATAL
Packit e5f2ee
        exit 1
Packit e5f2ee
      }
Packit e5f2ee
      __INTERNAL_JOURNAL_OPEN=1
Packit e5f2ee
      # Increase level of indent
Packit e5f2ee
      __INTERNAL_METAFILE_INDENT_LEVEL=1
Packit bbb0ff
    fi
Packit bbb0ff
Packit bbb0ff
    # display a warning message if run in POSIX mode
Packit bbb0ff
    if [ $POSIXFIXED == "YES" ] ; then
Packit bbb0ff
        rlLogWarning "POSIX mode detected and switched off"
Packit bbb0ff
        rlLogWarning "Please fix your test to have /bin/bash shebang"
Packit bbb0ff
    fi
Packit bbb0ff
Packit bbb0ff
    # Check BEAKERLIB_JOURNAL parameter
Packit bbb0ff
    [ -n "$BEAKERLIB_JOURNAL" ] && __INTERNAL_JournalParamCheck
Packit bbb0ff
Packit bbb0ff
    # final cleanup file (atomic updates)
Packit bbb0ff
    export __INTERNAL_CLEANUP_FINAL="$BEAKERLIB_DIR/cleanup.sh"
Packit bbb0ff
    # cleanup "buffer" used for append/prepend
Packit bbb0ff
    export __INTERNAL_CLEANUP_BUFF="$BEAKERLIB_DIR/clbuff"
Packit bbb0ff
Packit bbb0ff
    if touch "$__INTERNAL_CLEANUP_FINAL" "$__INTERNAL_CLEANUP_BUFF"; then
Packit bbb0ff
        rlLogDebug "rlJournalStart: Basic cleanup infrastructure successfully initialized"
Packit bbb0ff
Packit bbb0ff
        if [ -n "$TESTWATCHER_CLPATH" ] && \
Packit bbb0ff
           echo "$__INTERNAL_CLEANUP_FINAL" > "$TESTWATCHER_CLPATH"; then
Packit bbb0ff
            rlLogDebug "rlJournalStart: Running in test watcher and setup was successful"
Packit bbb0ff
            export __INTERNAL_TESTWATCHER_ACTIVE=true
Packit bbb0ff
        else
Packit bbb0ff
            rlLogDebug "rlJournalStart: Not running in test watcher or setup failed."
Packit bbb0ff
        fi
Packit bbb0ff
    else
Packit bbb0ff
        rlLogError "rlJournalStart: Failed to set up cleanup infrastructure"
Packit bbb0ff
    fi
Packit bbb0ff
    __INTERNAL_PersistentDataSave
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
# backward compatibility
Packit bbb0ff
rlStartJournal() {
Packit bbb0ff
    rlJournalStart
Packit bbb0ff
    rlLogWarning "rlStartJournal is obsoleted by rlJournalStart"
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
# Check if XML journal is to be created and if so
Packit bbb0ff
# whether it should be xsl transformed and how.
Packit bbb0ff
# Sets BEAKERLIB_JOURNAL and __INTERNAL_XSLT vars.
Packit bbb0ff
__INTERNAL_JournalParamCheck(){
Packit bbb0ff
    __INTERNAL_XSLT=''
Packit bbb0ff
    if [[ "$BEAKERLIB_JOURNAL" != "0" ]]; then
Packit bbb0ff
        if [[ -r "$BEAKERLIB/xslt-templates/$BEAKERLIB_JOURNAL" ]]; then
Packit bbb0ff
            __INTERNAL_XSLT="--xslt $BEAKERLIB/xslt-templates/$BEAKERLIB_JOURNAL"
Packit bbb0ff
        elif [[ -r "$BEAKERLIB_JOURNAL" ]]; then
Packit bbb0ff
            __INTERNAL_XSLT="--xslt $BEAKERLIB_JOURNAL"
Packit bbb0ff
        else
Packit bbb0ff
            rlLogError "xslt file '$BEAKERLIB_JOURNAL' is not readable"
Packit bbb0ff
            BEAKERLIB_JOURNAL="0"
Packit bbb0ff
        fi
Packit bbb0ff
    else
Packit bbb0ff
        rlLogInfo "skipping xml journal creation"
Packit bbb0ff
    fi
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
# rlJournalEnd
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
: <<'=cut'
Packit bbb0ff
=pod
Packit bbb0ff
Packit bbb0ff
=head3 rlJournalEnd
Packit bbb0ff
Packit bbb0ff
Summarize the test run and upload the journal file.
Packit bbb0ff
Packit bbb0ff
    rlJournalEnd
Packit bbb0ff
Packit bbb0ff
Run on the very end of your script to print summary of the whole test run,
Packit bbb0ff
generate OUTPUTFILE and include journal in Beaker logs.
Packit bbb0ff
Packit bbb0ff
=cut
Packit bbb0ff
Packit bbb0ff
rlJournalEnd(){
Packit bbb0ff
    if [ -z "$__INTERNAL_TESTWATCHER_ACTIVE" ] && [ -s "$__INTERNAL_CLEANUP_FINAL" ] && \
Packit bbb0ff
       [ -z "$__INTERNAL_CLEANUP_FROM_JOURNALEND" ]
Packit bbb0ff
    then
Packit bbb0ff
      rlLogWarning "rlJournalEnd: Not running in test watcher and rlCleanup* functions were used"
Packit bbb0ff
      rlLogWarning "rlJournalEnd: Executing prepared cleanup"
Packit bbb0ff
      rlLogWarning "rlJournalEnd: Please fix the test to use test watcher"
Packit bbb0ff
Packit bbb0ff
      # The executed cleanup will always run rlJournalEnd, so we need to prevent
Packit bbb0ff
      # infinite recursion. rlJournalEnd runs the cleanup only when
Packit bbb0ff
      # __INTERNAL_CLEANUP_FROM_JOURNALEND is not set (see above).
Packit bbb0ff
      __INTERNAL_CLEANUP_FROM_JOURNALEND=1 "$__INTERNAL_CLEANUP_FINAL"
Packit bbb0ff
Packit bbb0ff
      # Return, because the rest of the rlJournalEnd was already run inside the cleanup
Packit bbb0ff
      return $?
Packit bbb0ff
    fi
Packit bbb0ff
Packit bbb0ff
    if [ -z "$BEAKERLIB_COMMAND_SUBMIT_LOG" ]
Packit bbb0ff
    then
Packit bbb0ff
      local BEAKERLIB_COMMAND_SUBMIT_LOG="$__INTERNAL_DEFAULT_SUBMIT_LOG"
Packit bbb0ff
    fi
Packit bbb0ff
Packit bbb0ff
    __INTERNAL_SET_TIMESTAMP
Packit bbb0ff
    __INTERNAL_ENDTIME=$__INTERNAL_TIMESTAMP
Packit bbb0ff
    __INTERNAL_update_journal_txt
Packit bbb0ff
Packit 6b34d7
    __INTERNAL_PrintHeadLog "${__INTERNAL_TEST_NAME}" 2>&1
Packit 6b34d7
Packit bbb0ff
    if [ -n "$TESTID" ] ; then
Packit bbb0ff
        __INTERNAL_JournalXMLCreate
Packit bbb0ff
        $BEAKERLIB_COMMAND_SUBMIT_LOG -T $TESTID -l $__INTERNAL_BEAKERLIB_JOURNAL \
Packit bbb0ff
        || rlLogError "rlJournalEnd: Submit wasn't successful"
Packit bbb0ff
    else
Packit bbb0ff
        [[ "$BEAKERLIB_JOURNAL" == "0" ]] || rlLog "JOURNAL XML: $__INTERNAL_BEAKERLIB_JOURNAL"
Packit bbb0ff
        rlLog "JOURNAL TXT: $__INTERNAL_BEAKERLIB_JOURNAL_TXT"
Packit bbb0ff
    fi
Packit bbb0ff
Packit bbb0ff
    echo "#End of metafile" >> $__INTERNAL_BEAKERLIB_METAFILE
Packit 6b34d7
Packit b05e72
    __INTERNAL_PrintFootLog $__INTERNAL_STARTTIME \
Packit b05e72
                            $__INTERNAL_ENDTIME \
Packit b05e72
                            Phases \
Packit b05e72
                            $__INTERNAL_PHASES_PASSED \
Packit b05e72
                            $__INTERNAL_PHASES_FAILED \
Packit b05e72
                            $__INTERNAL_PHASES_WORST_RESULT \
Packit b05e72
                            "OVERALL"
Packit 6b34d7
Packit bbb0ff
    __INTERNAL_JournalXMLCreate
Packit c623bd
    __INTERNAL_TestResultsSave
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
# __INTERNAL_JournalXMLCreate
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
#: <<'=cut'
Packit bbb0ff
#=pod
Packit bbb0ff
#
Packit bbb0ff
#=head3 __INTERNAL_JournalXMLCreate
Packit bbb0ff
#
Packit bbb0ff
#Create XML version of the journal from internal structure.
Packit bbb0ff
#
Packit bbb0ff
#    __INTERNAL_JournalXMLCreate
Packit bbb0ff
#
Packit bbb0ff
#=cut
Packit bbb0ff
Packit bbb0ff
__INTERNAL_JournalXMLCreate() {
Packit bbb0ff
    [[ "$BEAKERLIB_JOURNAL" == "0" ]] || $__INTERNAL_JOURNALIST $__INTERNAL_XSLT --metafile \
Packit bbb0ff
    "$__INTERNAL_BEAKERLIB_METAFILE" --journal "$__INTERNAL_BEAKERLIB_JOURNAL"
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
# rlJournalPrint
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
: <<'=cut'
Packit bbb0ff
=pod
Packit bbb0ff
Packit bbb0ff
=head3 rlJournalPrint
Packit bbb0ff
Packit bbb0ff
Print the content of the journal in pretty xml format.
Packit bbb0ff
Packit bbb0ff
    rlJournalPrint [type]
Packit bbb0ff
Packit bbb0ff
=over
Packit bbb0ff
Packit bbb0ff
=item type
Packit bbb0ff
Packit bbb0ff
Can be either 'raw' or 'pretty', with the latter as a default.
Packit bbb0ff
Raw: xml is in raw form, no indentation etc
Packit bbb0ff
Pretty: xml is pretty printed, indented, with one record per line
Packit bbb0ff
Packit bbb0ff
=back
Packit bbb0ff
Packit bbb0ff
Example:
Packit bbb0ff
Packit bbb0ff
    
Packit bbb0ff
    <BEAKER_TEST>
Packit bbb0ff
      <test_id>debugging</test_id>
Packit bbb0ff
      <package>setup</package>
Packit bbb0ff
      <pkgdetails>setup-2.8.9-1.fc12.noarch</pkgdetails>
Packit bbb0ff
      <starttime>2010-02-08 15:17:47</starttime>
Packit bbb0ff
      <endtime>2010-02-08 15:17:47</endtime>
Packit bbb0ff
      <testname>/examples/beakerlib/Sanity/simple</testname>
Packit bbb0ff
      <release>Fedora release 12 (Constantine)</release>
Packit bbb0ff
      <hostname>localhost</hostname>
Packit bbb0ff
      <arch>i686</arch>
Packit bbb0ff
      <purpose>PURPOSE of /examples/beakerlib/Sanity/simple
Packit bbb0ff
        Description: Minimal BeakerLib sanity test
Packit bbb0ff
        Author: Petr Splichal <psplicha@redhat.com>
Packit bbb0ff
Packit bbb0ff
        This is a minimal sanity test for BeakerLib. It contains a single
Packit bbb0ff
        phase with a couple of asserts. We Just check that the "setup"
Packit bbb0ff
        package is installed and that there is a sane /etc/passwd file.
Packit bbb0ff
      </purpose>
Packit bbb0ff
      <log>
Packit bbb0ff
        
Packit bbb0ff
                score="0" starttime="2010-02-08 15:17:47" type="FAIL">
Packit bbb0ff
          <test message="Checking for the presence of setup rpm">PASS</test>
Packit bbb0ff
          <test message="File /etc/passwd should exist">PASS</test>
Packit bbb0ff
          <test message="File '/etc/passwd' should contain 'root'">PASS</test>
Packit bbb0ff
        </phase>
Packit bbb0ff
      </log>
Packit bbb0ff
    </BEAKER_TEST>
Packit bbb0ff
Packit bbb0ff
=cut
Packit bbb0ff
Packit bbb0ff
# cat generated text version
Packit bbb0ff
rlJournalPrint(){
Packit bbb0ff
  __INTERNAL_JournalXMLCreate
Packit bbb0ff
  if [[ "$1" == "raw" ]]; then
Packit bbb0ff
    cat $__INTERNAL_BEAKERLIB_JOURNAL
Packit bbb0ff
  else
Packit bbb0ff
    cat $__INTERNAL_BEAKERLIB_JOURNAL | xmllint --format -
Packit bbb0ff
  fi
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
# backward compatibility
Packit bbb0ff
rlPrintJournal() {
Packit bbb0ff
    rlLogWarning "rlPrintJournal is obsoleted by rlJournalPrint"
Packit bbb0ff
    rlJournalPrint
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
Packit bbb0ff
__INTERNAL_update_journal_txt() {
Packit bbb0ff
  local textfile
Packit bbb0ff
  local endtime
Packit c623bd
  __INTERNAL_DURATION=$(($__INTERNAL_TIMESTAMP - $__INTERNAL_STARTTIME))
Packit bbb0ff
  printf -v endtime "%($__INTERNAL_TIMEFORMAT_LONG)T %s" $__INTERNAL_TIMESTAMP "(still running)"
Packit bbb0ff
  [[ -n "$__INTERNAL_ENDTIME" ]] && printf -v endtime "%($__INTERNAL_TIMEFORMAT_LONG)T" $__INTERNAL_ENDTIME
Packit c623bd
  local sed_patterns="0,/    Test finished : /s/^(    Test finished : ).*\$/\1$endtime/;0,/    Test duration : /s/^(    Test duration : ).*\$/\1$__INTERNAL_DURATION seconds/"
Packit bbb0ff
  for textfile in "$__INTERNAL_BEAKERLIB_JOURNAL_COLORED" "$__INTERNAL_BEAKERLIB_JOURNAL_TXT"; do
Packit bbb0ff
    sed -r -i "$sed_patterns" "$textfile"
Packit bbb0ff
  done
Packit bbb0ff
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
# rlJournalPrintText
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
: <<'=cut'
Packit bbb0ff
=pod
Packit bbb0ff
Packit bbb0ff
=head3 rlJournalPrintText
Packit bbb0ff
Packit bbb0ff
Print the content of the journal in pretty text format.
Packit bbb0ff
Packit bbb0ff
    rlJournalPrintText [--full-journal]
Packit bbb0ff
Packit bbb0ff
=over
Packit bbb0ff
Packit bbb0ff
=item --full-journal
Packit bbb0ff
Packit bbb0ff
The options is now deprecated, has no effect and will be removed in one
Packit bbb0ff
of future versions.
Packit bbb0ff
Packit bbb0ff
=back
Packit bbb0ff
Packit bbb0ff
Example:
Packit bbb0ff
Packit bbb0ff
    ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Packit bbb0ff
    :: [   LOG    ] :: TEST PROTOCOL
Packit bbb0ff
    ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Packit bbb0ff
Packit bbb0ff
    :: [   LOG    ] :: Test run ID   : debugging
Packit bbb0ff
    :: [   LOG    ] :: Package       : debugging
Packit bbb0ff
    :: [   LOG    ] :: Test started  : 2010-02-08 14:45:57
Packit bbb0ff
    :: [   LOG    ] :: Test finished : 2010-02-08 14:45:58
Packit bbb0ff
    :: [   LOG    ] :: Test name     :
Packit bbb0ff
    :: [   LOG    ] :: Distro:       : Fedora release 12 (Constantine)
Packit bbb0ff
    :: [   LOG    ] :: Hostname      : localhost
Packit bbb0ff
    :: [   LOG    ] :: Architecture  : i686
Packit bbb0ff
Packit bbb0ff
    ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Packit bbb0ff
    :: [   LOG    ] :: Test description
Packit bbb0ff
    ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Packit bbb0ff
Packit bbb0ff
    PURPOSE of /examples/beakerlib/Sanity/simple
Packit bbb0ff
    Description: Minimal BeakerLib sanity test
Packit bbb0ff
    Author: Petr Splichal <psplicha@redhat.com>
Packit bbb0ff
Packit bbb0ff
    This is a minimal sanity test for BeakerLib. It contains a single
Packit bbb0ff
    phase with a couple of asserts. We Just check that the "setup"
Packit bbb0ff
    package is installed and that there is a sane /etc/passwd file.
Packit bbb0ff
Packit bbb0ff
Packit bbb0ff
    ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Packit bbb0ff
    :: [   LOG    ] :: Test
Packit bbb0ff
    ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Packit bbb0ff
Packit bbb0ff
    :: [   PASS   ] :: Checking for the presence of setup rpm
Packit bbb0ff
    :: [   PASS   ] :: File /etc/passwd should exist
Packit bbb0ff
    :: [   PASS   ] :: File '/etc/passwd' should contain 'root'
Packit bbb0ff
    :: [   LOG    ] :: Duration: 1s
Packit bbb0ff
    :: [   LOG    ] :: Assertions: 3 good, 0 bad
Packit bbb0ff
    :: [   PASS   ] :: RESULT: Test
Packit bbb0ff
Packit bbb0ff
=cut
Packit bbb0ff
# call rlJournalPrint
Packit bbb0ff
rlJournalPrintText(){
Packit bbb0ff
    __INTERNAL_PersistentDataLoad
Packit bbb0ff
    __INTERNAL_update_journal_txt
Packit bbb0ff
Packit bbb0ff
    echo -e "\n\n\n\n"
Packit bbb0ff
    local textfile
Packit bbb0ff
    [[ -t 1 ]] && textfile="$__INTERNAL_BEAKERLIB_JOURNAL_COLORED" || textfile="$__INTERNAL_BEAKERLIB_JOURNAL_TXT"
Packit bbb0ff
    cat "$textfile"
Packit bbb0ff
Packit bbb0ff
    return 0
Packit bbb0ff
}
Packit bbb0ff
Packit c623bd
Packit c623bd
# Creation of TestResults file
Packit c623bd
# Each line of the file contains TESTRESULT_VAR=$RESULT_VALUE
Packit c623bd
# so the file can be sourced afterwards
Packit c623bd
__INTERNAL_TestResultsSave(){
Packit c623bd
    # Set exit code of the test according to worst phase result
Packit c623bd
    case "$__INTERNAL_PHASES_WORST_RESULT" in
Packit c623bd
    PASS)
Packit c623bd
        __TESTRESULT_RESULT_ECODE="0"
Packit c623bd
        ;;
Packit c623bd
    WARN)
Packit c623bd
        __TESTRESULT_RESULT_ECODE="10"
Packit c623bd
        ;;
Packit c623bd
    FAIL)
Packit c623bd
        __TESTRESULT_RESULT_ECODE="20"
Packit c623bd
        ;;
Packit c623bd
    *)
Packit c623bd
        __TESTRESULT_RESULT_ECODE="30"
Packit c623bd
        ;;
Packit c623bd
    esac
Packit c623bd
Packit c623bd
    cat > "$__INTERNAL_TEST_RESULTS" <
Packit c623bd
# This is a result file of the test in a 'sourceable' form.
Packit c623bd
# Description of individual variables can be found in beakerlib man page.
Packit c623bd
TESTRESULT_RESULT_STRING=$__INTERNAL_PHASES_WORST_RESULT
Packit c623bd
TESTRESULT_RESULT_ECODE=$__TESTRESULT_RESULT_ECODE
Packit c623bd
TESTRESULT_PHASES_PASSED=$__INTERNAL_PHASES_PASSED
Packit c623bd
TESTRESULT_PHASES_FAILED=$__INTERNAL_PHASES_FAILED
Packit c623bd
TESTRESULT_PHASES_SKIPPED=$__INTERNAL_PHASES_SKIPPED
Packit c623bd
TESTRESULT_ASSERTS_FAILED=$__INTERNAL_TEST_STATE
Packit c623bd
TESTRESULT_STARTTIME=$__INTERNAL_STARTTIME
Packit c623bd
TESTRESULT_ENDTIME=$__INTERNAL_ENDTIME
Packit c623bd
TESTRESULT_DURATION=$__INTERNAL_DURATION
Packit c623bd
TESTRESULT_BEAKERLIB_DIR=$BEAKERLIB_DIR
Packit c623bd
EOF
Packit c623bd
}
Packit c623bd
Packit bbb0ff
# backward compatibility
Packit bbb0ff
rlCreateLogFromJournal(){
Packit bbb0ff
    rlLogWarning "rlCreateLogFromJournal is obsoleted by rlJournalPrintText"
Packit bbb0ff
    rlJournalPrintText
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
# rlGetTestState
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
: <<=cut
Packit bbb0ff
=pod
Packit bbb0ff
Packit bbb0ff
=head3 rlGetTestState
Packit bbb0ff
Packit bbb0ff
Returns number of failed asserts in so far, 255 if there are more then 255 failures.
Packit bbb0ff
The precise number is set to ECODE variable.
Packit bbb0ff
Packit bbb0ff
    rlGetTestState
Packit bbb0ff
=cut
Packit bbb0ff
Packit bbb0ff
rlGetTestState(){
Packit bbb0ff
    __INTERNAL_PersistentDataLoad
Packit bbb0ff
    ECODE=$__INTERNAL_TEST_STATE
Packit bbb0ff
    rlLogDebug "rlGetTestState: $ECODE failed assert(s) in test"
Packit bbb0ff
    [[ $ECODE -gt 255 ]] && return 255 || return $ECODE
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
# rlGetPhaseState
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
: <<=cut
Packit bbb0ff
=pod
Packit bbb0ff
Packit bbb0ff
=head3 rlGetPhaseState
Packit bbb0ff
Packit bbb0ff
Returns number of failed asserts in current phase so far, 255 if there are more then 255 failures.
Packit bbb0ff
The precise number is set to ECODE variable.
Packit bbb0ff
Packit bbb0ff
    rlGetPhaseState
Packit bbb0ff
=cut
Packit bbb0ff
Packit bbb0ff
rlGetPhaseState(){
Packit bbb0ff
    __INTERNAL_PersistentDataLoad
Packit bbb0ff
    ECODE=$__INTERNAL_PHASE_FAILED
Packit bbb0ff
    rlLogDebug "rlGetPhaseState: $ECODE failed assert(s) in phase"
Packit bbb0ff
    [[ $ECODE -gt 255 ]] && return 255 || return $ECODE
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
# Internal Stuff
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
Packit bbb0ff
rljAddPhase(){
Packit bbb0ff
    __INTERNAL_PersistentDataLoad
Packit bbb0ff
    local MSG=${2:-"Phase of $1 type"}
Packit fc5b64
    local TXTLOG_START=$(cat $__INTERNAL_BEAKERLIB_JOURNAL_TXT | wc -l)
Packit bbb0ff
    rlLogDebug "rljAddPhase: Phase $MSG started"
Packit bbb0ff
    __INTERNAL_WriteToMetafile phase --name "$MSG" --type "$1" >&2
Packit bbb0ff
    # Printing
Packit bbb0ff
    __INTERNAL_PrintHeadLog "$MSG"
Packit bbb0ff
Packit 5e1fe0
    if [[ "$BEAKERLIB_NESTED_PHASES" == "0" ]]; then
Packit bbb0ff
      __INTERNAL_METAFILE_INDENT_LEVEL=2
Packit bbb0ff
      __INTERNAL_PHASE_TYPE=( "$1" )
Packit bbb0ff
      __INTERNAL_PHASE_NAME=( "$MSG" )
Packit bbb0ff
      __INTERNAL_PHASE_FAILED=( 0 )
Packit bbb0ff
      __INTERNAL_PHASE_PASSED=( 0 )
Packit bbb0ff
      __INTERNAL_PHASE_STARTTIME=( $__INTERNAL_TIMESTAMP )
Packit fc5b64
      __INTERNAL_PHASE_TXTLOG_START=( $TXTLOG_START )
Packit bbb0ff
      __INTERNAL_PHASE_OPEN=${#__INTERNAL_PHASE_NAME[@]}
Packit bbb0ff
      __INTERNAL_PHASE_METRICS=( "" )
Packit bbb0ff
    else
Packit bbb0ff
      let __INTERNAL_METAFILE_INDENT_LEVEL++
Packit bbb0ff
      __INTERNAL_PHASE_TYPE=( "$1" "${__INTERNAL_PHASE_TYPE[@]}" )
Packit bbb0ff
      __INTERNAL_PHASE_NAME=( "$MSG" "${__INTERNAL_PHASE_NAME[@]}" )
Packit bbb0ff
      __INTERNAL_PHASE_FAILED=( 0 "${__INTERNAL_PHASE_FAILED[@]}" )
Packit bbb0ff
      __INTERNAL_PHASE_PASSED=( 0 "${__INTERNAL_PHASE_PASSED[@]}" )
Packit bbb0ff
      __INTERNAL_PHASE_STARTTIME=( $__INTERNAL_TIMESTAMP "${__INTERNAL_PHASE_STARTTIME[@]}" )
Packit bbb0ff
      __INTERNAL_PHASE_TXTLOG_START=( $TXTLOG_START "${__INTERNAL_PHASE_TXTLOG_START[@]}" )
Packit bbb0ff
      __INTERNAL_PHASE_OPEN=${#__INTERNAL_PHASE_NAME[@]}
Packit bbb0ff
      __INTERNAL_PHASE_METRICS=( "" "${__INTERNAL_PHASE_METRICS[@]}" )
Packit bbb0ff
    fi
Packit bbb0ff
    __INTERNAL_PersistentDataSave
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
__INTERNAL_SET_WORST_PHASE_RESULT() {
Packit bbb0ff
    local results='PASS WARN FAIL'
Packit bbb0ff
    [[ "$results" =~ $(echo "$__INTERNAL_PHASES_WORST_RESULT(.*)") ]] && {
Packit bbb0ff
      local possible_results="${BASH_REMATCH[1]}"
Packit bbb0ff
      rlLogDebug "$FUNCNAME(): possible worse results are now $possible_results, current result is $1"
Packit bbb0ff
      [[ "$possible_results" =~ $1 ]] && {
Packit bbb0ff
          rlLogDebug "$FUNCNAME(): changing worst phase result from $__INTERNAL_PHASES_WORST_RESULT to $1"
Packit bbb0ff
          __INTERNAL_PHASES_WORST_RESULT="$1"
Packit bbb0ff
      }
Packit bbb0ff
    }
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
rljClosePhase(){
Packit bbb0ff
    __INTERNAL_PersistentDataLoad
Packit bbb0ff
    [[ $__INTERNAL_PHASE_OPEN -eq 0 ]] && {
Packit bbb0ff
      rlLogError "nothing to close - no open phase"
Packit bbb0ff
      return 1
Packit bbb0ff
    }
Packit bbb0ff
    local result
Packit bbb0ff
    local logfile="$BEAKERLIB_DIR/journal.txt"
Packit bbb0ff
Packit bbb0ff
    local score=$__INTERNAL_PHASE_FAILED
Packit bbb0ff
    # Result
Packit bbb0ff
    if [ $score -eq 0 ]; then
Packit bbb0ff
        result="PASS"
Packit bbb0ff
        let __INTERNAL_PHASES_PASSED++
Packit bbb0ff
    else
Packit bbb0ff
        result="$__INTERNAL_PHASE_TYPE"
Packit bbb0ff
        let __INTERNAL_PHASES_FAILED++
Packit bbb0ff
    fi
Packit bbb0ff
Packit bbb0ff
    __INTERNAL_SET_WORST_PHASE_RESULT "$result"
Packit bbb0ff
Packit bbb0ff
    local name="$__INTERNAL_PHASE_NAME"
Packit bbb0ff
Packit bbb0ff
    rlLogDebug "rljClosePhase: Phase $name closed"
Packit bbb0ff
    __INTERNAL_SET_TIMESTAMP
Packit bbb0ff
    local endtime="$__INTERNAL_TIMESTAMP"
Packit b05e72
    __INTERNAL_PrintFootLog $__INTERNAL_PHASE_STARTTIME \
Packit b05e72
                            $endtime \
Packit b05e72
                            Assertions \
Packit b05e72
                            $__INTERNAL_PHASE_PASSED \
Packit b05e72
                            $__INTERNAL_PHASE_FAILED \
Packit b05e72
                            $result
Packit bbb0ff
    local logfile="$(mktemp)"
Packit bbb0ff
    tail -n +$((__INTERNAL_PHASE_TXTLOG_START+1)) $__INTERNAL_BEAKERLIB_JOURNAL_TXT > $logfile
Packit 93ed06
    rlReport "$(echo "${name//[^[:alnum:]]/-}" | tr -s '-')" "$result" "$score" "$logfile"
Packit bbb0ff
    rm -f $logfile
Packit bbb0ff
Packit bbb0ff
    # Reset of state variables
Packit 5e1fe0
    if [[ "$BEAKERLIB_NESTED_PHASES" == "0" ]]; then
Packit bbb0ff
      __INTERNAL_METAFILE_INDENT_LEVEL=1
Packit bbb0ff
      __INTERNAL_PHASE_TYPE=()
Packit bbb0ff
      __INTERNAL_PHASE_NAME=()
Packit bbb0ff
      __INTERNAL_PHASE_FAILED=()
Packit bbb0ff
      __INTERNAL_PHASE_PASSED=()
Packit bbb0ff
      __INTERNAL_PHASE_STARTTIME=()
Packit bbb0ff
      __INTERNAL_PHASE_TXTLOG_START=()
Packit bbb0ff
      __INTERNAL_PHASE_METRICS=()
Packit bbb0ff
    else
Packit bbb0ff
      let __INTERNAL_METAFILE_INDENT_LEVEL--
Packit bbb0ff
      unset __INTERNAL_PHASE_TYPE[0]; __INTERNAL_PHASE_TYPE=( "${__INTERNAL_PHASE_TYPE[@]}" )
Packit bbb0ff
      unset __INTERNAL_PHASE_NAME[0]; __INTERNAL_PHASE_NAME=( "${__INTERNAL_PHASE_NAME[@]}" )
Packit bbb0ff
      [[ ${#__INTERNAL_PHASE_FAILED[@]} -gt 1 ]] && let __INTERNAL_PHASE_FAILED[1]+=__INTERNAL_PHASE_FAILED[0]
Packit bbb0ff
      unset __INTERNAL_PHASE_FAILED[0]; __INTERNAL_PHASE_FAILED=( "${__INTERNAL_PHASE_FAILED[@]}" )
Packit bbb0ff
      [[ ${#__INTERNAL_PHASE_PASSED[@]} -gt 1 ]] && let __INTERNAL_PHASE_PASSED[1]+=__INTERNAL_PHASE_PASSED[0]
Packit bbb0ff
      unset __INTERNAL_PHASE_PASSED[0]; __INTERNAL_PHASE_PASSED=( "${__INTERNAL_PHASE_PASSED[@]}" )
Packit bbb0ff
      unset __INTERNAL_PHASE_STARTTIME[0]; __INTERNAL_PHASE_STARTTIME=( "${__INTERNAL_PHASE_STARTTIME[@]}" )
Packit bbb0ff
      unset __INTERNAL_PHASE_TXTLOG_START[0]; __INTERNAL_PHASE_TXTLOG_START=( "${__INTERNAL_PHASE_TXTLOG_START[@]}" )
Packit bbb0ff
      unset __INTERNAL_PHASE_METRICS[0]; __INTERNAL_PHASE_METRICS=( "${__INTERNAL_PHASE_METRICS[@]}" )
Packit bbb0ff
    fi
Packit bbb0ff
    __INTERNAL_PHASE_OPEN=${#__INTERNAL_PHASE_NAME[@]}
Packit bbb0ff
    # Updating phase element
Packit bbb0ff
    __INTERNAL_WriteToMetafile --result "$result" --score "$score"
Packit bbb0ff
    __INTERNAL_PersistentDataSave
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
# $1 message
Packit bbb0ff
# $2 result
Packit bbb0ff
# $3 command
Packit bbb0ff
rljAddTest(){
Packit 62c285
    local IFS
Packit bbb0ff
    __INTERNAL_PersistentDataLoad
Packit bbb0ff
    if [ $__INTERNAL_PHASE_OPEN -eq 0 ]; then
Packit bbb0ff
        rlPhaseStart "FAIL" "Asserts collected outside of a phase"
Packit bbb0ff
        rlFail "TEST BUG: Assertion not in phase"
Packit bbb0ff
        rljAddTest "$@"
Packit bbb0ff
        rlPhaseEnd
Packit bbb0ff
    else
Packit bbb0ff
        __INTERNAL_LogText "$1" "$2"
Packit bbb0ff
        __INTERNAL_WriteToMetafile test --message "$1" ${3:+--command "$3"} -- "$2" >&2
Packit bbb0ff
        if [ "$2" == "PASS" ]; then
Packit bbb0ff
            let __INTERNAL_PHASE_PASSED++
Packit bbb0ff
        else
Packit bbb0ff
            let __INTERNAL_TEST_STATE++
Packit bbb0ff
            let __INTERNAL_PHASE_FAILED++
Packit bbb0ff
        fi
Packit bbb0ff
    fi
Packit bbb0ff
    __INTERNAL_PersistentDataSave
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
rljAddMetric(){
Packit bbb0ff
    __INTERNAL_PersistentDataLoad
Packit bbb0ff
    local MID="$2"
Packit bbb0ff
    local VALUE="$3"
Packit bbb0ff
    local TOLERANCE=${4:-"0.2"}
Packit bbb0ff
    local res=0
Packit bbb0ff
    if [ "$MID" == "" ] || [ "$VALUE" == "" ]
Packit bbb0ff
    then
Packit bbb0ff
        rlLogError "TEST BUG: Bad call of rlLogMetric"
Packit bbb0ff
        return 1
Packit bbb0ff
    fi
Packit bbb0ff
    if [[ "$__INTERNAL_PHASE_METRICS" =~ \ $MID\  ]]; then
Packit bbb0ff
        rlLogError "$FUNCNAME: Metric name not unique!"
Packit bbb0ff
        let res++
Packit bbb0ff
    else
Packit bbb0ff
        rlLogDebug "rljAddMetric: Storing metric $MID with value $VALUE and tolerance $TOLERANCE"
Packit bbb0ff
        __INTERNAL_PHASE_METRICS="$__INTERNAL_PHASE_METRICS $MID "
Packit bbb0ff
        __INTERNAL_WriteToMetafile metric --type "$1" --name "$MID" \
Packit bbb0ff
            --value "$VALUE" --tolerance "$TOLERANCE" >&2 || let res++
Packit bbb0ff
        __INTERNAL_PersistentDataSave
Packit bbb0ff
    fi
Packit bbb0ff
    return $?
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
rljAddMessage(){
Packit bbb0ff
    __INTERNAL_WriteToMetafile message --severity "$2" -- "$1" >&2
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
__INTERNAL_GetPackageDetails() {
Packit bbb0ff
    rpm -q "$1" --qf "%{name}-%{version}-%{release}.%{arch} %{sourcerpm}"
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
rljRpmLog(){
Packit bbb0ff
    local package_details
Packit bbb0ff
    if package_details=( $(__INTERNAL_GetPackageDetails "$1") ); then
Packit bbb0ff
        __INTERNAL_WriteToMetafile pkgdetails --sourcerpm "${package_details[1]}" -- "${package_details[0]}"
Packit bbb0ff
    else
Packit bbb0ff
        __INTERNAL_WriteToMetafile pkgnotinstalled -- "$1"
Packit bbb0ff
    fi
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
Packit bbb0ff
# determine SUT package
Packit bbb0ff
__INTERNAL_DeterminePackage(){
Packit bbb0ff
    local package="$PACKAGE"
Packit bbb0ff
    if [ "$PACKAGE" == "" ]; then
Packit bbb0ff
        if [ "$TEST" == "" ]; then
Packit bbb0ff
            package="unknown"
Packit bbb0ff
        else
Packit bbb0ff
            local arrPac=(${TEST//// })
Packit bbb0ff
            package=${arrPac[1]}
Packit bbb0ff
        fi
Packit bbb0ff
    fi
Packit bbb0ff
    echo "$package"
Packit bbb0ff
    return 0
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
# Creates header
Packit bbb0ff
__INTERNAL_CreateHeader(){
Packit 62c285
    local IFS
Packit bbb0ff
Packit bbb0ff
    __INTERNAL_PrintHeadLog "TEST PROTOCOL" 2> /dev/null
Packit bbb0ff
Packit bbb0ff
    [[ -n "$TESTID" ]] && {
Packit bbb0ff
        __INTERNAL_WriteToMetafile test_id -- "$TESTID"
Packit bbb0ff
        __INTERNAL_LogText "    Test run ID   : $TESTID" 2> /dev/null
Packit bbb0ff
    }
Packit bbb0ff
Packit bbb0ff
    # Determine package which is tested
Packit bbb0ff
    local package=$(__INTERNAL_DeterminePackage)
Packit bbb0ff
    __INTERNAL_WriteToMetafile package -- "$package"
Packit bbb0ff
    __INTERNAL_LogText "    Package       : $package" 2> /dev/null
Packit bbb0ff
Packit bbb0ff
    # Write package details (rpm, srcrpm) into metafile
Packit bbb0ff
    rljRpmLog "$package"
Packit bbb0ff
    package=( $(__INTERNAL_GetPackageDetails "$package") ) && \
Packit bbb0ff
        __INTERNAL_LogText "    Installed     : ${package[0]}" 2> /dev/null
Packit bbb0ff
Packit bbb0ff
    # RPM version of beakerlib
Packit bbb0ff
    package=( $(__INTERNAL_GetPackageDetails "beakerlib") ) && {
Packit bbb0ff
        __INTERNAL_WriteToMetafile beakerlib_rpm -- "${package[0]}"
Packit bbb0ff
        __INTERNAL_LogText "    beakerlib RPM : ${package[0]}" 2> /dev/null
Packit bbb0ff
    }
Packit bbb0ff
Packit bbb0ff
    # RPM version of beakerlib-redhat
Packit bbb0ff
    package=( $(__INTERNAL_GetPackageDetails "beakerlib-redhat") ) && {
Packit bbb0ff
        __INTERNAL_WriteToMetafile beakerlib_redhat_rpm -- "${package[0]}"
Packit bbb0ff
        __INTERNAL_LogText "    bl-redhat RPM : ${package[0]}" 2> /dev/null
Packit bbb0ff
    }
Packit bbb0ff
Packit bbb0ff
    local test_version="${testversion:-$TESTVERSION}"
Packit bbb0ff
Packit bbb0ff
    [[ -n "$test_version" ]] && {
Packit bbb0ff
        __INTERNAL_WriteToMetafile testversion -- "$test_version"
Packit bbb0ff
        __INTERNAL_LogText "    Test version  : $test_version" 2> /dev/null
Packit bbb0ff
    }
Packit bbb0ff
Packit bbb0ff
    package="${packagename:-$test_version}"
Packit bbb0ff
    local test_built
Packit bbb0ff
    [[ -n "$package" ]] && test_built=$(rpm -q --qf '%{BUILDTIME}\n' $package) && {
Packit 827126
      test_built="$(echo "$test_built" | head -n 1 )"
Packit bbb0ff
      printf -v test_built "%($__INTERNAL_TIMEFORMAT_LONG)T" "$test_built"
Packit bbb0ff
      __INTERNAL_WriteToMetafile testversion -- "$test_built"
Packit bbb0ff
      __INTERNAL_LogText "    Test built    : $test_built" 2> /dev/null
Packit bbb0ff
    }
Packit bbb0ff
Packit bbb0ff
Packit bbb0ff
    # Starttime and endtime
Packit bbb0ff
    __INTERNAL_WriteToMetafile starttime
Packit bbb0ff
    __INTERNAL_WriteToMetafile endtime
Packit bbb0ff
    __INTERNAL_LogText "    Test started  : $(printf "%($__INTERNAL_TIMEFORMAT_LONG)T" $__INTERNAL_STARTTIME)" 2> /dev/null
Packit bbb0ff
    __INTERNAL_LogText "    Test finished : " 2> /dev/null
Packit bbb0ff
    __INTERNAL_LogText "    Test duration : " 2> /dev/null
Packit bbb0ff
Packit bbb0ff
    # Test name
Packit 6e11fd
    __INTERNAL_TEST_NAME="${TEST:-unknown}"
Packit 6e11fd
    __INTERNAL_WriteToMetafile testname -- "${__INTERNAL_TEST_NAME}"
Packit 6e11fd
    __INTERNAL_LogText "    Test name     : ${__INTERNAL_TEST_NAME}" 2> /dev/null
Packit bbb0ff
Packit bbb0ff
    # OS release
Packit bbb0ff
    local release=$(cat /etc/redhat-release)
Packit bbb0ff
    [[ -n "$release" ]] && {
Packit bbb0ff
        __INTERNAL_WriteToMetafile release -- "$release"
Packit bbb0ff
        __INTERNAL_LogText "    Distro        : ${release}" 2> /dev/null
Packit bbb0ff
    }
Packit bbb0ff
Packit bbb0ff
    # Hostname
Packit bbb0ff
    local hostname=""
Packit bbb0ff
    # Try hostname command or /etc/hostname if both fail skip it
Packit bbb0ff
    if which hostname &> /dev/null; then
Packit bbb0ff
        hostname=$(hostname --fqdn)
Packit bbb0ff
    elif [[ -f "/etc/hostname" ]]; then
Packit bbb0ff
        hostname=$(cat /etc/hostname)
Packit bbb0ff
    fi
Packit bbb0ff
Packit bbb0ff
    [[ -n "$hostname" ]] && {
Packit bbb0ff
        __INTERNAL_WriteToMetafile hostname -- "$hostname"
Packit bbb0ff
        __INTERNAL_LogText "    Hostname      : ${hostname}" 2> /dev/null
Packit bbb0ff
    }
Packit bbb0ff
Packit bbb0ff
    # Architecture
Packit bbb0ff
    local arch=$(uname -i 2>/dev/null || uname -m)
Packit bbb0ff
    [[ -n "$arch" ]] && {
Packit bbb0ff
        __INTERNAL_WriteToMetafile arch -- "$arch"
Packit bbb0ff
        __INTERNAL_LogText "    Architecture  : ${arch}" 2> /dev/null
Packit bbb0ff
    }
Packit bbb0ff
Packit bbb0ff
    local line size
Packit bbb0ff
    # CPU info
Packit bbb0ff
    if [ -f "/proc/cpuinfo" ]; then
Packit bbb0ff
        local count=0
Packit bbb0ff
        local type="unknown"
Packit bbb0ff
        local cpu_regex="^model\sname.*: (.*)$"
Packit 62c285
        while read -r line; do
Packit bbb0ff
            if [[ "$line" =~ $cpu_regex ]]; then
Packit bbb0ff
                type="${BASH_REMATCH[1]}"
Packit bbb0ff
                let count++
Packit bbb0ff
            fi
Packit bbb0ff
        done < "/proc/cpuinfo"
Packit bbb0ff
        __INTERNAL_WriteToMetafile hw_cpu -- "$count x $type"
Packit bbb0ff
        __INTERNAL_LogText "    CPUs          : $count x $type" 2> /dev/null
Packit bbb0ff
    fi
Packit bbb0ff
Packit bbb0ff
    # RAM size
Packit bbb0ff
     if [[ -f "/proc/meminfo" ]]; then
Packit bbb0ff
        size=0
Packit bbb0ff
        local ram_regex="^MemTotal: *(.*) kB$"
Packit 62c285
        while read -r line; do
Packit bbb0ff
            if [[ "$line" =~ $ram_regex ]]; then
Packit bbb0ff
                size=`expr ${BASH_REMATCH[1]} / 1024`
Packit bbb0ff
                break
Packit bbb0ff
            fi
Packit bbb0ff
        done < "/proc/meminfo"
Packit bbb0ff
        __INTERNAL_WriteToMetafile hw_ram -- "$size MB"
Packit bbb0ff
        __INTERNAL_LogText "    RAM size      : ${size} MB" 2> /dev/null
Packit bbb0ff
    fi
Packit bbb0ff
Packit bbb0ff
    # HDD size
Packit bbb0ff
    size=0
Packit bbb0ff
    local hdd_regex="^(/[^ ]+) +([0-9]+) +[0-9]+ +[0-9]+ +[0-9]+% +[^ ]+$"
Packit bbb0ff
    while read -r line ; do
Packit bbb0ff
        if [[ "$line" =~ $hdd_regex ]]; then
Packit bbb0ff
            let size+=BASH_REMATCH[2]
Packit bbb0ff
        fi
Packit bbb0ff
    done < <(df -k -P --local --exclude-type=tmpfs)
Packit bbb0ff
    [[ -n "$size" ]] && {
Packit bbb0ff
        size="$(echo "$((size*100/1024/1024))" | sed -r 's/..$/.\0/') GB"
Packit bbb0ff
        __INTERNAL_WriteToMetafile hw_hdd -- "$size"
Packit bbb0ff
        __INTERNAL_LogText "    HDD size      : ${size}" 2> /dev/null
Packit bbb0ff
    }
Packit bbb0ff
Packit bbb0ff
    # Purpose
Packit bbb0ff
    [[ -f 'PURPOSE' ]] && {
Packit bbb0ff
        local purpose tmp
Packit bbb0ff
        mapfile -t tmp < PURPOSE
Packit bbb0ff
        printf -v purpose "%s\n" "${tmp[@]}"
Packit bbb0ff
        __INTERNAL_WriteToMetafile purpose -- "$purpose"
Packit bbb0ff
        __INTERNAL_PrintHeadLog "Test description" 2> /dev/null
Packit bbb0ff
        __INTERNAL_LogText "$purpose" 2> /dev/null
Packit bbb0ff
    }
Packit bbb0ff
Packit bbb0ff
    return 0
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
Packit bbb0ff
__INTERNAL_SET_TIMESTAMP() {
Packit bbb0ff
    printf -v __INTERNAL_TIMESTAMP '%(%s)T' -1
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
Packit bbb0ff
# Encode arguments' values into base64
Packit bbb0ff
# Adds --timestamp argument and indent
Packit bbb0ff
# writes it into metafile
Packit bbb0ff
# takes [element] --attribute1 value1 --attribute2 value2 .. [-- "content"]
Packit bbb0ff
__INTERNAL_WriteToMetafile(){
Packit bbb0ff
    __INTERNAL_SET_TIMESTAMP
Packit bbb0ff
    local indent
Packit bbb0ff
    local line=""
Packit bbb0ff
    local lineraw=''
Packit bbb0ff
    local ARGS=("$@")
Packit bbb0ff
    local element=''
Packit bbb0ff
Packit bbb0ff
    [[ "${1:0:2}" != "--" ]] && {
Packit bbb0ff
      local element="$1"
Packit bbb0ff
      shift
Packit bbb0ff
    }
Packit bbb0ff
    local arg
Packit bbb0ff
    while [[ $# -gt 0 ]]; do
Packit bbb0ff
      case $1 in
Packit bbb0ff
      --)
Packit bbb0ff
        line+=" -- \"$(echo -n "$2" | base64 -w 0)\""
Packit bbb0ff
        printf -v lineraw "%s -- %q" "$lineraw" "$2"
Packit bbb0ff
        shift 2
Packit bbb0ff
        break
Packit bbb0ff
        ;;
Packit bbb0ff
      --*)
Packit bbb0ff
        line+=" $1=\"$(echo -n "$2" | base64 -w 0)\""
Packit bbb0ff
        printf -v lineraw "%s %s=%q" "$lineraw" "$1" "$2"
Packit bbb0ff
        shift
Packit bbb0ff
        ;;
Packit bbb0ff
      *)
Packit bbb0ff
        __INTERNAL_LogText "unexpected meta input format"
Packit bbb0ff
        set | grep ^ARGS=
Packit bbb0ff
        exit 124
Packit bbb0ff
        ;;
Packit bbb0ff
      esac
Packit bbb0ff
      shift
Packit bbb0ff
    done
Packit bbb0ff
    [[ $# -gt 0 ]] && {
Packit bbb0ff
      __INTERNAL_LogText "unexpected meta input format"
Packit bbb0ff
      set | grep ^ARGS=
Packit bbb0ff
      exit 125
Packit bbb0ff
    }
Packit bbb0ff
Packit bbb0ff
    printf -v indent '%*s' $__INTERNAL_METAFILE_INDENT_LEVEL
Packit bbb0ff
Packit bbb0ff
    line="$indent${element:+$element }--timestamp=\"${__INTERNAL_TIMESTAMP}\"$line"
Packit bbb0ff
    lineraw="$indent${element:+$element }--timestamp=\"${__INTERNAL_TIMESTAMP}\"$lineraw"
Packit ffe333
    [[ -n "$DEBUG" ]] && echo "#${lineraw:1}" >> $__INTERNAL_BEAKERLIB_METAFILE
Packit bbb0ff
    echo "$line" >> $__INTERNAL_BEAKERLIB_METAFILE
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
__INTERNAL_PrintHeadLog() {
Packit bbb0ff
    __INTERNAL_LogText "\n::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::"
Packit bbb0ff
    __INTERNAL_LogText "::   $1"
Packit bbb0ff
    __INTERNAL_LogText "::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n"
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
Packit b05e72
# $1 - start time
Packit b05e72
# $2 - end time
Packit b05e72
# $3 - stat name
Packit b05e72
# $4 - stat good
Packit b05e72
# $5 - stat bad
Packit b05e72
# $6 - result
Packit b05e72
# $7 - result prefix '<PREFIX> RESULT: <RESULT>'
Packit b05e72
__INTERNAL_PrintFootLog(){
Packit b05e72
  local result_colored
Packit b05e72
  local starttime="$1"
Packit b05e72
  local endtime="$2"
Packit b05e72
  local stat_name="$3"
Packit b05e72
  local stat_good="$4"
Packit b05e72
  local stat_bad="$5"
Packit b05e72
  local result="$6"
Packit b05e72
  local result_pref="$7"
Packit b05e72
  [[ -n "$result_pref" ]] && result_pref+=" "
Packit b05e72
  __INTERNAL_colorize_prio "$result" result_colored
Packit b05e72
  __INTERNAL_LogText "::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::"
Packit b05e72
  __INTERNAL_LogText "::   Duration: $((endtime - starttime))s"
Packit b05e72
  __INTERNAL_LogText "::   $stat_name: $stat_good good, $stat_bad bad"
Packit b05e72
  __INTERNAL_LogText "::   ${result_pref}RESULT: $result" '' '' \
Packit b05e72
                     "::   ${result_pref}RESULT: $result_colored"
Packit b05e72
  __INTERNAL_LogText ''
Packit b05e72
}
Packit b05e72
Packit b05e72
Packit c623bd
# whenever any of the persistent variable is touched,
Packit bbb0ff
# functions __INTERNAL_PersistentDataLoad and __INTERNAL_PersistentDataSave
Packit bbb0ff
# should be called before and after that respectively.
Packit bbb0ff
Packit dc97bb
__INTERNAL_PersistentDataSave_sed='s/^declare/\0 -g/'
Packit dc97bb
# ugly workaround for bash-4.1.2 and older, where -g does not exist
Packit dc97bb
# there might be an issue when there's a line break in the variables and there's
Packit dc97bb
# "")'" or "()'" at the end of the line. This should not never happen, the worst
Packit dc97bb
# case might happen in the phase name but is is not expected to contain line
Packit dc97bb
# breaks
Packit dc97bb
declare -g &> /dev/null || __INTERNAL_PersistentDataSave_sed="s/(^declare -a[^=]+=)'\(/\1(/;s/([\"(]\))'$/\1/;s/declare\s+\S+\s+([^=]+=)/\1/"
Packit dc97bb
Packit bbb0ff
__INTERNAL_PersistentDataSave() {
Packit dc97bb
  declare -p \
Packit dc97bb
    __INTERNAL_STARTTIME \
Packit dc97bb
    __INTERNAL_TEST_STATE \
Packit dc97bb
    __INTERNAL_PHASES_PASSED \
Packit dc97bb
    __INTERNAL_PHASES_FAILED \
Packit dc97bb
    __INTERNAL_PHASES_SKIPPED \
Packit dc97bb
    __INTERNAL_JOURNAL_OPEN \
Packit dc97bb
    __INTERNAL_PHASE_OPEN \
Packit dc97bb
    __INTERNAL_PHASES_WORST_RESULT \
Packit dc97bb
    __INTERNAL_METAFILE_INDENT_LEVEL \
Packit dc97bb
    __INTERNAL_PHASE_TYPE \
Packit dc97bb
    __INTERNAL_PHASE_NAME \
Packit dc97bb
    __INTERNAL_PHASE_FAILED \
Packit dc97bb
    __INTERNAL_PHASE_PASSED \
Packit dc97bb
    __INTERNAL_PHASE_STARTTIME \
Packit dc97bb
    __INTERNAL_PHASE_TXTLOG_START \
Packit dc97bb
    __INTERNAL_PHASE_METRICS \
Packit dc97bb
    __INTERNAL_TEST_NAME \
Packit dc97bb
    | sed -r "$__INTERNAL_PersistentDataSave_sed" > "$__INTERNAL_PERSISTENT_DATA"
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
__INTERNAL_PersistentDataLoad() {
Packit c623bd
  [[ -r "$__INTERNAL_PERSISTENT_DATA" ]] && . "$__INTERNAL_PERSISTENT_DATA"
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
# AUTHORS
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
: <<'=cut'
Packit bbb0ff
=pod
Packit bbb0ff
Packit bbb0ff
=head1 AUTHORS
Packit bbb0ff
Packit bbb0ff
=over
Packit bbb0ff
Packit bbb0ff
=item *
Packit bbb0ff
Packit bbb0ff
Petr Muller <pmuller@redhat.com>
Packit bbb0ff
Packit bbb0ff
=item *
Packit bbb0ff
Packit bbb0ff
Jan Hutar <jhutar@redhat.com>
Packit bbb0ff
Packit bbb0ff
=item *
Packit bbb0ff
Packit bbb0ff
Ales Zelinka <azelinka@redhat.com>
Packit bbb0ff
Packit bbb0ff
=item *
Packit bbb0ff
Packit bbb0ff
Petr Splichal <psplicha@redhat.com>
Packit bbb0ff
Packit bbb0ff
=item *
Packit bbb0ff
Packit bbb0ff
Dalibor Pospisil <dapospis@redhat.com>
Packit bbb0ff
Packit bbb0ff
=item *
Packit bbb0ff
Packit bbb0ff
Jakub Heger <jheger@redhat.com>
Packit bbb0ff
Packit bbb0ff
=back
Packit bbb0ff
Packit bbb0ff
=cut