DOKK Library

Howto: Using DejaGnu for Testing - A Simple Introduction

Authors Jeremy Bennett

License CC-BY-2.0

Plaintext
    Howto: Using DejaGnu for Testing
                     A Simple Introduction




Jeremy Bennett
Embecosm

Application Note 8. Issue 1
Publication date April 2010
Legal Notice
This work is licensed under the Creative Commons Attribution 2.0 UK: England & Wales
License. To view a copy of this license, visit http://creativecommons.org/licenses/by/2.0/uk/
or send a letter to Creative Commons, 171 Second Street, Suite 300, San Francisco, California,
94105, USA.
This license means you are free:
•     to copy, distribute, display, and perform the work
•    to make derivative works
under the following conditions:
•    Attribution. You must give the original author, Embecosm (www.embecosm.com), credit;
•    For any reuse or distribution, you must make clear to others the license terms of this
     work;
•    Any of these conditions can be waived if you get permission from the copyright holder,
     Embecosm; and
•    Nothing in this license impairs or restricts the author's moral rights.
The software examples written by Embecosm and used in this document are licensed under the
GNU General Public License (GNU General Public License). For detailed licensing information
see the file COPYING in the source code of the examples.
Embecosm is the business name of Embecosm Limited, a private limited company registered
in England and Wales. Registration number 6577021.




ii                           Copyright © 2010 Embecosm Limited
Table of Contents
1. Introduction ................................................................................................................ 1
     1.1. Target Audience ................................................................................................ 1
     1.2. Further information .......................................................................................... 1
     1.3. About Embecosm Application Notes .................................................................. 1
2. Overview of DejaGnu ................................................................................................... 2
     2.1. The runtest command ...................................................................................... 2
     2.2. The expect language ......................................................................................... 3
     2.3. A typical test framework directory structure ..................................................... 3
     2.4. DejaGnu configuration files ............................................................................... 3
3. Writing tests using expect ........................................................................................... 6
     3.1. Test results ...................................................................................................... 7
     3.2. The expect command ....................................................................................... 7
          3.2.1. Patterns for use with the expect command ............................................. 8
     3.3. An example test .............................................................................................. 10
          3.3.1. Automating testing ............................................................................... 11
4. Using DejaGnu standalone ........................................................................................ 13
5. Using DejaGnu with autoconf, automake and libtool ................................................... 14
     5.1. The configure.ac file ...................................................................................... 14
     5.2. Makefile.am files ............................................................................................. 14
     5.3. Fine tuning autoconf and automake with DejaGnu ........................................... 15
          5.3.1. Example: Short test names. .................................................................. 16
Glossary ....................................................................................................................... 18
References .................................................................................................................... 19




iii                                      Copyright © 2010 Embecosm Limited
List of Tables
2.1. runtest options and corresponding expect variables. ................................................ 3




iv                                Copyright © 2010 Embecosm Limited
Chapter 1. Introduction
DejaGnu is a testing framework, originally developed for the GNU project. This application note
was written in response to the author's frustration at setting up a DejaGnu test framework for
the first time, using the existing documentation [3].
DejaGnu can be used standalone, but it is most useful when integrated with the GNU autotools
(autoconf automake and libtool). This application note describes both modes of use.
This application note is deliberately incomplete. It only covers the most commonly used
features and options. The intention is that, having got an initial test suite up and running,
the user will be confident in reading the full DejaGnu documentation (see Section 1.2).

1.1. Target Audience
Setting up DejaGnu for the first time is a challenge. This application note is intended for
software engineers putting together their first test suite using DejaGnu.

1.2. Further information
The main source of information is the DejaGnu user guide by Rob Savoye [3]. The most useful
section is the Unit Testing API, which lists all the procedures which can be used when writing
tests.
DejaGnu is implemented as the runtest command. It is documented in its own manual
page (man runtest). However the manual page is incomplete, and additional options to this
command may be identified by using runtest ��help.
Tests are written in an extension to the Tool Command Language (TCL), known as expect. TCL
is extensively documented on its website (see www.tcl.tk/doc). Of particular value is the TCL
tutorial on that site [1].
Expect has its own manual page (man expect), which provides a "succinct" description of the
main language commands. Comprehensive documentation may be found in the book Exploring
Expect by Don Libes [2].

