Blame src/beakerlib.sh

Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
#
Packit bbb0ff
#   Name: beakerlib.sh - part of the BeakerLib project
Packit bbb0ff
#   Description: The main BeakerLib script
Packit bbb0ff
#
Packit bbb0ff
#   Author: Petr Muller <pmuller@redhat.com>
Packit bbb0ff
#   Author: Ondrej Hudlicky <ohudlick@redhat.com>
Packit bbb0ff
#   Author: Jan Hutar <jhutar@redhat.com>
Packit bbb0ff
#   Author: Petr Splichal <psplicha@redhat.com>
Packit bbb0ff
#   Author: Ales Zelinka <azelinka@redhat.com>
Packit bbb0ff
#   Author: Dalibor Pospisil <dapospis@redhat.com>
Packit bbb0ff
#   Author: Martin Kyral <mkyral@redhat.com>
Packit bbb0ff
#   Author: Jakub Prokes <jprokes@redhat.com>
Packit bbb0ff
#
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
#
Packit bbb0ff
#   Copyright (c) 2008-2012 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
Packit bbb0ff
=pod
Packit bbb0ff
Packit bbb0ff
=for comment beakerlib-manual-header
Packit bbb0ff
Packit bbb0ff
=head1 NAME
Packit bbb0ff
Packit bbb0ff
BeakerLib - a shell-level integration testing library
Packit bbb0ff
Packit bbb0ff
=head1 DESCRIPTION
Packit bbb0ff
Packit bbb0ff
BeakerLib is a shell-level integration testing library, providing
Packit bbb0ff
convenience functions which simplify writing, running and analysis of
Packit bbb0ff
integration and blackbox tests.
Packit bbb0ff
Packit bbb0ff
The essential features include:
Packit bbb0ff
Packit bbb0ff
=over
Packit bbb0ff
Packit bbb0ff
=item
Packit bbb0ff
Packit bbb0ff
B<Journal> - uniform logging mechanism (logs & results saved in flexible XML
Packit bbb0ff
format, easy to compare results & generate reports)
Packit bbb0ff
Packit bbb0ff
=item
Packit bbb0ff
Packit bbb0ff
B<Phases> - logical grouping of test actions, clear separation of setup / test
Packit bbb0ff
/ cleanup (preventing false fails)
Packit bbb0ff
Packit bbb0ff
=item
Packit bbb0ff
Packit bbb0ff
B<Asserts> - common checks affecting the overall results of the individual
Packit bbb0ff
phases (checking for exit codes, file existence & content...)
Packit bbb0ff
Packit bbb0ff
=item
Packit bbb0ff
Packit bbb0ff
B<Helpers> - convenience functions for common operations such as managing
Packit bbb0ff
services, backup & restore
Packit bbb0ff
Packit bbb0ff
=back
Packit bbb0ff
Packit bbb0ff
The main script sets the C<BEAKERLIB> variable and sources other scripts where
Packit bbb0ff
the actual functions are defined. You should source it at the beginning of your
Packit bbb0ff
test with:
Packit bbb0ff
Packit bbb0ff
    . /usr/share/beakerlib/beakerlib.sh
Packit bbb0ff
Packit bbb0ff
See the EXAMPLES section for quick start inspiration.
Packit bbb0ff
Packit bbb0ff
See the BKRDOC section for more information about Automated documentation generator for BeakerLib tests.
Packit bbb0ff
Packit bbb0ff
=cut
Packit bbb0ff
Packit bbb0ff
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
# beakerlib-manual-include
Packit bbb0ff
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
Packit bbb0ff
:<<'=cut'
Packit bbb0ff
Packit bbb0ff
=pod
Packit bbb0ff
Packit bbb0ff
=for comment beakerlib-manual-footer
Packit bbb0ff
Packit bbb0ff
=head1 EXAMPLES
Packit bbb0ff
Packit bbb0ff
=head2 Simple
Packit bbb0ff
Packit bbb0ff
A minimal BeakerLib test can look like this:
Packit bbb0ff
Packit bbb0ff
    . /usr/share/beakerlib/beakerlib.sh
