Blame assert/test-assert-perr.c
|
Packit |
6c4009 |
/* Test assert_perror().
|
|
Packit |
6c4009 |
*
|
|
Packit |
6c4009 |
* This is hairier than you'd think, involving games with
|
|
Packit |
6c4009 |
* stdio and signals.
|
|
Packit |
6c4009 |
*
|
|
Packit |
6c4009 |
*/
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
#include <signal.h>
|
|
Packit |
6c4009 |
#include <stdlib.h>
|
|
Packit |
6c4009 |
#include <stdio.h>
|
|
Packit |
6c4009 |
#include <string.h>
|
|
Packit |
6c4009 |
#include <setjmp.h>
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
jmp_buf rec;
|
|
Packit |
6c4009 |
char buf[160];
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
static void
|
|
Packit |
6c4009 |
sigabrt (int unused)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
longjmp (rec, 1); /* recover control */
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
#undef NDEBUG
|
|
Packit |
6c4009 |
#include <assert.h>
|
|
Packit |
6c4009 |
static void
|
|
Packit |
6c4009 |
assert1 (void)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
assert_perror (1);
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
static void
|
|
Packit |
6c4009 |
assert2 (void)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
assert_perror (0);
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
#define NDEBUG
|
|
Packit |
6c4009 |
#include <assert.h>
|
|
Packit |
6c4009 |
static void
|
|
Packit |
6c4009 |
assert3 (void)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
assert_perror (2);
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
int
|
|
Packit |
6c4009 |
main(void)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
volatile int failed = 1; /* safety in presence of longjmp() */
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
fclose (stderr);
|
|
Packit |
6c4009 |
stderr = tmpfile ();
|
|
Packit |
6c4009 |
if (!stderr)
|
|
Packit |
6c4009 |
abort ();
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
signal (SIGABRT, sigabrt);
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
if (!setjmp (rec))
|
|
Packit |
6c4009 |
assert1 ();
|
|
Packit |
6c4009 |
else
|
|
Packit |
6c4009 |
failed = 0; /* should happen */
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
if (!setjmp (rec))
|
|
Packit |
6c4009 |
assert2 ();
|
|
Packit |
6c4009 |
else
|
|
Packit |
6c4009 |
failed = 1; /* should not happen */
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
if (!setjmp (rec))
|
|
Packit |
6c4009 |
assert3 ();
|
|
Packit |
6c4009 |
else
|
|
Packit |
6c4009 |
failed = 1; /* should not happen */
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
rewind (stderr);
|
|
Packit |
6c4009 |
fgets (buf, 160, stderr);
|
|
Packit |
6c4009 |
if (!strstr(buf, strerror (1)))
|
|
Packit |
6c4009 |
failed = 1;
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
fgets (buf, 160, stderr);
|
|
Packit |
6c4009 |
if (strstr (buf, strerror (0)))
|
|
Packit |
6c4009 |
failed = 1;
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
fgets (buf, 160, stderr);
|
|
Packit |
6c4009 |
if (strstr (buf, strerror (2)))
|
|
Packit |
6c4009 |
failed = 1;
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
return failed;
|
|
Packit |
6c4009 |
}
|