1.3. About Embecosm Application Notes
Embecosm publishes a series of free and open source application notes, designed to help
working engineers with practical problems.
Feedback is always welcome, which should be sent to <info@embecosm.com>.




1                             Copyright © 2010 Embecosm Limited
Chapter 2. Overview of DejaGnu
DejaGnu is designed to run on POSIX compliant systems and is compliant with the
POSIX 1003.3 standard for test frameworks. It comprises a command to run tests (runtest),
a language in which to write tests (expect), a standard directory structure for the tests and
a set of configuration files.
           Note
           DejaGnu is not installed by default on most Linux systems. However most systems
           provide it as a standard extra. If not, it can be downloaded from www.gnu.org/
           software/dejagnu.

2.1. The runtest command
Central to DejaGnu is the runtest command. It takes the general form:

    runtest [options] [test]

The most important options when getting started are as follows.
--tool toolname                The naming of this option is confusing. It is the name of the
                               group of tests being carried out. This might be the name of a
                               tool (for example or1ksim), but it might equally be an indicator
                               of a type of test (for example unit).
                               The toolname is important, because it is used to construct the
                               names of other entities: the directories where tests may be
                               found and the name of a tool specific configuration file.
--srcdir dir                   This specifies a path where directories of tests may be found.
                               A directory containing tool specific configuration files (lib) is
                               also found in this directory.
                               The actual names of the directories containing tests must be
                               prefixed by the name of the tool, and by convention end with
                               the suffix .tests.
                               Thus for the tool or1ksim, the tests might appear in directories
                               named or1ksim.tests or or1ksim-profiling.tests.
--outdir dir                   This specifies a directory where all the output logs will be
                               placed.
--target_board board           This is one of the hidden options, only shown with
                               runtest ��help. It specifies board(s) on which the tests should
                               be run. This also controls which board specific configuration
                               file(s) will be used (see Section 2.4).
If no test is specified, runtest will run all the tests it can find, which match the specified
toolname. Otherwise it will run only the test specified.
           Note
           Options may also be set in configuration files (see Section 2.4). Where an option is
           set both on the command line and in a configuration file, the command line will
           take precedence.
           Caution
    !      There are a number of options which are not documented in the manual. You can
           see all of the options by running runtest --help




2                             Copyright © 2010 Embecosm Limited
2.2. The expect language
Strictly speaking, expect is a tool, rather than a language. However it is easiest to regard it as
a language which extends TCL. Before writing code using expect you should be fully familiar
with TCL [1].
Expect scripts spawn test programs, to which they supply input and check that the response
is as expected. A full description of how to write tests is given in Chapter 3 below.

2.3. A typical test framework directory structure
DejaGnu has some basic expectations of where it will find files, although this can be overridden
with command line options to runtest.
By convention, the test framework lives within a directory testsuite. Within that directory
are the following sub-directories:
config             An optional directory containing expect configuration files for each of the
                   different types of target board that might be tested (see Section 2.4). The
                   use of this directory depends on it being set up as part of the configuration.
                   These have the general name board.exp. For example unix.exp for the
                   default Unix target.
lib                A directory containing expect configuration files for each of the tools being
                   tested (see Section 2.4).
                   These files are named toolname.exp, where toolname is the tool being tested.
Test               Directories named toolname[type].tests contain expect tests for the tool
directories        toolname. The optional type field allows the tests to be split into several
                   directories.
                   For example a compiler tool named xcc might have tests both of the compiler
                   (in one directory, xcc-compile.tests) and the resulting code (in a second
                   directory, xcc-execute.tests).
                   Strictly speaking the suffix .tests is not required, but it is a common
                   convention.
                   Within each test directory, the tests, written in expect, all have the file suffix
                   .exp.

2.4. DejaGnu configuration files
Configuration files are used to set global variables and to define helper functions.
DejaGnu has a number of global variables which are set to correspond to runtest command
line arguments. However they can alternatively be set in the various configuration files (if both
are used, the command line takes precedence). The DejaGnu guide [3] documents them in full,
but some of the most useful are shown in in Table 2.1.
runtest         expect           Description
--all           all_flag         Display all test results if set (default is only to display
                                 failures).
--srcdir        srcdir           The directory containing test sub-directories and the tool
                                 specific configuration directory, lib.
--tool          tool             The name of the tool being tested.
--verbose       verbosity        The degree of verbosity required. Default is 0. Value of the
                                 variable is incremented for each time it appears on the
                                 command line.