Packit bbb0ff
Packit bbb0ff
    rlJournalStart
Packit bbb0ff
        rlPhaseStartTest
Packit bbb0ff
            rlAssertRpm "setup"
Packit bbb0ff
            rlAssertExists "/etc/passwd"
Packit bbb0ff
            rlAssertGrep "root" "/etc/passwd"
Packit bbb0ff
        rlPhaseEnd
Packit bbb0ff
    rlJournalEnd
Packit bbb0ff
Packit bbb0ff
=head2 Phases
Packit bbb0ff
Packit bbb0ff
Here comes a bit more interesting example of a test which sets all
Packit bbb0ff
the recommended variables and makes use of the phases:
Packit bbb0ff
Packit bbb0ff
    # Include the BeakerLib environment
Packit bbb0ff
    . /usr/share/beakerlib/beakerlib.sh
Packit bbb0ff
Packit bbb0ff
    # Set the full test name
Packit bbb0ff
    TEST="/examples/beakerlib/Sanity/phases"
Packit bbb0ff
Packit bbb0ff
    # Package being tested
Packit bbb0ff
    PACKAGE="coreutils"
Packit bbb0ff
Packit bbb0ff
    rlJournalStart
Packit bbb0ff
        # Setup phase: Prepare test directory
Packit bbb0ff
        rlPhaseStartSetup
Packit bbb0ff
            rlAssertRpm $PACKAGE
Packit bbb0ff
            rlRun 'TmpDir=$(mktemp -d)' 0 'Creating tmp directory' # no-reboot
Packit bbb0ff
            rlRun "pushd $TmpDir"
Packit bbb0ff
        rlPhaseEnd
Packit bbb0ff
Packit bbb0ff
        # Test phase: Testing touch, ls and rm commands
Packit bbb0ff
        rlPhaseStartTest
Packit bbb0ff
            rlRun "touch foo" 0 "Creating the foo test file"
Packit bbb0ff
            rlAssertExists "foo"
Packit bbb0ff
            rlRun "ls -l foo" 0 "Listing the foo test file"
Packit bbb0ff
            rlRun "rm foo" 0 "Removing the foo test file"
Packit bbb0ff
            rlAssertNotExists "foo"
Packit bbb0ff
            rlRun "ls -l foo" 2 "Listing foo should now report an error"
Packit bbb0ff
        rlPhaseEnd
Packit bbb0ff
Packit bbb0ff
        # Cleanup phase: Remove test directory
Packit bbb0ff
        rlPhaseStartCleanup
Packit bbb0ff
            rlRun "popd"
Packit bbb0ff
            rlRun "rm -r $TmpDir" 0 "Removing tmp directory"
Packit bbb0ff
        rlPhaseEnd
Packit bbb0ff
    rlJournalEnd
Packit bbb0ff
Packit bbb0ff
    # Print the test report
Packit bbb0ff
    rlJournalPrintText
Packit bbb0ff
Packit bbb0ff
The ouput of the rlJournalPrintText command would produce an
Packit bbb0ff
output similar to the following:
Packit bbb0ff
Packit bbb0ff
    ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Packit bbb0ff
    :: [   LOG    ] :: TEST PROTOCOL
Packit bbb0ff
    ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Packit bbb0ff
Packit bbb0ff
    :: [   LOG    ] :: Test run ID   : debugging
Packit bbb0ff
    :: [   LOG    ] :: Package       : coreutils
Packit bbb0ff
    :: [   LOG    ] :: Installed:    : coreutils-7.6-9.fc12.i686
Packit bbb0ff
    :: [   LOG    ] :: Test started  : 2010-02-08 14:55:44
Packit bbb0ff
    :: [   LOG    ] :: Test finished : 2010-02-08 14:55:50
Packit bbb0ff
    :: [   LOG    ] :: Test name     : /examples/beakerlib/Sanity/phases
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/phases
Packit bbb0ff
    Description: Testing BeakerLib phases
Packit bbb0ff
    Author: Petr Splichal <psplicha@redhat.com>
Packit bbb0ff
Packit bbb0ff
    This example shows how the phases work in the BeakerLib on a
