145 lines
4.4 KiB
C
145 lines
4.4 KiB
C
|
#include "test_common.h"
|
||
|
|
||
|
char program_options[500];
|
||
|
char test_infile[100];
|
||
|
char test_output_subdir[100];
|
||
|
char test_log_outfile[100];
|
||
|
|
||
|
/*
|
||
|
* Sets up to run a test.
|
||
|
* Initialize various filenames, using the name of the test as a base,
|
||
|
* and then initialize and run a command to remove old output from this test
|
||
|
* and to make sure that the test output directory exists.
|
||
|
*/
|
||
|
int setup_test(char *name)
|
||
|
{
|
||
|
char cmd[1000];
|
||
|
sprintf(test_infile, "%s/%s", TEST_REF_DIR, name);
|
||
|
sprintf(test_log_outfile, "%s/%s", TEST_OUTPUT_DIR, name);
|
||
|
sprintf(test_output_subdir, "%s/%s", TEST_OUTPUT_DIR, name);
|
||
|
sprintf(cmd, "rm -f %s.out %s.err; rm -fr %s; mkdir -p %s",
|
||
|
test_log_outfile, test_log_outfile, test_output_subdir,
|
||
|
test_output_subdir);
|
||
|
fprintf(stderr, "setup(%s)\n", cmd);
|
||
|
return system(cmd);
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Run the program as a "black box" using system().
|
||
|
* A shell command is constructed and run that first performs test setup,
|
||
|
* then runs the program to be tested with input redirected from a test input
|
||
|
* file and standard and error output redirected to separate output files.
|
||
|
*/
|
||
|
int run_using_system(char *name, char *pre_cmd, char *valgrind_cmd, char *limits)
|
||
|
{
|
||
|
char cmd[1000];
|
||
|
setup_test(name);
|
||
|
sprintf(cmd, "%s;%s%s "PROGNAME" %s < %s.in > %s.out 2> %s.err",
|
||
|
limits, pre_cmd,
|
||
|
valgrind_cmd, program_options, test_infile, test_log_outfile,
|
||
|
test_log_outfile);
|
||
|
fprintf(stderr, "run(%s)\n", cmd);
|
||
|
return system(cmd);
|
||
|
}
|
||
|
|
||
|
void assert_normal_exit(int status)
|
||
|
{
|
||
|
cr_assert(!WIFSIGNALED(status),
|
||
|
"The program terminated with an unexpected signal (%d).\n",
|
||
|
WTERMSIG(status));
|
||
|
cr_assert_eq(status, 0,
|
||
|
"The program did not exit normally (status = 0x%x).\n",
|
||
|
status);
|
||
|
}
|
||
|
|
||
|
void assert_expected_status(int expected, int status)
|
||
|
{
|
||
|
cr_assert(!WIFSIGNALED(status),
|
||
|
"The program terminated with an unexpected signal (%d).\n",
|
||
|
WTERMSIG(status));
|
||
|
cr_assert_eq(
|
||
|
WEXITSTATUS(status), expected,
|
||
|
"The program did not exit with the expected status "
|
||
|
"(expected 0x%x, was 0x%x).\n",
|
||
|
expected, WEXITSTATUS(status));
|
||
|
}
|
||
|
|
||
|
void assert_signaled(int sig, int status)
|
||
|
{
|
||
|
cr_assert(WIFSIGNALED(status),
|
||
|
"The program did not terminate with a signal.\n");
|
||
|
cr_assert(WTERMSIG(status) == sig,
|
||
|
"The program did not terminate with the expected signal "
|
||
|
"(expected %d, was %d).\n",
|
||
|
sig, WTERMSIG(status));
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Compare the standard output from the program being tested with reference
|
||
|
* output, after first possibly using "grep" to remove lines that match a filter
|
||
|
* pattern.
|
||
|
*/
|
||
|
void assert_outfile_matches(char *name, char *filter)
|
||
|
{
|
||
|
char cmd[500];
|
||
|
if (filter) {
|
||
|
sprintf(cmd,
|
||
|
"grep -v '%s' %s.out > %s_A.out; grep -v '%s' "
|
||
|
"%s/%s.out > %s_B.out; "
|
||
|
"diff --ignore-tab-expansion --ignore-trailing-space "
|
||
|
"--ignore-space-change --ignore-blank-lines %s_A.out "
|
||
|
"%s_B.out",
|
||
|
filter, test_log_outfile, name, filter, TEST_REF_DIR,
|
||
|
name, name, name, name);
|
||
|
} else {
|
||
|
sprintf(cmd,
|
||
|
"diff --ignore-tab-expansion --ignore-trailing-space "
|
||
|
"--ignore-space-change --ignore-blank-lines %s.out "
|
||
|
"%s/%s.out",
|
||
|
test_log_outfile, TEST_REF_DIR, name);
|
||
|
}
|
||
|
int err = system(cmd);
|
||
|
cr_assert_eq(err, 0,
|
||
|
"The output was not what was expected (diff exited with "
|
||
|
"status %d).\n",
|
||
|
WEXITSTATUS(err));
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Compare the standard error output from the program being tested with
|
||
|
* reference output, after first possibly using "grep" to remove lines that
|
||
|
* match a filter pattern.
|
||
|
*/
|
||
|
void assert_errfile_matches(char *name, char *filter)
|
||
|
{
|
||
|
char cmd[500];
|
||
|
if (filter) {
|
||
|
sprintf(cmd,
|
||
|
"grep -v '%s' %s.err > %s_A.err; grep -v '%s' "
|
||
|
"%s/%s.err > %s_B.err; "
|
||
|
"diff ---ignore-tab-expansion --ignore-trailing-space "
|
||
|
"--ignore-space-change --ignore-blank-lines %s_A.err "
|
||
|
"%s_B.err",
|
||
|
filter, test_log_outfile, name, filter, TEST_REF_DIR,
|
||
|
name, name, name, name);
|
||
|
} else {
|
||
|
sprintf(cmd,
|
||
|
"diff --ignore-tab-expansion --ignore-trailing-space "
|
||
|
"--ignore-space-change --ignore-blank-lines %s.err "
|
||
|
"%s/%s.err",
|
||
|
test_log_outfile, TEST_REF_DIR, name);
|
||
|
}
|
||
|
int err = system(cmd);
|
||
|
cr_assert_eq(err, 0,
|
||
|
"The output was not what was expected (diff exited with "
|
||
|
"status %d).\n",
|
||
|
WEXITSTATUS(err));
|
||
|
}
|
||
|
|
||
|
void assert_no_valgrind_errors(int status)
|
||
|
{
|
||
|
cr_assert_neq(WEXITSTATUS(status), 37,
|
||
|
"Valgrind reported errors -- see %s.err",
|
||
|
test_log_outfile);
|
||
|
}
|