<sect1 id="manual.intro.setup.test" xreflabel="Testing"><?dbhtml filename="test.html"?><sect1info><keywordset><keyword>ISO C++</keyword><keyword>test</keyword><keyword>testsuite</keyword></keywordset></sect1info><title>Test</title><sect2 id="test.organization" xreflabel="test.organization"><title>Organization</title><para>The directory <emphasis>libsrcdir/testsuite</emphasis> contains theindividual test cases organized in sub-directories corresponding tochapters of the C++ standard (detailed below), the dejagnu testharness support files, and sources to various testsuite utilitiesthat are packaged in a separate testing library.</para><para>All test cases for functionality required by the runtime componentsof the C++ standard (ISO 14882) are files within the followingdirectories.</para><programlisting>17_intro18_support19_diagnostics20_util21_strings22_locale23_containers25_algorithms26_numerics27_io</programlisting><para>In addition, the following directories include test files:</para><programlisting>tr1 Tests for components as described by the Technical Report on Standard Library Extensions (TR1).backward Tests for backwards compatibility and deprecated features.demangle Tests for __cxa_demangle, the IA 64 C++ ABI demanglerext Tests for extensions.performance Tests for performance analysis, and performance regressions.thread Tests for threads.</programlisting><para>Some directories don't have test files, but instead containauxiliary information (<ulink url="#internals">more information</ulink>):</para><programlisting>config Files for the dejagnu test harness.lib Files for the dejagnu test harness.libstdc++* Files for the dejagnu test harness.data Sample text files for testing input and output.util Files for libtestc++, utilities and testing routines.</programlisting><para>Within a directory that includes test files, there may beadditional subdirectories, or files. Originally, test caseswere appended to one file that represented a particular sectionof the chapter under test, and was named accordingly. Forinstance, to test items related to <code> 21.3.6.1 -basic_string::find [lib.string::find]</code> in the standard,the following was used:</para><programlisting>21_strings/find.cc</programlisting><para>However, that practice soon became a liability as the test casesbecame huge and unwieldy, and testing new or extendedfunctionality (like wide characters or named locales) becamefrustrating, leading to aggressive pruning of test cases on someplatforms that covered up implementation errors. Now, the testsuite has a policy of one file, one test case, which solves theabove issues and gives finer grained results and more manageableerror debugging. As an example, the test case quoted abovebecomes:</para><programlisting>21_strings/basic_string/find/char/1.cc21_strings/basic_string/find/char/2.cc21_strings/basic_string/find/char/3.cc21_strings/basic_string/find/wchar_t/1.cc21_strings/basic_string/find/wchar_t/2.cc21_strings/basic_string/find/wchar_t/3.cc</programlisting><para>All new tests should be written with the policy of one testcase, one file in mind.</para></sect2><sect2 id="test.naming" xreflabel="test.naming"><title>Naming Conventions</title><para></para><para>In addition, there are some special names and suffixes that areused within the testsuite to designate particular kinds oftests.</para><itemizedlist><listitem><para><emphasis>_xin.cc</emphasis></para><para>This test case expects some kind of interactive input in orderto finish or pass. At the moment, the interactive tests are notrun by default. Instead, they are run by hand, like:</para><programlisting>g++ 27_io/objects/char/3_xin.cccat 27_io/objects/char/3_xin.in | a.out</programlisting></listitem><listitem><para><emphasis>.in</emphasis></para><para>This file contains the expected input for the corresponding <emphasis>_xin.cc</emphasis> test case.</para></listitem><listitem><para><emphasis>_neg.cc</emphasis></para><para>This test case is expected to fail: it's a negative test. At themoment, these are almost always compile time errors.</para></listitem><listitem><para><emphasis>char</emphasis></para><para>This can either be a directory name or part of a longer filename, and indicates that this file, or the files within thisdirectory are testing the <code>char</code> instantiation of atemplate.</para></listitem><listitem><para><emphasis>wchar_t</emphasis></para><para>This can either be a directory name or part of a longer filename, and indicates that this file, or the files within thisdirectory are testing the <code>wchar_t</code> instantiation ofa template. Some hosts do not support <code>wchar_t</code>functionality, so for these targets, all of these tests will notbe run.</para></listitem><listitem><para><emphasis>thread</emphasis></para><para>This can either be a directory name or part of a longer filename, and indicates that this file, or the files within thisdirectory are testing situations where multiple threads arebeing used.</para></listitem><listitem><para><emphasis>performance</emphasis></para><para>This can either be an enclosing directory name or part of aspecific file name. This indicates a test that is used toanalyze runtime performance, for performance regression testing,or for other optimization related analysis. At the moment, thesetest cases are not run by default.</para></listitem></itemizedlist></sect2><sect2 id="test.utils" xreflabel="test.utils"><title>Utilities</title><para></para><para>The testsuite directory also contains some files that implementfunctionality that is intended to make writing test cases easier,or to avoid duplication, or to provide error checking in a way thatis consistent across platforms and test harnesses. A stand-aloneexecutable, called <emphasis>abi_check</emphasis>, and a staticlibrary called <emphasis>libtestc++</emphasis> areconstructed. Both of these items are not installed, and only usedduring testing.</para><para>These files include the following functionality:</para><itemizedlist><listitem><para><emphasis>testsuite_abi.h</emphasis>,<emphasis>testsuite_abi.cc</emphasis>,<emphasis>testsuite_abi_check.cc</emphasis></para><para>Creates the executable <emphasis>abi_check</emphasis>.Used to check correctness of symbol versioning, visibility ofexported symbols, and compatibility on symbols in the sharedlibrary, for hosts that support this feature. More informationcan be found in the ABI documentation <ulink url="abi.html">here</ulink></para></listitem><listitem><para><emphasis>testsuite_allocator.h</emphasis>,<emphasis>testsuite_allocator.cc</emphasis></para><para>Contains specialized allocators that keep track of constructionand destruction. Also, support for overriding global new anddelete operators, including verification that new and deleteare called during execution, and that allocation over max_sizefails.</para></listitem><listitem><para><emphasis>testsuite_character.h</emphasis></para><para>Contains <code>std::char_traits</code> and<code>std::codecvt</code> specializations for a user-definedPOD.</para></listitem><listitem><para><emphasis>testsuite_hooks.h</emphasis>,<emphasis>testsuite_hooks.cc</emphasis></para><para>A large number of utilities, including:</para><itemizedlist><listitem><para>VERIFY</para></listitem><listitem><para>set_memory_limits</para></listitem><listitem><para>verify_demangle</para></listitem><listitem><para>run_tests_wrapped_locale</para></listitem><listitem><para>run_tests_wrapped_env</para></listitem><listitem><para>try_named_locale</para></listitem><listitem><para>try_mkfifo</para></listitem><listitem><para>func_callback</para></listitem><listitem><para>counter</para></listitem><listitem><para>copy_tracker</para></listitem><listitem><para>copy_constructor</para></listitem><listitem><para>assignment_operator</para></listitem><listitem><para>destructor</para></listitem><listitem><para>pod_char, pod_int and associated char_traits specializations</para></listitem></itemizedlist></listitem><listitem><para><emphasis>testsuite_io.h</emphasis></para><para>Error, exception, and constraint checking for<code>std::streambuf, std::basic_stringbuf, std::basic_filebuf</code>.</para></listitem><listitem><para><emphasis>testsuite_iterators.h</emphasis></para><para>Wrappers for various iterators.</para></listitem><listitem><para><emphasis>testsuite_performance.h</emphasis></para><para>A number of class abstractions for performance counters, andreporting functions including:</para><itemizedlist><listitem><para>time_counter</para></listitem><listitem><para>resource_counter</para></listitem><listitem><para>report_performance</para></listitem></itemizedlist></listitem></itemizedlist></sect2><sect2 id="test.run" xreflabel="test.run"><title>Running the Testsuite</title><sect3 id="test.run.basic" xreflabel="test.run.basic"><title>Basic Results</title><para>There are several options for running tests, including testingthe regression tests, testing a subset of the regression tests,testing the performance tests, testing just compilation, testinginstalled tools, etc. In addition, there is a special rule forchecking the exported symbols of the shared library.</para><para>You can check the status of the build without installing itusing the dejagnu harness, much like the rest of the gcctools.</para><programlisting> make check</programlisting><para>in the <emphasis>libbuilddir</emphasis> directory.</para><para>or</para><programlisting> make check-target-libstdc++-v3</programlisting><para>in the <emphasis>gccbuilddir</emphasis> directory.</para><para>These commands are functionally equivalent and will create a'testsuite' directory underneath<emphasis>libbuilddir</emphasis> containing the results of thetests. Two results files will be generated: <emphasis>libstdc++.sum</emphasis>, which is a PASS/FAIL summary for eachtest, and <emphasis>libstdc++.log</emphasis> which is a log ofthe exact command line passed to the compiler, the compileroutput, and the executable output (if any).</para><para>Archives of test results for various versions and platforms areavailable on the GCC website in the <ulinkurl="http://gcc.gnu.org/gcc-4.1/buildstat.html">buildstatus</ulink> section of each individual release, and are alsoarchived on a daily basis on the <ulinkurl="http://gcc.gnu.org/ml/gcc-testresults/current">gcc-testresults</ulink>mailing list. Please check either of these places for a similarcombination of source version, operating system, and host CPU.</para></sect3><sect3 id="test.run.options" xreflabel="test.run.options"><title>Options</title><para>To debug the dejagnu test harness during runs, try invoking with aspecific argument to the variable RUNTESTFLAGS, as below.</para><programlisting>make check-target-libstdc++-v3 RUNTESTFLAGS="-v"</programlisting><para>or</para><programlisting>make check-target-libstdc++-v3 RUNTESTFLAGS="-v -v"</programlisting><para>To run a subset of the library tests, you will need to generatethe <emphasis>testsuite_files</emphasis> file by running<command>make testsuite_files</command> in the<emphasis>libbuilddir/testsuite</emphasis> directory, describedbelow. Edit the file to remove the tests you don't want andthen run the testsuite as normal.</para><para>There are two ways to run on a simulator: set up DEJAGNU to point to aspecially crafted site.exp, or pass down --target_board flags.</para><para>Example flags to pass down for various embedded builds are as follows:</para><programlisting>--target=powerpc-eabism (libgloss/sim)make check-target-libstdc++-v3 RUNTESTFLAGS="--target_board=powerpc-sim"--target=calmrisc32 (libgloss/sid)make check-target-libstdc++-v3 RUNTESTFLAGS="--target_board=calmrisc32-sid"--target=xscale-elf (newlib/sim)make check-target-libstdc++-v3 RUNTESTFLAGS="--target_board=arm-sim"</programlisting><para>Also, here is an example of how to run the libstdc++ testsuitefor a multilibed build directory with different ABI settings:</para><programlisting>make check-target-libstdc++-v3 RUNTESTFLAGS='--target_board \"unix{-mabi=32,,-mabi=64}\"'</programlisting><para>You can run the tests with a compiler and library that havealready been installed. Make sure that the compiler (e.g.,<code>g++</code>) is in your <code>PATH</code>. If you areusing shared libraries, then you must also ensure that thedirectory containing the shared version of libstdc++ is in your<code>LD_LIBRARY_PATH</code>, or equivalent. If your GCC sourcetree is at <code>/path/to/gcc</code>, then you can run the testsas follows:</para><programlisting>runtest --tool libstdc++ --srcdir=/path/to/gcc/libstdc++-v3/testsuite</programlisting><para>The testsuite will create a number of files in the directory inwhich you run this command,. Some of those files might use thesame name as files created by other testsuites (like the onesfor GCC and G++), so you should not try to run all thetestsuites in parallel from the same directory.</para><para>In addition, there are some testing options that are mostly ofinterest to library maintainers and system integrators. As such,these tests may not work on all cpu and host combinations, andmay need to be executed in the<emphasis>libbuilddir/testsuite</emphasis> directory. Theseoptions include, but are not necessarily limited to, thefollowing:</para><programlisting>make testsuite_files</programlisting><para>Five files are generated that determine what test filesare run. These files are:</para><itemizedlist><listitem><para><emphasis>testsuite_files</emphasis></para><para>This is a list of all the test cases that will be run. Eachtest case is on a separate line, given with an absolute pathfrom the <emphasis>libsrcdir/testsuite</emphasis> directory.</para></listitem><listitem><para><emphasis>testsuite_files_interactive</emphasis></para><para>This is a list of all the interactive test cases, using thesame format as the file list above. These tests are not runby default.</para></listitem><listitem><para><emphasis>testsuite_files_performance</emphasis></para><para>This is a list of all the performance test cases, using thesame format as the file list above. These tests are not runby default.</para></listitem><listitem><para><emphasis>testsuite_thread</emphasis></para><para>This file indicates that the host system can run tests whichinvolved multiple threads.</para></listitem><listitem><para><emphasis>testsuite_wchar_t</emphasis></para><para>This file indicates that the host system can run the wchar_ttests, and corresponds to the macro definition <code>_GLIBCXX_USE_WCHAR_T</code> in the file c++config.h.</para></listitem></itemizedlist><programlisting>make check-abi</programlisting><para>The library ABI can be tested. This involves testing the sharedlibrary against an ABI-defining previous version of symbolexports.</para><programlisting>make check-compile</programlisting><para>This rule compiles, but does not link or execute, the<emphasis>testsuite_files</emphasis> test cases and displays theoutput on stdout.</para><programlisting>make check-performance</programlisting><para>This rule runs through the<emphasis>testsuite_files_performance</emphasis> test cases andcollects information for performance analysis and can be used tospot performance regressions. Various timing information iscollected, as well as number of hard page faults, and memoryused. This is not run by default, and the implementation is influx.</para><para>We are interested in any strange failures of the testsuite;please email the main libstdc++ mailing list if you seesomething odd or have questions.</para></sect3><sect3 id="test.run.permutations" xreflabel="test.run.permutations"><title>Test Permutations</title><para>To run the libstdc++ test suite under the <linklinkend="manual.ext.debug_mode">debug mode</link>, edit<filename>libstdc++-v3/scripts/testsuite_flags</filename> to add thecompile-time flag <constant>-D_GLIBCXX_DEBUG</constant> to theresult printed by the <literal>--build-cxx</literal>option. Additionally, add the<constant>-D_GLIBCXX_DEBUG_PEDANTIC</constant> flag to turn onpedantic checking. The libstdc++ test suite should produceprecisely the same results under debug mode that it does underrelease mode: any deviation indicates an error in either thelibrary or the test suite.</para><para>Or, just run the testsuites with <constant>CXXFLAGS</constant>set to <constant>-D_GLIBCXX_DEBUG</constant>.</para></sect3></sect2><sect2 id="test.new_tests" xreflabel="test.new_tests"><title>New Test Cases</title><para>The first step in making a new test case is to choose the correctdirectory and file name, given the organization as previouslydescribed.</para><para>All files are copyright the FSF, and GPL'd: this is veryimportant. The first copyright year should correspond to the datethe file was checked in to SVN.</para><para>As per the dejagnu instructions, always return 0 from main toindicate success.</para><para>A bunch of utility functions and classes have already beenabstracted out into the testsuite utility library, <code>libtestc++</code>. To use this functionality, just include theappropriate header file: the library or specific object files willautomatically be linked in as part of the testsuite run.</para><para>For a test that needs to take advantage of the dejagnu testharness, what follows below is a list of special keyword thatharness uses. Basically, a test case contains dg-keywords (seedg.exp) indicating what to do and what kinds of behavior are to beexpected. New test cases should be written with the new styleDejaGnu framework in mind.</para><para>To ease transition, here is the list of dg-keyword documentationlifted from dg.exp.</para><programlisting># The currently supported options are:## dg-prms-id N# set prms_id to N## dg-options "options ..." [{ target selector }]# specify special options to pass to the tool (eg: compiler)## dg-do do-what-keyword [{ target/xfail selector }]# `do-what-keyword' is tool specific and is passed unchanged to# ${tool}-dg-test. An example is gcc where `keyword' can be any of:# preprocess|compile|assemble|link|run# and will do one of: produce a .i, produce a .s, produce a .o,# produce an a.out, or produce an a.out and run it (the default is# compile).## dg-error regexp comment [{ target/xfail selector } [{.|0|linenum}]]# indicate an error message <regexp> is expected on this line# (the test fails if it doesn't occur)# Linenum=0 for general tool messages (eg: -V arg missing).# "." means the current line.## dg-warning regexp comment [{ target/xfail selector } [{.|0|linenum}]]# indicate a warning message <regexp> is expected on this line# (the test fails if it doesn't occur)## dg-bogus regexp comment [{ target/xfail selector } [{.|0|linenum}]]# indicate a bogus error message <regexp> use to occur here# (the test fails if it does occur)## dg-build regexp comment [{ target/xfail selector }]# indicate the build use to fail for some reason# (errors covered here include bad assembler generated, tool crashes,# and link failures)# (the test fails if it does occur)## dg-excess-errors comment [{ target/xfail selector }]# indicate excess errors are expected (any line)# (this should only be used sparingly and temporarily)## dg-output regexp [{ target selector }]# indicate the expected output of the program is <regexp># (there may be multiple occurrences of this, they are concatenated)## dg-final { tcl code }# add some tcl code to be run at the end# (there may be multiple occurrences of this, they are concatenated)# (unbalanced braces must be \-escaped)## "{ target selector }" is a list of expressions that determine whether the# test succeeds or fails for a particular target, or in some cases whether the# option applies for a particular target. If the case of `dg-do' it specifies# whether the test case is even attempted on the specified target.## The target selector is always optional. The format is one of:## { xfail *-*-* ... } - the test is expected to fail for the given targets# { target *-*-* ... } - the option only applies to the given targets## At least one target must be specified, use *-*-* for "all targets".# At present it is not possible to specify both `xfail' and `target'.# "native" may be used in place of "*-*-*".Example 1: Testing compilation only// { dg-do compile }Example 2: Testing for expected warnings on line 36, which all targets fail// { dg-warning "string literals" "" { xfail *-*-* } 36Example 3: Testing for expected warnings on line 36// { dg-warning "string literals" "" { target *-*-* } 36Example 4: Testing for compilation errors on line 41// { dg-do compile }// { dg-error "no match for" "" { target *-*-* } 41 }Example 5: Testing with special command line settings, or without theuse of pre-compiled headers, in particular the stdc++.h.gch file. Anyoptions here will override the DEFAULT_CXXFLAGS and PCH_CXXFLAGS setup in the normal.exp file.// { dg-options "-O0" { target *-*-* } }</programlisting><para>More examples can be found in the libstdc++-v3/testsuite/*/*.cc files.</para></sect2><sect2 id="test.dejagnu" xreflabel="test.dejagnu"><title>Test Harness Details</title><para>Underlying details of testing are abstracted via the GNU Dejagnu package.</para><para>This is information for those looking at making changes to the testsuitestructure, and/or needing to trace dejagnu's actions with --verbose. Thiswill not be useful to people who are "merely" adding new tests to the existingstructure.</para><para>The first key point when working with dejagnu is the idea of a "tool".Files, directories, and functions are all implicitly used when they arenamed after the tool in use. Here, the tool will always be "libstdc++".</para><para>The <code>lib</code> subdir contains support routines. The<code>lib/libstdc++.exp</code> file ("support library") is loadedautomagically, and must explicitly load the others. For example, files canbe copied from the core compiler's support directory into <code>lib</code>.</para><para>Some routines in <code>lib/libstdc++.exp</code> are callbacks, some areour own. Callbacks must be prefixed with the name of the tool. To easilydistinguish the others, by convention our own routines are named "v3-*".</para><para>The next key point when working with dejagnu is "test files". Anydirectory whose name starts with the tool name will be searched for test files.(We have only one.) In those directories, any <code>.exp</code> file isconsidered a test file, and will be run in turn. Our main test file is called<code>normal.exp</code>; it runs all the tests in testsuite_files using thecallbacks loaded from the support library.</para><para>The <code>config</code> directory is searched for any particular "targetboard" information unique to this library. This is currently unused and setsonly default variables.</para></sect2><sect2 id="test.future" xreflabel="test.future"><title>Future</title><para></para><para>Shared runs need to be implemented, for targets that support shared libraries.</para><para>Diffing of expected output to standard streams needs to be finished off.</para><para>The V3 testing framework supports, or will eventually support,additional keywords for the purpose of easing the job of writingtest cases. All V3-keywords are of the form <code>@xxx@</code>.Currently plans for supported keywords include:</para><variablelist><varlistentry><term> <code> @require@ <files> </code> </term><listitem><para>The existence of <files> is essential for the test to completesuccessfully. For example, a test case foo.C using bar.baz asinput file could say</para><programlisting>// @require@ bar.baz</programlisting><para>The special variable % stands for the rootname, e.g. thefile-name without its `.C' extension. Example of use (takenverbatim from 27_io/filebuf.cc)</para><programlisting>// @require@ %-*.tst %-*.txt</programlisting></listitem></varlistentry><varlistentry><term> <code> @diff@ <first-list> <second-list> </code> </term><listitem><para>After the test case compiles and ran successfully, diff<first-list> against <second-list>, these lists shouldhave the same length. The test fails if diff returns non-zero apair of files.</para></listitem></varlistentry></variablelist></sect2></sect1>