Packit bbb0ff
    trivial smoke test for the "touch", "ls" and "rm" commands from
Packit bbb0ff
    the coreutils package.
Packit bbb0ff
Packit bbb0ff
Packit bbb0ff
    ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Packit bbb0ff
    :: [   LOG    ] :: Setup
Packit bbb0ff
    ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Packit bbb0ff
Packit bbb0ff
    :: [   PASS   ] :: Checking for the presence of coreutils rpm
Packit bbb0ff
    :: [   PASS   ] :: Creating tmp directory
Packit bbb0ff
    :: [   PASS   ] :: Running 'pushd /tmp/tmp.IcluQu5GVS' # no-reboot
Packit bbb0ff
    :: [   LOG    ] :: Duration: 0s
Packit bbb0ff
    :: [   LOG    ] :: Assertions: 3 good, 0 bad
Packit bbb0ff
    :: [   PASS   ] :: RESULT: Setup
Packit bbb0ff
Packit bbb0ff
    ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Packit bbb0ff
    :: [   LOG    ] :: Test
Packit bbb0ff
    ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Packit bbb0ff
Packit bbb0ff
    :: [   PASS   ] :: Creating the foo test file
Packit bbb0ff
    :: [   PASS   ] :: File foo should exist
Packit bbb0ff
    :: [   PASS   ] :: Listing the foo test file
Packit bbb0ff
    :: [   PASS   ] :: Removing the foo test file
Packit bbb0ff
    :: [   PASS   ] :: File foo should not exist
Packit bbb0ff
    :: [   PASS   ] :: Listing foo should now report an error
Packit bbb0ff
    :: [   LOG    ] :: Duration: 1s
Packit bbb0ff
    :: [   LOG    ] :: Assertions: 6 good, 0 bad
Packit bbb0ff
    :: [   PASS   ] :: RESULT: Test
Packit bbb0ff
Packit bbb0ff
    ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Packit bbb0ff
    :: [   LOG    ] :: Cleanup
Packit bbb0ff
    ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Packit bbb0ff
Packit bbb0ff
    :: [   PASS   ] :: Running 'popd'
Packit bbb0ff
    :: [   PASS   ] :: Removing tmp directory
Packit bbb0ff
    :: [   LOG    ] :: Duration: 1s
Packit bbb0ff
    :: [   LOG    ] :: Assertions: 2 good, 0 bad
Packit bbb0ff
    :: [   PASS   ] :: RESULT: Cleanup
Packit bbb0ff
Packit bbb0ff
Note that the detailed test description is read from a separate
Packit bbb0ff
file PURPOSE placed in the same directory as the test itself.
Packit bbb0ff
Packit bbb0ff
A lot of useful debugging information is reported on the DEBUG level.
Packit bbb0ff
You can run your test with C<DEBUG=1 make run> to get them.
Packit bbb0ff
Packit bbb0ff
Verbosity of the test logging may be altered also by setting the LOG_LEVEL
Packit bbb0ff
variable. Possible values are "ERROR", "WARNING", "INFO" and "DEBUG". You will
Packit bbb0ff
see messages like the ones below.
Packit bbb0ff
Packit bbb0ff
    :: [ WARNING  ] :: rlGetArch: Update test to use rlGetPrimaryArch/rlGetSecondaryArch
Packit bbb0ff
    :: [  DEBUG   ] :: rlGetArch: This is architecture 'x86_64'
Packit bbb0ff
    :: [  ERROR   ] :: this function was dropped as its development is completely moved to the beaker library
Packit bbb0ff
    :: [   INFO   ] :: if you realy on this function and you really need to have it present in core beakerlib, file a RFE, please