Table 2.1. runtest options and corresponding expect variables.




3                              Copyright © 2010 Embecosm Limited
DejaGnu has a plethora of configuration files, each of which contain expect script that is
processed before each test. The historical naming of some of these files can be confusing.
Although these configuration files are all optional, runtest may complain if it can't find them.
So it's worth setting them up, just to stop the messages.
The configuration files are read in the following sequence.
Personal      This is in the user's home directory, ~/.dejagnurc. In general it is only used to
config file   set variables that control personal taste in output.
Local         This is always named site.exp and is looked for in the directory where the tests
config file   are being run. In general it is used to set variables specific to the tool or tools
              being tested.
              If GNU autotools (autoconf, automake and libtool) are being used to drive DejaGnu
              this file will be created automatically whenever make is run. It will be placed in the
              main test suite directory, but within the build directory hierarchy, not the source
              directory hierarchy. It is this directory from which runtest will be executed.
              When GNU autotools generate site.exp, the file is created in two halves, separated
              by a comment line. Only the first part is regenerated every time make is run, so
              changes may safely be made in the second half.
              This is a convenient place for quickly testing changes. However the local config
              file in an autotools environment is inherently transient (it is in the build directory,
              not the source directory), so permanent changes should be placed in one of the
              other config files.
Global        This is intended as a file to allow a group testing the same product to share
config file   common settings. It is identified by the DEJAGNU environment variable, which
              should always be set to avoid warnings.
Board         This is used for settings specific to a particular target board, as specified by the
config file   --target_board option to runtest (see Section 2.1). If no target board is specified,
              then DejaGnu running on a POSIX system will typically decide the target is Unix
              and look for a file named unix.exp.
              The search path for board configuration files is in the global variable boards_dir,
              which by default includes /usr/share/dejagnu/baseboards and /usr/share/
              dejagnu/config.
              It is common to append additional directories to this search path in one of
              the earlier configuration directories (typically the global config file) to provide
              additional board specific information. This can be done by using the TCL lappend
              function. For example, to look in the config sub-directory of the main test
              directory for board specific settings, the following would be suitable in the global
              configuration file.


                 lappend boards_dir "$srcdir/boards"


                         Note
                         If multiple board configuration files are found in the different
                         directories, they will all be used in the order they are found.

Tool          Finally DejaGnu will load code from a tool specific configuration file. This will
config file   be found in the lib sub-directory of the main test directory. For a tool named
              toolname, the file will be lib/toolname.exp.




4                               Copyright © 2010 Embecosm Limited
     This is the place to put helper functions for use by test code.
    Note
    When running runtest, multiple test programs may be found in the test directory
    or directories. These are effectively concatenated, so they are run one after the other
    after running all the configurations.
    The important thing to remember is that this means the configuration files are only
    read once, not once for each test.




5                      Copyright © 2010 Embecosm Limited
Chapter 3. Writing tests using expect
Each DejaGnu test is a sequence of expect commands. These are standard TCL commands
with some additions, which make the language particularly suitable for testing. man expect
documents all the commands specific to expect. The most useful of these are:

expect            This is the most important of the commands. It takes a series of pairs
                  of patterns and actions and waits until one of the patterns matches the
                  output of a spawned process (see spawn below), or a specified time period
                  has passed or an end of file has been seen. When a pattern matches, its
                  corresponding body is executed.
                  This command has a considerable number of options, and is described in
                  detail in a separate section (see Section 3.2).

send              This command is used to send data to the standard input of a spawned
                  process (see spawn below).

send_error        These commands are used to send output to respectively the standard error
send_log          of the user, the log file and the standard output of the user. In other words
send_user         for data that is not to go to the spawned process.

spawn
                     spawn [opts] program args


                  spawn starts a program and its arguments in a child process, connecting its
                  stdin, stdout and stderr so they may be written and read by other expect
                  commands, most notably the expect command.

          Note
          There is the potential for confusion here, since expect is both the name of the
          language and a command within that language.

Expect defines and uses a number of TCL global variables. The most important are associated
with the expect command and documented in the section on that command (see Section 3.2).

On top of this DejaGnu defines a number of procedures which facilitate testing. These are
documented in the DejaGnu manual's section on Unit Testing [3]. The most useful are:

