| \input texinfo |
| @setfilename dejagnu.info |
| @documentencoding us-ascii |
| @settitle DejaGnu |
| @dircategory Programming |
| @direntry |
| * DejaGnu: (dejagnu). The GNU testing framework. |
| @end direntry |
| |
| @node Top, Abstract, , (dir) |
| @top DejaGnu |
| |
| @menu |
| * Abstract:: |
| * Overview:: |
| * Getting DejaGnu up and running:: |
| * Running Tests:: |
| * Customizing DejaGnu:: |
| * Extending DejaGnu:: |
| * Unit Testing:: |
| * Reference:: |
| * Unit Testing API:: |
| |
| @detailmenu |
| --- The Detailed Node Listing --- |
| |
| Overview |
| |
| * What is DejaGnu ?:: |
| * New In This Release: Release Notes. |
| * Design Goals:: |
| * A POSIX conforming test framework: A POSIX Conforming Test Framework. |
| |
| Getting DejaGnu up and running |
| |
| * Test your installation:: |
| * Create a minimal project, e.g. calc: Create a minimal project; e_g_ calc. |
| * Our first automated tests:: |
| * A first remote test:: |
| |
| Running Tests |
| |
| * Make check: Make Check. |
| * Runtest:: |
| * The files DejaGnu produces.: Output Files. |
| |
| Customizing DejaGnu |
| |
| * Local Config File:: |
| * Global Config File:: |
| * Board Config File:: |
| * Remote Host Testing:: |
| * Config File Values:: |
| |
| Extending DejaGnu |
| |
| * Adding A New Testsuite: Adding a new Testsuite. |
| * Adding A New Tool:: |
| * Adding A New Target:: |
| * Adding A New Board:: |
| * Board Config File Values: Board File Values. |
| * Writing A Test Case:: |
| * Debugging A Test Case:: |
| * Adding A Test Case To A Testsuite.: Adding A Test Case To A Testsuite. |
| * Hints On Writing A Test Case:: |
| * Special variables used by test cases.: Test Case Variables. |
| |
| Unit Testing |
| |
| * What Is Unit Testing ?:: |
| * The dejagnu.h Header File: The dejagnu_h Header File. |
| |
| Reference |
| |
| * Obtaining DejaGnu:: |
| * Installation:: |
| * Builtin Procedures:: |
| * File Map:: |
| |
| Unit Testing API |
| |
| * C Unit Testing API:: |
| * C++ Unit Testing API:: |
| |
| @end detailmenu |
| @end menu |
| |
| @node Abstract, Overview, Top, Top |
| @chapter Abstract |
| |
| This document describes the functionality of DejaGnu, the |
| testing framework of the GNU project. DejaGnu is written in |
| Expect, which uses |
| Tcl as a command |
| language. Expect acts as a very |
| programmable shell. As with other Unix command shells, you can |
| run any program, but once the program is started, your test script |
| has programmable control over its input and output. This does not |
| just apply to the programs under test; @code{expect} |
| can also run any auxiliary program, such as |
| @code{diff} or @code{sh}, with full |
| control over its input and output. |
| |
| DejaGnu itself is merely a framework for the creation of |
| testsuites. Testsuites are distributed with each |
| application. |
| |
| @node Overview, Getting DejaGnu up and running, Abstract, Top |
| @chapter Overview |
| |
| @menu |
| * What is DejaGnu ?:: |
| * New In This Release: Release Notes. |
| * Design Goals:: |
| * A POSIX conforming test framework: A POSIX Conforming Test Framework. |
| @end menu |
| |
| @node What is DejaGnu ?, Release Notes, , Overview |
| @section What is DejaGnu ? |
| |
| DejaGnu is a framework for |
| testing other programs. Its purpose is to provide a single |
| front end for all tests. Think of it as a custom library of |
| Tcl procedures crafted to support writing a test harness. A |
| @emph{Test Harness} is the testing |
| infrastructure that is created to support a specific program |
| or tool. Each program can have multiple testsuites, all |
| supported by a single test harness. DejaGnu is written in |
| Expect, which in turn uses |
| Tcl -- Tool command |
| language. There is more information on Tcl at the @uref{http://www.scriptics.com,Scriptics} web site and the |
| Expect web site is at @uref{http://expect.nist.gov,NIST}. |
| |
| Julia Menapace first coined the term ``DejaGnu'' to describe |
| an earlier testing framework at Cygnus Support she had written |
| for @code{GDB}. When we replaced it with the |
| Expect-based framework, it was like DejaGnu all over again. |
| More importantly, it was also named after my daughter, @uref{http://www.welcomehome.org/deja/,Deja Snow Savoye} |
| (now 14 years old as of Feb 2004), who was a toddler |
| during DejaGnu's beginnings. |
| |
| DejaGnu offers several advantages for testing: |
| |
| @itemize |
| |
| @item |
| The flexibility and consistency of the DejaGnu |
| framework make it easy to write tests for any program, with |
| either batch oriented, or interactive programs. |
| |
| @item |
| DejaGnu provides a layer of abstraction which |
| allows you to write tests that are portable to any host or |
| target where a program must be tested. For instance, a test |
| for @code{GDB} can run from any supported host |
| system on any supported target system. DejaGnu runs tests on |
| many single board computers, whose operating software ranges |
| from a simple boot monitor to a real-time OS. |
| |
| @item |
| All tests have the same output format. This |
| makes it easy to integrate testing into other software |
| development processes. DejaGnu's output is designed to be |
| parsed by other filtering script and it is also human |
| readable. |
| |
| @item |
| Using Tcl and Expect, it's easy to create wrappers |
| for existing testsuites. By incorporating existing tests under |
| DejaGnu, it's easier to have a single set of report analyse |
| programs.. |
| @end itemize |
| |
| Running tests requires two things: the testing framework and |
| the testsuites themselves. Tests are usually written in |
| Expect using Tcl, but you can also use |
| a Tcl script to run a testsuite that is not based on |
| Expect. Expect |
| script filenames conventionally use @emph{.exp} as a |
| suffix; for example, the main implementation of the DejaGnu test |
| driver is in the file |
| runtest.exp.) |
| |
| @node Release Notes, Design Goals, What is DejaGnu ?, Overview |
| @section New In This Release |
| |
| This release has a number of substantial changes over version |
| 1.3. The most visible change is that the version of Expect and Tcl |
| included in the release are up-to-date with the current stable net |
| releases. The biggest change is years of modifications to the |
| target configuration system, used for cross testing. While this |
| greatly improved cross testing, is has made that subsystem very |
| complicated. The goal is to have this entirely rewritten using |
| iTcl by the next release. Other changes |
| are: |
| |
| @itemize |
| |
| @item |
| More built-in support for building target binaries |
| with the correct linker flags. Currently this only works with |
| GCC as the cross compiler, |
| preferably with a target supported by |
| @ref{Libgloss}. |
| |
| @item |
| Lots of little bug fixes from years of heavy |
| use at Cygnus Solutions. |
| |
| @item |
| DejaGnu now uses |
| Automake for Makefile |
| configuration. |
| |
| @item |
| Updated documentation, now in DocBook XML. |
| |
| @item |
| Windows support. There is beta level support for |
| Windows that is still a work in progress. This requires the |
| @uref{http://www.cygwin.com/,Cygwin} POSIX |
| subsystem for Windows. |
| @end itemize |
| |
| @menu |
| * Windows Support:: |
| @end menu |
| |
| @node Windows Support, , , Release Notes |
| @subsection Windows Support |
| |
| To use DejaGnu on Windows, you need to first install the |
| @uref{http://www.cygwin.com/,Cygwin} |
| release. This works as of the B20.1 release. Cygwin is a POSIX |
| system for Windows. This covers both utility programs and a library |
| that adds POSIX system calls to Windows. Among them is pseudo tty |
| support for Windows that emulates the POSIX pty standard. The |
| latest Cygwin is always available from @uref{http://www.cygwin.com/,this location}. This |
| works well enough to run @emph{"make check"} of |
| the GNU development tree on Windows after a native build. But the |
| nature of ptys on Windows is still evolving. Your mileage may |
| vary. |
| |
| @node Design Goals, A POSIX Conforming Test Framework, Release Notes, Overview |
| @section Design Goals |
| |
| DejaGnu grew out of the internal needs of Cygnus Solutions, |
| the company formerly known as Cygnus Support. Cygnus maintained |
| and enhanced a variety of free programs in many different |
| environments and we needed a testing tool that: |
| |
| @itemize |
| |
| @item |
| was useful to developers while fixing |
| bugs; |
| |
| @item |
| automated running many tests during a software |
| release process; |
| |
| @item |
| was portable among a variety of host |
| computers; |
| |
| @item |
| supported cross-development |
| testing; |
| |
| @item |
| permitted testing interactive programs, like |
| @code{GDB}; and |
| |
| @item |
| permitted testing batch oriented programs, like |
| @code{GCC}. |
| @end itemize |
| |
| Some of the requirements proved challenging. For example, |
| interactive programs do not lend themselves very well to automated testing. |
| But all the requirements are important: for instance, it is imperative to |
| make sure that @code{GDB} works as well when cross-debugging |
| as it does in a native configuration. |
| |
| Probably the greatest challenge was testing in a |
| cross-development environment. Most cross-development |
| environments are customized by each developer. Even when buying |
| packaged boards from vendors there are many differences. The |
| communication interfaces vary from a serial line to Ethernet. |
| DejaGnu was designed with a modular communication setup, so that |
| each kind of communication can be added as required and supported |
| thereafter. Once a communication procedure is coded, any test can |
| use it. Currently DejaGnu can use @code{rsh}, |
| @code{rlogin}, @code{telnet}, |
| @code{tip}, @code{kermit} and |
| @code{mondfe} for remote communications. |
| |
| @node A POSIX Conforming Test Framework, , Design Goals, Overview |
| @section A POSIX conforming test framework |
| |
| DejaGnu conforms to the POSIX 1003.3 standard for test |
| frameworks. Rob Savoye was a member of that committee. |
| |
| The POSIX standard 1003.3 defines what a testing framework needs to |
| provide, in order to permit the creation of POSIX conformance test |
| suites. This standard is primarily oriented to running POSIX conformance |
| tests, but its requirements also support testing of features not related |
| to POSIX conformance. POSIX 1003.3 does not specify a particular testing |
| framework, but at this time there is only one other POSIX conforming test |
| framework: TET. TET was created by Unisoft for a consortium comprised of |
| X/Open, Unix International and the Open Software Foundation. |
| |
| The POSIX documentation refers to @dfn{assertions}. |
| An assertion is a description of behavior. For example, if a standard |
| says ``The sun shall shine'', a corresponding assertion might be ``The |
| sun is shining.'' A test based on this assertion would pass or fail |
| depending on whether it is day or night. It is important to note |
| that the standard being tested is never 1003.3; the standard being tested |
| is some other standard, for which the assertions were written. |
| |
| As there is no testsuite to test testing frameworks for POSIX |
| 1003.3 conformance, verifying conformance to this standard is done by |
| repeatedly reading the standard and experimenting. One of the main |
| things 1003.3 does specify is the set of allowed output messages and |
| their definitions. Four messages are supported for a required feature of |
| POSIX conforming systems and a fifth for a conditional feature. DejaGnu |
| supports the use of all five output messages. In this sense a testsuite |
| that uses exactly these messages can be considered POSIX conforming. |
| These definitions specify the output of a test |
| case: |
| |
| @table @asis |
| |
| @item PASS |
| A test has succeeded. That is, it demonstrated that |
| the assertion is true. |
| |
| @item XFAIL |
| POSIX 1003.3 does not incorporate the notion of |
| expected failures, so @emph{PASS}, instead of |
| @emph{XPASS}, must also be returned for test cases |
| which were expected to fail and did not. This means that |
| @emph{PASS} is in some sense more ambiguous than if |
| @emph{XPASS} is also used. |
| |
| @item FAIL |
| A test has produced the bug it was intended to |
| capture. That is, it has demonstrated that the assertion is false. |
| The @emph{FAIL} message is based on the test case only. |
| Other messages are used to indicate a failure of the framework. As |
| with @emph{PASS}, POSIX tests must return |
| @emph{FAIL} rather than @emph{XFAIL} even |
| if a failure was expected. |
| |
| @item UNRESOLVED |
| A test produced indeterminate results. Usually, this |
| means the test executed in an unexpected fashion; this outcome |
| requires that a human being go over results, to determine if the test |
| should have passed or failed. This message is also used for any test |
| that requires human intervention because it is beyond the abilities |
| of the testing framework. Any unresolved test should resolved to |
| @emph{PASS} or @emph{FAIL} before a test |
| run can be considered finished. |
| |
| Note that for POSIX, each assertion must produce a test result |
| code. If the test isn't actually run, it must produce |
| @emph{UNRESOLVED} rather than just leaving that test |
| out of the output. This means that you have to be careful when |
| writing tests to not carelessly use Tcl commands like |
| @emph{return}---if you alter the flow of control of the |
| Tcl code you must insure that every test still produces some result |
| code. |
| |
| Here are some of the ways a test may wind up |
| @emph{UNRESOLVED}: |
| @end table |
| |
| @itemize |
| |
| @item |
| A test's execution is |
| interrupted. |
| |
| @item |
| A test does not produce a clear |
| result. This is usually because there was an |
| @emph{ERROR} from DejaGnu while processing |
| the test, or because there were three or more |
| @emph{WARNING} messages. Any |
| @emph{WARNING} or @emph{ERROR} |
| messages can invalidate the output of the test. This |
| usually requires a human being to examine the output to |
| determine what really happened---and to improve the test |
| case. |
| |
| @item |
| A test depends on a previous test, which |
| fails. |
| |
| @item |
| The test was set up |
| incorrectly. |
| @end itemize |
| |
| @table @asis |
| |
| @item UNTESTED |
| A test was not run. This is a place-holder, used |
| when there is no real test case yet. |
| @end table |
| |
| The only remaining output message left is intended to test |
| features that are specified by the applicable POSIX standard as |
| conditional: |
| |
| @table @asis |
| |
| @item UNSUPPORTED |
| There is no support for the tested case. This may |
| mean that a conditional feature of an operating system, or of a |
| compiler, is not implemented. DejaGnu also uses this message when |
| a testing environment (often a ``bare board'' target) lacks basic |
| support for compiling or running the test case. For example, a |
| test for the system subroutine @emph{gethostname} |
| would never work on a target board running only a boot |
| monitor. |
| @end table |
| |
| DejaGnu uses the same output procedures to produce these messages |
| for all testsuites and these procedures are already known to conform |
| to POSIX 1003.3. For a DejaGnu testsuite to conform to POSIX 1003.3, |
| you must avoid the @emph{setup}xfail@} procedure as |
| described in the @emph{PASS} section above and you must |
| be careful to return @emph{UNRESOLVED} where appropriate, |
| as described in the @emph{UNRESOLVED} section |
| above. |
| |
| @node Getting DejaGnu up and running, Running Tests, Overview, Top |
| @chapter Getting DejaGnu up and running |
| |
| This chapter was originally written by Niklaus Giger |
| (ngiger@@mus.ch) because he lost a week to figure out how DejaGnu works |
| and how to write a first test. |
| |
| Follow these instructions as closely a possible in order get a |
| good insight into how DejaGnu works, else you might run into a lot of |
| subtle problems. You have been warned. |
| |
| It should be no big problems installing DejaGnu using your |
| package manager or from the source code. Under a Debian/GNU/Linux |
| systems just type (as root) |
| |
| @example |
| apt-get install |
| dejagnu |
| @end example |
| |
| @noindent |
| . These examples were run on a primary machine |
| with a AMD K6 and a Mac Powerbook G3 serving as a remote |
| target. |
| |
| The tests for Windows were run under Windows using the actual |
| Cygwin version (1.3.x as of October 2001). Its target system was a PPC |
| embedded system running vxWorks. |
| |
| @menu |
| * Test your installation:: |
| * Create a minimal project, e.g. calc: Create a minimal project; e_g_ calc. |
| * Our first automated tests:: |
| * A first remote test:: |
| @end menu |
| |
| @node Test your installation, Create a minimal project; e_g_ calc, , Getting DejaGnu up and running |
| @section Test your installation |
| |
| Create a new user called "dgt" (DejaGnuTest), which uses bash as |
| it login shell. PS1 must be set to '\u:\w\$ ' in its ~/.bashrc. Login |
| as this user, create an empty directory and change the working |
| directory to it. e.g |
| |
| @example |
| |
| dgt:~$ mkdir ~/dejagnu.test |
| dgt:~$ cd ~/dejagnu.test |
| @end example |
| |
| Now you are ready to test DejaGnu's main program called |
| runtest. The expecteted output is shown |
| |
| @strong{Runtest output in a empty directory |
| } |
| |
| @example |
| |
| dgt:~/dejagnu.test$ runtest |
| WARNING: Couldn't find the global config file. |
| WARNING: No tool specified Test |
| Run By dgt on Sun Nov 25 17:07:03 2001 Native configuration is i586-pc-linux-gnu |
| === tests === |
| Schedule of variations: unix |
| Running target unix Using /usr/share/dejagnu/baseboards/unix.exp as board description file for target. |
| Using /usr/share/dejagnu/config/unix.exp as generic interface file for target. |
| ERROR: Couldn't find tool config file for unix. |
| === Summary === |
| @end example |
| |
| We will show you later how to get rid of all the WARNING- and |
| ERROR-messages. The files testrun.sum and testrun.log have been |
| created, which do not interest us at this point. Let's remove |
| them. |
| |
| @example |
| :~/dejagnu.test$ rm testrun.sum testrun.log |
| @end example |
| |
| @menu |
| * Windows:: |
| * Getting the source code for the calc example:: |
| @end menu |
| |
| @node Windows, Getting the source code for the calc example, , Test your installation |
| @subsection Windows |
| |
| On Windows systems DejaGnu is part of a port of a lot of Unix |
| tools to the Windows OS, called Cygwin. Cygwin may be downloaded and |
| installed from a mirror of http://www.cygwin.com/. All examples were |
| also run on Windows. If nothing is said, you can assume that you |
| should get the same output as on a Unix system. |
| |
| You will need a telnet daemon if you want to use a Windows box |
| as a remote target. There seems to be a freeware telnet daemon at |
| http://www.fictional.net/. |
| |
| @node Getting the source code for the calc example, , Windows, Test your installation |
| @subsection Getting the source code for the calc example |
| |
| If you are running a Debian distribution you can find the |
| examples under /usr/share/doc/dejagnu/examples. These examples seem to |
| be missing in Red Hat's RPM. In this case download the sources of |
| DejaGnu and adjust the pathes to the DejaGnu examples |
| accordingly. |
| |
| @node Create a minimal project; e_g_ calc, Our first automated tests, Test your installation, Getting DejaGnu up and running |
| @section Create a minimal project, e.g. calc |
| |
| In this section you will to start a small project, |
| using the sample application calc, which is part of your DejaGnu |
| distribution |
| |
| @menu |
| * A simple project without the GNU autotools:: |
| * Using autoconf/autoheader/automake:: |
| @end menu |
| |
| @node A simple project without the GNU autotools, Using autoconf/autoheader/automake, , Create a minimal project; e_g_ calc |
| @subsection A simple project without the GNU autotools |
| |
| The runtest program can be run standalone. All the |
| autoconf/automake support is just cause those programs are commonly |
| used for other GNU applications. The key to running runtest standalone |
| is having the local site.exp file setup correctly, which automake |
| does. |
| |
| The generated site.exp should like like: |
| |
| @example |
| |
| set tool calc |
| set srcdir . |
| set objdir /home/dgt/dejagnu.test |
| @end example |
| |
| @node Using autoconf/autoheader/automake, , A simple project without the GNU autotools, Create a minimal project; e_g_ calc |
| @subsection Using autoconf/autoheader/automake |
| |
| We have to prepare some input file in order to run autocon and |
| automake. There is book "GNU autoconf, automake and |
| libtool" by Garry V. Vaughan, et al. NewRider, ISBN |
| 1-57870-190-2 which describes this process thoroughly. |
| |
| From the calc example distributed with the DejaGnu documentation |
| you should copy the program file itself (calc.c) and some additional |
| files, which you might examine a little bit close to derive their |
| meanings. |
| |
| @example |
| |
| dgt:~/dejagnu.test$ cp -r /usr/share/doc/dejagnu/examples/calc/\ |
| @{configure.in,Makefile.am,calc.c,testsuite@} . |
| @end example |
| |
| In Makemake.am note the presence of the AUTOMAKE_OPTIONS = dejagnu. This option is needed. |
| |
| Run aclocal to generate aclocal.m4, which is a collection of |
| macros needed by configure.in |
| |
| @example |
| |
| dgt:~/dejagnu.test$ aclocal |
| @end example |
| |
| autoconf is another part of the auto-tools. Run it to generate |
| configure based on information contained in configure.in. |
| |
| @example |
| |
| dgt:~/dejagnu.test$ autoconf |
| @end example |
| |
| autoheader is another part of the auto-tools. |
| Run it to generate calc.h.in. |
| |
| @example |
| |
| dgt:~/dejagnu.test$ autoheader |
| @end example |
| |
| The Makefile.am of this example was developed as port of the DejaGnu |
| distribution. |
| Adapt Makefile.am for this test. Replace the line |
| "#noinst_PROGRAMS = calc" to |
| "bin_PROGRAMS = calc". |
| Change the RUNTESTDEFAULTFLAGS from |
| "$$srcdir/testsuite" to |
| "./testsuite". |
| |
| Running automake at this point contains a series of warning in |
| its output as shown in the following example: |
| |
| @strong{Sample output of automake with missing files} |
| |
| @example |
| |
| dgt:~/dejagnu.test$ automake --add-missing |
| automake: configure.in: installing `./install-sh' |
| automake: configure.in: installing `./mkinstalldirs' |
| automake: configure.in: installing `./missing' |
| automake: Makefile.am: installing `./INSTALL' |
| automake: Makefile.am: required file `./NEWS' not found |
| automake: Makefile.am: required file `./README' not found |
| automake: Makefile.am: installing `./COPYING' |
| automake: Makefile.am: required file `./AUTHORS' not found |
| automake: Makefile.am: required file `./ChangeLog' not found |
| configure.in: 4: required file `./calc.h.in' not found |
| Makefile.am:6: required directory ./doc does not exist |
| @end example |
| |
| Create a empty directory doc and empty files |
| INSTALL, NEWS, README, AUTHORS, ChangeLog and COPYING. |
| The default COPYING will point to the GNU Public License (GPL). |
| In a real project it would be time to add some meaningfull text in each file. |
| |
| Adapt calc to your environment by calling configure. |
| |
| @strong{Sample output of configure |
| } |
| |
| @example |
| |
| dgt:~/dejagnu.test$ ./configure |
| creating cache ./config.cache |
| checking whether to enable maintainer-specific portions of Makefiles... no |
| checking for a BSD compatible install... /usr/bin/install -c |
| checking whether build environment is sane... yes |
| checking whether make sets $@{MAKE@}... yes |
| checking for working aclocal... found |
| checking for working autoconf... found |
| checking for working automake... found |
| checking for working autoheader... found |
| checking for working makeinfo... found |
| checking for gcc... gcc checking whether the C compiler (gcc ) works... yes |
| checking whether the C compiler (gcc ) is a cross-compiler... no |
| checking whether we are using GNU C... yes |
| checking whether gcc accepts -g... yes |
| checking for a BSD compatible install... /usr/bin/install -c |
| checking how to run the C preprocessor... gcc -E |
| checking for stdlib.h... yes |
| checking for strcmp... yes |
| updating cache ./config.cache |
| creating ./config.status |
| creating Makefile creating calc.h |
| @end example |
| |
| If you are familiar with GNU software, |
| this output should not contain any surprise to you. |
| Any errors should be easy to fix for such a simple program. |
| |
| Build the calc executable: |
| |
| @strong{Sample output building calc |
| } |
| |
| @example |
| |
| dgt:~/dejagnu.test$ make |
| gcc -DHAVE_CONFIG_H -I. -I. -I. -g -O2 -c calc.c |
| gcc -g -O2 -o calc calc.o |
| @end example |
| |
| You prepared a few files and then called some |
| commands. Respecting the right order assures a automatic and correctly |
| compiled calc program. The following example resumes the correct |
| order. |
| |
| @strong{Creating the calc program using the GNU autotools} |
| |
| @example |
| |
| dgt:~/dejagnu.test$ aclocal |
| dgt:~/dejagnu.test$ autoconf |
| dgt:~/dejagnu.test$ autoheader |
| dgt:~/dejagnu.test$ automake --add-missing |
| dgt:~/dejagnu.test$ ./configure |
| dgt:~/dejagnu.test$ make |
| |
| @end example |
| |
| Play with calc and verify whether it works correctly. |
| A sample session might look like this: |
| |
| @example |
| |
| dgt:~/dejagnu.test$ ./calc |
| calc: version |
| Version: 1.1 |
| calc: add 3 4 |
| 7 |
| calc: multiply 3 4 |
| 12 |
| calc: multiply 2 4 |
| 12 |
| calc: quit |
| |
| @end example |
| |
| Look at the intentional bug that 2 times 4 equals 12. |
| |
| The tests run by DejaGnu need a file called site.exp, |
| which is automatically generated if we call "make |
| site.exp". This was the purpose of the "AUTOMAKE_OPTIONS = |
| dejagnu" in Makefile.am. |
| |
| @strong{Sample output generating a site.exp} |
| |
| @example |
| |
| dgt: make site.exp |
| dgt:~/dejagnu.test$ make site.exp |
| Making a new site.exp file... |
| @end example |
| |
| @node Our first automated tests, A first remote test, Create a minimal project; e_g_ calc, Getting DejaGnu up and running |
| @section Our first automated tests |
| |
| @menu |
| * Running the test for the calc example:: |
| * The various config files or how to avoid warnings:: |
| * When trouble strikes:: |
| * Testing "Hello world" locally:: |
| @end menu |
| |
| @node Running the test for the calc example, The various config files or how to avoid warnings, , Our first automated tests |
| @subsection Running the test for the calc example |
| |
| Now we are ready to call the automated tests |
| |
| @strong{Sample output of runtest in a configured directory} |
| |
| @example |
| |
| dgt:~/dejagnu.test$ make check |
| make check-DEJAGNU |
| make[1]: Entering directory `/home/dgt/dejagnu.test' srcdir=`cd . && pwd`; export srcdir; \ |
| EXPECT=expect; export EXPECT; \ runtest=runtest; \ |
| if /bin/sh -c "$runtest --version" > /dev/null 2>&1; then \ |
| $runtest --tool calc CALC=`pwd`/calc --srcdir ./testsuite ; \ |
| else echo "WARNING: could not find \`runtest'" 1>&2; :;\ |
| fi |
| WARNING: Couldn't find the global config file. |
| WARNING: Couldn't find tool init file |
| Test Run By dgt on Sun Nov 25 21:42:21 2001 |
| Native configuration is i586-pc-linux-gnu |
| |
| === calc tests === |
| |
| Schedule of variations: |
| unix |
| |
| Running target unix |
| Using /usr/share/dejagnu/baseboards/unix.exp as board description file for target. |
| Using /usr/share/dejagnu/config/unix.exp as generic interface file for target. |
| Using ./testsuite/config/unix.exp as tool-and-target-specific interface file. |
| Running ./testsuite/calc.test/calc.exp ... |
| FAIL: multiply2 (bad match) |
| |
| === calc Summary === |
| |
| # of expected passes 5 |
| # of unexpected failures 1 |
| /home/Dgt/dejagnu.test/calc version Version: 1.1 |
| make[1]: *** [check-DEJAGNU] Fehler 1 |
| make[1]: Leaving directory `/home/Dgt/dejagnu.test' make: *** [check-am] Fehler 2 |
| @end example |
| |
| Did you see the line "FAIL:"? The test cases for calc catch the bug in the calc.c file. Fix the error in calc.c later as the following examples assume a unchanged calc.c. |
| |
| Examine the output files calc.sum and calc.log. Try to |
| understand the testcases written in |
| ~/dejagnu.test/testsuite/calc.test/calc.exp. To understand Expect you |
| might take a look at the book "Exploring Expect", which is |
| an excellent resource for learning and using Expect. (Pub: O'Reilly, |
| ISBN 1-56592-090-2) The book contains hundreds of examples and also |
| includes a tutorial on Tcl. Exploring Expect is 602 pages |
| long. |
| |
| @node The various config files or how to avoid warnings, When trouble strikes, Running the test for the calc example, Our first automated tests |
| @subsection The various config files or how to avoid warnings |
| |
| DejaGnu may be customized by each user. It first searches for a |
| file called ~/.dejagnurc. Create the file ~/.dejagnurc and insert the |
| following line: |
| |
| @example |
| |
| puts "I am ~/.dejagnurc" |
| @end example |
| |
| Rerun make check. Test whether the output contains "I am ~/.dejagnurc". |
| Create ~/my_dejagnu.exp and insert the following line: |
| |
| @example |
| |
| puts "I am ~/my_dejagnu.exp" |
| @end example |
| |
| In a Bash-Shell enter |
| |
| @example |
| |
| dgt:~/dejagnu.test$ export DEJAGNU=~/my_dejagnu.exp |
| @end example |
| |
| Run "make check" again. The output should not contain |
| "WARNING: Couldn't find the global config file.". |
| Create the sub-directory lib. Create the file "calc.exp" in it and insert the following line: |
| |
| @example |
| |
| puts "I am lib/calc.exp" |
| @end example |
| |
| The last warning "WARNING: Couldn't find tool init file" |
| should not be part of the output of make check. |
| Create the directory ~/boards. Create the file ~/boards/standard.exp and insert the following line: |
| |
| @example |
| |
| puts "I am boards/standard.exp" |
| @end example |
| |
| If the variable DEJAGNU is still not empty then the (abbreviated) output of "make check" should look like this: |
| |
| @strong{Sample output of runtest with the usual configuration files} |
| |
| @example |
| |
| dgt:~/dejagnu.test$ make check |
| <...> |
| fi |
| I am ~/.dejagnurc |
| I am ~/my_dejagnu.exp |
| I am lib/calc.exp |
| Test Run By dgt on Sun Nov 25 22:19:14 2001 |
| Native configuration is i586-pc-linux-gnu |
| |
| === calc tests === |
| Using /home/Dgt/boards/standard.exp as standard board description\ |
| file for build. |
| I am ~/boards/standard.exp |
| Using /home/Dgt/boards/standard.exp as standard board description\ |
| file for host. |
| I am ~/boards/standard.exp |
| |
| Schedule of variations: |
| unix |
| |
| Running target unix |
| Using /home/Dgt/boards/standard.exp as standard board description\ |
| file for target. |
| I am ~/boards/standard.exp |
| Using /usr/share/dejagnu/baseboards/unix.exp as board description file\ |
| for target. |
| <...> |
| @end example |
| |
| It is up to you to decide when and where to use any of the above |
| mentioned config files for customizing. |
| This chapters showed you where and in which order the different config |
| files are run. |
| |
| @node When trouble strikes, Testing "Hello world" locally, The various config files or how to avoid warnings, Our first automated tests |
| @subsection When trouble strikes |
| |
| Calling runtest with the '-v'-flag shows you in even more details which files are searched in which order. Passing it several times gives more and more details. |
| |
| @strong{Displaying details about runtest execution} |
| |
| @example |
| |
| runtest -v -v -v --tool calc CALC=`pwd`/calc --srcdir ./testsuite |
| @end example |
| |
| Calling runtest with the '--debug'-flag logs a lot of details to dbg.log where you can analyse it afterwards. |
| |
| In all test cases you can temporary adjust the verbosity of information by adding the following Tcl-command to any tcl file that gets loaded by |
| dejagnu, for instance, ~/.dejagnurc: |
| |
| @example |
| |
| set verbose 9 |
| @end example |
| |
| @node Testing "Hello world" locally, , When trouble strikes, Our first automated tests |
| @subsection Testing "Hello world" locally |
| |
| This test checks, whether the built-in shell command "echo Hello world" |
| will really write "Hello world" on the console. |
| Create the file ~/dejagnu.test/testsuite/calc.test/local_echo.exp. |
| It should contain the following lines |
| |
| @strong{A first (local) test case} |
| |
| @example |
| |
| set test "Local Hello World" |
| send "echo Hello World" |
| expect @{ |
| -re "Hello World" @{ pass "$test" @} |
| @} |
| @end example |
| |
| Run runtest again and verify the output "calc.log" |
| |
| @node A first remote test, , Our first automated tests, Getting DejaGnu up and running |
| @section A first remote test |
| |
| Testing remote targets is a lot trickier especially if you are using an |
| embedded target |
| which has no built in support for things like a compiler, ftp server or a Bash-shell. |
| Before you can test calc on a remote target you have to acquire a few basics skills. |
| |
| @menu |
| * Setup telnet to your own host:: |
| * A test case for login via telnet:: |
| * Remote testing "Hello world":: |
| * Transferring files from/to the target:: |
| * Preparing for crosscompilation:: |
| * Remote testing of calc:: |
| * Using Windows as host and vxWorks as target:: |
| @end menu |
| |
| @node Setup telnet to your own host, A test case for login via telnet, , A first remote test |
| @subsection Setup telnet to your own host |
| |
| The easiest remote host is usually the host you are working on. |
| In this example we will use telnet to login in your own workstation. |
| For security reason you should never have a telnet deamon running on |
| machine connected on the internet, as password and usernames are transmitted |
| in clear text. |
| We assume you know how to setup your machine for a telnet daemon. |
| |
| Next try whether you may login in your own host by issuing the |
| command "telnet localhost.1". In order to be able to |
| distinguish between a normal session an a telnet login add the following lines to /home/dgt/.bashrc. |
| |
| @example |
| |
| if [ "$REMOTEHOST" ] |
| then |
| PS1='remote:\w\$ ' |
| fi |
| @end example |
| |
| Now on the machine a "remote" login looks like this: |
| |
| @strong{Sample log of a telnet login to localhost} |
| |
| @example |
| |
| dgt:~/dejagnu.test$ telnet localhost |
| Trying 127.0.0.1... |
| Connected to 127.0.0.1. |
| Escape character is '^]'. |
| Debian GNU/Linux testing/unstable Linux |
| K6Linux login: dgt |
| Password: |
| Last login: Sun Nov 25 22:46:34 2001 from localhost on pts/4 |
| Linux K6Linux 2.4.14 #1 Fre Nov 16 19:28:25 CET 2001 i586 unknown |
| No mail. |
| remote:~$ exit |
| logout |
| Connection closed by foreign host. |
| @end example |
| |
| @node A test case for login via telnet, Remote testing "Hello world", Setup telnet to your own host, A first remote test |
| @subsection A test case for login via telnet |
| |
| In order to define a correct setup we have add a line containing |
| "set target unix" either to ~/.dejagnurc or to ~/my_dejagnu.exp. |
| In ~/boards/standard.exp add the following four lines to define a few patterns for the DejaGnu telnet login procedure. |
| |
| @strong{Defining a remote target board} |
| |
| @example |
| |
| set_board_info shell_prompt "remote:" |
| set_board_info telnet_username "dgt" |
| set_board_info telnet_password "top_secret" |
| set_board_info hostname "localhost" |
| |
| @end example |
| |
| As DejaGnu will be parsing the telnet session output for some well |
| known pattern the output there are a lot of things that can go wrong. |
| If you have any problems verify your setup: |
| |
| @itemize |
| |
| @item |
| Is @file{/etc/motd} empty? |
| |
| @item |
| Is @file{/etc/issue.net} empty? |
| |
| @item |
| Exists a empty @file{~/.hushlogin}? |
| |
| @item |
| The LANG environment variable must be either empty or set to "C". |
| @end itemize |
| |
| To test the login via telnet write a sample test case. |
| Create the file ~/dejagnu.test/testsuite/calc.test/remote_echo.exp and |
| add the following few lines: |
| |
| @strong{DejaGnu script for logging in into a remote target} |
| |
| @example |
| |
| puts "this is remote_echo.exp target for $target " |
| target_info $target |
| #set verbose 9 |
| set shell_id [remote_open $target] |
| set test "Remote login to $target" |
| #set verbose 0 |
| puts "Spawn id for remote shell is $shell_id" |
| if @{ $shell_id > 0 @} @{ |
| pass "$test" |
| @} else @{ |
| fail "Remote open to $target" |
| @} |
| @end example |
| |
| In the runtest output you should find something like: |
| |
| @example |
| |
| Running ./testsuite/calc.test/local_echo.exp ... |
| Running ./testsuite/calc.test/remote_echoo.exp ... |
| this is remote_echo.exp target is unix |
| Spawn id for remote shell is exp7 |
| @end example |
| |
| Have again a look at calc.log to get a feeling how DejaGnu and expect |
| parse the input. |
| |
| @node Remote testing "Hello world", Transferring files from/to the target, A test case for login via telnet, A first remote test |
| @subsection Remote testing "Hello world" |
| |
| Next you will transform the above "hello world" example to |
| its remote equivalent. |
| This can be done by adding the following lines to our file remote_echo.exp. |
| |
| @strong{A first (local) remote "Hello world" test} |
| |
| @example |
| |
| set test "Remote_send Hello World" |
| set status [remote_send $target "echo \"Hello\" \"World\"\n" ] |
| pass "$test" |
| set test "Remote_expect Hello World" |
| remote_expect $target 5 @{ |
| -re "Hello World" @{ pass "$test" @} |
| @} |
| @end example |
| |
| Call make check. The output should contain |
| "# of expected passes 9" and "# of unexpected failures 1". |
| |
| Have a look at the procedures in /usr/share/dejagnu/remote.exp to have an overview of the offered procedures and their features. |
| |
| Now setup a real target. |
| In the following example we assume as target a PowerBook running Debian. |
| As above add a test user "dgt", install telnet and FTP servers. |
| In order to distinguish it from the host add the line |
| |
| @example |
| PS1='test:>' |
| @end example |
| |
| @noindent |
| to /home/dgt/.bash_profile. |
| Also add a corresponding entry "powerbook" to /etc/hosts and verify that you |
| are able to ping, telnet and ftp to the target "powerbook". |
| |
| In order to let runtest run its test on the "powerbook" target change the following lines in ~/boards/standard.exp: |
| |
| @strong{Board definition for a remote target} |
| |
| @example |
| |
| set_board_info protocol "telnet" |
| set_board_info telnet_username "dgt" |
| set_board_info telnet_password "top_secret" |
| set_board_info shell_prompt "test:> " |
| set_board_info hostname "powerbook" |
| @end example |
| |
| Now call runtest again with the same arguments and verify whether all went okay by taking a close look at calc.log. |
| |
| @node Transferring files from/to the target, Preparing for crosscompilation, Remote testing "Hello world", A first remote test |
| @subsection Transferring files from/to the target |
| |
| A simple procedure like this will do the job for you: |
| |
| @strong{Test script to transfer a file to a remote target} |
| |
| @example |
| |
| set test "Remote_download" |
| puts "Running Remote_download" |
| # set verbose 9 |
| set remfile /home/dgt/dejagnu2 |
| |
| set status [remote_download $target /home/dgt/.dejagnurc $remfile] |
| if @{ "$status" == "" @} @{ |
| fail "Remote download to $remfile on $target" |
| @} else @{ |
| pass "$test" |
| @} |
| |
| puts "status of remote_download ist $status" |
| # set verbose 0 |
| @end example |
| |
| After running runtest again, check whether the file dejagnu2 exists on the target. |
| This example will only work if the rcp command works with your target. |
| If you have a working FTP-server on the target you can use it by adding the |
| following lines to ~/boards/standard.exp: |
| |
| @strong{Defining a board to use FTP as file transport} |
| |
| @example |
| |
| set_board_info file_transfer "ftp" |
| set_board_info ftp_username "dgt" |
| set_board_info ftp_password "1234" |
| @end example |
| |
| @node Preparing for crosscompilation, Remote testing of calc, Transferring files from/to the target, A first remote test |
| @subsection Preparing for crosscompilation |
| |
| For crosscompiling you need working binutils, gcc and a base library like |
| libc or glib for your target. |
| It is beyond the scope of this document to describe how to get it working. |
| The following examples assume a cross compiler for PowerPC which is called linux-powerpc-gcc. |
| |
| Add AC_CANONICAL_TARGET in dejagnu.test/configure.in at the following location. Copy config.guess from /usr/share/automake to dejagnu.test. |
| |
| @example |
| |
| AM_CONFIG_HEADER(calc.h) |
| AC_CANONICAL_TARGET([]) |
| AM_INIT_AUTOMAKE(calc, 1.1) |
| @end example |
| |
| You need to run automake 2.5 or later. |
| Depending on your installation calling autoconf2.5 instead of autoconf is not needed. |
| The sequence to regenerate all files is: |
| |
| @strong{Using autotools for cross development} |
| |
| @example |
| |
| $ autoconf2.5 |
| $ autoheader |
| $ automake |
| $ ./configure --host=powerpc-linux --target=powerpc-linux |
| configure: WARNING: If you wanted to set the --build type, don't use --host. |
| If a cross compiler is detected then cross compile mode will be used. |
| checking build system type... ./config.guess: ./config.guess: No such file or directory |
| configure: error: cannot guess build type; you must specify one |
| $ cp /usr/share/automake/config.guess . |
| $ ./configure --host=powerpc-linux --target=powerpc-linux |
| configure: WARNING: If you wanted to set the --build type, don't use --host. |
| If a cross compiler is detected then cross compile mode will be used. \ |
| checking build system type... i586-pc-linux-gnu |
| checking host system type... powerpc-unknown-linux-gnu |
| <...> |
| checking whether we are cross compiling... yes |
| <...> |
| Configuration: |
| Source code location: . |
| C Compiler: powerpc-linux-gcc |
| C Compiler flags: -g -O2 |
| |
| @end example |
| |
| Everything should be ready to recompile for the target: |
| |
| @example |
| $ make |
| powerpc-linux-gcc -DHAVE_CONFIG_H -I. -I. -I. -g -O2 -c calc.c |
| powerpc-linux-gcc -g -O2 -o calc calc.o |
| |
| @end example |
| |
| @node Remote testing of calc, Using Windows as host and vxWorks as target, Preparing for crosscompilation, A first remote test |
| @subsection Remote testing of calc |
| |
| Not yet written, as I have problem getting libc6-dev-powerpc to work. Probably I first have to build my cross compiler. |
| |
| @node Using Windows as host and vxWorks as target, , Remote testing of calc, A first remote test |
| @subsection Using Windows as host and vxWorks as target |
| |
| A more thorough walk-through will be written in a few weeks. |
| |
| In order to test the vxWorks as a target I changed boards/standards.exp to reflect my settings (IP, username, password). Then I reconfigured vxWorks to include a FTP and telnet server (using the same username/password combination ad in boards/standard.exp). |
| |
| With this setup and some minor modification (e.g. replacing echo by printf) in my test cases I could test my vxWorks system. It sure does not seem to be a correct setup by DejaGnu standard. For instance, it still loading /usr/share/dejagnu/baseboards/unix.exp instead of vxWorks. In any case I found that (at least under Windows) I did not find out how the command line would let me override settings in my personal config files. |
| |
| @node Running Tests, Customizing DejaGnu, Getting DejaGnu up and running, Top |
| @chapter Running Tests |
| |
| There are two ways to execute a testsuite. The most |
| common way is when there is existing support in the |
| @file{Makefile}. This support consists of a |
| @emph{check} target. The other way is to execute the |
| @code{runtest} program directly. To run |
| @code{runtest} directcly from the command line requires |
| either all the correct options, or the @ref{Local Config File} must be setup |
| correctly. |
| |
| @menu |
| * Make check: Make Check. |
| * Runtest:: |
| * The files DejaGnu produces.: Output Files. |
| @end menu |
| |
| @node Make Check, Runtest, , Running Tests |
| @section Make check |
| |
| To run tests from an existing collection, first use |
| @code{configure} as usual to set up the |
| build directory. Then try typing: |
| |
| @example |
| |
| make check |
| |
| @end example |
| |
| If the @emph{check} target exists, it |
| usually saves you some trouble. For instance, it can set up any |
| auxiliary programs or other files needed by the tests. The most |
| common file the check builds is the |
| @emph{site.exp}. The site.exp file contains |
| various variables that DejaGnu used to dertermine the |
| configuration of the program being tested. This is mostly for |
| supporting remote testing. |
| |
| The @emph{check} target is supported by GNU |
| Automake. To have DejaGnu support added to your |
| generated @file{Makefile.in}, just add the keyword |
| dejagnu to the AUTOMAKE_OPTIONS variable in your |
| @file{Makefile.am} file. |
| |
| Once you have run @emph{make check} to build |
| any auxiliary files, you can invoke the test driver |
| @code{runtest} directly to repeat the tests. |
| You will also have to execute @code{runtest} |
| directly for test collections with no |
| @emph{check} target in the |
| @file{Makefile}. |
| |
| @node Runtest, Output Files, Make Check, Running Tests |
| @section Runtest |
| |
| @code{runtest} is the executable test driver |
| for DejaGnu. You can specify two kinds of things on the |
| @code{runtest} command line: command line options, |
| and Tcl variables for the test scripts. The options are listed |
| alphabetically below. |
| |
| @code{runtest} returns an exit code of |
| @emph{1} if any test has an unexpected result; otherwise |
| (if all tests pass or fail as expected) it returns @emph{0} |
| as the exit code. |
| |
| @menu |
| * Output States:: |
| * Invoking Runtest:: |
| * Common Options: Common Operations. |
| @end menu |
| |
| @node Output States, Invoking Runtest, , Runtest |
| @subsection Output States |
| |
| @file{runtest} flags the outcome of each |
| test as one of these cases. @ref{A POSIX Conforming Test Framework} for a |
| discussion of how POSIX specifies the meanings of these |
| cases. |
| |
| @table @asis |
| |
| @item PASS |
| The most desirable outcome: the test succeeded, and |
| was expected to succeed. |
| |
| @item XPASS |
| A pleasant kind of failure: a test was expected to |
| fail, but succeeded. This may indicate progress; inspect the test |
| case to determine whether you should amend it to stop expecting |
| failure. |
| |
| @item FAIL |
| A test failed, although it was expected to succeed. |
| This may indicate regress; inspect the test case and the failing |
| software to locate the bug. |
| |
| @item XFAIL |
| A test failed, but it was expected to fail. This |
| result indicates no change in a known bug. If a test fails because |
| the operating system where the test runs lacks some facility required |
| by the test, the outcome is @emph{UNSUPPORTED} |
| instead. |
| |
| @item UNRESOLVED |
| Output from a test requires manual inspection; the |
| testsuite could not automatically determine the outcome. For |
| example, your tests can report this outcome is when a test does not |
| complete as expected. |
| |
| @item UNTESTED |
| A test case is not yet complete, and in particular |
| cannot yet produce a @emph{PASS} or |
| @emph{FAIL}. You can also use this outcome in dummy |
| ``tests'' that note explicitly the absence of a real test case for a |
| particular property. |
| |
| @item UNSUPPORTED |
| A test depends on a conditionally available feature |
| that does not exist (in the configured testing environment). For |
| example, you can use this outcome to report on a test case that does |
| not work on a particular target because its operating system support |
| does not include a required subroutine. |
| @end table |
| |
| runtest may also display the following messages: |
| |
| @table @asis |
| |
| @item ERROR |
| Indicates a major problem (detected by the test case |
| itself) in running the test. This is usually an unrecoverable error, |
| such as a missing file or loss of communication to the target. (POSIX |
| testsuites should not emit this message; use |
| @emph{UNSUPPORTED}, @emph{UNTESTED}, or |
| @emph{UNRESOLVED} instead, as |
| appropriate.) |
| |
| @item WARNING |
| Indicates a possible problem in running the |
| test. Usually warnings correspond to recoverable errors, or display |
| an important message about the following tests. |
| |
| @item NOTE |
| An informational message about the test |
| case. |
| @end table |
| |
| @node Invoking Runtest, Common Operations, Output States, Runtest |
| @subsection Invoking Runtest |
| |
| This is the full set of command line options that |
| @file{runtest} recognizes. Arguments may be |
| abbreviated to the shortest unique string. |
| |
| @table @asis |
| |
| @item @code{--all} (-a) |
| Display all test output. By default, |
| @emph{runtest} shows only the output of tests that |
| produce unexpected results; that is, tests with status |
| @emph{FAIL} (unexpected failure), |
| @emph{XPASS} (unexpected success), or |
| @emph{ERROR} (a severe error in the test case |
| itself). Specify @emph{--all} to see output for tests |
| with status @emph{PASS} (success, as expected) |
| @emph{XFAIL} (failure, as expected), or |
| @emph{WARNING} (minor error in the test case |
| itself). |
| |
| @item @code{--build [string]} |
| @emph{string} is a full configuration |
| ``triple'' name as used by @code{configure}. This |
| is the type of machine DejaGnu and the tools to be tested are built |
| on. For a normal cross this is the same as the host, but for a |
| canadian cross, they are seperate. |
| |
| @item @code{--host [string]} |
| @code{string} is a full configuration |
| ``triple'' name as used by @emph{configure}. Use this |
| option to override the default string recorded by your |
| configuration's choice of host. This choice does not change how |
| anything is actually configured unless --build is also specified; it |
| affects @emph{only} DejaGnu procedures that compare the |
| host string with particular values. The procedures |
| @emph{ishost}, @emph{istarget}, |
| @emph{isnative}, and @emph{setup}xfail@} |
| are affected by @emph{--host}. In this usage, |
| @emph{host} refers to the machine that the tests are to |
| be run on, which may not be the same as the |
| @emph{build} machine. If @emph{--build} |
| is also specified, then @emph{--host} refers to the |
| machine that the tests wil, be run on, not the machine DejaGnu is run |
| on. |
| |
| @item @code{--host_board [name]} |
| The host board to use. |
| |
| @item @code{--target [string]} |
| Use this option to override the default setting |
| (running native tests). @emph{string} is a full |
| configuration ``triple'' name of the form |
| @emph{cpu-vendor-os} as used by |
| @code{configure}. This option changes the |
| configuration @emph{runtest} uses for the default tool |
| names, and other setup information. |
| |
| @item @code{--debug} (-de) |
| Turns on the @emph{expect} internal |
| debugging output. Debugging output is displayed as part of the |
| @emph{runtest} output, and logged to a file called |
| @file{dbg.log}. The extra debugging output does |
| @emph{not} appear on standard output, unless the |
| verbose level is greater than 2 (for instance, to see debug output |
| immediately, specify @emph{--debug}-v -v@}). The |
| debugging output shows all attempts at matching the test output of |
| the tool with the scripted patterns describing expected output. The |
| output generated with @emph{--strace} also goes into |
| @file{dbg.log}. |
| |
| @item @code{--help} (-he) |
| Prints out a short summary of the |
| @emph{runtest} options, then exits (even if you also |
| specify other options). |
| |
| @item @code{--ignore [name(s)] } |
| The names of specific tests to |
| ignore. |
| |
| @item @code{--objdir [path]} |
| Use @emph{path} as the top directory |
| containing any auxiliary compiled test code. This defaults to |
| @file{.}. Use this option to locate pre-compiled test |
| code. You can normally prepare any auxiliary files needed with |
| @emph{make}. |
| |
| @item @code{--outdir [path]} |
| Write output logs in directory |
| @file{path}. The default is @emph{.@}, |
| the} directory where you start |
| @emph{runtest}. This option affects only the summary |
| and the detailed log files |
| @file{tool.sum} and |
| @file{tool.log}. The DejaGnu debug |
| log @file{dbg.log} always appears (when requested) in |
| the local directory. |
| |
| @item @code{--reboot [name]} |
| Reboot the target board when |
| @emph{runtest} initializes. Usually, when running tests |
| on a separate target board, it is safer to reboot the target to be |
| certain of its state. However, when developing test scripts, |
| rebooting takes a lot of time. |
| |
| @item @code{--srcdir [path]} |
| Use @file{path} as the top directory |
| for test scripts to run. @emph{runtest} looks in this |
| directory for any subdirectory whose name begins with the toolname |
| (specified with @emph{--tool}). For instance, with |
| @emph{--tool}gdb@}, @emph{runtest} uses |
| tests in subdirectories @file{gdb.*} (with the usual |
| shell-like filename expansion). If you do not use |
| @emph{--srcdir}, @emph{runtest} looks for |
| test directories under the current working |
| directory. |
| |
| @item @code{--strace [number]} |
| Turn on internal tracing for |
| @emph{expect}, to n levels deep. By adjusting the |
| level, you can control the extent to which your output expands |
| multi-level Tcl statements. This allows you to ignore some levels of |
| @emph{case} or @emph{if} statements. |
| Each procedure call or control structure counts as one ``level''. The |
| output is recorded in the same file, @file{dbg.log}, |
| used for output from @emph{--debug}. |
| |
| @item @code{--connect [program]} |
| Connect to a target testing environment as specified |
| by @emph{type}, if the target is not the computer |
| running @emph{runtest}. For example, use |
| @emph{--connect} to change the program used to connect |
| to a ``bare board'' boot monitor. The choices for |
| @emph{type} in the DejaGnu 1.4 distribution are |
| @emph{rlogin}, @emph{telnet}, |
| @emph{rsh}, @emph{tip}, |
| @emph{kermit}, and @emph{mondfe}. |
| |
| The default for this option depends on the configuration most |
| convenient communication method available, but often other |
| alternatives work as well; you may find it useful to try alternative |
| connect methods if you suspect a communication problem with your |
| testing target. |
| |
| @item @code{--baud [number]} |
| Set the default baud rate to something other than |
| 9600. (Some serial interface programs, like @emph{tip}, |
| use a separate initialization file instead of this |
| value.) |
| |
| @item @code{--target_board [name(s)]} |
| The list of target boards to run tests |
| on. |
| |
| @anchor{--tool[name[s]]}@item @code{--tool[name(s)]} |
| Specifies which testsuite to run, and what |
| initialization module to use. @code{--tool} is used |
| @emph{only} for these two purposes. It is |
| @emph{not} used to name the executable program to |
| test. Executable tool names (and paths) are recorded in |
| @file{site.exp} and you can override them by specifying |
| Tcl variables on the command line. |
| |
| For example, including "@code{--tool} gcc" on the |
| @emph{runtest} command line runs tests from all test |
| subdirectories whose names match @file{gcc.*}, and uses |
| one of the initialization modules named |
| @file{config/*-gcc.exp}. To specify the name of the |
| compiler (perhaps as an alternative path to what |
| @emph{runtest} would use by default), use |
| @emph{GCC=binname} on the @emph{runtest} |
| command line. |
| |
| @item @code{--tool_exec [name]} |
| The path to the tool executable to |
| test. |
| |
| @item @code{--tool_opts [options]} |
| A list of additional options to pass to the |
| tool. |
| |
| @item @code{--verbose} (-v) |
| Turns on more output. Repeating this option increases |
| the amount of output displayed. Level one (@emph{-v}) |
| is simply test output. Level two (@emph{-v}-v@}) shows |
| messages on options, configuration, and process control. Verbose |
| messages appear in the detailed (@file{*.log}) log |
| file, but not in the summary (@file{*.sum}) log |
| file. |
| |
| @item @code{--version} (-V) |
| Prints out the version numbers of DejaGnu, |
| @emph{expect} and Tcl, and exits without running any |
| tests. |
| |
| @item @code{--D[0-1]} |
| Start the internal Tcl debugger. The Tcl debugger |
| supports breakpoints, single stepping, and other common debugging |
| activities. See the document "Debugger for Tcl Applications" by Don |
| Libes. (Distributed in PostScript form with |
| @emph{expect} as the file |
| @file{expect/tcl-debug.ps.}. If you specify |
| @emph{-D1}, the @emph{expect} shell stops |
| at a breakpoint as soon as DejaGnu invokes it. If you specify |
| @emph{-D0}, DejaGnu starts as usual, but you can enter |
| the debugger by sending an interrupt (e.g. by typing |
| @key{C}@key{c}). |
| |
| @item @file{testfile}.exp[=arg(s)] |
| Specify the names of testsuites to run. By default, |
| @emph{runtest} runs all tests for the tool, but you can |
| restrict it to particular testsuites by giving the names of the |
| @emph{.exp expect} scripts that control |
| them. @emph{testsuite}.exp may not include path |
| information; use plain filenames. |
| |
| @item @file{testfile}.exp="testfile1 ..." |
| Specify a subset of tests in a suite to run. For |
| compiler or assembler tests, which often use a single |
| @emph{.exp} script covering many different source |
| files, this option allows you to further restrict the tests by |
| listing particular source files to compile. Some tools even support |
| wildcards here. The wildcards supported depend upon the tool, but |
| typically they are @emph{?}, @emph{*}, |
| and @emph{[chars]}. |
| |
| @item @code{tclvar}=value |
| You can define Tcl variables for use by your test |
| scripts in the same style used with @emph{make} for |
| environment variables. For example, @emph{runtest |
| GDB=gdb.old} defines a variable called |
| @code{GDB}; when your scripts refer to |
| @code{$GDB} in this run, they use the value |
| @emph{gdb.old}. |
| |
| The default Tcl variables used for most tools are defined in |
| the main DejaGnu @emph{Makefile}; their values are |
| captured in the @file{site.exp} file. |
| @end table |
| |
| @node Common Operations, , Invoking Runtest, Runtest |
| @subsection Common Options |
| |
| Typically, you don't need must to use any command-line options. |
| @code{--tool} used is only required when there are more than |
| one testsuite in the same directory. The default options are in the |
| local site.exp file, created by "make site.exp". |
| |
| For example, if the directory @file{gdb/testsuite} |
| contains a collection of DejaGnu tests for GDB, you can run them like |
| this: |
| |
| @example |
| |
| eg$ cd gdb/testsuite |
| eg$ runtest --tool gdb |
| |
| @end example |
| |
| Test output follows, ending with: |
| |
| @example |
| |
| === gdb Summary === |
| |
| # of expected passes 508 |
| # of expected failures 103 |
| /usr/latest/bin/gdb version 4.14.4 -nx |
| |
| @end example |
| |
| You can use the option @emph{--srcdir} to point to |
| some other directory containing a collection of tests: |
| |
| @example |
| |
| eg$ runtest--srcdir /devo/gdb/testsuite |
| |
| @end example |
| |
| By default, @code{runtest} prints only the |
| names of the tests it runs, output from any tests that have unexpected |
| results, and a summary showing how many tests passed and how many |
| failed. To display output from all tests (whether or not they behave |
| as expected), use the @emph{--all} option. For more |
| verbose output about processes being run, communication, and so on, use |
| @emph{--verbose}. To see even more output, use multiple |
| @emph{--verbose} options. for a more detailed explanation |
| of each @code{runtest} option. |
| |
| Test output goes into two files in your current directory: |
| summary output in @file{tool.sum}, |
| and detailed output in @file{ |
| tool.log}. (@emph{tool} |
| refers to the collection of tests; for example, after a run with |
| @emph{--tool} gdb, look for output files |
| @file{gdb.sum} and |
| @file{gdb.log}.) |
| |
| @node Output Files, , Runtest, Running Tests |
| @section The files DejaGnu produces. |
| |
| DejaGnu always writes two kinds of output files: summary |
| logs and detailed logs. The contents of both of these are |
| determined by your tests. |
| |
| For troubleshooting, a third kind of output file is useful: |
| use @code{--debug} to request an output file showing |
| details of what Expect is doing |
| internally. |
| |
| @menu |
| * Summary File:: |
| * Log File:: |
| * Debug Log File:: |
| @end menu |
| |
| @node Summary File, Log File, , Output Files |
| @subsection Summary File |
| |
| DejaGnu always produces a summary output file |
| @file{tool.sum}. This summary shows the names of |
| all test files run; for each test file, one line of output from |
| each @code{pass} command (showing status |
| @emph{PASS} or @emph{XPASS}) or |
| @code{fail} command (status |
| @emph{FAIL} or @emph{XFAIL}); |
| trailing summary statistics that count passing and failing tests |
| (expected and unexpected); and the full pathname and version |
| number of the tool tested. (All possible outcomes, and all |
| errors, are always reflected in the summary output file, |
| regardless of whether or not you specify |
| @code{--all}.) |
| |
| If any of your tests use the procedures |
| @code{unresolved}, @code{unsupported}, |
| or @code{runtested}, the summary output also |
| tabulates the corresponding outcomes. |
| |
| For example, after @code{runtest --tool |
| binutils}, look for a summary log in |
| @file{binutils.sum}. Normally, DejaGnu writes this |
| file in your current working directory; use the |
| @code{--outdir} option to select a different |
| directory. |
| |
| @strong{Here is a short sample summary log} |
| |
| @example |
| |
| Test Run By rob on Mon May 25 21:40:57 PDT 1992 |
| === gdb tests === |
| Running ./gdb.t00/echo.exp ... |
| PASS: Echo test |
| Running ./gdb.all/help.exp ... |
| PASS: help add-symbol-file |
| PASS: help aliases |
| PASS: help breakpoint "bre" abbreviation |
| FAIL: help run "r" abbreviation |
| Running ./gdb.t10/crossload.exp ... |
| PASS: m68k-elf (elf-big) explicit format; loaded |
| XFAIL: mips-ecoff (ecoff-bigmips) "ptype v_signed_char" signed C types |
| === gdb Summary === |
| # of expected passes 5 |
| # of expected failures 1 |
| # of unexpected failures 1 |
| /usr/latest/bin/gdb version 4.6.5 -q |
| |
| @end example |
| |
| @node Log File, Debug Log File, Summary File, Output Files |
| @subsection Log File |
| |
| DejaGnu also saves a detailed log file |
| @file{tool.log}, showing any output generated by |
| tests as well as the summary output. For example, after |
| @code{runtest --tool binutils}, look for a detailed |
| log in @file{binutils.log}. Normally, DejaGnu |
| writes this file in your current working directory; use the |
| @code{--outdir} option to select a different |
| directory. |
| |
| @strong{Here is a brief example showing a detailed log for |
| G++ tests} |
| |
| @example |
| |
| Test Run By rob on Mon May 25 21:40:43 PDT 1992 |
| |
| === g++ tests === |
| |
| --- Running ./g++.other/t01-1.exp --- |
| PASS: operate delete |
| |
| --- Running ./g++.other/t01-2.exp --- |
| FAIL: i960 bug EOF |
| p0000646.C: In function `int warn_return_1 ()': |
| p0000646.C:109: warning: control reaches end of non-void function |
| p0000646.C: In function `int warn_return_arg (int)': |
| p0000646.C:117: warning: control reaches end of non-void function |
| p0000646.C: In function `int warn_return_sum (int, int)': |
| p0000646.C:125: warning: control reaches end of non-void function |
| p0000646.C: In function `struct foo warn_return_foo ()': |
| p0000646.C:132: warning: control reaches end of non-void function |
| |
| --- Running ./g++.other/t01-4.exp --- |
| FAIL: abort |
| 900403_04.C:8: zero width for bit-field `foo' |
| --- Running ./g++.other/t01-3.exp --- |
| FAIL: segment violation |
| 900519_12.C:9: parse error before `;' |
| 900519_12.C:12: Segmentation violation |
| /usr/latest/bin/gcc: Internal compiler error: program cc1plus got fatal signal |
| |
| === g++ Summary === |
| |
| # of expected passes 1 |
| # of expected failures 3 |
| /usr/latest/bin/g++ version cygnus-2.0.1 |
| |
| @end example |
| |
| @node Debug Log File, , Log File, Output Files |
| @subsection Debug Log File |
| |
| With the @code{--debug} option, you can request |
| a log file showing the output from |
| Expect itself, running in debugging |
| mode. This file (@file{dbg.log}, in the directory |
| where you start @code{runtest}) shows each pattern |
| Expect considers in analyzing test |
| output. |
| |
| This file reflects each @code{send} command, |
| showing the string sent as input to the tool under test; and |
| each Expect command, showing each |
| pattern it compares with the tool output. |
| |
| @strong{The log messages begin with a message of the form} |
| |
| @example |
| |
| |
| expect: does @{tool output@} (spawn_id n) |
| match pattern @{expected pattern@}? |
| |
| |
| @end example |
| |
| For every unsuccessful match, |
| Expect issues a |
| @emph{no} after this message; if other patterns |
| are specified for the same Expect |
| command, they are reflected also, but without the first part of |
| the message (@emph{expect... match pattern}). |
| |
| When Expect finds a match, the |
| log for the successful match ends with @emph{yes}, |
| followed by a record of the Expect |
| variables set to describe a successful match. |
| |
| @strong{Here is an excerpt from the debugging log for a |
| GDB test:} |
| |
| @example |
| |
| send: sent @{break gdbme.c:34\n@} to spawn id 6 |
| expect: does @{@} (spawn_id 6) match pattern @{Breakpoint.*at.* file |
| gdbme.c, line 34.*\(gdb\) $@}? no |
| @{.*\(gdb\) $@}? no |
| expect: does @{@} (spawn_id 0) match pattern @{return@} ? no |
| @{\(y or n\) @}? no |
| @{buffer_full@}? no |
| @{virtual@}? no |
| @{memory@}? no |
| @{exhausted@}? no |
| @{Undefined@}? no |
| @{command@}? no |
| break gdbme.c:34 |
| Breakpoint 8 at 0x23d8: file gdbme.c, line 34. |
| (gdb) expect: does @{break gdbme.c:34\r\nBreakpoint 8 at 0x23d8: |
| file gdbme.c, line 34.\r\n(gdb) @} (spawn_id 6) match pattern |
| @{Breakpoint.*at.* file gdbme.c, line 34.*\(gdb\) $@}? yes |
| expect: set expect_out(0,start) @{18@} |
| expect: set expect_out(0,end) @{71@} |
| expect: set expect_out(0,string) @{Breakpoint 8 at 0x23d8: file |
| gdbme.c, line 34.\r\n(gdb) @} |
| epect: set expect_out(spawn_id) @{6@} |
| expect: set expect_out(buffer) @{break gdbme.c:34\r\nBreakpoint 8 |
| at 0x23d8: file gdbme.c, line 34.\r\n(gdb) @} |
| PASS: 70 0 breakpoint line number in file |
| |
| @end example |
| |
| This example exhibits three properties of |
| Expect and |
| DejaGnu that might be surprising at |
| first glance: |
| |
| @itemize |
| |
| @item |
| Empty output for the first attempted match. The |
| first set of attempted matches shown ran against the output |
| @emph{@{@}} --- that is, no |
| output. Expect begins |
| attempting to match the patterns supplied immediately; often, |
| the first pass is against incomplete output (or completely |
| before all output, as in this case). |
| |
| @item |
| Interspersed tool output. The beginning of |
| the log entry for the second attempted match may be hard to |
| spot: this is because the prompt @emph{@{(gdb) @}} |
| appears on the same line, just before the |
| @emph{expect:} that marks the beginning of the |
| log entry. |
| |
| @item |
| Fail-safe patterns. Many of the patterns |
| tested are fail-safe patterns provided by |
| GDB testing utilities, to reduce |
| possible indeterminacy. It is useful to anticipate potential |
| variations caused by extreme system conditions |
| (GDB might issue the message |
| @emph{virtual memory exhausted} in rare |
| circumstances), or by changes in the tested program |
| (@emph{Undefined command} is the likeliest |
| outcome if the name of a tested command changes). |
| |
| The pattern @emph{@{return@}} is a |
| particularly interesting fail-safe to notice; it checks for an |
| unexpected @key{RET} prompt. This may happen, |
| for example, if the tested tool can filter output through a |
| pager. |
| |
| These fail-safe patterns (like the debugging log itself) |
| are primarily useful while developing test scripts. Use the |
| @code{error} procedure to make the actions for |
| fail-safe patterns produce messages starting with |
| @emph{ERROR} on standard output, and in the |
| detailed log file. |
| @end itemize |
| |
| @node Customizing DejaGnu, Extending DejaGnu, Running Tests, Top |
| @chapter Customizing DejaGnu |
| |
| The site configuration file, @file{site.exp}, |
| captures configuration-dependent values and propagates them to the |
| DejaGnu test environment using Tcl variables. This ties the |
| DejaGnu test scripts into the @code{configure} and |
| @code{make} programs. If this file is setup correctly, |
| it is possible to execute a testsuite merely by typing |
| @code{runtest}. |
| |
| DejaGnu supports two @file{site.exp} |
| files. The multiple instances of @file{site.exp} are |
| loaded in a fixed order built into DejaGnu. The first file loaded |
| is the local file @file{site.exp}, and then the |
| optional global @file{site.exp} file as |
| pointed to by the @code{DEJAGNU} environment |
| variable. |
| |
| There is an optional @emph{master} |
| @file{site.exp}, capturing configuration values that |
| apply to DejaGnu across the board, in each configuration-specific |
| subdirectory of the DejaGnu library directory. |
| @code{runtest} loads these values first. The master |
| @file{site.exp} contains the default values for all |
| targets and hosts supported by DejaGnu. This master file is |
| identified by setting the environment variable |
| @code{DEJAGNU} to the name of the file. This is also |
| refered to as the ``global'' config file. |
| |
| Any directory containing a configured testsuite also has a |
| local @file{site.exp}, capturing configuration values |
| specific to the tool under test. Since @code{runtest} |
| loads these values last, the individual test configuration can |
| either rely on and use, or override, any of the global values from |
| the global @file{site.exp} file. |
| |
| You can usually generate or update the testsuite's local |
| @file{site.exp} by typing @code{make |
| site.exp} in the testsuite directory, after the test |
| suite is configured. |
| |
| You can also have a file in your home directory called |
| @file{.dejagnurc}. This gets loaded first before the |
| other config files. Usually this is used for personal stuff, like |
| setting the @code{all_flag} so all the output gets |
| printed, or your own verbosity levels. This file is usually |
| restricted to setting command line options. |
| |
| You can further override the default values in a |
| user-editable section of any @file{site.exp}, or by |
| setting variables on the @code{runtest} command |
| line. |
| |
| @menu |
| * Local Config File:: |
| * Global Config File:: |
| * Board Config File:: |
| * Remote Host Testing:: |
| * Config File Values:: |
| @end menu |
| |
| @node Local Config File, Global Config File, , Customizing DejaGnu |
| @section Local Config File |
| |
| It is usually more convenient to keep these @emph{manual |
| overrides} in the @file{site.exp} |
| local to each test directory, rather than in the global |
| @file{site.exp} in the installed DejaGnu |
| library. This file is mostly for supplying tool specific info |
| that is required by the testsuite. |
| |
| All local @file{site.exp} files have |
| two sections, separated by comment text. The first section is |
| the part that is generated by @code{make}. It is |
| essentially a collection of Tcl variable definitions based on |
| @file{Makefile} environment variables. Since they |
| are generated by @code{make}, they contain the |
| values as specified by @code{configure}. (You can |
| also customize these values by using the @code{--site} |
| option to @code{configure}.) In particular, this |
| section contains the @file{Makefile} |
| variables for host and target configuration data. Do not edit |
| this first section; if you do, your changes are replaced next |
| time you run @code{make}. |
| |
| @strong{The first section starts with} |
| |
| @example |
| |
| ## these variables are automatically generated by make ## |
| # Do not edit here. If you wish to override these values |
| # add them to the last section |
| |
| @end example |
| |
| In the second section, you can override any default values |
| (locally to DejaGnu) for all the variables. The second section |
| can also contain your preferred defaults for all the command |
| line options to @code{runtest}. This allows you to |
| easily customize @code{runtest} for your preferences |
| in each configured test-suite tree, so that you need not type |
| options repeatedly on the command line. (The second section may |
| also be empty, if you do not wish to override any defaults.) |
| |
| @strong{The first section ends with this line} |
| |
| @example |
| |
| ## All variables above are generated by configure. Do Not Edit ## |
| |
| @end example |
| |
| You can make any changes under this line. If you wish to |
| redefine a variable in the top section, then just put a |
| duplicate value in this second section. Usually the values |
| defined in this config file are related to the configuration of |
| the test run. This is the ideal place to set the variables |
| @code{host_triplet}, @code{build_triplet}, |
| @code{target_triplet}. All other variables are tool |
| dependant, i.e., for testing a compiler, the value for |
| @code{CC} might be set to a freshly built binary, as |
| opposed to one in the user's path. |
| |
| Here's an example local site.exp file, as used for |
| GCC/G++ testing. |
| |
| @strong{Local Config File} |
| |
| @example |
| |
| ## these variables are automatically generated by make ## |
| # Do not edit here. If you wish to override these values |
| # add them to the last section |
| set rootme "/build/devo-builds/i586-pc-linux-gnulibc1/gcc" |
| set host_triplet i586-pc-linux-gnulibc1 |
| set build_triplet i586-pc-linux-gnulibc1 |
| set target_triplet i586-pc-linux-gnulibc1 |
| set target_alias i586-pc-linux-gnulibc1 |
| set CFLAGS "" |
| set CXXFLAGS "-isystem /build/devo-builds/i586-pc-linux-gnulibc1/gcc/../libio -isystem $srcdir/../libg++/src -isystem $srcdir/../libio -isystem $srcdir/../libstdc++ -isystem $srcdir/../libstdc++/stl -L/build/devo-builds/i586-pc-linux-gnulibc1/gcc/../libg++ -L/build/devo-builds/i586-pc-linux-gnulibc1/gcc/../libstdc++" |
| append LDFLAGS " -L/build/devo-builds/i586-pc-linux-gnulibc1/gcc/../ld" |
| set tmpdir /build/devo-builds/i586-pc-linux-gnulibc1/gcc/testsuite |
| set srcdir "$@{srcdir@}/testsuite" |
| ## All variables above are generated by configure. Do Not Edit ## |
| |
| |
| @end example |
| |
| This file defines the required fields for a local config |
| file, namely the three config triplets, and the srcdir. It also |
| defines several other Tcl variables that are used exclusivly by |
| the GCC testsuite. For most test cases, the CXXFLAGS and LDFLAGS |
| are supplied by DejaGnu itself for cross testing, but to test a |
| compiler, GCC needs to manipulate these itself. |
| |
| @node Global Config File, Board Config File, Local Config File, Customizing DejaGnu |
| @section Global Config File |
| |
| The master config file is where all the target specific |
| config variables for a whole site get set. The idea is |
| that for a centralized testing lab where people have to share a |
| target between multiple developers. There are settings for both |
| remote targets and remote hosts. Here's an example of a Master |
| Config File (also called the Global config file) for a |
| @emph{canadian cross}. A canadian cross is when |
| you build and test a cross compiler on a machine other than the |
| one it's to be hosted on. |
| |
| Here we have the config settings for our California |
| office. Note that all config values are site dependant. Here we |
| have two sets of values that we use for testing m68k-aout cross |
| compilers. As both of these target boards has a different |
| debugging protocol, we test on both of them in sequence. |
| |
| @strong{Global Config file} |
| |
| @example |
| |
| |
| # Make sure we look in the right place for the board description files. |
| if ![info exists boards_dir] @{ |
| set boards_dir @{@} |
| @} |
| lappend boards_dir "/nfs/cygint/s1/cygnus/dejagnu/boards" |
| |
| verbose "Global Config File: target_triplet is $target_triplet" 2 |
| global target_list |
| |
| case "$target_triplet" in @{ |
| @{ "native" @} @{ |
| set target_list "unix" |
| @} |
| @{ "sparc64-*elf" @} @{ |
| set target_list "sparc64-sim" |
| @} |
| @{ "mips-*elf" @} @{ |
| set target_list "mips-sim wilma barney" |
| @} |
| @{ "mips-lsi-elf" @} @{ |
| set target_list "mips-lsi-sim@{,soft-float,el@}" |
| @} |
| @{ "sh-*hms" @} @{ |
| set target_list @{ "sh-hms-sim" "bloozy" @} |
| @} |
| @} |
| |
| @end example |
| |
| In this case, we have support for several cross compilers, |
| that all run on this host. For testing on operating systems that |
| don't support Expect, DejaGnu can be run on the local build |
| machine, and it can connect to the remote host and run all the |
| tests for this cross compiler on that host. All the remote OS |
| requires is a working telnetd. |
| |
| As you can see, all one does is set the variable |
| @code{target_list} to the list of targets and options to |
| test. The simple settings, like for |
| @emph{sparc64-elf} only require setting the name of |
| the single board config file. The @emph{mips-elf} |
| target is more complicated. Here it sets the list to three target |
| boards. One is the default mips target, and both |
| @emph{wilma} @emph{barney} are |
| symbolic names for other mips boards. Symbolic names are covered |
| in the @ref{Adding A New Board} chapter. The more complicated |
| example is the one for @emph{mips-lsi-elf}. This one |
| runs the tests with multiple iterations using all possible |
| combinations of the @code{--soft-float} and the |
| @code{--el} (little endian) option. Needless to say, |
| this last feature is mostly compiler specific. |
| |
| @node Board Config File, Remote Host Testing, Global Config File, Customizing DejaGnu |
| @section Board Config File |
| |
| The board config file is where board specfic config data |
| is stored. A board config file contains all the higher-level |
| configuration settings. There is a rough inheritance scheme, where it is |
| possible to base a new board description file on an existing one. There |
| are also collections of custom procedures for common environments. For |
| more information on adding a new board config file, go to the @ref{Adding A New Board} chapter. |
| |
| An example board config file for a GNU simulator is as |
| follows. @code{set_board_info} is a procedure that sets the |
| field name to the specified value. The procedures in square brackets |
| @emph{[]} are @emph{helper procedures}. Thes |
| are used to find parts of a tool chain required to build an executable |
| image that may reside in various locations. This is mostly of use for |
| when the startup code, the standard C lobraries, or the tool chain itself |
| is part of your build tree. |
| |
| @strong{Board Config File} |
| |
| @example |
| |
| # This is a list of toolchains that are supported on this board. |
| set_board_info target_install @{sparc64-elf@} |
| |
| # Load the generic configuration for this board. This will define any |
| # routines needed by the tool to communicate with the board. |
| load_generic_config "sim" |
| |
| # We need this for find_gcc and *_include_flags/*_link_flags. |
| load_base_board_description "basic-sim" |
| |
| # Use long64 by default. |
| process_multilib_options "long64" |
| |
| setup_sim sparc64 |
| |
| # We only support newlib on this target. We assume that all multilib |
| # options have been specified before we get here. |
| set_board_info compiler "[find_gcc]" |
| set_board_info cflags "[libgloss_include_flags] [newlib_include_flags]" |
| set_board_info ldflags "[libgloss_link_flags] [newlib_link_flags]" |
| # No linker script. |
| set_board_info ldscript ""; |
| |
| # Used by a few gcc.c-torture testcases to delimit how large the |
| # stack can be. |
| set_board_info gcc,stack_size 16384 |
| # The simulator doesn't return exit statuses and we need to indicate this |
| # the standard GCC wrapper will work with this target. |
| set_board_info needs_status_wrapper 1 |
| # We can't pass arguments to programs. |
| set_board_info noargs 1 |
| |
| @end example |
| |
| There are five helper procedures used in this example. The first |
| one, @code{find gcc} looks for a copy of the GNU compiler in |
| your build tree, or it uses the one in your path. This will also return |
| the proper transformed name for a cross compiler if you whole build tree |
| is configured for one. The next helper procedures are |
| @code{libgloss_include_flags} & |
| @code{libgloss_link_flags}. These return the proper flags to |
| compiler and link an executable image using @ref{Libgloss}, the GNU BSP (Board Support Package). The final |
| procedures are @code{newlib_include_flag} & |
| @code{newlib_include_flag}. These find the Newlib C |
| library, which is a reentrant standard C library for embedded systems |
| comprising of non GPL'd code. |
| |
| @node Remote Host Testing, Config File Values, Board Config File, Customizing DejaGnu |
| @section Remote Host Testing |
| |
| @quotation |
| |
| @strong{Note} |
| |
| Thanks to Dj Delorie for the original paper that |
| this section is based on. |
| @end quotation |
| |
| DejaGnu also supports running the tests on a remote |
| host. To set this up, the remote host needs an ftp server, and a |
| telnet server. Currently foreign operating systems used as |
| remote hosts are VxWorks, VRTX, DOS/Windows 3.1, MacOS and Windows. |
| |
| The recommended source for a Windows-based FTP |
| server is to get IIS (either IIS 1 or Personal Web Server) from |
| @uref{http://www.microsoft.com,http://www.microsoft.com}. |
| When you install it, make sure you install the FTP server - it's |
| not selected by default. Go into the IIS manager and change the |
| FTP server so that it does not allow anonymous FTP. Set the home |
| directory to the root directory (i.e. c:\) of a suitable |
| drive. Allow writing via FTP. |
| |
| It will create an account like IUSR_FOOBAR where foobar is |
| the name of your machine. Go into the user editor and give that |
| account a password that you don't mind hanging around in the |
| clear (i.e. not the same as your admin or personal |
| passwords). Also, add it to all the various permission groups. |
| |
| You'll also need a telnet server. For Windows, go |
| to the @uref{http://ataman.com,Ataman} web site, |
| pick up the Ataman Remote Logon Services for Windows, and |
| install it. You can get started on the eval period anyway. Add |
| IUSR_FOOBAR to the list of allowed users, set the HOME directory |
| to be the same as the FTP default directory. Change the Mode |
| prompt to simple. |
| |
| Ok, now you need to pick a directory name to do all the |
| testing in. For the sake of this example, we'll call it piggy |
| (i.e. c:\piggy). Create this directory. |
| |
| You'll need a unix machine. Create a directory for the |
| scripts you'll need. For this example, we'll use |
| /usr/local/swamp/testing. You'll need to have a source tree |
| somewhere, say /usr/src/devo. Now, copy some files from |
| releng's area in SV to your machine: |
| |
| @strong{Remote host setup} |
| |
| @example |
| |
| cd /usr/local/swamp/testing |
| mkdir boards |
| scp darkstar.welcomehome.org:/dejagnu/cst/bin/MkTestDir . |
| scp darkstar.welcomehome.org:/dejagnu/site.exp . |
| scp darkstar.welcomehome.org:/dejagnu/boards/useless98r2.exp boards/foobar.exp |
| export DEJAGNU=/usr/local/swamp/testing/site.exp |
| |
| |
| @end example |
| |
| You must edit the boards/foobar.exp file to reflect your |
| machine; change the hostname (foobar.com), username |
| (iusr_foobar), password, and ftp_directory (c:/piggy) to match |
| what you selected. |
| |
| Edit the global @file{ site.exp} to reflect your |
| boards directory: |
| |
| @strong{Add The Board Directory} |
| |
| @example |
| |
| lappend boards_dir "/usr/local/swamp/testing/boards" |
| |
| @end example |
| |
| Now run MkTestDir, which is in the contrib |
| directory. The first parameter is the toolchain prefix, the |
| second is the location of your devo tree. If you are testing a |
| cross compiler (ex: you have sh-hms-gcc.exe in your PATH on |
| the PC), do something like this: |
| |
| @strong{Setup Cross Remote Testing} |
| |
| @example |
| |
| ./MkTestDir sh-hms /usr/dejagnu/src/devo |
| |
| @end example |
| |
| If you are testing a native PC compiler (ex: you have |
| gcc.exe in your PATH on the PC), do this: |
| |
| @strong{Setup Native Remote Testing} |
| |
| @example |
| |
| ./MkTestDir '' /usr/dejagnu/src/devo |
| |
| @end example |
| |
| To test the setup, @code{ftp} to your PC |
| using the username (iusr_foobar) and password you selected. CD |
| to the test directory. Upload a file to the PC. Now telnet to |
| your PC using the same username and password. CD to the test |
| directory. Make sure the file is there. Type "set" and/or "gcc |
| -v" (or sh-hms-gcc -v) and make sure the default PATH contains |
| the installation you want to test. |
| |
| @strong{Run Test Remotely} |
| |
| @example |
| |
| cd /usr/local/swamp/testing |
| make -k -w check RUNTESTFLAGS="--host_board foobar --target_board foobar -v -v" > check.out 2>&1 |
| |
| @end example |
| |
| To run a specific test, use a command like this (for |
| this example, you'd run this from the gcc directory that |
| MkTestDir created): |
| |
| @strong{Run a Test Remotely} |
| |
| @example |
| |
| make check RUNTESTFLAGS="--host_board sloth --target_board sloth -v compile.exp=921202-1.c" |
| |
| @end example |
| |
| Note: if you are testing a cross-compiler, put in the |
| correct target board. You'll also have to download more .exp |
| files and modify them for your local configuration. The -v's |
| are optional. |
| |
| @node Config File Values, , Remote Host Testing, Customizing DejaGnu |
| @section Config File Values |
| |
| DejaGnu uses a named array in Tcl to hold all the info for |
| each machine. In the case of a canadian cross, this means host |
| information as well as target information. The named array is |
| called @code{target_info}, and it has two indices. The |
| following fields are part of the array. |
| |
| @menu |
| * Command Line Option Variables: Option Variables. |
| * Personal Config File:: |
| @end menu |
| |
| @node Option Variables, Personal Config File, , Config File Values |
| @subsection Command Line Option Variables |
| |
| In the user editable second section of the @ref{Personal Config File} you can not only override the configuration |
| variables captured in the first section, but also specify |
| default values for all on the @code{runtest} |
| command line options. Save for @code{--debug}, |
| @code{--help}, and @code{--version}, each |
| command line option has an associated Tcl variable. Use the |
| Tcl @code{set} command to specify a new default |
| value (as for the configuration variables). The following |
| table describes the correspondence between command line |
| options and variables you can set in |
| @file{site.exp}. @ref{Invoking Runtest}, for |
| explanations of the command-line options. |
| |
| |
| @strong{Tcl Variables For Command Line Options} |
| |
| @multitable @columnfractions 0.333333333333333 0.333333333333333 0.333333333333333 |
| @item |
| runtest@tab Tcl@tab optionvariabledescription |
| @item |
| --all@tab all_flag@tab display all test results if set |
| @item |
| --baud@tab baud@tab set the default baud rate to something other than |
| 9600. |
| @item |
| --connect@tab connectmode@tab @code{rlogin}, |
| @code{telnet}, @code{rsh}, |
| @code{kermit}, @code{tip}, or |
| @code{mondfe} |
| @item |
| --outdir@tab outdir@tab directory for @file{tool.sum} and |
| @file{tool.log.} |
| @item |
| --objdir@tab objdir@tab directory for pre-compiled binaries |
| @item |
| --reboot@tab reboot@tab reboot the target if set to |
| @emph{"1"}; do not reboot if set to |
| @emph{"0"} (the default). |
| @item |
| --srcdir@tab srcdir@tab directory of test subdirectories |
| @item |
| --strace@tab tracelevel@tab a number: Tcl trace depth |
| @item |
| --tool@tab tool@tab name of tool to test; identifies init, test subdir |
| @item |
| --verbose@tab verbose@tab verbosity level. As option, use multiple times; as |
| variable, set a number, 0 or greater. |
| @item |
| --target@tab target_triplet@tab The canonical configuration string for the target. |
| @item |
| --host@tab host_triplet@tab The canonical configuration string for the host. |
| @item |
| --build@tab build_triplet@tab The canonical configuration string for the build |
| host. |
| @item |
| --mail@tab address@tab Email the output log to the specified address. |
| @end multitable |
| |
| @node Personal Config File, , Option Variables, Config File Values |
| @subsection Personal Config File |
| |
| The personal config file is used to customize |
| @code{runtest's} behaviour for each person. It is |
| typically used to set the user prefered setting for verbosity, |
| and any experimental Tcl procedures. My personal |
| @file{~/.dejagnurc} file looks like: |
| |
| @strong{Personal Config File} |
| |
| @example |
| |
| set all_flag 1 |
| set RLOGIN /usr/ucb/rlogin |
| set RSH /usr/local/sbin/ssh |
| |
| @end example |
| |
| Here I set @code{all_flag} so I see all the test |
| cases that PASS along with the ones that FAIL. I also set |
| @code{RLOGIN} to the BSD version. I have |
| Kerberos installed, and when I rlogin |
| to a target board, it usually isn't supported. So I use the non |
| secure version rather than the default that's in my path. I also |
| set @code{RSH} to the SSH |
| secure shell, as rsh is mostly used to test unix |
| machines within a local network here. |
| |
| @node Extending DejaGnu, Unit Testing, Customizing DejaGnu, Top |
| @chapter Extending DejaGnu |
| |
| @menu |
| * Adding A New Testsuite: Adding a new Testsuite. |
| * Adding A New Tool:: |
| * Adding A New Target:: |
| * Adding A New Board:: |
| * Board Config File Values: Board File Values. |
| * Writing A Test Case:: |
| * Debugging A Test Case:: |
| * Adding A Test Case To A Testsuite.: Adding A Test Case To A Testsuite. |
| * Hints On Writing A Test Case:: |
| * Special variables used by test cases.: Test Case Variables. |
| @end menu |
| |
| @node Adding a new Testsuite, Adding A New Tool, , Extending DejaGnu |
| @section Adding A New Testsuite |
| |
| The testsuite for a new tool should always be located in that tools |
| source directory. DejaGnu require the directory be named |
| @file{testsuite}. Under this directory, the test cases go |
| in a subdirectory whose name begins with the tool name. For example, for |
| a tool named @emph{flubber}, each subdirectory containing |
| testsuites must start with @emph{"flubber."}. |
| |
| @node Adding A New Tool, Adding A New Target, Adding a new Testsuite, Extending DejaGnu |
| @section Adding A New Tool |
| |
| In general, the best way to learn how to write (code or even prose) |
| is to read something similar. This principle applies to test cases and |
| to testsuites. Unfortunately, well-established testsuites have a way |
| of developing their own conventions: as test writers become more |
| experienced with DejaGnu and with Tcl, they accumulate more utilities, |
| and take advantage of more and more features of |
| Expect and Tcl in |
| general. |
| |
| Inspecting such established testsuites may make the prospect of |
| creating an entirely new testsuite appear overwhelming. Nevertheless, |
| it is quite straightforward to get a new testsuite going. |
| |
| There is one testsuite that is guaranteed not to grow more |
| elaborate over time: both it and the tool it tests were created expressly |
| to illustrate what it takes to get started with DejaGnu. The |
| @file{example/} directory of the DejaGnu distribution |
| contains both an interactive tool called @code{calc}, and a |
| testsuite for it. Reading this testsuite, and experimenting with it, |
| is a good way to supplement the information in this section. (Thanks to |
| Robert Lupton for creating calc and its testsuite---and also the first |
| version of this section of the manual!) |
| |
| To help orient you further in this task, here is an outline of the |
| steps to begin building a testsuite for a program example. |
| |
| @itemize |
| |
| @item |
| Create or select a directory to contain your new |
| collection of tests. Change into that directory (shown here as |
| @file{testsuite}): |
| |
| Create a @file{configure.in} file in this directory, |
| to control configuration-dependent choices for your tests. So far as |
| DejaGnu is concerned, the important thing is to set a value for the |
| variable @code{target_abbrev}; this value is the link to the |
| init file you will write soon. (For simplicity, we assume the |
| environment is Unix, and use @emph{unix} as the |
| value.) |
| |
| What else is needed in @file{configure.in} depends on |
| the requirements of your tool, your intended test environments, and which |
| configure system you use. This example is a minimal configure.in for use |
| with GNU Autoconf. |
| |
| @item |
| Create @file{Makefile.in} (if you are using |
| Autoconf), or @file{Makefile.am}(if you are using |
| Automake), the source file used by configure to build your |
| @file{Makefile}. If you are using GNU Automake.just add the |
| keyword @emph{dejagnu} to the |
| @emph{AUTOMAKE_OPTIONS} variable in your |
| @file{Makefile.am} file. This will add all the Makefile |
| support needed to run DejaGnu, and support the @ref{Make Check} |
| target. |
| |
| You also need to include two targets important to DejaGnu: |
| @emph{check}, to run the tests, and |
| @emph{site.exp}, to set up the Tcl copies of |
| configuration-dependent values. This is called the @ref{Local Config File} |
| The check target must run the @code{runtest} program to |
| execute the tests. |
| |
| The @file{site.exp} target should usually set up |
| (among other things) the $tool variable for the name of your program. If |
| the local site.exp file is setup correctly, it is possible to execute the |
| tests by merely typing @code{runtest} on the command |
| line. |
| |
| @strong{Sample Makefile.in Fragment} |
| |
| @example |
| |
| # Look for a local version of DejaGnu, otherwise use one in the path |
| RUNTEST = `if test -f $(top_srcdir)/../dejagnu/runtest; then \ |
| echo $(top_srcdir) ../dejagnu/runtest; \ |
| else \ |
| echo runtest; \ |
| fi` |
| |
| # The flags to pass to runtest |
| RUNTESTFLAGS = |
| |
| # Execute the tests |
| check: site.exp all |
| $(RUNTEST) $(RUNTESTFLAGS) \ |
| --tool $@{example@} --srcdir $(srcdir) |
| |
| # Make the local config file |
| site.exp: ./config.status Makefile |
| @@echo "Making a new config file..." |
| -@@rm -f ./tmp? |
| @@touch site.exp |
| |
| -@@mv site.exp site.bak |
| @@echo "## these variables are automatically\ |
| generated by make ##" > ./tmp0 |
| @@echo "# Do not edit here. If you wish to\ |
| override these values" >> ./tmp0 |
| @@echo "# add them to the last section" >> ./tmp0 |
| @@echo "set host_os $@{host_os@}" >> ./tmp0 |
| @@echo "set host_alias $@{host_alias@}" >> ./tmp0 |
| @@echo "set host_cpu $@{host_cpu@}" >> ./tmp0 |
| @@echo "set host_vendor $@{host_vendor@}" >> ./tmp0 |
| @@echo "set target_os $@{target_os@}" >> ./tmp0 |
| @@echo "set target_alias $@{target_alias@}" >> ./tmp0 |
| @@echo "set target_cpu $@{target_cpu@}" >> ./tmp0 |
| @@echo "set target_vendor $@{target_vendor@}" >> ./tmp0 |
| @@echo "set host_triplet $@{host_canonical@}" >> ./tmp0 |
| @@echo "set target_triplet $@{target_canonical@}">>./tmp0 |
| @@echo "set tool binutils" >> ./tmp0 |
| @@echo "set srcdir $@{srcdir@}" >> ./tmp0 |
| @@echo "set objdir `pwd`" >> ./tmp0 |
| @@echo "set $@{examplename@} $@{example@}" >> ./tmp0 |
| @@echo "## All variables above are generated by\ |
| configure. Do Not Edit ##" >> ./tmp0 |
| @@cat ./tmp0 > site.exp |
| @@sed < site.bak \ |
| -e '1,/^## All variables above are.*##/ d' \ |
| >> site.exp |
| -@@rm -f ./tmp? |
| |
| |
| @end example |
| |
| @item |
| Create a directory (in @file{testsuite}) |
| called @file{config}. Make a @emph{Tool Init |
| File} in this directory. Its name must start with the |
| @code{target_abbrev} value, or be named |
| @file{default.exp} so call it |
| @file{config/unix.exp} for our Unix based example. This |
| is the file that contains the target-dependent procedures. |
| Fortunately, on Unix, most of them do not have to do very much in |
| order for @code{runtest} to run. |
| |
| If the program being tested is not interactive, you can get |
| away with this minimal @file{unix.exp} to begin |
| with: |
| |
| @strong{Simple Batch Program Tool Init File} |
| |
| @example |
| |
| |
| proc foo_exit @{@} @{@} |
| proc foo_version @{@} @{@} |
| |
| |
| @end example |
| |
| If the program being tested is interactive, however, you might |
| as well define a @emph{start} routine and invoke it by |
| using an init file like this: |
| |
| @strong{Simple Interactive Program Tool Init File} |
| |
| @example |
| |
| |
| proc foo_exit @{@} @{@} |
| proc foo_version @{@} @{@} |
| |
| proc foo_start @{@} @{ |
| global $@{examplename@} |
| spawn $@{examplename@} |
| expect @{ |
| -re "" @{@} |
| @} |
| @} |
| |
| # Start the program running we want to test |
| foo_start |
| |
| |
| @end example |
| |
| @item |
| Create a directory whose name begins with your tool's |
| name, to contain tests. For example, if your tool's name is |
| @emph{gcc}, then the directories all need to start with |
| @emph{"gcc."}. |
| |
| @item |
| Create a sample test file. Its name must end with |
| @file{.exp}. You can use |
| @file{first-try.exp}. To begin with, just write there a |
| line of Tcl code to issue a message. |
| |
| @strong{Testing A New Tool Config} |
| |
| @example |
| |
| |
| send_user "Testing: one, two...\n" |
| |
| |
| @end example |
| |
| @item |
| Back in the @file{testsuite} (top |
| level) directory, run @code{configure}. Typically you do |
| this while in the build directory. You may have to specify more of a |
| path, if a suitable configure is not available in your execution |
| path. |
| |
| @item |
| e now ready to triumphantly type @code{make |
| check} or @code{runtest}. You should see |
| something like this: |
| |
| @strong{Example Test Case Run} |
| |
| @example |
| |
| Test Run By rhl on Fri Jan 29 16:25:44 EST 1993 |
| |
| === example tests === |
| |
| Running ./example.0/first-try.exp ... |
| Testing: one, two... |
| |
| === example Summary === |
| |
| |
| @end example |
| |
| There is no output in the summary, because so far the example |
| does not call any of the procedures that establish a test |
| outcome. |
| |
| @item |
| Write some real tests. For an interactive tool, you |
| should probably write a real exit routine in fairly short order. In |
| any case, you should also write a real version routine |
| soon. |
| @end itemize |
| |
| @node Adding A New Target, Adding A New Board, Adding A New Tool, Extending DejaGnu |
| @section Adding A New Target |
| |
| DejaGnu has some additional requirements for target support, beyond |
| the general-purpose provisions of configure. DejaGnu must actively |
| communicate with the target, rather than simply generating or managing |
| code for the target architecture. Therefore, each tool requires an |
| initialization module for each target. For new targets, you must supply |
| a few Tcl procedures to adapt DejaGnu to the target. This permits |
| DejaGnu itself to remain target independent. |
| |
| Usually the best way to write a new initialization module is to |
| edit an existing initialization module; some trial and error will be |
| required. If necessary, you can use the @@samp@{--debug@} option to see what |
| is really going on. |
| |
| When you code an initialization module, be generous in printing |
| information controlled by the @code{verbose} |
| procedure. |
| |
| For cross targets, most of the work is in getting the |
| communications right. Communications code (for several situations |
| involving IP networks or serial lines) is available in a DejaGnu library |
| file. |
| |
| If you suspect a communication problem, try running the connection |
| interactively from Expect. (There are three |
| ways of running Expect as an interactive |
| interpreter. You can run Expect with no |
| arguments, and control it completely interactively; or you can use |
| @code{expect -i} together with other command-line options and |
| arguments; or you can run the command @code{interpreter} from |
| any Expect procedure. Use |
| @code{return} to get back to the calling procedure (if any), |
| or @code{return -tcl} to make the calling procedure itself |
| return to its caller; use @code{exi}t or end-of-file to leave |
| Expect altogether.) Run the program whose name is recorded in |
| @code{$connectmode}, with the arguments in |
| @code{$targetname}, to establish a connection. You should at |
| least be able to get a prompt from any target that is physically |
| connected. |
| |
| @node Adding A New Board, Board File Values, Adding A New Target, Extending DejaGnu |
| @section Adding A New Board |
| |
| Adding a new board consists of creating a new board config |
| file. Examples are in |
| @file{dejagnu/baseboards}. Usually to make a new |
| board file, it's easiest to copy an existing one. It is also |
| possible to have your file be based on a |
| @emph{baseboard} file with only one or two |
| changes needed. Typically, this can be as simple as just |
| changing the linker script. Once the new baseboard file is done, |
| add it to the @code{boards_DATA} list in the |
| @file{dejagnu/baseboards/Makefile.am}, and regenerate the |
| Makefile.in using automake. Then just rebuild and install DejaGnu. You |
| can test it by: |
| |
| There is a crude inheritance scheme going on with board files, so |
| you can include one board file into another, The two main procedures used |
| to do this are @code{load_generic_config} and |
| @code{load_base_board_description}. The generic config file |
| contains other procedures used for a certain class of target. The |
| board description file is where the board specfic settings go. Commonly |
| there are similar target environments with just different |
| processors. |
| |
| @strong{Testing a New Board Config File} |
| |
| @example |
| |
| make check RUNTESTFLAGS="--target_board=newboardfile". |
| |
| @end example |
| |
| Here's an example of a board config file. There are |
| several @emph{helper procedures} used in this |
| example. A helper procedure is one that look for a tool of files |
| in commonly installed locations. These are mostly used when |
| testing in the build tree, because the executables to be tested |
| are in the same tree as the new dejagnu files. The helper |
| procedures are the ones in square braces |
| @emph{[]}, which is the Tcl execution characters. |
| |
| @strong{Example Board Config File} |
| |
| @example |
| |
| |
| # Load the generic configuration for this board. This will define a basic |
| # set of routines needed by the tool to communicate with the board. |
| load_generic_config "sim" |
| |
| # basic-sim.exp is a basic description for the standard Cygnus simulator. |
| load_base_board_description "basic-sim" |
| |
| # The compiler used to build for this board. This has *nothing* to do |
| # with what compiler is tested if we're testing gcc. |
| set_board_info compiler "[find_gcc]" |
| |
| # We only support newlib on this target. |
| # However, we include libgloss so we can find the linker scripts. |
| set_board_info cflags "[newlib_include_flags] [libgloss_include_flags]" |
| set_board_info ldflags "[newlib_link_flags]" |
| |
| # No linker script for this board. |
| set_board_info ldscript "-Tsim.ld"; |
| |
| # The simulator doesn't return exit statuses and we need to indicate this. |
| set_board_info needs_status_wrapper 1 |
| |
| # Can't pass arguments to this target. |
| set_board_info noargs 1 |
| |
| # No signals. |
| set_board_info gdb,nosignals 1 |
| |
| # And it can't call functions. |
| set_board_info gdb,cannot_call_functions 1 |
| |
| |
| @end example |
| |
| @node Board File Values, Writing A Test Case, Adding A New Board, Extending DejaGnu |
| @section Board Config File Values |
| |
| These fields are all in the @code{board_info} These are |
| all set by using the @code{set_board_info} procedure. The |
| parameters are the field name, followed by the value to set the field |
| to. |
| |
| |
| @strong{Common Board Info Fields} |
| |
| @multitable @columnfractions 0.333333333333333 0.333333333333333 0.333333333333333 |
| @item |
| Field@tab Sample Value@tab Description |
| @item |
| compiler@tab "[find_gcc]"@tab The path to the compiler to use. |
| @item |
| cflags@tab "-mca"@tab Compilation flags for the compiler. |
| @item |
| ldflags@tab "[libgloss_link_flags] [newlib_link_flags]"@tab Linking flags for the compiler. |
| @item |
| ldscript@tab "-Wl,-Tidt.ld"@tab The linker script to use when cross compiling. |
| @item |
| libs@tab "-lgcc"@tab Any additional libraries to link in. |
| @item |
| shell_prompt@tab "cygmon>"@tab The command prompt of the remote shell. |
| @item |
| hex_startaddr@tab "0xa0020000"@tab The Starting address as a string. |
| @item |
| start_addr@tab 0xa0008000@tab The starting address as a value. |
| @item |
| startaddr@tab "a0020000"@tab |
| @item |
| exit_statuses_bad@tab 1@tab Whether there is an accurate exit status. |
| @item |
| reboot_delay@tab 10@tab The delay between power off and power on. |
| @item |
| unreliable@tab 1@tab Whether communication with the board is unreliable. |
| @item |
| sim@tab [find_sim]@tab The path to the simulator to use. |
| @item |
| objcopy@tab $tempfil@tab The path to the @code{objcopy} program. |
| @item |
| support_libs@tab "$@{prefix_dir@}/i386-coff/"@tab Support libraries needed for cross compiling. |
| @item |
| addl_link_flags@tab "-N"@tab Additional link flags, rarely used. |
| @end multitable |
| |
| These fields are used by the GCC and GDB tests, and are mostly |
| only useful to somewhat trying to debug a new board file for one of |
| these tools. Many of these are used only by a few testcases, and their |
| purpose is esoteric. These are listed with sample values as a guide to |
| better guessing if you need to change any of these. |
| |
| |
| @strong{Board Info Fields For GCC & GDB} |
| |
| @multitable @columnfractions 0.333333333333333 0.333333333333333 0.333333333333333 |
| @item |
| Field@tab Sample Value@tab Description |
| @item |
| strip@tab $tempfile@tab Strip the executable of symbols. |
| @item |
| gdb_load_offset@tab "0x40050000"@tab |
| @item |
| gdb_protocol@tab "remote"@tab The GDB debugging protocol to use. |
| @item |
| gdb_sect_offset@tab "0x41000000";@tab |
| @item |
| gdb_stub_ldscript@tab "-Wl,-Teva-stub.ld"@tab The linker script to use with a GDB stub. |
| @item |
| gdb_init_command@tab "set mipsfpu none"@tab |
| @item |
| gdb,cannot_call_functions@tab 1@tab Whether GDB can call functions on the target, |
| @item |
| gdb,noargs@tab 1@tab Whether the target can take command line arguments. |
| @item |
| gdb,nosignals@tab 1@tab Whether there are signals on the target. |
| @item |
| gdb,short_int@tab 1@tab |
| @item |
| gdb,start_symbol@tab "_start";@tab The starting symbol in the executable. |
| @item |
| gdb,target_sim_options@tab "-sparclite"@tab Special options to pass to the simulator. |
| @item |
| gdb,timeout@tab 540@tab Timeout value to use for remote communication. |
| @item |
| gdb_init_command@tab "print/x \$fsr = 0x0"@tab |
| @item |
| gdb_load_offset@tab "0x12020000"@tab |
| @item |
| gdb_opts@tab "--command gdbinit"@tab |
| @item |
| gdb_prompt@tab "\\(gdb960\\)"@tab The prompt GDB is using. |
| @item |
| gdb_run_command@tab "jump start"@tab |
| @item |
| gdb_stub_offset@tab "0x12010000"@tab |
| @item |
| use_gdb_stub@tab 1@tab Whether to use a GDB stub. |
| @item |
| use_vma_offset@tab 1@tab |
| @item |
| wrap_m68k_aout@tab 1@tab |
| @item |
| gcc,no_label_values@tab 1@tab |
| @item |
| gcc,no_trampolines@tab 1@tab |
| @item |
| gcc,no_varargs@tab 1@tab |
| @item |
| gcc,stack_size@tab 16384@tab Stack size to use with some GCC testcases. |
| @item |
| ieee_multilib_flags@tab "-mieee";@tab |
| @item |
| is_simulator@tab 1@tab |
| @item |
| needs_status_wrapper@tab 1@tab |
| @item |
| no_double@tab 1@tab |
| @item |
| no_long_long@tab 1@tab |
| @item |
| noargs@tab 1@tab |
| @item |
| nullstone,lib@tab "mips-clock.c"@tab |
| @item |
| nullstone,ticks_per_sec@tab 3782018@tab |
| @item |
| sys_speed_value@tab 200@tab |
| @item |
| target_install@tab @{sh-hms@}@tab |
| @end multitable |
| |
| @node Writing A Test Case, Debugging A Test Case, Board File Values, Extending DejaGnu |
| @section Writing A Test Case |
| |
| The easiest way to prepare a new test case is to base it |
| on an existing one for a similar situation. There are two major |
| categories of tests: batch or interactive. Batch oriented tests |
| are usually easier to write. |
| |
| The GCC tests are a good example of batch oriented tests. |
| All GCC tests consist primarily of a call to a single common |
| procedure, Since all the tests either have no output, or only |
| have a few warning messages when successfully compiled. Any |
| non-warning output is a test failure. All the C code needed is |
| kept in the test directory. The test driver, written in Tcl, |
| need only get a listing of all the C files in the directory, and |
| compile them all using a generic procedure. This procedure and a |
| few others supporting for these tests are kept in the library |
| module @file{lib/c-torture.exp} in the GCC test |
| suite. Most tests of this kind use very few |
| expect features, and are coded almost |
| purely in Tcl. |
| |
| Writing the complete suite of C tests, then, consisted of |
| these steps: |
| |
| @itemize |
| |
| @item |
| Copying all the C code into the test directory. |
| These tests were based on the C-torture test created by Torbjorn |
| Granlund (on behalf of the Free Software Foundation) for GCC |
| development. |
| |
| @item |
| Writing (and debugging) the generic Tcl procedures for |
| compilation. |
| |
| @item |
| Writing the simple test driver: its main task is to |
| search the directory (using the Tcl procedure |
| @emph{glob} for filename expansion with wildcards) |
| and call a Tcl procedure with each filename. It also checks for |
| a few errors from the testing procedure. |
| @end itemize |
| |
| Testing interactive programs is intrinsically more |
| complex. Tests for most interactive programs require some trial |
| and error before they are complete. |
| |
| However, some interactive programs can be tested in a |
| simple fashion reminiscent of batch tests. For example, prior |
| to the creation of DejaGnu, the GDB distribution already |
| included a wide-ranging testing procedure. This procedure was |
| very robust, and had already undergone much more debugging and |
| error checking than many recent DejaGnu test cases. |
| Accordingly, the best approach was simply to encapsulate the |
| existing GDB tests, for reporting purposes. Thereafter, new GDB |
| tests built up a family of Tcl procedures specialized for GDB |
| testing. |
| |
| @node Debugging A Test Case, Adding A Test Case To A Testsuite, Writing A Test Case, Extending DejaGnu |
| @section Debugging A Test Case |
| |
| These are the kinds of debugging information available |
| from DejaGnu: |
| |
| @itemize |
| |
| @item |
| Output controlled by test scripts themselves, |
| explicitly allowed for by the test author. This kind of |
| debugging output appears in the detailed output recorded in the |
| DejaGnu log file. To do the same for new tests, use the |
| @code{verbose} procedure (which in turn uses the |
| variable also called @emph{verbose}) to control |
| how much output to generate. This will make it easier for other |
| people running the test to debug it if necessary. Whenever |
| possible, if @emph{$verbose} is |
| @emph{0}, there should be no output other than the |
| output from @emph{pass}, |
| @emph{fail}, @emph{error}, and |
| @emph{warning}. Then, to whatever extent is |
| appropriate for the particular test, allow successively higher |
| values of @emph{$verbose} to generate more |
| information. Be kind to other programmers who use your tests: |
| provide for a lot of debugging information. |
| |
| @item |
| Output from the internal debugging functions of |
| Tcl and Expect. There is a command |
| line options for each; both forms of debugging output are |
| recorded in the file @file{dbg.log} in the current |
| directory. |
| |
| Use @code{--debug} for information from the |
| expect level; it generates displays of the expect attempts to |
| match the tool output with the patterns specified. This output |
| can be very helpful while developing test scripts, since it |
| shows precisely the characters received. Iterating between the |
| latest attempt at a new test script and the corresponding |
| @file{dbg.log} can allow you to create the final |
| patterns by ``cut and paste''. This is sometimes the best way |
| to write a test case. |
| |
| @item |
| Use @code{--strace} to see more |
| detail at the Tcl level; this shows how Tcl procedure |
| definitions expand, as they execute. The associated number |
| controls the depth of definitions expanded. |
| |
| @item |
| Finally, if the value of |
| @emph{verbose} is 3 or greater,DejaGnu turns on |
| the expect command @code{log_user}. This command |
| prints all expect actions to the expect standard output, to the |
| detailed log file, and (if @code{--debug} is on) to |
| @file{dbg.log}. |
| @end itemize |
| |
| @node Adding A Test Case To A Testsuite, Hints On Writing A Test Case, Debugging A Test Case, Extending DejaGnu |
| @section Adding A Test Case To A Testsuite. |
| |
| There are two slightly different ways to add a test |
| case. One is to add the test case to an existing directory. The |
| other is to create a new directory to hold your test. The |
| existing test directories represent several styles of testing, |
| all of which are slightly different; examine the directories for |
| the tool of interest to see which (if any) is most suitable. |
| |
| Adding a GCC test can be very simple: just add the C code |
| to any directory beginning with @file{gcc}. and it |
| runs on the next |
| |
| @example |
| runtest --tool |
| gcc |
| @end example |
| |
| @noindent |
| . |
| |
| To add a test to GDB, first add any source code you will |
| need to the test directory. Then you can either create a new |
| expect file, or add your test to an existing one (any |
| file with a @emph{.exp} suffix). Creating a new |
| .exp file is probably a better idea if the test is significantly |
| different from existing tests. Adding it as a separate file also |
| makes upgrading easier. If the C code has to be already compiled |
| before the test will run, then you'll have to add it to the |
| @file{Makefile.in} file for that test directory, |
| then run @code{configure} and |
| @code{make}. |
| |
| Adding a test by creating a new directory is very |
| similar: |
| |
| @itemize |
| |
| @item |
| Create the new directory. All subdirectory names |
| begin with the name of the tool to test; e.g. G++ tests might be |
| in a directory called @file{g++.other}. There can |
| be multiple test directories that start with the same tool name |
| (such as @emph{g++}). |
| |
| @item |
| Add the new directory name to the |
| @code{configdirs} definition in the |
| @file{configure.in} file for the testsuite |
| directory. This way when @code{make} and |
| @code{configure} next run, they include the new |
| directory. |
| |
| @item |
| Add the new test case to the directory, as |
| above. |
| |
| @item |
| To add support in the new directory for |
| configure and make, you must also create a |
| @file{Makefile.in} and a |
| @file{configure.in}. |
| @end itemize |
| |
| @node Hints On Writing A Test Case, Test Case Variables, Adding A Test Case To A Testsuite, Extending DejaGnu |
| @section Hints On Writing A Test Case |
| |
| It is safest to write patterns that match all the output |
| generated by the tested program; this is called closure. |
| If a pattern does not match the entire output, any output that |
| remains will be examined by the next @code{expect} |
| command. In this situation, the precise boundary that determines |
| which @code{expect} command sees what is very |
| sensitive to timing between the Expect task and the task running |
| the tested tool. As a result, the test may sometimes appear to |
| work, but is likely to have unpredictable results. (This problem |
| is particularly likely for interactive tools, but can also |
| affect batch tools---especially for tests that take a long time |
| to finish.) The best way to ensure closure is to use the |
| @code{-re} option for the @code{expect} |
| command to write the pattern as a full regular expressions; then |
| you can match the end of output using a @emph{$}. |
| It is also a good idea to write patterns that match all |
| available output by using @emph{.*\} after the |
| text of interest; this will also match any intervening blank |
| lines. Sometimes an alternative is to match end of line using |
| @emph{\r} or @emph{\n}, but this is |
| usually too dependent on terminal settings. |
| |
| Always escape punctuation, such as @emph{(} |
| or @emph{"}, in your patterns; for example, write |
| @emph{\(}. If you forget to escape punctuation, |
| you will usually see an error message like |
| |
| @example |
| extra |
| characters after close-quote. |
| @end example |
| |
| If you have trouble understanding why a pattern does not |
| match the program output, try using the @code{--debug} |
| option to @code{runtest}, and examine the debug log |
| carefully. |
| |
| Be careful not to neglect output generated by setup rather |
| than by the interesting parts of a test case. For example, |
| while testing GDB, I issue a send @emph{set height |
| 0\n} command. The purpose is simply to make sure GDB |
| never calls a paging program. The @emph{set |
| height} command in GDB does not generate any |
| output; but running any command makes GDB issue a new |
| @emph{(gdb) } prompt. If there were no |
| @code{expect} command to match this prompt, the |
| output @emph{(gdb) } begins the text seen by the |
| next @code{expect} command---which might make that |
| pattern fail to match. |
| |
| To preserve basic sanity, I also recommended that no test |
| ever pass if there was any kind of problem in the test case. To |
| take an extreme case, tests that pass even when the tool will |
| not spawn are misleading. Ideally, a test in this sort of |
| situation should not fail either. Instead, print an error |
| message by calling one of the DejaGnu procedures |
| @code{error} or @code{warning}. |
| |
| @node Test Case Variables, , Hints On Writing A Test Case, Extending DejaGnu |
| @section Special variables used by test cases. |
| |
| There are special variables used by test cases. These contain |
| other information from DejaGnu. Your test cases can use these variables, |
| with conventional meanings (as well as the variables saved in |
| @file{site.exp}. You can use the value of these variables, |
| but they should never be changed. |
| |
| @table @asis |
| |
| @item $prms_id |
| The tracking system (e.g. GNATS) number identifying |
| a corresponding bugreport. (@emph{0}@} if you do not |
| specify it in the test script.) |
| |
| @item $item bug_id |
| An optional bug id; may reflect a bug |
| identification from another organization. (@emph{0} |
| if you do not specify it.) |
| |
| @item $subdir |
| The subdirectory for the current test |
| case. |
| |
| @item $expect_out(buffer) |
| The output from the last command. This is an |
| internal variable set by Expect. More information can be found in |
| the Expect manual. |
| |
| @item $exec_output |
| This is the output from a |
| @code{$@{tool@}_load} command. This only applies to |
| tools like GCC and GAS which produce an object file that must in |
| turn be executed to complete a test. |
| |
| @item $comp_output |
| This is the output from a |
| @code{$@{tool@}_start} command. This is conventionally |
| used for batch oriented programs, like GCC and GAS, that may |
| produce interesting output (warnings, errors) without further |
| interaction. |
| @end table |
| |
| @node Unit Testing, Reference, Extending DejaGnu, Top |
| @chapter Unit Testing |
| |
| @menu |
| * What Is Unit Testing ?:: |
| * The dejagnu.h Header File: The dejagnu_h Header File. |
| @end menu |
| |
| @node What Is Unit Testing ?, The dejagnu_h Header File, , Unit Testing |
| @section What Is Unit Testing ? |
| |
| Most regression testing as done by DejaGnu is system |
| testing. This is the complete application is tested all at |
| once. Unit testing is for testing single files, or small |
| libraries. In this case, each file is linked with a test case in |
| C or C++, and each function or class and method is tested in |
| series, with the test case having to check private data or |
| global variables to see if the function or method worked. |
| |
| This works particularly well for testing APIs and at level |
| where it is easier to debug them, than by needing to trace through |
| the entire appication. Also if there is a specification for the |
| API to be tested, the testcase can also function as a compliance |
| test. |
| |
| @node The dejagnu_h Header File, , What Is Unit Testing ?, Unit Testing |
| @section The dejagnu.h Header File |
| |
| DejaGnu uses a single header file to assist in unit |
| testing. As this file also produces it's one test state output, |
| it can be run standalone, which is very useful for testing on |
| embedded systems. This header file has a C and C++ API for the |
| test states, with simple totals, and standardized |
| output. Because the output has been standardized, DejaGnu can be |
| made to work with this test case, without writing almost any |
| Tcl. The library module, dejagnu.exp, will look for the output |
| messages, and then merge them into DejaGnu's. |
| |
| @node Reference, Unit Testing API, Unit Testing, Top |
| @chapter Reference |
| |
| @menu |
| * Obtaining DejaGnu:: |
| * Installation:: |
| * Builtin Procedures:: |
| * File Map:: |
| @end menu |
| |
| @node Obtaining DejaGnu, Installation, , Reference |
| @section Obtaining DejaGnu |
| |
| You can obtain DejaGnu from the DejaGnu web site at the |
| @uref{http://www.gnu.org,Free Software Foundation}, |
| which is at @uref{http://www.gnu.org/software/dejagnu/,www.gnu.org/software/dejagnu/ } |
| |
| @node Installation, Builtin Procedures, Obtaining DejaGnu, Reference |
| @section Installation |
| |
| Once you have the DejaGnu source unpacked and available, you must |
| first configure the software to specify where it is to run (and the |
| associated defaults); then you can proceed to installing it. |
| |
| @menu |
| * Configuring DejaGnu:: |
| * Installing DejaGnu:: |
| @end menu |
| |
| @node Configuring DejaGnu, Installing DejaGnu, , Installation |
| @subsection Configuring DejaGnu |
| |
| It is usually best to configure in a directory separate from the |
| source tree, specifying where to find the source with the optional |
| @emph{--srcdir} option to |
| @emph{configure}. DejaGnu uses the GNU |
| @emph{autoconf} to configure itself. For more info on using |
| autoconf, read the GNU autoconf manual. To configure, execute the |
| @file{configure} program, no other options are |
| required. For an example, to configure in a seperate tree for objects, |
| execute the configure script from the source tree like this: |
| |
| @example |
| |
| ../dejagnu-1.4.5/configure |
| |
| @end example |
| |
| DejaGnu doesn't care at config time if it's for testing a native |
| system or a cross system. That is determined at runtime by using the |
| config files. |
| |
| You may also want to use the @code{configure} option |
| @emph{--prefix} to specify where you want DejaGnu and its |
| supporting code installed. By default, installation is in subdirectories |
| of @file{/usr/local}, but you can select any alternate |
| directory @code{altdir} by including |
| @code{--prefix}@{altdir@}@} on the |
| @code{configure} command line. (This value is captured in |
| the Makefile variables @emph{prefix} and |
| @emph{exec}prefix@}.) |
| |
| Save for a small number of example tests, the DejaGnu distribution |
| itself does not include any testsuites; these are available |
| separately. Testsuites for the GNU development tools are included in |
| those releases. After configuring the top-level DejaGnu directory, unpack |
| and configure the test directories for the tools you want to test; then, |
| in each test directory, run @emph{make check} to build |
| auxiliary programs required by some of the tests, and run the test |
| suites. |
| |
| @node Installing DejaGnu, , Configuring DejaGnu, Installation |
| @subsection Installing DejaGnu |
| |
| To install DejaGnu in your filesystem (either in |
| @file{/usr/local}, or as specified by your |
| @emph{--prefix} option to @emph{configure}), |
| execute. |
| |
| @example |
| |
| eg$ make install |
| |
| @end example |
| |
| @emph{make install}does thes things for |
| DejaGnu: |
| |
| @itemize |
| |
| @item |
| Look in the path specified for executables |
| @code{$exec_prefix}) for directories called |
| @file{lib} and @file{bin}. If these |
| directories do not exist, @emph{make install} creates |
| them. |
| |
| @item |
| Create another directory in the |
| @file{share} directory, called |
| @file{dejagnu}, and copy all the library files into |
| it. |
| |
| @item |
| Create a directory in the |
| @file{dejagnu/share} directory, called |
| @file{config}, and copy all the configuration files into |
| it. |
| |
| @item |
| Copy the @emph{runtest} shell script into |
| @file{$exec_prefix/bin}. |
| |
| @item |
| Copy @file{runtest.exp} into |
| @file{$exec_prefix/lib/dejagnu}. This is the main Tcl |
| code implementing DejaGnu. |
| @end itemize |
| |
| @node Builtin Procedures, File Map, Installation, Reference |
| @section Builtin Procedures |
| |
| DejaGnu provides these Tcl procedures. |
| |
| @menu |
| * Core Internal Procedures:: |
| * Procedures For Remote Communication:: |
| * Procedures For Using Utilities to Connect: connprocs. |
| * Procedures For Target Boards:: |
| * Target Database Procedures: target database library file. |
| * Platform Dependant Procedures: platform dependant procedures. |
| * Utility Procedures:: |
| * Libgloss, A Free BSP: Libgloss. |
| * Procedures for debugging your Tcl code.: Debugging Procedures. |
| @end menu |
| |
| @node Core Internal Procedures, Procedures For Remote Communication, , Builtin Procedures |
| @subsection Core Internal Procedures |
| |
| @menu |
| * Mail_file Procedure: mail_file procedure. |
| * Open_logs Procedure: open_logs procedure. |
| * Close_logs Procedure: close_logs procedure. |
| * Isbuild Procedure: isbuild procedure. |
| * Is_remote Procedure: is_remote procedure. |
| * is3way Procedure: is3way procedure. |
| * Ishost Procedure: ishost procedure. |
| * Istarget Procedure: istarget procedure. |
| * Isnative Procedure: isnative procedure. |
| * Unknown Procedure: unknown procedure. |
| * Clone_output Procedure: clone_output procedure. |
| * Reset_vars Procedure: reset_vars procedure. |
| * Log_and_exit Procedure: log_and_exit procedure. |
| * Log_summary Procedure: log_summary procedure. |
| * Cleanup Procedure: cleanup procedure. |
| * Setup_xfail Procedure: setup_xfail procedure. |
| * Record_test Procedure: record_test procedure. |
| * Pass Procedure: pass procedure. |
| * Fail Procedure: fail procedure. |
| * Xpass Procedure: xpass procedure. |
| * Xfail Procedure: xfail procedure. |
| * Set_warning_threshold Procedure: set_warning_threshold procedure. |
| * Get_warning_threshold Procedure: get_warning_threshold procedure. |
| * Warning Procedure: warning procedure. |
| * Perror Procedure: perror procedure. |
| * Note Procedure: note procedure. |
| * Untested Procedure: untested procedure. |
| * Unresolved Procedure: unresolved procedure. |
| * Unsupported Procedure: unsupported procedure. |
| * Init_testcounts Procedure: init_testcounts procedure. |
| * Incr_count Procedure: incr_count procedure. |
| * transform Procedure: transform procedure. |
| * Check_conditional_xfail Procedure: check_conditional_xfail procedure. |
| * Clear_xfail Procedure: clear_xfail procedure. |
| * Verbose Procedure: verbose procedure. |
| * Load_lib Procedure: load_lib procedure. |
| @end menu |
| |
| @node mail_file procedure, open_logs procedure, , Core Internal Procedures |
| @subsubsection Mail_file Procedure |
| |
| @quotation |
| |
| @t{@b{mail_file}(@i{file to |
| subject});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{} |
| @end table |
| |
| @node open_logs procedure, close_logs procedure, mail_file procedure, Core Internal Procedures |
| @subsubsection Open_logs Procedure |
| |
| @quotation |
| |
| @t{@b{open_logs}(@i{});} |
| @end quotation |
| |
| @node close_logs procedure, isbuild procedure, open_logs procedure, Core Internal Procedures |
| @subsubsection Close_logs Procedure |
| |
| |
| @quotation |
| |
| @t{@b{close_logs}(@i{});} |
| @end quotation |
| |
| @node isbuild procedure, is_remote procedure, close_logs procedure, Core Internal Procedures |
| @subsubsection Isbuild Procedure |
| |
| Tests for a particular build host environment. If the |
| currently configured host matches the argument string, the result is |
| @emph{1}; otherwise the result is |
| @emph{0}. @emph{host} must be a full |
| three-part configure host name; in particular, you may not use the |
| shorter nicknames supported by configure (but you can use wildcard |
| characters, using shell syntax, to specify sets of names). If it is |
| passed a NULL string, then it returns the name of the build canonical |
| configuration. |
| |
| @quotation |
| |
| @t{@b{isbuild}(@i{pattern});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{pattern} |
| @end table |
| |
| @node is_remote procedure, is3way procedure, isbuild procedure, Core Internal Procedures |
| @subsubsection Is_remote Procedure |
| |
| |
| @quotation |
| |
| @t{@b{is_remote}(@i{board});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{} |
| @end table |
| |
| @node is3way procedure, ishost procedure, is_remote procedure, Core Internal Procedures |
| @subsubsection is3way Procedure |
| |
| Tests for a canadian cross. This is when the tests will be run |
| on a remotly hosted cross compiler. If it is a canadian cross, then |
| the result is @emph{1}; otherwise the result is |
| @emph{0}. |
| |
| @quotation |
| |
| @t{@b{is3way}(@i{});} |
| @end quotation |
| |
| @node ishost procedure, istarget procedure, is3way procedure, Core Internal Procedures |
| @subsubsection Ishost Procedure |
| |
| Tests for a particular host environment. If the currently |
| configured host matches the argument string, the result is |
| @emph{1}; otherwise the result is |
| @emph{0}. @emph{host} must be a full |
| three-part configure host name; in particular, you may not use the |
| shorter nicknames supported by configure (but you can use wildcard |
| characters, using shell syntax, to specify sets of names). |
| |
| @quotation |
| |
| @t{@b{ishost}(@i{pattern});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{} |
| @end table |
| |
| @node istarget procedure, isnative procedure, ishost procedure, Core Internal Procedures |
| @subsubsection Istarget Procedure |
| |
| Tests for a particular target environment. If the currently |
| configured target matches the argument string, the result is |
| @emph{1} ; otherwise the result is |
| @emph{0}. target must be a full three-part configure |
| target name; in particular, you may not use the shorter nicknames |
| supported by configure (but you can use wildcard characters, using |
| shell syntax, to specify sets of names). If it is passed a |
| @emph{NULL} string, then it returns the name of the |
| build canonical configuration. |
| |
| @quotation |
| |
| @t{@b{istarget}(@i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{} |
| @end table |
| |
| @node isnative procedure, unknown procedure, istarget procedure, Core Internal Procedures |
| @subsubsection Isnative Procedure |
| |
| Tests whether the current configuration has the same host and |
| target. When it runs in a native configuration this procedure returns |
| a @emph{1}; otherwise it returns a |
| @emph{0}. |
| |
| @quotation |
| |
| @t{@b{isnative}(@i{});} |
| @end quotation |
| |
| @node unknown procedure, clone_output procedure, isnative procedure, Core Internal Procedures |
| @subsubsection Unknown Procedure |
| |
| |
| @quotation |
| |
| @t{@b{unknown}(@i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{args} |
| @end table |
| |
| @node clone_output procedure, reset_vars procedure, unknown procedure, Core Internal Procedures |
| @subsubsection Clone_output Procedure |
| |
| |
| @quotation |
| |
| @t{@b{clone_output}(@i{message});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{message} |
| @end table |
| |
| @node reset_vars procedure, log_and_exit procedure, clone_output procedure, Core Internal Procedures |
| @subsubsection Reset_vars Procedure |
| |
| |
| @quotation |
| |
| @t{@b{reset_vars}(@i{});} |
| @end quotation |
| |
| @node log_and_exit procedure, log_summary procedure, reset_vars procedure, Core Internal Procedures |
| @subsubsection Log_and_exit Procedure |
| |
| |
| @quotation |
| |
| @t{@b{log_and_exit}(@i{});} |
| @end quotation |
| |
| @node log_summary procedure, cleanup procedure, log_and_exit procedure, Core Internal Procedures |
| @subsubsection Log_summary Procedure |
| |
| |
| @quotation |
| |
| @t{@b{log_summary}(@i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{args} |
| @end table |
| |
| @node cleanup procedure, setup_xfail procedure, log_summary procedure, Core Internal Procedures |
| @subsubsection Cleanup Procedure |
| |
| |
| @quotation |
| |
| @t{@b{cleanup}(@i{});} |
| @end quotation |
| |
| @node setup_xfail procedure, record_test procedure, cleanup procedure, Core Internal Procedures |
| @subsubsection Setup_xfail Procedure |
| |
| Declares that the test is expected to fail on a particular set |
| of configurations. The config argument must be a list of full |
| three-part configure target name; in particular, you may not use the |
| shorter nicknames supported by configure (but you can use the common |
| shell wildcard characters to specify sets of names). The |
| @emph{bugid} argument is optional, and used only in the |
| logging file output; use it as a link to a bug-tracking system such |
| as GNATS. |
| |
| Once you use @code{setup_xfail}, the |
| @code{fail} and @code{pass} procedures |
| produce the messages @emph{XFAIL} and |
| @emph{XPASS} respectively, allowing you to distinguish |
| expected failures (and unexpected success!) from other test |
| outcomes. |
| |
| @quotation |
| |
| @strong{Warning} |
| |
| Warning you must clear the expected failure after |
| using setup_xfail in a test case. Any call to @code{pass |
| }or @code{fail}l clears the expected failure |
| implicitly; if the test has some other outcome, e.g. an error, you |
| can call @code{clear_xfail} to clear the expected |
| failure explicitly. Otherwise, the expected-failure declaration |
| applies to whatever test runs next, leading to surprising |
| results. |
| @end quotation |
| |
| @quotation |
| |
| @t{@b{setup_xfail}(@i{config} |
| @i{bugid});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{config} |
| The config triplet to trigger whether this is an |
| unexpected or expect failure. |
| |
| @item @code{bugid} |
| The optional bugid, used to tie it this test case |
| to a bug tracking system. |
| @end table |
| |
| @node record_test procedure, pass procedure, setup_xfail procedure, Core Internal Procedures |
| @subsubsection Record_test Procedure |
| |
| |
| @quotation |
| |
| @t{@b{record_test}(@i{type} |
| @i{message} |
| @i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{type} |
| |
| @item @code{message} |
| |
| @item @code{args} |
| @end table |
| |
| @node pass procedure, fail procedure, record_test procedure, Core Internal Procedures |
| @subsubsection Pass Procedure |
| |
| Declares a test to have passed. @code{pass} |
| writes in the log files a message beginning with |
| @emph{PASS} (or @emph{XPASS}, if failure |
| was expected), appending the argument |
| @code{string}. |
| |
| @quotation |
| |
| @t{@b{pass}(@i{string});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{string} |
| The string to use for this PASS |
| message. |
| @end table |
| |
| @node fail procedure, xpass procedure, pass procedure, Core Internal Procedures |
| @subsubsection Fail Procedure |
| |
| Declares a test to have failed. @code{fail} |
| writes in the log files a message beginning with |
| @emph{FAIL} (or @emph{XFAIL}, if failure |
| was expected), appending the argument |
| @code{string}. |
| |
| @quotation |
| |
| @t{@b{fail}(@i{string});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{string} |
| The string to use for this FAIL |
| message. |
| @end table |
| |
| @node xpass procedure, xfail procedure, fail procedure, Core Internal Procedures |
| @subsubsection Xpass Procedure |
| |
| Declares a test to have unexpectably passed, when it was |
| expected to be a failure. @code{xpass} |
| writes in the log files a message beginning with |
| @emph{XPASS} (or @emph{XFAIL}, if failure |
| was expected), appending the argument |
| @code{string}. |
| |
| @quotation |
| |
| @t{@b{xpass}(@i{string});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{string} |
| The string to use for this output |
| state. |
| @end table |
| |
| @node xfail procedure, set_warning_threshold procedure, xpass procedure, Core Internal Procedures |
| @subsubsection Xfail Procedure |
| |
| Declares a test to have expectably |
| failed. @code{xfail} |
| writes in the log files a message beginning with |
| @emph{XFAIL} (or @emph{PASS}, if success |
| was expected), appending the argument |
| @code{string}. |
| |
| @quotation |
| |
| @t{@b{xpass}(@i{string});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{string} |
| The string to use for this output |
| state. |
| @end table |
| |
| @node set_warning_threshold procedure, get_warning_threshold procedure, xfail procedure, Core Internal Procedures |
| @subsubsection Set_warning_threshold Procedure |
| |
| Sets the value of @code{warning_threshold}. A value |
| of @emph{0} disables it: calls to |
| @code{warning} will not turn a |
| @emph{PASS} or @emph{FAIL} into an |
| @emph{UNRESOLVED}. |
| |
| @quotation |
| |
| @t{@b{set_warning_threshold}(@i{threshold});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{threshold} |
| This is the value of the new warning |
| threshold. |
| @end table |
| |
| @node get_warning_threshold procedure, warning procedure, set_warning_threshold procedure, Core Internal Procedures |
| @subsubsection Get_warning_threshold Procedure |
| |
| Returns the current value of |
| @code{@{warning_threshold}. The default value is 3. This |
| value controls how many @code{warning} procedures can |
| be called before becoming @emph{UNRESOLVED}. |
| |
| @quotation |
| |
| @t{@b{get_warning_threshold}(@i{});} |
| @end quotation |
| |
| @node warning procedure, perror procedure, get_warning_threshold procedure, Core Internal Procedures |
| @subsubsection Warning Procedure |
| |
| Declares detection of a minor error in the test case |
| itself. @code{warning} writes in the log files a message |
| beginning with @emph{WARNING}, appending the argument |
| @code{string}. Use @code{warning} rather |
| than @code{perror} for cases (such as communication |
| failure to be followed by a retry) where the test case can recover from |
| the error. If the optional @code{number} is supplied, |
| then this is used to set the internal count of warnings to that |
| value. |
| |
| As a side effect, @code{warning_threshold} or more |
| calls to warning in a single test case also changes the effect of the |
| next @code{pass} or @code{fail} command: |
| the test outcome becomes @emph{UNRESOLVED} since an |
| automatic @emph{PASS} or @emph{FAIL} may |
| not be trustworthy after many warnings. If the optional numeric value |
| is @emph{0}, then there are no further side effects to |
| calling this function, and the following test outcome doesn't become |
| @emph{UNRESOLVED}. This can be used for errors with no |
| known side effects. |
| |
| @quotation |
| |
| @t{@b{warning}(@i{string} |
| @i{number} |
| );} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{string} |
| |
| @item @code{number} |
| The optional number to set the error counter. Thius |
| is only used to fake out the counter when using the |
| @code{xfail} procedure to control when it flips the |
| output over to @emph{UNRESOLVED} |
| state. |
| @end table |
| |
| @node perror procedure, note procedure, warning procedure, Core Internal Procedures |
| @subsubsection Perror Procedure |
| |
| Declares a severe error in the testing framework |
| itself. @code{perror} writes in the log files a message |
| beginning with @emph{ERROR}, appending the argument |
| @code{string}. |
| |
| As a side effect, perror also changes the effect of the next |
| @code{pass} or @code{fail} command: the |
| test outcome becomes @emph{UNRESOLVED}, since an |
| automatic @emph{PASS} or @emph{FAIL} cannot |
| be trusted after a severe error in the test framework. If the optional |
| numeric value is @emph{0}, then there are no further side |
| effects to calling this function, and the following test outcome |
| doesn't become @emph{UNRESOLVED}. This can be used for |
| errors with no known side effects. |
| |
| @quotation |
| |
| @t{@b{perror}(@i{string} |
| @i{number} |
| );} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{string} |
| |
| @item @code{number} |
| The optional number to set the error counter. Thius |
| is only used to fake out the counter when using the |
| @code{xfail} procedure to control when it flips the |
| output over to @emph{UNRESOLVED} |
| state. |
| @end table |
| |
| @node note procedure, untested procedure, perror procedure, Core Internal Procedures |
| @subsubsection Note Procedure |
| |
| Appends an informational message to the log |
| file. @code{note} writes in the log files a message |
| beginning with @emph{NOTE}, appending the argument |
| @code{string}. Use @code{note} |
| sparingly. The @code{verbose} should be used for most |
| such messages, but in cases where a message is needed in the log file |
| regardless of the verbosity level use @code{note}. |
| |
| @quotation |
| |
| @t{@b{note}(@i{string});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{string} |
| The string to use for this note. |
| @end table |
| |
| @node untested procedure, unresolved procedure, note procedure, Core Internal Procedures |
| @subsubsection Untested Procedure |
| |
| Declares a test was not run. @code{untested} writes |
| in the log file a message beginning with @emph{UNTESTED}, |
| appending the argument @emph{string}. For example, you |
| might use this in a dummy test whose only role is to record that a test |
| does not yet exist for some feature. |
| |
| @quotation |
| |
| @t{@b{untested}(@i{string});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{string} |
| The string to use for this output |
| state. |
| @end table |
| |
| @node unresolved procedure, unsupported procedure, untested procedure, Core Internal Procedures |
| @subsubsection Unresolved Procedure |
| |
| Declares a test to have an unresolved |
| outcome. @code{unresolved} writes in the log file a |
| message beginning with @emph{UNRESOLVED}, appending the |
| argument @emph{string}. This usually means the test did |
| not execute as expected, and a human being must go over results to |
| determine if it passed or failed (and to improve the test case). |
| |
| @quotation |
| |
| @t{@b{unresolved}(@i{string});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{string} |
| The string to use for this output |
| state. |
| @end table |
| |
| @node unsupported procedure, init_testcounts procedure, unresolved procedure, Core Internal Procedures |
| @subsubsection Unsupported Procedure |
| |
| Declares that a test case depends on some facility that does not |
| exist in the testing environment. @code{unsupported} |
| writes in the log file a message beginning with |
| @emph{UNSUPPORTED}, appending the argument string. |
| |
| @quotation |
| |
| @t{@b{unsupported}(@i{string});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{string} |
| The string to use for this output |
| state. |
| @end table |
| |
| @node init_testcounts procedure, incr_count procedure, unsupported procedure, Core Internal Procedures |
| @subsubsection Init_testcounts Procedure |
| |
| |
| @quotation |
| |
| @t{@b{init_testcounts}(@i{});} |
| @end quotation |
| |
| @node incr_count procedure, transform procedure, init_testcounts procedure, Core Internal Procedures |
| @subsubsection Incr_count Procedure |
| |
| |
| @quotation |
| |
| @t{@b{incr_count}(@i{name} |
| @i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{name} |
| |
| @item @code{args} |
| @end table |
| |
| @node transform procedure, check_conditional_xfail procedure, incr_count procedure, Core Internal Procedures |
| @subsubsection transform Procedure |
| |
| Generates a string for the name of a tool as it was configured |
| and installed, given its native name (as the argument |
| @code{toolname}). This makes the assumption that all |
| tools are installed using the same naming conventions: For example, |
| for a cross compiler supporting the @emph{m68k-vxworks} |
| configuration, the result of transform @code{gcc} is |
| @code{m68k-vxworks-gcc}. |
| |
| @quotation |
| |
| @t{@b{transform}(@i{toolname});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{toolname} |
| The name of the cross-development program to |
| transform. |
| @end table |
| |
| @node check_conditional_xfail procedure, clear_xfail procedure, transform procedure, Core Internal Procedures |
| @subsubsection Check_conditional_xfail Procedure |
| |
| This procedure adds a conditional xfail, based on compiler |
| options used to create a test case executable. If an include options |
| is found in the compiler flags, and it's the right architecture, |
| it'll trigger an @emph{XFAIL}. Otherwise it'll produce |
| an ordinary @emph{FAIL}. You can also specify flags to |
| exclude. This makes a result be a @emph{FAIL}, even if |
| the included options are found. To set the conditional, set |
| the variable @code{compiler_conditional_xfail_data} to the |
| fields |
| |
| @example |
| "[message string] [targets list] [includes |
| list] [excludes list]" |
| @end example |
| |
| @noindent |
| (descriptions below). This is |
| the checked at pass/fail decision time, so there is no need to call |
| the procedure yourself, unless you wish to know if it gets |
| triggered. After a pass/fail, the variable is reset, so it doesn't |
| effect other tests. It returns @emph{1} if the |
| conditional is true, or @emph{0} if the conditional is |
| false. |
| |
| @quotation |
| |
| @t{@b{check_conditional_xfail}(@i{message} |
| @i{targets} |
| @i{includes} |
| @i{excludes});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{message} |
| This is the message to print with the normal test |
| result. |
| |
| @item @code{targets} |
| This is a string with the list targets to activate |
| this conditional on. |
| |
| @item @code{includes} |
| This is a list of sets of options to search for in |
| the compiler options to activate this conditional. If the list of |
| sets of options is empty or if any set of the options matches, |
| then this conditional is true. (It may be useful to specify an |
| empty list of include sets if the conditional is always true |
| unless one of the exclude sets matches.) |
| |
| @item @code{excludes} |
| This is a list of sets of options to search for in |
| the compiler options to activate this conditional. If any set of |
| the options matches, (regardless of whether any of the include sets |
| match) then this conditional is de-activated. |
| @end table |
| |
| @strong{Specifying the conditional xfail data} |
| |
| @example |
| |
| set compiler_conditional_xfail_data @{ \ |
| "I sure wish I knew why this was hosed" \ |
| "sparc*-sun*-* *-pc-*-*" \ |
| @{"-Wall -v" "-O3"@} \ |
| @{"-O1" "-Map"@} \ |
| @} |
| |
| @end example |
| |
| What this does is it matches only for these two targets if |
| "-Wall -v" or "-O3" is set, but neither "-O1" or "-Map" is set. For |
| a set to match, the options specified are searched for independantly |
| of each other, so a "-Wall -v" matches either "-Wall -v" or "-v |
| -Wall". A space seperates the options in the string. Glob-style |
| regular expressions are also permitted. |
| |
| @node clear_xfail procedure, verbose procedure, check_conditional_xfail procedure, Core Internal Procedures |
| @subsubsection Clear_xfail Procedure |
| |
| Cancel an expected failure (previously declared with |
| @code{setup_xfail}) for a particular set of |
| configurations. The @code{config} argument is a list |
| of configuration target names. It is only necessary to call |
| @code{clear_xfail} if a test case ends without calling |
| either @code{pass} or @code{fail}, after |
| calling @code{setup_xfail}. |
| |
| @quotation |
| |
| @t{@b{clear_xfail}(@i{config});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{config} |
| The configuration triplets to |
| clear. |
| @end table |
| |
| @node verbose procedure, load_lib procedure, clear_xfail procedure, Core Internal Procedures |
| @subsubsection Verbose Procedure |
| |
| Test cases can use this function to issue helpful messages |
| depending on the number of @code{--verbose} options on the |
| runtest command line. It prints string if the value of the variable |
| @code{verbose} is higher than or equal to the optional |
| number. The default value for number is @emph{1}. Use |
| the optional @code{-log} argument to cause string to always |
| be added to the log file, even if it won't be printed. Use the |
| optional @code{-x} argument to log the test results into |
| a parsable XML file. Use the optional @code{-n} argument |
| to print string without a trailing newline. Use the optional |
| @code{--} argument if string begins with "-". |
| |
| @quotation |
| |
| @t{@b{verbose}(@i{-log} |
| @i{-x} |
| @i{-n} |
| @i{-r} |
| @i{string} |
| @i{number});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{-x} |
| |
| @item @code{-log} |
| |
| @item @code{-n} |
| |
| @item @code{--} |
| |
| @item @code{string} |
| |
| @item @code{number} |
| @end table |
| |
| @node load_lib procedure, , verbose procedure, Core Internal Procedures |
| @subsubsection Load_lib Procedure |
| |
| Loads a DejaGnu library file by searching a fixed path built |
| into DejaGnu. If DejaGnu has been installed, it looks in a path |
| starting with the installed library directory. If you are running |
| DejaGnu directly from a source directory, without first running |
| @code{make install}, this path defaults to the current |
| directory. In either case, it then looks in the current directory |
| for a directory called @file{lib}. If there are |
| duplicate definitions, the last one loaded takes precedence over the |
| earlier ones. |
| |
| @quotation |
| |
| @t{@b{load_lib}(@i{filespec});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{filespec} |
| The name of the DejaGnu library file to |
| load. |
| @end table |
| |
| @node Procedures For Remote Communication, connprocs, Core Internal Procedures, Builtin Procedures |
| @subsection Procedures For Remote Communication |
| |
| @file{lib/remote.exp} defines these |
| functions, for establishing and managing communications. Each |
| of these procedures tries to establish the connection up to |
| three times before returning. Warnings (if retries will |
| continue) or errors (if the attempt is abandoned) report on |
| communication failures. The result for any of these |
| procedures is either @emph{-1}, when the |
| connection cannot be established, or the spawn ID returned by |
| the Expect command |
| @code{spawn}. |
| |
| It use the value of the @code{connect} field |
| in the @code{target_info} array (was |
| @code{connectmode} as the type of connection to |
| make. Current supported connection types are tip, kermit, |
| telnet, rsh, rlogin, and netdata. If the @code{--reboot} |
| option was used on the runtest command line, then the target |
| is rebooted before the connection is made. |
| |
| @menu |
| * Call_remote Procedure: call_remote procedure. |
| * Check_for_board_status Procedure: check_for_board_status procedure. |
| * File_on_build Procedure: file_on_build procedure. |
| * File_on_host Procedure: file_on_host procedure. |
| * Local_exec Procedure: local_exec procedure. |
| * Remote_binary Procedure: remote_binary procedure. |
| * Remote_close Procedure: remote_close procedure. |
| * Remote_download Procedure: remote_download procedure. |
| * Remote_exec Procedure: remote_exec procedure. |
| * Remote_expect Procedure: remote_expect procedure. |
| * Remote_file Procedure: remote_file procedure. |
| * Remote_ld Procedure: remote_ld procedure. |
| * Remote_load Procedure: remote_load procedure. |
| * Remote_open Procedure: remote_open procedure. |
| * Remote_pop_conn Procedure: remote_pop_conn procedure. |
| * Remote_push_conn Procedure: remote_push_conn procedure. |
| * Remote_raw_binary Procedure: remote_raw_binary procedure. |
| * Remote_raw_close Procedure: remote_raw_close procedure. |
| * Remote_raw_file Procedure: remote_raw_file procedure. |
| * remote_raw_ld Procedure: remote_raw_ld procedure. |
| * Remote_raw_load Procedure: remote_raw_load procedure. |
| * Remote_raw_open Procedure: remote_raw_open procedure. |
| * Remote_raw_send Procedure: remote_raw_send procedure. |
| * Remote_raw_spawn Procedure: remote_raw_spawn procedure. |
| * Remote_raw_transmit Procedure: remote_raw_transmit procedure. |
| * Remote_raw_wait Procedure: remote_raw_wait procedure. |
| * Remote_reboot Procedure: remote_reboot procedure. |
| * Remote_send Procedure: remote_send procedure. |
| * Remote_spawn Procedure: remote_spawn procedure. |
| * Remote_swap_conn Procedure: remote_swap_conn procedure. |
| * Remote_transmit Procedure: remote_transmit procedure. |
| * Remote_upload Procedure: remote_upload procedure. |
| * Remote_wait Procedure: remote_wait procedure. |
| * Standard_close Procedure: standard_close procedure. |
| * Standard_download Procedure: standard_download procedure. |
| * Standard_exec Procedure: standard_exec procedure. |
| * Standard_file Procedure: standard_file procedure. |
| * Standard_load Procedure: standard_load procedure. |
| * Standard_reboot Procedure: standard_reboot procedure. |
| * Standard_send Procedure: standard_send procedure. |
| * Standard_spawn Procedure: standard_spawn procedure. |
| * Standard_transmit Procedure: standard_transmit procedure. |
| * Standard_upload Procedure: standard_upload procedure. |
| * Standard_wait Procedure: standard_wait procedure. |
| * Unix_clean_filename Procedure: unix_clean_filename procedure. |
| @end menu |
| |
| @node call_remote procedure, check_for_board_status procedure, , Procedures For Remote Communication |
| @subsubsection Call_remote Procedure |
| |
| |
| @quotation |
| |
| @t{@b{call_remote}(@i{type} |
| @i{proc} |
| @i{dest} |
| @i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{proc} |
| |
| @item @code{dest} |
| |
| @item @code{args} |
| @end table |
| |
| @node check_for_board_status procedure, file_on_build procedure, call_remote procedure, Procedures For Remote Communication |
| @subsubsection Check_for_board_status Procedure |
| |
| |
| @quotation |
| |
| @t{@b{check_for_board_status}(@i{variable});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{variable} |
| @end table |
| |
| @node file_on_build procedure, file_on_host procedure, check_for_board_status procedure, Procedures For Remote Communication |
| @subsubsection File_on_build Procedure |
| |
| |
| @quotation |
| |
| @t{@b{file_on_build}(@i{op} |
| @i{file} |
| @i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{op} |
| |
| @item @code{file} |
| |
| @item @code{args} |
| @end table |
| |
| @node file_on_host procedure, local_exec procedure, file_on_build procedure, Procedures For Remote Communication |
| @subsubsection File_on_host Procedure |
| |
| |
| @quotation |
| |
| @t{@b{file_on_host}(@i{op} |
| @i{file} |
| @i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{op} |
| |
| @item @code{file} |
| |
| @item @code{args} |
| @end table |
| |
| @node local_exec procedure, remote_binary procedure, file_on_host procedure, Procedures For Remote Communication |
| @subsubsection Local_exec Procedure |
| |
| |
| @quotation |
| |
| @t{@b{local_exec}(@i{commandline} |
| @i{inp} |
| @i{outp} |
| @i{timeout});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{inp} |
| |
| @item @code{outp} |
| |
| @item @code{timeout} |
| @end table |
| |
| @node remote_binary procedure, remote_close procedure, local_exec procedure, Procedures For Remote Communication |
| @subsubsection Remote_binary Procedure |
| |
| |
| @quotation |
| |
| @t{@b{remote_binary}(@i{host});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{host} |
| @end table |
| |
| @node remote_close procedure, remote_download procedure, remote_binary procedure, Procedures For Remote Communication |
| @subsubsection Remote_close Procedure |
| |
| |
| @quotation |
| |
| @t{@b{remote_close}(@i{shellid});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{shellid} |
| This is the value returned by a call |
| to @code{remote_open}. This closes the |
| connection to the target so resources can be used by |
| others. This parameter can be left off if the |
| @code{fileid} field in the |
| @code{target_info} array is set. |
| @end table |
| |
| @node remote_download procedure, remote_exec procedure, remote_close procedure, Procedures For Remote Communication |
| @subsubsection Remote_download Procedure |
| |
| |
| @quotation |
| |
| @t{@b{remote_download}(@i{dest} |
| @i{file} |
| @i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{dest} |
| |
| @item @code{file} |
| |
| @item @code{args} |
| @end table |
| |
| @node remote_exec procedure, remote_expect procedure, remote_download procedure, Procedures For Remote Communication |
| @subsubsection Remote_exec Procedure |
| |
| |
| @quotation |
| |
| @t{@b{remote_exec}(@i{hostname} |
| @i{program} |
| @i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{hostname} |
| |
| @item @code{program} |
| |
| @item @code{args} |
| @end table |
| |
| @node remote_expect procedure, remote_file procedure, remote_exec procedure, Procedures For Remote Communication |
| @subsubsection Remote_expect Procedure |
| |
| |
| @quotation |
| |
| @t{@b{remote_expect}(@i{board} |
| @i{timeout} |
| @i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{board} |
| |
| @item @code{timeout} |
| |
| @item @code{args} |
| @end table |
| |
| @node remote_file procedure, remote_ld procedure, remote_expect procedure, Procedures For Remote Communication |
| @subsubsection Remote_file Procedure |
| |
| |
| @quotation |
| |
| @t{@b{remote_file}(@i{dest} |
| @i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{dest} |
| |
| @item @code{args} |
| @end table |
| |
| @node remote_ld procedure, remote_load procedure, remote_file procedure, Procedures For Remote Communication |
| @subsubsection Remote_ld Procedure |
| |
| |
| @quotation |
| |
| @t{@b{remote_ld}(@i{dest} |
| @i{prog});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{dest} |
| |
| @item @code{prog} |
| @end table |
| |
| @node remote_load procedure, remote_open procedure, remote_ld procedure, Procedures For Remote Communication |
| @subsubsection Remote_load Procedure |
| |
| |
| @quotation |
| |
| @t{@b{remote_load}(@i{dest} |
| @i{prog} |
| @i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{dest} |
| |
| @item @code{prog} |
| |
| @item @code{args} |
| @end table |
| |
| @node remote_open procedure, remote_pop_conn procedure, remote_load procedure, Procedures For Remote Communication |
| @subsubsection Remote_open Procedure |
| |
| |
| @quotation |
| |
| @t{@b{remote_open}(@i{type});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{type} |
| This is passed @code{host} or |
| @code{target}. Host or target refers to |
| whether it is a connection to a remote target, or a |
| remote host. This opens the connection to the desired |
| target or host using the default values in the |
| configuration system. It returns that |
| @code{spawn_id} of the process that manages |
| the connection. This value can be used in |
| Expect or |
| @code{exp_send} statements, or passed to |
| other procedures that need the connection process's |
| id. This also sets the @code{fileid} field in |
| the @code{target_info} array. |
| @end table |
| |
| @node remote_pop_conn procedure, remote_push_conn procedure, remote_open procedure, Procedures For Remote Communication |
| @subsubsection Remote_pop_conn Procedure |
| |
| |
| @quotation |
| |
| @t{@b{remote_pop_conn}(@i{host});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{host} |
| @end table |
| |
| @node remote_push_conn procedure, remote_raw_binary procedure, remote_pop_conn procedure, Procedures For Remote Communication |
| @subsubsection Remote_push_conn Procedure |
| |
| |
| @quotation |
| |
| @t{@b{remote_push_conn}(@i{host});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{host} |
| @end table |
| |
| @node remote_raw_binary procedure, remote_raw_close procedure, remote_push_conn procedure, Procedures For Remote Communication |
| @subsubsection Remote_raw_binary Procedure |
| |
| |
| @quotation |
| |
| @t{@b{remote_raw_binary}(@i{host});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{host} |
| @end table |
| |
| @node remote_raw_close procedure, remote_raw_file procedure, remote_raw_binary procedure, Procedures For Remote Communication |
| @subsubsection Remote_raw_close Procedure |
| |
| |
| @quotation |
| |
| @t{@b{remote_raw_close}(@i{host});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{host} |
| @end table |
| |
| @node remote_raw_file procedure, remote_raw_ld procedure, remote_raw_close procedure, Procedures For Remote Communication |
| @subsubsection Remote_raw_file Procedure |
| |
| |
| @quotation |
| |
| @t{@b{remote_raw_file}(@i{dest} |
| @i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{dest} |
| |
| @item @code{args} |
| @end table |
| |
| @node remote_raw_ld procedure, remote_raw_load procedure, remote_raw_file procedure, Procedures For Remote Communication |
| @subsubsection remote_raw_ld Procedure |
| |
| |
| @quotation |
| |
| @t{@b{remote_raw_ld}(@i{dest} |
| @i{prog});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{dest} |
| |
| @item @code{prog} |
| @end table |
| |
| @node remote_raw_load procedure, remote_raw_open procedure, remote_raw_ld procedure, Procedures For Remote Communication |
| @subsubsection Remote_raw_load Procedure |
| |
| |
| @quotation |
| |
| @t{@b{remote_raw_load}(@i{dest} |
| @i{prog} |
| @i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{dest} |
| |
| @item @code{prog} |
| |
| @item @code{args} |
| @end table |
| |
| @node remote_raw_open procedure, remote_raw_send procedure, remote_raw_load procedure, Procedures For Remote Communication |
| @subsubsection Remote_raw_open Procedure |
| |
| |
| @quotation |
| |
| @t{@b{remote_raw_open}(@i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{args} |
| @end table |
| |
| @node remote_raw_send procedure, remote_raw_spawn procedure, remote_raw_open procedure, Procedures For Remote Communication |
| @subsubsection Remote_raw_send Procedure |
| |
| |
| @quotation |
| |
| @t{@b{remote_raw_send}(@i{dest} |
| @i{string});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{dest} |
| |
| @item @code{string} |
| @end table |
| |
| @node remote_raw_spawn procedure, remote_raw_transmit procedure, remote_raw_send procedure, Procedures For Remote Communication |
| @subsubsection Remote_raw_spawn Procedure |
| |
| |
| @quotation |
| |
| @t{@b{remote_raw_spawn}(@i{dest} |
| @i{commandline});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{dest} |
| |
| @item @code{commandline} |
| @end table |
| |
| @node remote_raw_transmit procedure, remote_raw_wait procedure, remote_raw_spawn procedure, Procedures For Remote Communication |
| @subsubsection Remote_raw_transmit Procedure |
| |
| |
| @quotation |
| |
| @t{@b{remote_raw_transmit}(@i{dest} |
| @i{file});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{dest} |
| |
| @item @code{file} |
| @end table |
| |
| @node remote_raw_wait procedure, remote_reboot procedure, remote_raw_transmit procedure, Procedures For Remote Communication |
| @subsubsection Remote_raw_wait Procedure |
| |
| |
| @quotation |
| |
| @t{@b{remote_raw_wait}(@i{dest} |
| @i{timeout});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{dest} |
| |
| @item @code{timeout} |
| @end table |
| |
| @node remote_reboot procedure, remote_send procedure, remote_raw_wait procedure, Procedures For Remote Communication |
| @subsubsection Remote_reboot Procedure |
| |
| |
| @quotation |
| |
| @t{@b{remote_reboot}(@i{host});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{host} |
| @end table |
| |
| @node remote_send procedure, remote_spawn procedure, remote_reboot procedure, Procedures For Remote Communication |
| @subsubsection Remote_send Procedure |
| |
| |
| @quotation |
| |
| @t{@b{remote_send}(@i{dest} |
| @i{string});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{dest} |
| |
| @item @code{string} |
| @end table |
| |
| @node remote_spawn procedure, remote_swap_conn procedure, remote_send procedure, Procedures For Remote Communication |
| @subsubsection Remote_spawn Procedure |
| |
| |
| @quotation |
| |
| @t{@b{remote_spawn}(@i{dest} |
| @i{commandline} |
| @i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{dest} |
| |
| @item @code{commandline} |
| |
| @item @code{args} |
| @end table |
| |
| @node remote_swap_conn procedure, remote_transmit procedure, remote_spawn procedure, Procedures For Remote Communication |
| @subsubsection Remote_swap_conn Procedure |
| |
| |
| @quotation |
| |
| @t{@b{remote_swap_conn}(@i{host});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{} |
| @end table |
| |
| @node remote_transmit procedure, remote_upload procedure, remote_swap_conn procedure, Procedures For Remote Communication |
| @subsubsection Remote_transmit Procedure |
| |
| |
| @quotation |
| |
| @t{@b{remote_transmit}(@i{dest} |
| @i{file});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{dest} |
| |
| @item @code{file} |
| @end table |
| |
| @node remote_upload procedure, remote_wait procedure, remote_transmit procedure, Procedures For Remote Communication |
| @subsubsection Remote_upload Procedure |
| |
| |
| @quotation |
| |
| @t{@b{remote_upload}(@i{dest} |
| @i{srcfile} |
| @i{arg});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{dest} |
| |
| @item @code{srcfile} |
| |
| @item @code{arg} |
| @end table |
| |
| @node remote_wait procedure, standard_close procedure, remote_upload procedure, Procedures For Remote Communication |
| @subsubsection Remote_wait Procedure |
| |
| |
| @quotation |
| |
| @t{@b{remote_wait}(@i{dest} |
| @i{timeout});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{dest} |
| |
| @item @code{timeout} |
| @end table |
| |
| @node standard_close procedure, standard_download procedure, remote_wait procedure, Procedures For Remote Communication |
| @subsubsection Standard_close Procedure |
| |
| @quotation |
| |
| @t{@b{standard_close}(@i{host});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{host} |
| @end table |
| |
| @node standard_download procedure, standard_exec procedure, standard_close procedure, Procedures For Remote Communication |
| @subsubsection Standard_download Procedure |
| |
| |
| @quotation |
| |
| @t{@b{standard_download}(@i{dest} |
| @i{file} |
| @i{destfile});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{dest} |
| |
| @item @code{file} |
| |
| @item @code{destfile} |
| @end table |
| |
| @node standard_exec procedure, standard_file procedure, standard_download procedure, Procedures For Remote Communication |
| @subsubsection Standard_exec Procedure |
| |
| |
| @quotation |
| |
| @t{@b{standard_exec}(@i{hostname} |
| @i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{hostname} |
| |
| @item @code{args} |
| @end table |
| |
| @node standard_file procedure, standard_load procedure, standard_exec procedure, Procedures For Remote Communication |
| @subsubsection Standard_file Procedure |
| |
| |
| @quotation |
| |
| @t{@b{standard_file}(@i{dest} |
| @i{op} |
| @i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{} |
| @end table |
| |
| @node standard_load procedure, standard_reboot procedure, standard_file procedure, Procedures For Remote Communication |
| @subsubsection Standard_load Procedure |
| |
| |
| @quotation |
| |
| @t{@b{standard_load}(@i{dest} |
| @i{prog} |
| @i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{dest} |
| |
| @item @code{prog} |
| |
| @item @code{args} |
| @end table |
| |
| @node standard_reboot procedure, standard_send procedure, standard_load procedure, Procedures For Remote Communication |
| @subsubsection Standard_reboot Procedure |
| |
| |
| @quotation |
| |
| @t{@b{standard_reboot}(@i{host});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{host} |
| @end table |
| |
| @node standard_send procedure, standard_spawn procedure, standard_reboot procedure, Procedures For Remote Communication |
| @subsubsection Standard_send Procedure |
| |
| |
| @quotation |
| |
| @t{@b{standard_send}(@i{dest} |
| @i{string});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{dest} |
| |
| @item @code{string} |
| @end table |
| |
| @node standard_spawn procedure, standard_transmit procedure, standard_send procedure, Procedures For Remote Communication |
| @subsubsection Standard_spawn Procedure |
| |
| |
| @quotation |
| |
| @t{@b{standard_spawn}(@i{dest} |
| @i{commandline});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{dest} |
| |
| @item @code{commndline} |
| @end table |
| |
| @node standard_transmit procedure, standard_upload procedure, standard_spawn procedure, Procedures For Remote Communication |
| @subsubsection Standard_transmit Procedure |
| |
| |
| @quotation |
| |
| @t{@b{standard_transmit}(@i{dest} |
| @i{file});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{dest} |
| |
| @item @code{file} |
| @end table |
| |
| @node standard_upload procedure, standard_wait procedure, standard_transmit procedure, Procedures For Remote Communication |
| @subsubsection Standard_upload Procedure |
| |
| |
| @quotation |
| |
| @t{@b{standard_upload}(@i{dest srcfile destfile});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{dest} |
| |
| @item @code{srcfile} |
| |
| @item @code{destfile} |
| @end table |
| |
| @node standard_wait procedure, unix_clean_filename procedure, standard_upload procedure, Procedures For Remote Communication |
| @subsubsection Standard_wait Procedure |
| |
| |
| @quotation |
| |
| @t{@b{standard_wait}(@i{dest} |
| @i{timeout});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{dest} |
| |
| @item @code{timeout} |
| @end table |
| |
| @node unix_clean_filename procedure, , standard_wait procedure, Procedures For Remote Communication |
| @subsubsection Unix_clean_filename Procedure |
| |
| |
| @quotation |
| |
| @t{@b{unix_clean_filename}(@i{dest} |
| @i{file});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{dest} |
| |
| @item @code{file} |
| @end table |
| |
| @node connprocs, Procedures For Target Boards, Procedures For Remote Communication, Builtin Procedures |
| @subsection Procedures For Using Utilities to Connect |
| |
| telnet, rsh, tip, kermit |
| |
| @menu |
| * telnet Procedure: telnet procedure. |
| * rsh Procedure: rsh procedure. |
| * Tip Procedure: tip procedure. |
| * Kermit Procedure: kermit procedure. |
| * kermit_open Procedure: kermit_open procedure. |
| * Kermit_command Procedure: kermit_command procedure. |
| * Kermit_send Procedure: kermit_send procedure. |
| * Kermit_transmit Procedure: kermit_transmit procedure. |
| * Telnet_open Procedure: telnet_open procedure. |
| * Telnet_binary Procedure: telnet_binary procedure. |
| * Telnet_transmit Procedure: telnet_transmit procedure. |
| * Tip_open Procedure: tip_open procedure. |
| * Rlogin_open Procedure: rlogin_open procedure. |
| * Rlogin_spawn Procedure: rlogin_spawn procedure. |
| * Rsh_open Procedure: rsh_open procedure. |
| * Rsh_download Procedure: rsh_download procedure. |
| * Rsh_upload Procedure: rsh_upload procedure. |
| * Rsh_exec Procedure: rsh_exec procedure. |
| * Ftp_open Procedure: ftp_open procedure. |
| * Ftp_upload Procedure: ftp_upload procedure. |
| * Ftp_download Procedure: ftp_download procedure. |
| * Ftp_close Procedure: ftp_close procedure. |
| * Tip_download Procedure: tip_download procedure. |
| @end menu |
| |
| @node telnet procedure, rsh procedure, , connprocs |
| @subsubsection telnet Procedure |
| |
| |
| @quotation |
| |
| @t{@b{telnet}(@i{hostname} |
| @i{port});} |
| @end quotation |
| |
| @quotation |
| |
| @t{@b{rlogin}(@i{hostname});} |
| @end quotation |
| |
| @node rsh procedure, tip procedure, telnet procedure, connprocs |
| @subsubsection rsh Procedure |
| |
| |
| @quotation |
| |
| @t{@b{rsh}(@i{hostname});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{hostname} |
| This refers to the IP address or name |
| (for example, an entry in |
| @file{/etc/hosts}) for this target. The |
| procedure names reflect the Unix utility used to |
| establish a connection. The optional |
| @code{port} is used to specify the IP |
| port number. The value of the |
| @code{netport} field in the |
| @code{target_info} array is used. (was |
| @code{$netport}) This value has two parts, |
| the hostname and the port number, seperated by a |
| @emph{:}. If host or target is used in |
| the @code{hostname} field, than the |
| config array is used for all information. |
| @end table |
| |
| @node tip procedure, kermit procedure, rsh procedure, connprocs |
| @subsubsection Tip Procedure |
| |
| |
| @quotation |
| |
| @t{@b{tip}(@i{port});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{port} |
| Connect using the Unix utility |
| @code{tip}. @code{Port}must |
| be a name from the tip |
| configuration file |
| @file{/etc/remote}. Often, this is called |
| @code{hardwire}, or something like |
| @code{ttya}. This file holds all the |
| configuration data for the serial port. The value of |
| the @code{serial} field in the |
| @code{target_info} array is used. (was |
| @code{$serialport}) If @code{host} |
| or @code{target} is used in the |
| @code{port} field, than the config |
| array is used for all information. the |
| config array is used for all information. |
| @end table |
| |
| @node kermit procedure, kermit_open procedure, tip procedure, connprocs |
| @subsubsection Kermit Procedure |
| |
| |
| @quotation |
| |
| @t{@b{kermit}(@i{port} |
| @i{bps});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{port} |
| Connect using the program |
| @code{kermit}. @code{Port} |
| is the device name, |
| e.g. @file{/dev/ttyb}. |
| |
| @item @code{bps} |
| @code{bps} is the line |
| speed to use (in its per second) for the |
| connection. The value of the @code{serial} |
| field in the @code{target_info} array is |
| used. (was @code{$serialport}) If |
| @code{host} or @code{target} is |
| used in the @code{port} field, than the |
| config array is used for all information. the |
| config array is used for all information. |
| @end table |
| |
| @node kermit_open procedure, kermit_command procedure, kermit procedure, connprocs |
| @subsubsection kermit_open Procedure |
| |
| |
| @quotation |
| |
| @t{@b{kermit_open}(@i{dest} |
| @i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{dest} |
| |
| @item @code{args} |
| @end table |
| |
| @node kermit_command procedure, kermit_send procedure, kermit_open procedure, connprocs |
| @subsubsection Kermit_command Procedure |
| |
| |
| @quotation |
| |
| @t{@b{kermit_command}(@i{dest} |
| @i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{dest} |
| |
| @item @code{args} |
| @end table |
| |
| @node kermit_send procedure, kermit_transmit procedure, kermit_command procedure, connprocs |
| @subsubsection Kermit_send Procedure |
| |
| |
| @quotation |
| |
| @t{@b{kermit_send}(@i{dest string args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{dest} |
| |
| @item @code{string} |
| |
| @item @code{args} |
| @end table |
| |
| @node kermit_transmit procedure, telnet_open procedure, kermit_send procedure, connprocs |
| @subsubsection Kermit_transmit Procedure |
| |
| |
| @quotation |
| |
| @t{@b{kermit_transmit}(@i{dest} |
| @i{file} |
| @i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{dest} |
| |
| @item @code{file} |
| |
| @item @code{args} |
| @end table |
| |
| @node telnet_open procedure, telnet_binary procedure, kermit_transmit procedure, connprocs |
| @subsubsection Telnet_open Procedure |
| |
| |
| @quotation |
| |
| @t{@b{telnet_open}(@i{hostname} |
| @i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{hostname} |
| |
| @item @code{args} |
| @end table |
| |
| @node telnet_binary procedure, telnet_transmit procedure, telnet_open procedure, connprocs |
| @subsubsection Telnet_binary Procedure |
| |
| |
| @quotation |
| |
| @t{@b{telnet_binary}(@i{hostname});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{hostname} |
| @end table |
| |
| @node telnet_transmit procedure, tip_open procedure, telnet_binary procedure, connprocs |
| @subsubsection Telnet_transmit Procedure |
| |
| |
| @quotation |
| |
| @t{@b{telnet_transmit}(@i{dest} |
| @i{file} |
| @i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{dest} |
| |
| @item @code{file} |
| |
| @item @code{args} |
| @end table |
| |
| @node tip_open procedure, rlogin_open procedure, telnet_transmit procedure, connprocs |
| @subsubsection Tip_open Procedure |
| |
| |
| @quotation |
| |
| @t{@b{tip_open}(@i{hostname});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{hostname} |
| @end table |
| |
| @node rlogin_open procedure, rlogin_spawn procedure, tip_open procedure, connprocs |
| @subsubsection Rlogin_open Procedure |
| |
| |
| @quotation |
| |
| @t{@b{rlogin_open}(@i{arg});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{arg} |
| @end table |
| |
| @node rlogin_spawn procedure, rsh_open procedure, rlogin_open procedure, connprocs |
| @subsubsection Rlogin_spawn Procedure |
| |
| |
| @quotation |
| |
| @t{@b{rlogin_spawn}(@i{dest} |
| @i{cmdline});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{dest} |
| |
| @item @code{cmdline} |
| @end table |
| |
| @node rsh_open procedure, rsh_download procedure, rlogin_spawn procedure, connprocs |
| @subsubsection Rsh_open Procedure |
| |
| |
| @quotation |
| |
| @t{@b{rsh_open}(@i{hostname});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{hostname} |
| @end table |
| |
| @node rsh_download procedure, rsh_upload procedure, rsh_open procedure, connprocs |
| @subsubsection Rsh_download Procedure |
| |
| |
| @quotation |
| |
| @t{@b{rsh_download}(@i{desthost} |
| @i{srcfile} |
| @i{destfile});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{desthost} |
| |
| @item @code{srcfile} |
| |
| @item @code{destfile} |
| @end table |
| |
| @node rsh_upload procedure, rsh_exec procedure, rsh_download procedure, connprocs |
| @subsubsection Rsh_upload Procedure |
| |
| |
| @quotation |
| |
| @t{@b{rsh_upload}(@i{desthost} |
| @i{srcfile} |
| @i{destfile});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{desthost} |
| |
| @item @code{srcfile} |
| |
| @item @code{destfile} |
| @end table |
| |
| @node rsh_exec procedure, ftp_open procedure, rsh_upload procedure, connprocs |
| @subsubsection Rsh_exec Procedure |
| |
| |
| @quotation |
| |
| @t{@b{rsh_exec}(@i{boardname} |
| @i{cmd} |
| @i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{boardname} |
| |
| @item @code{cmd} |
| |
| @item @code{args} |
| @end table |
| |
| @node ftp_open procedure, ftp_upload procedure, rsh_exec procedure, connprocs |
| @subsubsection Ftp_open Procedure |
| |
| |
| @quotation |
| |
| @t{@b{ftp_open}(@i{host});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{host} |
| @end table |
| |
| @node ftp_upload procedure, ftp_download procedure, ftp_open procedure, connprocs |
| @subsubsection Ftp_upload Procedure |
| |
| |
| @quotation |
| |
| @t{@b{ftp_upload}(@i{host} |
| @i{remotefile} |
| @i{localfile});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{host} |
| |
| @item @code{remotefile} |
| |
| @item @code{localfile} |
| @end table |
| |
| @node ftp_download procedure, ftp_close procedure, ftp_upload procedure, connprocs |
| @subsubsection Ftp_download Procedure |
| |
| |
| @quotation |
| |
| @t{@b{ftp_download}(@i{host} |
| @i{localfile} |
| @i{remotefile});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{host} |
| |
| @item @code{localfile} |
| |
| @item @code{remotefile} |
| @end table |
| |
| @node ftp_close procedure, tip_download procedure, ftp_download procedure, connprocs |
| @subsubsection Ftp_close Procedure |
| |
| |
| @quotation |
| |
| @t{@b{ftp_close}(@i{host});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{host} |
| @end table |
| |
| @node tip_download procedure, , ftp_close procedure, connprocs |
| @subsubsection Tip_download Procedure |
| |
| |
| @quotation |
| |
| @t{@b{tip_download}(@i{spawnid} |
| @i{file});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{spawnid} |
| Download @code{file} to the |
| process @code{spawnid} (the value returned |
| when the connection was established), using the |
| @code{~put} command under |
| tip. Most often used for |
| single board computers that require downloading |
| programs in ASCII S-records. Returns |
| @emph{1} if an error occurs, |
| @emph{0} otherwise. |
| |
| @item @code{file} |
| This is the filename to |
| downlaod. |
| @end table |
| |
| @node Procedures For Target Boards, target database library file, connprocs, Builtin Procedures |
| @subsection Procedures For Target Boards |
| |
| |
| @menu |
| * Default_link Procedure: default_link procedure. |
| * Default_target_assemble Procedure: default_target_assemble procedure. |
| * default_target_compile Procedure: default_target_compile procedure. |
| * Pop_config Procedure: pop_config procedure. |
| * Prune_warnings Procedure: prune_warnings procedure. |
| * Push_build Procedure: push_build procedure. |
| * push_config Procedure: push_config procedure. |
| * Reboot_target Procedure: reboot_target procedure. |
| * Target_assemble Procedure: target_assemble procedure. |
| * Target_compile Procedure: target_compile procedure. |
| @end menu |
| |
| @node default_link procedure, default_target_assemble procedure, , Procedures For Target Boards |
| @subsubsection Default_link Procedure |
| |
| |
| @quotation |
| |
| @t{@b{default_link}(@i{board} |
| @i{objects} |
| @i{destfile} |
| @i{flags});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{board} |
| |
| @item @code{objects} |
| |
| @item @code{destfile} |
| |
| @item @code{flags} |
| @end table |
| |
| @node default_target_assemble procedure, default_target_compile procedure, default_link procedure, Procedures For Target Boards |
| @subsubsection Default_target_assemble Procedure |
| |
| |
| @quotation |
| |
| @t{@b{default_target_assemble}(@i{source} |
| @i{destfile} |
| @i{flags});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{source} |
| |
| @item @code{destfile} |
| |
| @item @code{flags} |
| @end table |
| |
| @node default_target_compile procedure, pop_config procedure, default_target_assemble procedure, Procedures For Target Boards |
| @subsubsection default_target_compile Procedure |
| |
| |
| @quotation |
| |
| @t{@b{default_target_compile}(@i{source} |
| @i{destfile} |
| @i{type} |
| @i{options});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{source} |
| |
| @item @code{destfile} |
| |
| @item @code{type} |
| |
| @item @code{options} |
| @end table |
| |
| @node pop_config procedure, prune_warnings procedure, default_target_compile procedure, Procedures For Target Boards |
| @subsubsection Pop_config Procedure |
| |
| |
| @quotation |
| |
| @t{@b{pop_config}(@i{type});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{type} |
| @end table |
| |
| @node prune_warnings procedure, push_build procedure, pop_config procedure, Procedures For Target Boards |
| @subsubsection Prune_warnings Procedure |
| |
| |
| @quotation |
| |
| @t{@b{prune_warnings}(@i{text});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{text} |
| @end table |
| |
| @node push_build procedure, push_config procedure, prune_warnings procedure, Procedures For Target Boards |
| @subsubsection Push_build Procedure |
| |
| |
| @quotation |
| |
| @t{@b{push_build}(@i{name});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{name} |
| @end table |
| |
| @node push_config procedure, reboot_target procedure, push_build procedure, Procedures For Target Boards |
| @subsubsection push_config Procedure |
| |
| |
| @quotation |
| |
| @t{@b{push_config}(@i{type} |
| @i{name});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{type} |
| |
| @item @code{name} |
| @end table |
| |
| @node reboot_target procedure, target_assemble procedure, push_config procedure, Procedures For Target Boards |
| @subsubsection Reboot_target Procedure |
| |
| |
| @quotation |
| |
| @t{@b{reboot_target}(@i{});} |
| @end quotation |
| |
| @node target_assemble procedure, target_compile procedure, reboot_target procedure, Procedures For Target Boards |
| @subsubsection Target_assemble Procedure |
| |
| |
| @quotation |
| |
| @t{@b{target_assemble}(@i{source destfile flags});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{source} |
| |
| @item @code{destfile} |
| |
| @item @code{flags} |
| @end table |
| |
| @node target_compile procedure, , target_assemble procedure, Procedures For Target Boards |
| @subsubsection Target_compile Procedure |
| |
| |
| @quotation |
| |
| @t{@b{target_compile}(@i{source} |
| @i{destfile} |
| @i{type} |
| @i{options});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{source} |
| |
| @item @code{destfile} |
| |
| @item @code{type} |
| |
| @item @code{options} |
| @end table |
| |
| @node target database library file, platform dependant procedures, Procedures For Target Boards, Builtin Procedures |
| @subsection Target Database Procedures |
| |
| @menu |
| * Board_info Procedure: board_info procedure. |
| * Host_info Procedure: host_info procedure. |
| * Set_board_info Procedure: set_board_info procedure. |
| * Set_currtarget_info Procedure: set_currtarget_info procedure. |
| * Target_info Procedure: target_info procedure. |
| * Unset_board_info Procedure: unset_board_info procedure. |
| * Unset_currtarget_info Procedure: unset_currtarget_info procedure. |
| * Push_target Procedure: push_target procedure. |
| * Pop_target Procedure: poptarget procedure. |
| * List_targets Procedure: list_targets procedure. |
| * Push_host Procedure: push_host procedure. |
| * Pop_host Procedure: pop_host procedure. |
| * Compile Procedure: compile procedure. |
| * Archive Procedure: archive procedure. |
| * Ranlib Procedure: ranlib procedure. |
| * Execute_anywhere Procedure: execute_anywhere procedure. |
| @end menu |
| |
| @node board_info procedure, host_info procedure, , target database library file |
| @subsubsection Board_info Procedure |
| |
| |
| @quotation |
| |
| @t{@b{board_info}(@i{machine} |
| @i{op} |
| @i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{machine} |
| |
| @item @code{op} |
| |
| @item @code{args} |
| @end table |
| |
| @node host_info procedure, set_board_info procedure, board_info procedure, target database library file |
| @subsubsection Host_info Procedure |
| |
| |
| @quotation |
| |
| @t{@b{host_info}(@i{op} |
| @i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{op} |
| |
| @item @code{args} |
| @end table |
| |
| @node set_board_info procedure, set_currtarget_info procedure, host_info procedure, target database library file |
| @subsubsection Set_board_info Procedure |
| |
| |
| @quotation |
| |
| @t{@b{set_board_info}(@i{entry} |
| @i{value});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{entry} |
| |
| @item @code{value} |
| @end table |
| |
| @node set_currtarget_info procedure, target_info procedure, set_board_info procedure, target database library file |
| @subsubsection Set_currtarget_info Procedure |
| |
| |
| @quotation |
| |
| @t{@b{set_currtarget_info}(@i{entry} |
| @i{value});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{entry} |
| |
| @item @code{value} |
| @end table |
| |
| @node target_info procedure, unset_board_info procedure, set_currtarget_info procedure, target database library file |
| @subsubsection Target_info Procedure |
| |
| |
| @quotation |
| |
| @t{@b{target_info}(@i{op} |
| @i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{op} |
| |
| @item @code{args} |
| @end table |
| |
| @node unset_board_info procedure, unset_currtarget_info procedure, target_info procedure, target database library file |
| @subsubsection Unset_board_info Procedure |
| |
| |
| @quotation |
| |
| @t{@b{unset_board_info}(@i{entry});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{entry} |
| @end table |
| |
| @node unset_currtarget_info procedure, push_target procedure, unset_board_info procedure, target database library file |
| @subsubsection Unset_currtarget_info Procedure |
| |
| |
| @quotation |
| |
| @t{@b{unset_currtarget_info}(@i{entry});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{entry} |
| @end table |
| |
| @node push_target procedure, poptarget procedure, unset_currtarget_info procedure, target database library file |
| @subsubsection Push_target Procedure |
| |
| This makes the target named @emph{name} be the |
| current target connection. The value of @emph{name} is |
| an index into the @code{target_info} array and is set in |
| the global config file. |
| |
| @quotation |
| |
| @t{@b{push_target}(@i{name});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{name} |
| The name of the target to make current |
| connection. |
| @end table |
| |
| @node poptarget procedure, list_targets procedure, push_target procedure, target database library file |
| @subsubsection Pop_target Procedure |
| |
| This unsets the current target connection. |
| |
| @quotation |
| |
| @t{@b{pop_target}(@i{});} |
| @end quotation |
| |
| @node list_targets procedure, push_host procedure, poptarget procedure, target database library file |
| @subsubsection List_targets Procedure |
| |
| This lists all the supported targets for this |
| architecture. |
| |
| @quotation |
| |
| @t{@b{list_targets}(@i{});} |
| @end quotation |
| |
| @node push_host procedure, pop_host procedure, list_targets procedure, target database library file |
| @subsubsection Push_host Procedure |
| |
| This makes the host named @emph{name} be the |
| current remote host connection. The value of |
| @emph{name} is an index into the |
| @code{target_info} array and is set in the global config |
| file. |
| |
| @quotation |
| |
| @t{@b{push_host}(@i{name});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{name} |
| @end table |
| |
| @node pop_host procedure, compile procedure, push_host procedure, target database library file |
| @subsubsection Pop_host Procedure |
| |
| This unsets the current host connection. |
| |
| @quotation |
| |
| @t{@b{pop_host}(@i{});} |
| @end quotation |
| |
| @node compile procedure, archive procedure, pop_host procedure, target database library file |
| @subsubsection Compile Procedure |
| |
| This invokes the compiler as set by CC to compile the |
| file @file{file}. The default options for many cross |
| compilation targets are @emph{guessed} by DejaGnu, and |
| these options can be added to by passing in more parameters as |
| arguments to @code{compile}. Optionally, this will also |
| use the value of the @emph{cflags} field in the target |
| config array. If the host is not the same as the build machines, then |
| then compiler is run on the remote host using |
| @code{execute_anywhere}. |
| |
| @quotation |
| |
| @t{@b{compile}(@i{file});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{file} |
| @end table |
| |
| @node archive procedure, ranlib procedure, compile procedure, target database library file |
| @subsubsection Archive Procedure |
| |
| This produces an archive file. Any parameters passed to |
| @code{archive} are used in addition to the default |
| flags. Optionally, this will also use the value of the |
| @emph{arflags} field in the target config array. If the |
| host is not the same as the build machines, then then archiver is run |
| on the remote host using @code{execute_anywhere}. |
| |
| @quotation |
| |
| @t{@b{archive}(@i{file});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{file} |
| @end table |
| |
| @node ranlib procedure, execute_anywhere procedure, archive procedure, target database library file |
| @subsubsection Ranlib Procedure |
| |
| This generates an index for the archive file for systems that |
| aren't POSIX yet. Any parameters passed to @code{ranlib} |
| are used in for the flags. |
| |
| @quotation |
| |
| @t{@b{ranlib}(@i{file});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{file} |
| @end table |
| |
| @node execute_anywhere procedure, , ranlib procedure, target database library file |
| @subsubsection Execute_anywhere Procedure |
| |
| This executes the @emph{cmdline} on the proper |
| host. This should be used as a replacement for the Tcl command |
| @code{exec} as this version utilizes the target config |
| info to execute this command on the build machine or a remote |
| host. All config information for the remote host must be setup to |
| have this command work. If this is a canadian cross, (where we test a |
| cross compiler that runs on a different host then where DejaGnu is |
| running) then a connection is made to the remote host and the command |
| is executed there. It returns either REMOTERROR (for an error) or the |
| output produced when the command was executed. This is used for |
| running the tool to be tested, not a test case. |
| |
| @quotation |
| |
| @t{@b{execute_anywhere}(@i{cmdline});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{cmdline} |
| @end table |
| |
| @node platform dependant procedures, Utility Procedures, target database library file, Builtin Procedures |
| @subsection Platform Dependant Procedures |
| |
| Each combination of target and tool requires some |
| target-dependent procedures. The names of these procedures have |
| a common form: the tool name, followed by an underbar |
| @emph{_}, and finally a suffix describing the |
| procedure's purpose. For example, a procedure to extract the |
| version from GDB is called |
| @code{gdb_version}. |
| |
| @code{runtest} itself calls only two of these |
| procedures, @code{$@{tool@}_exit} and |
| @code{$@{tool@}_version}; these procedures use no |
| arguments. |
| |
| The other two procedures, @code{$@{tool@}_start} |
| and @code{$@{tool@}_load}@}, are only called by the test |
| suites themselves (or by testsuite-specific initialization |
| code); they may take arguments or not, depending on the |
| conventions used within each testsuite. |
| |
| The usual convention for return codes from any of these |
| procedures (although it is not required by |
| @code{runtest}) is to return @emph{0} |
| if the procedure succeeded, @emph{1} if it failed, |
| and @emph{-1} if there was a communication error. |
| |
| @menu |
| * $@{tool@}_start Procedure: $@{tool@}_start procedure. |
| * $@{tool@}_load Procedure: $@{tool@}_load procedure. |
| * $@{tool@}_exit Procedure: $@{tool@}_exit procedure. |
| * $@{tool@}_version Procedure: $@{tool@}_version procedure. |
| @end menu |
| |
| @node $@{tool@}_start procedure, $@{tool@}_load procedure, , platform dependant procedures |
| @subsubsection $@{tool@}_start Procedure |
| |
| Starts a particular tool. For an interactive tool, |
| @code{$@{tool@}_start} starts and initializes the |
| tool, leaving the tool up and running for the test cases; an |
| example is @code{gdb_start}, the start function |
| for GDB. For a batch oriented tool, |
| @code{$@{tool@}_start} is optional; the recommended |
| convention is to let @code{$@{tool@}_start} run the |
| tool, leaving the output in a variable called |
| @code{comp_output}. Test scripts can then analyze |
| @code{$comp_output} to determine the test results. |
| An example of this second kind of start function is |
| @code{gcc_start}, the start function for GCC. |
| |
| DejaGnu itself does not call |
| @code{$@{tool@}_start}. The initialization |
| module @code{$@{tool@}_init.exp} must call |
| @code{$@{tool@}_start} for interactive tools; |
| for batch-oriented tools, each individual test script calls |
| @code{$@{tool@}_start} (or makes other |
| arrangements to run the tool). |
| |
| @quotation |
| |
| @t{@b{$@{tool@}_start}(@i{});} |
| @end quotation |
| |
| @node $@{tool@}_load procedure, $@{tool@}_exit procedure, $@{tool@}_start procedure, platform dependant procedures |
| @subsubsection $@{tool@}_load Procedure |
| |
| Loads something into a tool. For an interactive tool, |
| this conditions the tool for a particular test case; for |
| example, @code{gdb_load} loads a new |
| executable file into the debugger. For batch oriented tools, |
| @code{$@{tool@}_load} may do nothing---though, |
| for example, the GCC support uses |
| @code{gcc_load} to load and run a binary on |
| the target environment. Conventionally, |
| @code{$@{tool@}_load} leaves the output of any |
| program it runs in a variable called |
| @code{$exec_output}. Writing |
| @code{$@{tool@}_load} can be the most complex |
| part of extending DejaGnu to a new tool or a new target, if |
| it requires much communication coding or file |
| downloading. Test scripts call |
| @code{$@{tool@}_load}. |
| |
| @quotation |
| |
| @t{@b{$@{tool@}_load}(@i{});} |
| @end quotation |
| |
| @node $@{tool@}_exit procedure, $@{tool@}_version procedure, $@{tool@}_load procedure, platform dependant procedures |
| @subsubsection $@{tool@}_exit Procedure |
| |
| Cleans up (if necessary) before DejaGnu exits. For |
| interactive tools, this usually ends the interactive |
| session. You can also use @code{$@{tool@}_exit} |
| to remove any temporary files left over from the |
| tests. @code{runtest} calls |
| @code{$@{tool@}_exit}. |
| |
| @quotation |
| |
| @t{@b{$@{tool@}_exit}(@i{});} |
| @end quotation |
| |
| @node $@{tool@}_version procedure, , $@{tool@}_exit procedure, platform dependant procedures |
| @subsubsection $@{tool@}_version Procedure |
| |
| Prints the version label and number for |
| @code{$@{tool@}}. This is called by the DejaGnu |
| procedure that prints the final summary report. The output |
| should consist of the full path name used for the tested |
| tool, and its version number. |
| |
| @quotation |
| |
| @t{@b{$@{tool@}_version}(@i{});} |
| @end quotation |
| |
| @node Utility Procedures, Libgloss, platform dependant procedures, Builtin Procedures |
| @subsection Utility Procedures |
| |
| @menu |
| * Getdirs Procedure: getdirs procedure. |
| * Find Procedure: find procedure. |
| * Which Procedure: which procedure. |
| * Grep Procedure: grep procedure. |
| * Prune Procedure: prune procedure. |
| * Slay Procedure: slay procedure. |
| * Absolute Procedure: absolute procedure. |
| * Psource Procedure: psource procedure. |
| * Runtest_file_p Procedure: runtest_file_p procedure. |
| * Diff Procedure: diff procedure. |
| * Setenv Procedure: setenv procedure. |
| * unsetenv Procedure: unsetenv procedure. |
| * Getenv Procedure: getenv procedure. |
| * Prune_system_crud Procedure: prune_system_crud procedure. |
| @end menu |
| |
| @node getdirs procedure, find procedure, , Utility Procedures |
| @subsubsection Getdirs Procedure |
| |
| Returns a list of all the directories in the single |
| directory a single directory that match an optional |
| pattern. |
| |
| @quotation |
| |
| @t{@b{getdirs}(@i{rootdir} |
| @i{pattern});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{args} |
| |
| @item @code{pattern} |
| If you do not specify |
| @code{pattern}, |
| @code{Getdirs} assumes a default pattern of |
| @emph{*}. You may use the common shell |
| wildcard characters in the pattern. If no directories |
| match the pattern, then a NULL string is |
| returned |
| @end table |
| |
| @node find procedure, which procedure, getdirs procedure, Utility Procedures |
| @subsubsection Find Procedure |
| |
| Search for files whose names match @emph{pattern} |
| (using shell wildcard characters for filename expansion). Search |
| subdirectories recursively, starting at |
| @emph{rootdir}. The result is the list of files whose |
| names match; if no files match, the result is empty. Filenames in the |
| result include all intervening subdirectory names. If no files match |
| the pattern, then a NULL string is returned. |
| |
| @quotation |
| |
| @t{@b{find}(@i{rootdir} |
| @i{pattern});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{rootdir} |
| The top level directory to search the search |
| from. |
| |
| @item @code{pattern} |
| A csh "glob" style regular expression reprsenting |
| the files to find. |
| @end table |
| |
| @node which procedure, grep procedure, find procedure, Utility Procedures |
| @subsubsection Which Procedure |
| |
| Searches the execution path for an executable file |
| @emph{binary}, like the the BSD @code{which} |
| utility. This procedure uses the shell environment variable |
| @emph{PATH}. It returns @emph{0} if the |
| binary is not in the path, or if there is no @emph{PATH} |
| environment variable. If @code{binary} is in the path, it |
| returns the full path to @code{binary}. |
| |
| @quotation |
| |
| @t{@b{which}(@i{file});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{binary} |
| The executable program or shell script to look |
| for. |
| @end table |
| |
| @node grep procedure, prune procedure, which procedure, Utility Procedures |
| @subsubsection Grep Procedure |
| |
| Search the file called @file{filename} (a fully |
| specified path) for lines that contain a match for regular expression |
| @emph{regexp}. The result is a list of all the lines that |
| match. If no lines match, the result is an empty string. Specify |
| @emph{regexp} using the standard regular expression style |
| used by the Unix utility program grep. |
| |
| Use the optional third argument @emph{line} to |
| start lines in the result with the line number in |
| @file{filename}. (This argument is simply an option |
| flag; type it just as shown @code{--line}.) |
| |
| @quotation |
| |
| @t{@b{grep}(@i{filename} |
| @i{regexp} |
| @i{--line});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{filename} |
| The file to search. |
| |
| @item @code{regexp} |
| The Unix style regular expression (as used by the |
| @code{grep} Unix utility) to search |
| for. |
| |
| @item @code{--line} |
| Prefix the line number to each line where the |
| regexp matches. |
| @end table |
| |
| @node prune procedure, slay procedure, grep procedure, Utility Procedures |
| @subsubsection Prune Procedure |
| |
| This procedure is deprecated and will be removed in |
| the next release of DejaGnu. If a testsuite uses this |
| procedure, a copy of the procedure should be made and placed |
| in the lib directory of the testsuite. |
| |
| @node slay procedure, absolute procedure, prune procedure, Utility Procedures |
| @subsubsection Slay Procedure |
| |
| This procedure is deprecated and will be removed in |
| the next release of DejaGnu. If a testsuite uses this |
| procedure, a copy of the procedure should be made and placed |
| in the lib directory of the testsuite. |
| |
| @node absolute procedure, psource procedure, slay procedure, Utility Procedures |
| @subsubsection Absolute Procedure |
| |
| This procedure is deprecated and will be removed in |
| the next release of DejaGnu. If a testsuite uses this |
| procedure, a copy of the procedure should be made and placed |
| in the lib directory of the testsuite. |
| |
| @node psource procedure, runtest_file_p procedure, absolute procedure, Utility Procedures |
| @subsubsection Psource Procedure |
| |
| This procedure is deprecated and will be removed in |
| the next release of DejaGnu. If a testsuite uses this |
| procedure, a copy of the procedure should be made and placed |
| in the lib directory of the testsuite. |
| |
| @node runtest_file_p procedure, diff procedure, psource procedure, Utility Procedures |
| @subsubsection Runtest_file_p Procedure |
| |
| Search @emph{runtest}s for |
| @emph{testcase} and return @emph{1} if |
| found, @emph{0} if not. @emph{runtests} |
| is a list of two elements. The first is a copy of what was on |
| the right side of the @emph{=} if |
| |
| @example |
| foo.exp="..." |
| @end example |
| |
| @noindent |
| " was specified, or |
| an empty string if no such argument is present. The second is the |
| pathname of the current testcase under consideration. This is used |
| by tools like compilers where each testcase is a file. |
| |
| @quotation |
| |
| @t{@b{runtest_file_p}(@i{runtests} |
| @i{testcase});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{runtests} |
| The list of patterns to compare against. |
| |
| @item @code{testcase} |
| The test case filename. |
| @end table |
| |
| @node diff procedure, setenv procedure, runtest_file_p procedure, Utility Procedures |
| @subsubsection Diff Procedure |
| |
| Compares the two files and returns a @emph{1} if |
| they match, or a @emph{0} if they don't. If |
| @code{verbose} is set, then it'll print the differences to |
| the screen. |
| |
| @quotation |
| |
| @t{@b{diff}(@i{file_1} |
| @i{file_2});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{file_1} |
| The first file to compare. |
| |
| @item @code{file_2} |
| The second file to compare. |
| @end table |
| |
| @node setenv procedure, unsetenv procedure, diff procedure, Utility Procedures |
| @subsubsection Setenv Procedure |
| |
| Sets the environment variable @emph{var} to the |
| value @emph{val}. |
| |
| @quotation |
| |
| @t{@b{setenv}(@i{var} |
| @i{val});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{var} |
| The environment variable to set. |
| |
| @item @code{val} |
| The value to set the variable to. |
| @end table |
| |
| @node unsetenv procedure, getenv procedure, setenv procedure, Utility Procedures |
| @subsubsection unsetenv Procedure |
| |
| Unsets the environment variable |
| @emph{var}. |
| |
| @quotation |
| |
| @t{@b{unsetenv}(@i{var});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{var} |
| The environment variable to |
| unset. |
| @end table |
| |
| @node getenv procedure, prune_system_crud procedure, unsetenv procedure, Utility Procedures |
| @subsubsection Getenv Procedure |
| |
| Returns the value of @emph{var} in the |
| environment if it exists, otherwise it returns NULL. |
| |
| @quotation |
| |
| @t{@b{getenv}(@i{var});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{var} |
| The environment variable to get the value |
| of. |
| @end table |
| |
| @node prune_system_crud procedure, , getenv procedure, Utility Procedures |
| @subsubsection Prune_system_crud Procedure |
| |
| For system @emph{system}, delete text the host or |
| target operating system might issue that will interfere with pattern |
| matching of program output in @emph{text}. An example |
| is the message that is printed if a shared library is out of |
| date. |
| |
| @quotation |
| |
| @t{@b{prune_system_crud}(@i{system} |
| @i{test});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{system} |
| The system error messages to look for to screen out |
| . |
| |
| @item @code{text} |
| The Tcl variable containing the |
| text. |
| @end table |
| |
| @node Libgloss, Debugging Procedures, Utility Procedures, Builtin Procedures |
| @subsection Libgloss, A Free BSP |
| |
| Libgloss is a free @dfn{BSP} (Board Support |
| Package) commonly used with GCC and G++ to produce a fully linked |
| executable image for an embedded systems. |
| |
| @menu |
| * Libgloss_link_flags Procedure: libgloss_link_flags procedure. |
| * Libgloss_include_flags Procedure: libgloss_include_flags procedure. |
| * Newlib_link_flags Procedure: newlib_link_flags procedure. |
| * Newlib_include_flags Procedure: newlib_include_flags procedure. |
| * Libio_include_flags Procedure: libio_include_flags procedure. |
| * Libio_link_flags Procedure: libio_link_flags procedure. |
| * G++_include_flags Procedure: g++_include_flags procedure. |
| * G++_link_flags Procedure: g++_link_flags procedure. |
| * Libstdc++_include_flags Procedure: libstdc++_include_flags procedure. |
| * Libstdc++_link_flags Procedure: libstdc++_link_flags procedure. |
| * Get_multilibs Procedure: get_multilibs procedure. |
| * Find_binutils_prog Procedure: find_binutils_prog procedure. |
| * Find_gcc Procedure: find_gcc procedure. |
| * Find_gcj Procedure: find_gcj procedure. |
| * Find_g++ Procedure: find_g++ procedure. |
| * Find_g77 Procedure: find_g77 procedure. |
| * Process_multilib_options Procedure: process_multilib_options procedure. |
| * Add_multilib_option Procedure: add_multilib_option procedure. |
| * Find_gas Procedure: find_gas procedure. |
| * Find_ld Procedure: find_ld procedure. |
| * Build_wrapper Procedure: build_wrapper procedure. |
| * Winsup_include_flags Procedure: winsup_include_flags procedure. |
| * Winsup_link_flags Procedure: winsup_link_flags procedure. |
| @end menu |
| |
| @node libgloss_link_flags procedure, libgloss_include_flags procedure, , Libgloss |
| @subsubsection Libgloss_link_flags Procedure |
| |
| |
| @quotation |
| |
| @t{@b{libgloss_link_flags}(@i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{args} |
| @end table |
| |
| @node libgloss_include_flags procedure, newlib_link_flags procedure, libgloss_link_flags procedure, Libgloss |
| @subsubsection Libgloss_include_flags Procedure |
| |
| |
| @quotation |
| |
| @t{@b{libgloss_include_flags}(@i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{args} |
| @end table |
| |
| @node newlib_link_flags procedure, newlib_include_flags procedure, libgloss_include_flags procedure, Libgloss |
| @subsubsection Newlib_link_flags Procedure |
| |
| |
| @quotation |
| |
| @t{@b{newlib_link_flags}(@i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{args} |
| @end table |
| |
| @node newlib_include_flags procedure, libio_include_flags procedure, newlib_link_flags procedure, Libgloss |
| @subsubsection Newlib_include_flags Procedure |
| |
| |
| @quotation |
| |
| @t{@b{newlib_include_flags}(@i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{args} |
| @end table |
| |
| @node libio_include_flags procedure, libio_link_flags procedure, newlib_include_flags procedure, Libgloss |
| @subsubsection Libio_include_flags Procedure |
| |
| |
| @quotation |
| |
| @t{@b{libio_include_flags}(@i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{args} |
| @end table |
| |
| @node libio_link_flags procedure, g++_include_flags procedure, libio_include_flags procedure, Libgloss |
| @subsubsection Libio_link_flags Procedure |
| |
| |
| @quotation |
| |
| @t{@b{libio_link_flags}(@i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{args} |
| @end table |
| |
| @node g++_include_flags procedure, g++_link_flags procedure, libio_link_flags procedure, Libgloss |
| @subsubsection G++_include_flags Procedure |
| |
| |
| @quotation |
| |
| @t{@b{g++_include_flags}(@i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{args} |
| @end table |
| |
| @node g++_link_flags procedure, libstdc++_include_flags procedure, g++_include_flags procedure, Libgloss |
| @subsubsection G++_link_flags Procedure |
| |
| |
| @quotation |
| |
| @t{@b{g++_link_flags}(@i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{args} |
| @end table |
| |
| @node libstdc++_include_flags procedure, libstdc++_link_flags procedure, g++_link_flags procedure, Libgloss |
| @subsubsection Libstdc++_include_flags Procedure |
| |
| |
| @quotation |
| |
| @t{@b{libstdc++_include_flags}(@i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{args} |
| @end table |
| |
| @node libstdc++_link_flags procedure, get_multilibs procedure, libstdc++_include_flags procedure, Libgloss |
| @subsubsection Libstdc++_link_flags Procedure |
| |
| |
| @quotation |
| |
| @t{@b{libstdc++_link_flags}(@i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{args} |
| @end table |
| |
| @node get_multilibs procedure, find_binutils_prog procedure, libstdc++_link_flags procedure, Libgloss |
| @subsubsection Get_multilibs Procedure |
| |
| |
| @quotation |
| |
| @t{@b{get_multilibs}(@i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{args} |
| @end table |
| |
| @node find_binutils_prog procedure, find_gcc procedure, get_multilibs procedure, Libgloss |
| @subsubsection Find_binutils_prog Procedure |
| |
| |
| @quotation |
| |
| @t{@b{find_binutils_prog}(@i{name});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{name} |
| @end table |
| |
| @node find_gcc procedure, find_gcj procedure, find_binutils_prog procedure, Libgloss |
| @subsubsection Find_gcc Procedure |
| |
| |
| @quotation |
| |
| @t{@b{find_gcc}(@i{});} |
| @end quotation |
| |
| @node find_gcj procedure, find_g++ procedure, find_gcc procedure, Libgloss |
| @subsubsection Find_gcj Procedure |
| |
| |
| @quotation |
| |
| @t{@b{find_gcj}(@i{});} |
| @end quotation |
| |
| @node find_g++ procedure, find_g77 procedure, find_gcj procedure, Libgloss |
| @subsubsection Find_g++ Procedure |
| |
| |
| @quotation |
| |
| @t{@b{find_g++}(@i{});} |
| @end quotation |
| |
| @node find_g77 procedure, process_multilib_options procedure, find_g++ procedure, Libgloss |
| @subsubsection Find_g77 Procedure |
| |
| |
| @quotation |
| |
| @t{@b{find_g77}(@i{});} |
| @end quotation |
| |
| @node process_multilib_options procedure, add_multilib_option procedure, find_g77 procedure, Libgloss |
| @subsubsection Process_multilib_options Procedure |
| |
| |
| @quotation |
| |
| @t{@b{process_multilib_options}(@i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{args} |
| @end table |
| |
| @node add_multilib_option procedure, find_gas procedure, process_multilib_options procedure, Libgloss |
| @subsubsection Add_multilib_option Procedure |
| |
| |
| @quotation |
| |
| @t{@b{add_multilib_option}(@i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{args} |
| @end table |
| |
| @node find_gas procedure, find_ld procedure, add_multilib_option procedure, Libgloss |
| @subsubsection Find_gas Procedure |
| |
| |
| @quotation |
| |
| @t{@b{find_gas}(@i{});} |
| @end quotation |
| |
| @node find_ld procedure, build_wrapper procedure, find_gas procedure, Libgloss |
| @subsubsection Find_ld Procedure |
| |
| |
| @quotation |
| |
| @t{@b{find_ld}(@i{});} |
| @end quotation |
| |
| @node build_wrapper procedure, winsup_include_flags procedure, find_ld procedure, Libgloss |
| @subsubsection Build_wrapper Procedure |
| |
| |
| @quotation |
| |
| @t{@b{build_wrapper}(@i{gluefile});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{gluefile} |
| @end table |
| |
| @node winsup_include_flags procedure, winsup_link_flags procedure, build_wrapper procedure, Libgloss |
| @subsubsection Winsup_include_flags Procedure |
| |
| |
| @quotation |
| |
| @t{@b{winsup_include_flags}(@i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{args} |
| @end table |
| |
| @node winsup_link_flags procedure, , winsup_include_flags procedure, Libgloss |
| @subsubsection Winsup_link_flags Procedure |
| |
| |
| @quotation |
| |
| @t{@b{winsup_link_flags}(@i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{args} |
| @end table |
| |
| @node Debugging Procedures, , Libgloss, Builtin Procedures |
| @subsection Procedures for debugging your Tcl code. |
| |
| @file{lib/debugger.exp}defines these utility |
| procedures: |
| |
| @menu |
| * Dumpvars Procedure: dumpvars procedure. |
| * Dumplocals Procedure: dumplocals procedure. |
| * Dumprocs Procedure: dumprocs procedure. |
| * Dumpwatch Procedure: dumpwatch procedure. |
| * Watcharray Procedure: watcharray procedure. |
| * Watchvar Procedure: watchvar procedure. |
| * Watchunset Procedure: watchunset procedure. |
| * Watchwrite Procedure: watchwrite procedure. |
| * Watchread Procedure: watchread procedure. |
| * Watchdel Procedure: watchdel procedure. |
| * Print Procedure: print procedure. |
| * Quit Procedure: quit procedure. |
| @end menu |
| |
| @node dumpvars procedure, dumplocals procedure, , Debugging Procedures |
| @subsubsection Dumpvars Procedure |
| |
| This takes a csh style regular expression (glob rules) and prints |
| the values of the global variable names that match. It is abbreviated |
| as @emph{dv}. |
| |
| @quotation |
| |
| @t{@b{dumpvars}(@i{vars});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{vars} |
| The variables to dump. |
| @end table |
| |
| @node dumplocals procedure, dumprocs procedure, dumpvars procedure, Debugging Procedures |
| @subsubsection Dumplocals Procedure |
| |
| This takes a csh style regular expression (glob rules) and |
| prints the values of the local variable names that match. It is |
| abbreviated as @emph{dl}. |
| |
| @quotation |
| |
| @t{@b{dumplocals}(@i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{args} |
| @end table |
| |
| @node dumprocs procedure, dumpwatch procedure, dumplocals procedure, Debugging Procedures |
| @subsubsection Dumprocs Procedure |
| |
| This takes a csh style regular expression (glob rules) and |
| prints the body of all procs that match. It is abbreviated as |
| @emph{dp}. |
| |
| @quotation |
| |
| @t{@b{dumprocs}(@i{pattern});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{pattern} |
| The csh "glob" style pattern to look |
| for. |
| @end table |
| |
| @node dumpwatch procedure, watcharray procedure, dumprocs procedure, Debugging Procedures |
| @subsubsection Dumpwatch Procedure |
| |
| This takes a csh style regular expression (glob rules) and |
| prints all the watchpoints. It is abbreviated as |
| @emph{dw}. |
| |
| @quotation |
| |
| @t{@b{dumpwatch}(@i{pattern});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{pattern} |
| The csh "glob" style pattern to look |
| for. |
| @end table |
| |
| @node watcharray procedure, watchvar procedure, dumpwatch procedure, Debugging Procedures |
| @subsubsection Watcharray Procedure |
| |
| |
| @quotation |
| |
| @t{@b{watcharray}(@i{element} |
| @i{type});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{type} |
| The csh "glob" style pattern to look |
| for. |
| @end table |
| |
| @node watchvar procedure, watchunset procedure, watcharray procedure, Debugging Procedures |
| @subsubsection Watchvar Procedure |
| |
| |
| @quotation |
| |
| @t{@b{watchvar}(@i{var} |
| @i{type});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{} |
| @end table |
| |
| @node watchunset procedure, watchwrite procedure, watchvar procedure, Debugging Procedures |
| @subsubsection Watchunset Procedure |
| |
| This breaks program execution when the variable |
| @code{var} is unset. It is abbreviated as |
| @emph{wu}. |
| |
| @quotation |
| |
| @t{@b{watchunset}(@i{arg});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{args} |
| @end table |
| |
| @node watchwrite procedure, watchread procedure, watchunset procedure, Debugging Procedures |
| @subsubsection Watchwrite Procedure |
| |
| This breaks program execution when the variable |
| @code{var} is written. It is abbreviated as |
| @emph{ww}. |
| |
| @quotation |
| |
| @t{@b{watchwrite}(@i{var});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{var} |
| The variable to watch. |
| @end table |
| |
| @node watchread procedure, watchdel procedure, watchwrite procedure, Debugging Procedures |
| @subsubsection Watchread Procedure |
| |
| This breaks program execution when the variable |
| @code{var} is read. It is abbreviated as |
| @emph{wr}. |
| |
| @quotation |
| |
| @t{@b{watchread}(@i{var});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{var} |
| The variable to watch. |
| @end table |
| |
| @node watchdel procedure, print procedure, watchread procedure, Debugging Procedures |
| @subsubsection Watchdel Procedure |
| |
| This deletes a the watchpoint from the watch list. It is |
| abbreviated as @emph{wd}. |
| |
| @quotation |
| |
| @t{@b{watchdel}(@i{args});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{args} |
| @end table |
| |
| @node print procedure, quit procedure, watchdel procedure, Debugging Procedures |
| @subsubsection Print Procedure |
| |
| This prints the value of the variable |
| @code{var}. It is abbreviated as |
| @emph{p}. |
| |
| @quotation |
| |
| @t{@b{print}(@i{var});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{var} |
| @end table |
| |
| @node quit procedure, , print procedure, Debugging Procedures |
| @subsubsection Quit Procedure |
| |
| This makes runtest exit. It is abbreviated as |
| @emph{q}. |
| |
| @quotation |
| |
| @t{@b{quit}(@i{});} |
| @end quotation |
| |
| @table @asis |
| |
| @item @code{} |
| @end table |
| |
| @node File Map, , Builtin Procedures, Reference |
| @section File Map |
| |
| This is a map of the files in DejaGnu. |
| |
| @itemize |
| |
| @item |
| runtest |
| |
| @item |
| runtest.exp |
| |
| @item |
| stub-loader.c |
| |
| @item |
| testglue.c |
| |
| @item |
| config |
| |
| @item |
| baseboards |
| |
| @item |
| lib/debugger.exp |
| |
| @item |
| lib/dg.exp |
| |
| @item |
| lib/framework.exp |
| |
| @item |
| lib/ftp.exp |
| |
| @item |
| lib/kermit.exp |
| |
| @item |
| lib/libgloss.exp |
| |
| @item |
| lib/mondfe.exp |
| |
| @item |
| lib/remote.exp |
| |
| @item |
| lib/rlogin.exp |
| |
| @item |
| lib/rsh.exp |
| |
| @item |
| lib/standard.exp |
| |
| @item |
| lib/target.exp |
| |
| @item |
| lib/targetdb.exp |
| |
| @item |
| lib/telnet.exp |
| |
| @item |
| lib/tip.exp |
| |
| @item |
| lib/util-defs.exp |
| |
| @item |
| lib/utils.exp |
| |
| @item |
| lib/xsh.exp |
| |
| @item |
| lib/dejagnu.exp |
| @end itemize |
| |
| @node Unit Testing API, , Reference, Top |
| @chapter Unit Testing API |
| |
| @menu |
| * C Unit Testing API:: |
| * C++ Unit Testing API:: |
| @end menu |
| |
| @node C Unit Testing API, C++ Unit Testing API, , Unit Testing API |
| @section C Unit Testing API |
| |
| All of the functions that take a |
| @code{msg} parameter use a C char * that is |
| the message to be dislayed. There currently is no support for |
| variable length arguments. |
| |
| @menu |
| * Pass Function: pass function. |
| * Fail Function: fail function. |
| * Untested Function: untested function. |
| * Unresolved Function: unresolved function. |
| * Totals Function: totals function. |
| @end menu |
| |
| @node pass function, fail function, , C Unit Testing API |
| @subsection Pass Function |
| |
| This prints a message for a successful test |
| completion. |
| |
| @quotation |
| |
| @t{@b{pass}(@i{msg});} |
| @end quotation |
| |
| @node fail function, untested function, pass function, C Unit Testing API |
| @subsection Fail Function |
| |
| This prints a message for an unsuccessful test |
| completion. |
| |
| @quotation |
| |
| @t{@b{fail}(@i{msg});} |
| @end quotation |
| |
| @node untested function, unresolved function, fail function, C Unit Testing API |
| @subsection Untested Function |
| |
| This prints a message for an test case that isn't run |
| for some technical reason. |
| |
| @quotation |
| |
| @t{@b{untested}(@i{msg});} |
| @end quotation |
| |
| @node unresolved function, totals function, untested function, C Unit Testing API |
| @subsection Unresolved Function |
| |
| This prints a message for an test case that is run, |
| but there is no clear result. These output states require a |
| human to look over the results to determine what happened. |
| |
| @quotation |
| |
| @t{@b{unresolved}(@i{msg});} |
| @end quotation |
| |
| @node totals function, , unresolved function, C Unit Testing API |
| @subsection Totals Function |
| |
| This prints out the total numbers of all the test |
| state outputs. |
| |
| @quotation |
| |
| @t{@b{totals}(@i{});} |
| @end quotation |
| |
| @node C++ Unit Testing API, , C Unit Testing API, Unit Testing API |
| @section C++ Unit Testing API |
| |
| All of the methods that take a |
| @code{msg} parameter use a C char * |
| or STL string, that is the message to be |
| dislayed. There currently is no support for variable |
| length arguments. |
| |
| @menu |
| * Pass Method: pass method. |
| * Fail Method: fail method. |
| * Untested Method: untested method. |
| * Unresolved Method: unresolved method. |
| * Totals Method: totals method. |
| @end menu |
| |
| @node pass method, fail method, , C++ Unit Testing API |
| @subsection Pass Method |
| |
| This prints a message for a successful test |
| completion. |
| |
| @quotation |
| |
| @t{@b{TestState::pass}(@i{msg});} |
| @end quotation |
| |
| @node fail method, untested method, pass method, C++ Unit Testing API |
| @subsection Fail Method |
| |
| This prints a message for an unsuccessful test |
| completion. |
| |
| @quotation |
| |
| @t{@b{TestState::fail}(@i{msg});} |
| @end quotation |
| |
| @node untested method, unresolved method, fail method, C++ Unit Testing API |
| @subsection Untested Method |
| |
| This prints a message for an test case that isn't run |
| for some technical reason. |
| |
| @quotation |
| |
| @t{@b{TestState::untested}(@i{msg});} |
| @end quotation |
| |
| @node unresolved method, totals method, untested method, C++ Unit Testing API |
| @subsection Unresolved Method |
| |
| This prints a message for an test case that is run, |
| but there is no clear result. These output states require a |
| human to look over the results to determine what happened. |
| |
| @quotation |
| |
| @t{@b{TestState::unresolved}(@i{msg});} |
| @end quotation |
| |
| @node totals method, , unresolved method, C++ Unit Testing API |
| @subsection Totals Method |
| |
| This prints out the total numbers of all the test |
| state outputs. |
| |
| @quotation |
| |
| @t{@b{TestState::totals}(@i{});} |
| @end quotation |
| |
| @bye |