%==========================================================================
\chapter{Testing Procedures}
\label{Testing Procedures}

The HYPRE testing structure is designed to allow test suites to be easily added,
modified and removed.  Tests are designed for each interface and the options it
allows, i.e. different solvers and preconditioners.  Scripts to run the test codes 
are written so that they can be run stand-alone for individual testing or by a 
controller script for regression testing.

A controller script is run nightly on local and remote platforms to test the 
library with all changes made during the day.  The script checks out the latest 
version of the code from the source code repository; configures and builds the
library on the specified platform, runs the driver codes, identifies the success
or failure of the tests and notifies the development team by email. 

%==========================================================================
\section{Test Directory Structure}
\label{Test Directory Structure}

The test directory is contained in the source code repository as the \file{test} 
subdirectory of the top-level directory, \file{linear\_solvers}.  It contains:
\begin{enumerate}
\item \file{Makefile}; rules to build test codes
\item driver codes (\file{.c, .cxx, .C, .f} files)
\item subdirectory \file{AUTOTEST}; contains scripts and files needed for automated tests 
\item TEST\_* subdirectories; contain scripts and files needed to run the driver codes 
\item \file{runtest.sh} test driver utility script
\end{enumerate}

%==========================================================================
\section{Editing Existing Tests}
\label{Editing Existing Tests}

A developer may want to edit existing tests if they have added new capabilities to any
part of the library.  In this case, the developer would edit the appropriate scripts,
input files and test codes to include the new information.  All of the changes are 
manually tested and debugged before being added to the source code repository. Changing
existing tests does NOT require changes to the automated testing scripts.

%==========================================================================
\section{Adding New Tests}
\label{Adding New Tests}

A developer may add new tests in response to reported errors, when a new capability
is added, significant code changes are made, or they determine that existing tests 
are no longer sufficient.  Adding new test cases may require changes to the 
automated testing scripts.

The following steps are done in the \file{linear\_solvers/test} and/or \file{TEST\_*} directories:
\begin{enumerate}
\item Create and test a driver program, e.g. \file{somedriver.c}
\item Create and test a Bourne shell script to run the driver, \file{somedriver.sh}
\item Modify the \file{Makefile} in the test subdirectory as follows:
  \begin{itemize}
  \item Add library information to the \code{LFLAGS} variable
  \item Add target information to the \code{Targets} section
  \item Add rules to the \code{Rules} section
  \end{itemize}
\item Test all changes; debug as needed
\item Commit all files, new and modified, to the source code repository
\end{enumerate}

%==========================================================================
\section{Manual Tests}
\label{Manual Tests}

The developer is responsible for testing their code before it is committed to the
source code repository as well as creating the necessary driver codes and scripts.
Each script is written so that it can be run in stand-alone mode or by another 
script.  These scripts are used regularly by the development team in their individual
testing phases.

%==========================================================================
\section{Automated Tests}
\label{Automated Tests}

The primary script for automated testing is named \file{autotest}.  It is a Bourne 
shell script that controls extracting the source code from the repository, building 
the library, running test suites on local and/or remote platforms, recording results 
and emailing them to the development team. 

It is run nightly by the CRON controller to test the changes made to HYPRE during 
the day.  CRON expects to find the script in \file{/usr/casc/hypre/i686-pc-linux-gnu/AUTOTEST}
directory on the CASC cluster. If \file{autotest} has been modified in the \file{linear\_solvers/test}
directory, it must be manually copied to \file{/usr/casc/hypre/i686-pc-linux-gnu/AUTOTEST} 
before the CRON job is initiated.  See the section below on how to modify CRON jobs.

The \file{/usr/casc/hypre/i686-pc-linux-gnu/AUTOTEST} directory also contains:
\begin{enumerate}
\item a \file{linear\_solvers} directory which is the last extracted from the repository
by \file{autotest}; latest documentation is in the \file{docs} subdirectory
\item a \file{log} directory which is an archive of autotest summary files
\item cron log files for each day of the week, i.e. \file{autotest.cron.Mon.log}
\end{enumerate}