fail              These procedures all report the result of a test. They are described in more
pass              detail below (see Section 3.1.
xfail
xpass
untested
unresolved
unsupported

warning           Writes a message to the log, prepended by the string WARNING. Once more
                  than warning_threshold warnings have been given the test is assumed to
                  be unresolved. The next call to one of the result procedures will behave as
                  though unresolved had been called.
                  The value of warning_threshold (default 3) may be read and written with
                  get_warning_threshold and set_warning_threshold.




6                            Copyright © 2010 Embecosm Limited
perror             Writes a message to the log, prepended by the string ERROR. The next call
                   to one of the result procedures will behave as though unresolved had been
                   called.

3.1. Test results
The results from all the tests encountered by runtest are reported in the log file and
counted, for reporting on completion. The results are triggered by calling the appropriate result
procedure, which takes a string to identify the test concerned. The possible results are as
follows:
FAIL                     Indicates that a test has failed. Triggered by calling the fail
                         procedure.
PASS                     Indicates that a test has passed. Triggered by calling the pass
                         procedure.
XFAIL                    Indicates that a test has failed as expected. Triggered by calling the
                         xfail procedure.
                                    Note
                                    POSIX 1003.3 does not recognize the concept of expected
                                    failure (tests either fail or pass), so compliant tests should
                                    not generate this result.
XPASS                    Indicates that a test which was expected to fail has passed. Triggered
                         by calling the xpass procedure.
                                     Note
                                     POSIX 1003.3 does not recognize the concept of expected
                                     failure (tests either fail or pass), so compliant tests should
                                     not generate this result.
UNTESTED                 Indicates that a feature was not tested. Triggered by calling the
                         untested procedure. This is a good way to mark tests that need to
                         be completed.
UNRESOLVED               Indicates that the output from a test needs manual inspection.
                         Triggered by calling the unresolved procedure. Commonly used when
                         tests timeout.
                                    Note
                                    Any test which calls perror or calls warning more than
                                    warning_threshold times will cause the next call to any
                                    result function in this list to behave as though unresolved
                                    was called.
UNSUPPORTED              Indicates that a test is not supported. Triggered by calling the
                         unsupported procedure. Used for tests which depend on some
                         conditionally available feature. For example for tests which cannot
                         run on a particular target board.

3.2. The expect command
The general form of this command is


    expect -flags pat1 body1 ... -flags patn bodyn




7                             Copyright © 2010 Embecosm Limited
The command waits until one of the patterns matches the output of a spawned process, a
specified time period has passed, or an end-of-file is seen. It then executes the corresponding
body.

If (as is usual) the command takes more than one line, the arguments must be surrounded
by braces. However substitutions will still occur within these braces, unlike standard TCL

A very simple example might be as follows.


     expect {
         ERROR              {fail "Error encountered.\n"; }
         "Test complete"    {pass "Test completed.\n";}
         timeout            {unresolved "Timeout.\n";}
     }


The expect command returns a result, which is the result of the body executed on a pattern
match.

The expect command will be called each time there is new input. It is important to understand
two aspects of expect command behavior.

1.     The expect command will skip past any unmatched text. So the above example would
       pass if the spawned program generated the following output.

          Computing results
          Final result is 42
          Test complete


       The first two lines don't match, so are ignored.

2.     The expect command is not line oriented. Thus the following output from the spawned
       program would also pass.

          FooTest completeBar


3.2.1. Patterns for use with the expect command
There are a wide range of possible patterns that expect can use.

Plain strings       Plain strings. In the previous example the strings ERROR and "Test
                    complete" were used. Double quotation marks are needed where the string
                    contains a space.

eof                 Matches if the stream from the spawned process reaches end of file.
                    Typically because the spawned process has completed execution.

timeout             Matches if more than timeout seconds have passed since the spawned
                    process started execution. The default timeout period is 10 seconds, but
                    may be changed by setting the timeout global variable.
                    The timeout value may be also set for the current expect command by using
                    the -timeout flag as a pattern (see below).

default             Equivalent to matching either eof or timeout.




8                              Copyright © 2010 Embecosm Limited
                   -timeout t. Use t seconds as the timeout for the current expect command.

full_buffer        By default, the expect command buffers up to 2000 bytes. If more than
                   this is encountered while reading bytes, earlier bytes will be forgotten. This
                   keyword will match if the buffer is full, allowing this circumstance to be
                   trapped.
                               Note
                               The size of the buffer can be increased using the procedure
                               match_max. However very large values down will slow down the
                               pattern matcher.

null               Matches a single ASCII character 0.

"Globbed"          These are patterns specified as for the TCL string match command, which
expressions        is similar to the syntax of shell regular expressions (commonly known as
                   "glob" patterns).
                   It is possible that patterns might match flags to the expect command, in
                   which case they can be protected by using the -gl flag. So for example the
                   following would match the string "-gl".


                      expect {
                          -gl -gl {puts "Matched -gl\n"}
                      }


                   In general any pattern starting with '-' should be protected using -gl to
                   future proof against new flags.

Regular            These patterns follow the syntax defined by the TCL regexp command. They
expressions        are introduced with the flag -re.

Exact strings      These are prefixed by the -ex flag. This is needed for strings containing
                   characters such as '*' that would otherwise be interpreted as part of a
                   globbed pattern.

Case insensitive   Prefixing any pattern by the -nocase flag will cause the input to be matched
match              as though it were all lower case. The pattern should thus be all in lower case.

When matching a pattern, any matching and previously unmatched output is saved in the
variable expect_out(buffer). The matched output may be found in expect_out(0,string).

If a regular expression with sub-expressions was used, then the matching sub-expressions
(up to 9 in total) may be found in expect_out(1,string) through expect_out(1,string).

If the flag -indices was used before any match, the start and end indices of the
matching string can be found in expect_out(0,start) and expect_out(0,end). Where the
pattern was a regular expression, start and end positions of up to 9 sub-strings may be
found in expect_out(1,start) and expect_out(1,end) through expect_out(9,start) and
expect_out(9,end).

These strings are useful when evaluating the body associated with the pattern matched.

Once matching is complete, the matched output (and any preceding output) is discarded from
the internal buffers. However it can be retained by preceding the match with the -notransfer
flag. This has little value in finished scripts, but can help when developing and debugging tests.



9                              Copyright © 2010 Embecosm Limited
3.3. An example test
Writing a test is a matter of spawning the test program, then using the expect to match the
output and report failure as appropriate.

A simple example is as follows.


     # Timeout reduced to 3 seconds
     set timeout 3

     # The name of this test and the command we will run
     set test_name "Simple test"
     set command_line "or32-elf-sim -f default.cfg test-prog.or32"

     # When verbose, tell the user what we are running
     if { $verbose > 1 } {
         send_user "starting $command_line\n"
     }

     # Run the program.
     spawn $command_line

     expect {
         # Check for any warning messages in the output first
         Warning {
              fail "$test_name: warning: $expect_out(buffer)"
         }

         # Check for any error messages
         ERROR {
             fail "$test_name: error: $expect_out(buffer)"
         }

         # The string indicating successful completion
         "Test complete" {
              pass "$test_name\n"
         }

         # EOF and timeout only come after everything else. EOF must be an error.
         eof {
             fail "$test_name: EOF\n"
         }

         # Timeout requires inspection to determine the cause of failure.
         timeout {
             unresolved "$test_name: timeout"
         }
     }


This test will look first for the strings "Warning" or "ERROR" in the output stream from the
spawned program. Then it will look for the string Test complete. Finally it will check for end-
of-file or timeout.




10                            Copyright © 2010 Embecosm Limited
The ordering matters. For a small program, the spawned output could all fit in the buffer.
By that time, the program might have completed execution. So that buffer would match both
Test complete and end-of-file. So we must check for successful completion first.
Similarly the program might generate warnings or errors, but still print Test complete. So we
should check for warnings or errors before we test for successful completion.

3.3.1. Automating testing
The example in Section 3.3 is a fairly common framework, and it makes sense to automate
it using TCL procedure. For example the test name and command line could be passed as
arguments to the procedure as follows.

     proc runmytest { test_name command_line } {
         global verbose

         # When verbose, tell the user what we are running
         if { $verbose > 1 } {
             send_user "starting $command_line\n"
         }

         # Run the program.
         spawn $command_line

         expect {
             # Check for any warning messages in the output first
             Warning {
             fail "$test_name: warning: $expect_out(buffer)"
             }

             # Check for any error messages
             ERROR {
             fail "$test_name: error: $expect_out(buffer)"
             }

             # The string indicating successful completion
             "Test complete" {
                  pass "$test_name\n"
             }

             # EOF and timeout only come after everything else. EOF must be an error.
             eof {
             fail "$test_name: EOF\n"
             }

             # Timeout requires inspection to determine the cause of failure.
             timeout {
                 unresolved "$test_name: timeout"
             }
         }
     }

The code is identical, except we must note from within the procedure that verbose is a global
variable.




11                             Copyright © 2010 Embecosm Limited
Our series of tests could then just be as follows

     # Timeout reduced to 3 seconds
     set timeout 3

     runmytest "Simple test" "or32-elf-sim -f default.cfg test-prog.or32"
     runmytest "Harder test" "or32-elf-sim -f default.cfg test-prog2.or32"
     runmytest "Hardest test" "or32-elf-sim -f default.cfg test-prog3.or32"


The correct place for a procedure shared amongst a number of tests like this is the tool
configuration file (see Section 2.4).




12                            Copyright © 2010 Embecosm Limited
Chapter 4. Using DejaGnu standalone
To run a DejaGnu test framework standalone is straightforward.
1.    Create a directory structure for the test framework (see Section 2.3).
2.    Write any test programs and compile them.
3.    Write tests in expect and place them in the tool specific test directory (or directories)
      (see Chapter 3)
4.    Place any TCL support procedures for the tests in the tool specific configuration file (see
      Section 2.4 and Section 3.3.1).
5.    Run runtest, specifying the source directory and tool name.
This sequence of steps can easily be captured in either a script file, or a hand-written make file.




13                             Copyright © 2010 Embecosm Limited
Chapter 5. Using DejaGnu with autoconf, automake
and libtool
Almost all use of DejaGnu is in practice within the context of projects using the GNU autotools
(autoconf, automake and libtool). These tools understand DejaGnu and provide specific hooks.

The overall directory structure is as described earlier (see Section 2.3). By convention the
tests are all run from a directory named testsuite, but this need not be the case. That
directory, as well as containing the tool specific test directories, tool specific configuration
directory (lib) and possible a board specific configuration directory should also contain the
global configuration file and directories for any test programs that must be compiled.

Autotools programs are usually configured and built in a separate directory structure. runtest
will be executed in the testsuite directory, within the build directory hierarchy, not the source
hierarchy. It is within this directory that the local configuration file, site.exp will be generated
when running make.

There are no explicit changes needed in the use of libtool. However some changes are needed
to configure.ac for autoconf and Makefile.am for automake.

5.1. The configure.ac file
This is the file that is modified by autoconf and provides ultimately the definitions that will
feed into automake. It will need some additional changes to tell it about DejaGnu

            Note
            In some older systems, this file may be named configure.in.


Where there are multiple configuration files, it is usually the top level one which is changed.
The important thing is it should be the configuration file which feeds into the transformation
of the Makefile.am file in the main test directory (testsuite).

The file should be extended to set the DEJAGNU environment variable to point to the global
configuration file. There are two approaches to this. The simplest is just to set the value.
However it is more flexible to only set a value if it is not already set. This allows the user to try
different global configurations by manually setting DEJAGNU before running tests.


     if test x"$DEJAGNU" = x
     then
        DEJAGNU="\$(top_srcdir)/testsuite/global-conf.exp"
     fi

     AC_SUBST(DEJAGNU)



5.2. Makefile.am files
There should be a Makefile.am in the main test directory (testsuite) and each of its sub-
directories.




14                              Copyright © 2010 Embecosm Limited
If dejagnu appears in AUTOMAKE_OPTIONS, then automake will assume a DejaGnu based test
system. This will be run when the user uses make check.

The tests must pick up the DEJAGNU environment variable. So it should be exported from the
Makefile.am in the main test directory.

The tool(s) must be named. This is done by setting the DEJATOOL variable. If there are multiple
tools to be tested, specify them all with DEJATOOL

The following shows part of a Makefile.am for a typical test main directory.


     SUBDIRS = config           \
               lib              \
               libsim.tests     \
               or1ksim.tests    \
               test-code        \
               test-code-or1k

     EXTRA_DIST = global-conf.exp

     # Setup for DejaGNU
     AUTOMAKE_OPTIONS    = dejagnu

     export DEJAGNU

     DEJATOOL             = libsim \
                            or1ksim


Note the use of EXTRA_DIST to specify that the global configuration file must be added to the
distribution. In this example there is a board specific configuration directory (config), an
expect test directory for each of two tools (libsim.tests and or1ksim.tests) and two directories
of test program code (test-code and test-code-or1k).

Makefile.am files are needed in the various config and expect test directories, but only to
ensure their code is added to the distribution. There is nothing that needs compiling. For
example, the Makefile.am in the tool specific configuration directory (lib) is as follows.


     # Just distribute this stuff
     EXTRA_DIST = libsim.exp \
                  or1ksim.exp



5.3. Fine tuning autoconf and automake with DejaGnu
The flags passed to runtest by default are held in the variable RUNTESTDEFAULTFLAGS. Its default
value is --tool $$tool --srcdir $$srcdir. $$tool will expand to each tool specified in
DEJATOOL and $$srcdir to the full name of the source directory.

This variable can be overridden in the configuration file.

It is also sometimes useful to override runtest options just within the Makefile.am. This can
be done by setting the variable AM_RUNTESTFLAGS within the Makefile.am.




15                            Copyright © 2010 Embecosm Limited
5.3.1. Example: Short test names.
DejaGnu will log the name of each file of expect code found in the test directory. However by
default it will use the full file name, which can make for hard to read listings.

This can be adjusted by redefining RUNTESTDEFAULTFLAGS in configure.ac.


     # The following line will ensure that short names are used for test names.
     RUNTESTDEFAULTFLAGS="--tool \$\$tool"
     AC_SUBST(RUNTESTDEFAULTFLAGS)


By not defining --srcdir on the command line, runtest will look instead in the local
configuration file, automatically generated by automake and autoconf, which includes a
definition of the global variable srcdir.

This is useful, because in the local configuration file, the srcdir is specified with its relative
name (for example ../../testsuite). This is shorter than the value of $srcdir that would be
used as the command line value. The result is that the name of the tests run will be shorter,
making for clearer output. Instead of:


                      === or1ksim tests ===

     Schedule of variations:
         unix

     Running target unix
     Using ../../testsuite/config/unix.exp as board description file for target.
     Running /home/jeremy/svntrunk/Projects/or1ksim/testsuite/or1ksim.tests/basic
     .exp ...
     Running /home/jeremy/svntrunk/Projects/or1ksim/testsuite/or1ksim.tests/cache
     .exp ...

     ...

     Running /home/jeremy/svntrunk/Projects/or1ksim/testsuite/or1ksim.tests/mycom
     press.exp ...
     Running /home/jeremy/svntrunk/Projects/or1ksim/testsuite/or1ksim.tests/tick.
     exp ...

                      === or1ksim Summary ===

     # of expected passes                21


We get the more concise:




16                             Copyright © 2010 Embecosm Limited
                    === or1ksim tests ===

     Schedule of variations:
         unix

     Running target unix
     Using ../../testsuite/config/unix.exp as board description file for target.
     Running ../../testsuite/or1ksim.tests/basic.exp ...
     Running ../../testsuite/or1ksim.tests/cache.exp ...

     ...

     Running ../../testsuite/or1ksim.tests/mycompress.exp ...
     Running ../../testsuite/or1ksim.tests/tick.exp ...

                    === or1ksim Summary ===

     # of expected passes               21




17                             Copyright © 2010 Embecosm Limited
Glossary
Expect
   Expect is a program that "talks" to other interactive programs. Colloquially it is used to
   refer to the language used by that program, which is an extension of TCL.
   See also: Tool Command Language

runtest
   runtest is the main command of the DejaGnu testing framework. It runs a series of tests
   written in expect and reports the results of those tests.
   See also: Expect

Tool Command Language (TCL)
   TCL is an open source dynamic scripting language, widely used for rapid prototyping and
   system admin tasks. It is designed to be highly extensible.




18                           Copyright © 2010 Embecosm Limited
References
[1] Tcl Tutorial Clif Flynt. Version for TCL 8.5 available at www.tcl.tk/man/tcl8.5/tutorial/
      tcltutorial.html.
[2] Exploring Expect: A Tcl-Based Toolkit for Automating Interactive Programs Don Libes.
     O'Reilly and Associates 1995, 1-56592-090-2.
[3] DejaGnu: The GNU Testing Framework Rob Savoye. Free Software Foundation            2004.
     Available at www.gnu.org/software/dejagnu/manual.




19                           Copyright © 2010 Embecosm Limited