Packit bbb0ff
Packit bbb0ff
Setting LOG_LEVEL="DEBUG" is equivalent to DEBUG=1.
Packit bbb0ff
Packit bbb0ff
=head1 BKRDOC
Packit bbb0ff
Packit bbb0ff
=over
Packit bbb0ff
Packit bbb0ff
=item Description
Packit bbb0ff
Packit bbb0ff
Bkrdoc is a documentation generator from tests written using BeakerLib
Packit bbb0ff
library. This generator makes documentation from test code with and also
Packit bbb0ff
without any documentation markup.
Packit bbb0ff
Packit bbb0ff
=item What it's good for
Packit bbb0ff
Packit bbb0ff
For fast, brief and reliable documentation creation. It`s good for
Packit bbb0ff
quick start with unknown BeakerLib test. Created documentations provides
Packit bbb0ff
information about the documentation credibility. Also created documentations
Packit bbb0ff
shows environmental variables and helps reader to run test script from
Packit bbb0ff
which was documentation created.
Packit bbb0ff
Packit bbb0ff
=item Bkrdoc project page
Packit bbb0ff
Packit bbb0ff
https://github.com/rh-lab-q/bkrdoc
Packit bbb0ff
Packit bbb0ff
=back
Packit bbb0ff
Packit bbb0ff
=head1 LINKS
Packit bbb0ff
Packit bbb0ff
=over
Packit bbb0ff
Packit bbb0ff
=item Project Page
Packit bbb0ff
Packit bbb0ff
https://github.com/beakerlib/beakerlib
Packit bbb0ff
Packit bbb0ff
=item Manual
Packit bbb0ff
Packit bbb0ff
https://github.com/beakerlib/beakerlib/wiki/man
Packit bbb0ff
Packit bbb0ff
=item Issues list
Packit bbb0ff
Packit bbb0ff
https://github.com/beakerlib/beakerlib/issues
Packit bbb0ff
Packit bbb0ff
=item Reporting issues
Packit bbb0ff
Packit bbb0ff
https://github.com/beakerlib/beakerlib/issues/new
Packit bbb0ff
Packit bbb0ff
=back
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
Ondrej Hudlicky <ohudlick@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
Petr Splichal <psplicha@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
Dalibor Pospisil <dapospis@redhat.com>
Packit bbb0ff
Packit bbb0ff
=item *
Packit bbb0ff
Packit bbb0ff
Martin Kyral <mkyral@redhat.com>
Packit bbb0ff
Packit bbb0ff
=item *
Packit bbb0ff
Packit bbb0ff
Jakub Prokes <jprokes@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
Packit bbb0ff
Packit bbb0ff
if set -o | grep posix | grep on ; then
Packit bbb0ff
    set +o posix
Packit bbb0ff
    export POSIXFIXED="YES"
Packit bbb0ff
else
Packit bbb0ff
    export POSIXFIXED="NO"
Packit bbb0ff
fi
Packit bbb0ff
Packit bbb0ff
export __INTERNAL_PERSISTENT_TMP=/var/tmp
Packit bbb0ff
Packit bbb0ff
# export COBBLER_SERVER for the usage in tests
Packit bbb0ff
test -f /etc/profile.d/cobbler.sh && . /etc/profile.d/cobbler.sh
Packit bbb0ff
Packit bbb0ff
set -e
Packit bbb0ff
export BEAKERLIB=${BEAKERLIB:-"/usr/share/beakerlib"}
Packit bbb0ff
. $BEAKERLIB/storage.sh
Packit bbb0ff
. $BEAKERLIB/infrastructure.sh
Packit bbb0ff
. $BEAKERLIB/journal.sh
Packit bbb0ff
. $BEAKERLIB/libraries.sh
Packit bbb0ff
. $BEAKERLIB/logging.sh
Packit bbb0ff
. $BEAKERLIB/rpms.sh
Packit bbb0ff
. $BEAKERLIB/testing.sh
Packit bbb0ff
. $BEAKERLIB/analyze.sh
Packit bbb0ff
. $BEAKERLIB/performance.sh
Packit bbb0ff
. $BEAKERLIB/virtualX.sh
Packit bbb0ff
. $BEAKERLIB/synchronisation.sh
Packit bbb0ff
if [ -d $BEAKERLIB/plugins/ ] ; then
Packit bbb0ff
    for __INTERNAL_beakerlib_source_plugin in $BEAKERLIB/plugins/*.sh ; do
Packit bbb0ff
        . $__INTERNAL_beakerlib_source_plugin
Packit bbb0ff
    done
Packit bbb0ff
fi
Packit bbb0ff
set +e