%==========================================================================
\section{Changing the CRON Job}
\label{Changing the CRON Job}

Changes to the CRON job can be necessitated by changes to the \file{autotest} script or the
file that tells CRON when and where to run each test, which is named \file{cronfile} and
found in the \file{linear\_solvers/test/AUTOTEST} directory.

The \file{cronfile} contains the commands for CRON to execute.  It only needs to be modified
if the tests being done on any given night need to be changed, new platforms are added or 
existing platforms are removed.  Currently CRON is initiated on the CASC cluster.

To terminate and restart the CRON job:
\begin{enumerate}
\item crontab -r          (stops current run)
\item verify all editing is completed and files in appropriate locations
\item crontab <filename>  (name of file containing cron commands, i.e. \file{cronfile})
\end{enumerate}

To list current CRON jobs:
\begin{itemize}
\item crontab -l 
\end{itemize}

%==========================================================================
\section{The runtest.sh Script}
\label{The runtest.sh Script}

This script is the test driver utility script.  It is assumed that there are 
test directories \file{test/TEST\_{solver}}, where {solver} is the solver/interface
test name, i. e. ij, struct, sstruct, etc.  These directories contain:
\begin{itemize}
\item Individual test scripts named {test\_name}.jobs that provide the mpirun
execution syntax; {test\_name} is user defined to describe the test, i. e. solver, 
default, matrix, etc.
\item Test run output files named {test\_name}.out.{number}
\item Individual scripts to compare, usually using diff, output files from
corresponding {test\_name}.jobs scripts
\end{itemize}

Usage:
./runtest.sh [-d|-debug] [-n|-norun] [-h|-help] [-t|-trace] TEST\_solver/test\_name.sh

\begin{verbatim}
where:
    solver      name of test
    test_name   user-defined name of test script
   -debug       turn on debug messages
   -help        print help message
   -norun       do not execute codes; echo each command
   -trace       turn on debug and echo each command
\end{verbatim}

Example usage to run all tests in the TEST\_sstruct directory with debug option turned on:
\begin{verbatim}
./runtest.sh -d TEST_sstruct/*.sh
\end{verbatim}

%==========================================================================
\section{The autotest Script}
\label{The autotest Script}

This script is the high-level wrapper for automated testing.  It determines, based 
on its input options, which platforms and options are to be tested.  It controls
extracting the source code from the repository, copying, building and running the
code on either local or remote platforms.

Usage:
\begin{verbatim}
./autotest [-nocvs|-rev REV] [-d|-debug] [-h|-help] host [host ... host]

where:
   -debug       turn on debug messages
   -help        print help message
   -nocvs       do not checkout latest source code; use existing \file{linear\_solvers} directory
   -rev REV     check out version REV from the source code repository
   host         current valid host options are:
                   -gps        Compaq system
                   -gpsmp      Compaq system executing OpenMP
                   -ilx        Intel Linux
                   -insure     CASC Linux executing insure++
                   -mcr        Intel Linux, CHAOS
                   -pengra     Intel Linux, CHAOS
                   -tux149     CASC RedHat Enterprise Linux
                   -tuxgcc     CASC RedHat Enterprise Linux - latest GCC compilers
                   -tuxpgi     CASC RedHat Enterprise Linux - latest PGI compilers
                   -tuxabsoft  CASC RedHat Enterprise Linux - Absoft-Pro8 Fortran90
                   -tuxlahey   CASC RedHat Enterprise Linux - Lahey Fortran
                   -tuxintel   CASC RedHat Enterprise Linux - latest Intel compilers
                   -tuxkai     CASC RedHat Enterprise Linux - latest KAI KCC compilers
\end{verbatim}

Example usage to run version 1.9.0b in debug mode on local CASC and remote MCR:
\begin{verbatim}
./autotest -rev V1-9-0b -debug -tux149 -mcr
\end{verbatim}
