mirror of
https://git.savannah.gnu.org/git/gnulib.git
synced 2025-08-08 17:22:05 +03:00
*printf-posix: Avoid test failures. Make tests work on MacOS X, Cygwin.
* tests/test-fprintf-posix3.c: Include "resource-ext.h". (main): Perform test also when getrlimit and setrlimit don't exist or when setrlimit of RLIMIT_DATA fails (like on Cygwin). Instead of limiting the address space size using setrlimit, compare the address space size before and after the the test. * tests/test-dprintf-posix2.c: Likewise. * tests/test-fprintf-posix3.sh: Update skip messages. * tests/test-dprintf-posix2.sh: Likewise. * modules/fprintf-posix-tests (Depends-on): Add get-rusage-as. * modules/dprintf-posix-tests (Depends-on): Likewise. Reported by Bruce Korb <bkorb@gnu.org> and Gary V. Vaughan <gary@gnu.org>.
This commit is contained in:
16
ChangeLog
16
ChangeLog
@@ -1,3 +1,19 @@
|
|||||||
|
2011-01-18 Bruno Haible <bruno@clisp.org>
|
||||||
|
|
||||||
|
*printf-posix: Avoid test failures. Make tests work on MacOS X, Cygwin.
|
||||||
|
* tests/test-fprintf-posix3.c: Include "resource-ext.h".
|
||||||
|
(main): Perform test also when getrlimit and setrlimit don't exist or
|
||||||
|
when setrlimit of RLIMIT_DATA fails (like on Cygwin). Instead of
|
||||||
|
limiting the address space size using setrlimit, compare the address
|
||||||
|
space size before and after the the test.
|
||||||
|
* tests/test-dprintf-posix2.c: Likewise.
|
||||||
|
* tests/test-fprintf-posix3.sh: Update skip messages.
|
||||||
|
* tests/test-dprintf-posix2.sh: Likewise.
|
||||||
|
* modules/fprintf-posix-tests (Depends-on): Add get-rusage-as.
|
||||||
|
* modules/dprintf-posix-tests (Depends-on): Likewise.
|
||||||
|
Reported by Bruce Korb <bkorb@gnu.org> and
|
||||||
|
Gary V. Vaughan <gary@gnu.org>.
|
||||||
|
|
||||||
2011-01-18 Bruno Haible <bruno@clisp.org>
|
2011-01-18 Bruno Haible <bruno@clisp.org>
|
||||||
|
|
||||||
get-rusage-as: Improvement for Cygwin.
|
get-rusage-as: Improvement for Cygwin.
|
||||||
|
@@ -9,6 +9,7 @@ tests/macros.h
|
|||||||
|
|
||||||
Depends-on:
|
Depends-on:
|
||||||
stdint
|
stdint
|
||||||
|
get-rusage-as
|
||||||
|
|
||||||
configure.ac:
|
configure.ac:
|
||||||
AC_CHECK_FUNCS_ONCE([getrlimit setrlimit])
|
AC_CHECK_FUNCS_ONCE([getrlimit setrlimit])
|
||||||
|
@@ -12,6 +12,7 @@ tests/macros.h
|
|||||||
|
|
||||||
Depends-on:
|
Depends-on:
|
||||||
stdint
|
stdint
|
||||||
|
get-rusage-as
|
||||||
|
|
||||||
configure.ac:
|
configure.ac:
|
||||||
AC_CHECK_FUNCS_ONCE([getrlimit setrlimit])
|
AC_CHECK_FUNCS_ONCE([getrlimit setrlimit])
|
||||||
|
@@ -20,16 +20,19 @@
|
|||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#if HAVE_GETRLIMIT && HAVE_SETRLIMIT
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/time.h>
|
|
||||||
#include <sys/resource.h>
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
|
#if HAVE_GETRLIMIT && HAVE_SETRLIMIT
|
||||||
|
# include <sys/types.h>
|
||||||
|
# include <sys/time.h>
|
||||||
|
# include <sys/resource.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "resource-ext.h"
|
||||||
|
|
||||||
/* Test against a memory leak in the fprintf replacement. */
|
/* Test against a memory leak in the fprintf replacement. */
|
||||||
|
|
||||||
/* Number of iterations across the loop. */
|
/* Number of iterations across the loop. */
|
||||||
@@ -46,32 +49,32 @@
|
|||||||
int
|
int
|
||||||
main (int argc, char *argv[])
|
main (int argc, char *argv[])
|
||||||
{
|
{
|
||||||
struct rlimit limit;
|
uintptr_t initial_rusage_as;
|
||||||
int arg;
|
int arg;
|
||||||
int repeat;
|
int result;
|
||||||
|
|
||||||
/* Limit the amount of malloc()ed memory to MAX_ALLOC_TOTAL or less. */
|
/* Limit the amount of malloc()ed memory to MAX_ALLOC_TOTAL or less. */
|
||||||
|
|
||||||
/* On BSD systems, malloc() is limited by RLIMIT_DATA. */
|
/* On BSD systems, malloc() is limited by RLIMIT_DATA. */
|
||||||
#ifdef RLIMIT_DATA
|
#if HAVE_GETRLIMIT && HAVE_SETRLIMIT && defined RLIMIT_DATA
|
||||||
if (getrlimit (RLIMIT_DATA, &limit) < 0)
|
{
|
||||||
return 77;
|
struct rlimit limit;
|
||||||
if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > MAX_ALLOC_TOTAL)
|
|
||||||
limit.rlim_max = MAX_ALLOC_TOTAL;
|
if (getrlimit (RLIMIT_DATA, &limit) >= 0)
|
||||||
limit.rlim_cur = limit.rlim_max;
|
{
|
||||||
if (setrlimit (RLIMIT_DATA, &limit) < 0)
|
if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > MAX_ALLOC_TOTAL)
|
||||||
return 77;
|
limit.rlim_max = MAX_ALLOC_TOTAL;
|
||||||
|
limit.rlim_cur = limit.rlim_max;
|
||||||
|
(void) setrlimit (RLIMIT_DATA, &limit);
|
||||||
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
/* On Linux systems, malloc() is limited by RLIMIT_AS. */
|
/* On Linux systems, malloc() is limited by RLIMIT_AS.
|
||||||
#ifdef RLIMIT_AS
|
On some systems, setrlimit of RLIMIT_AS doesn't work but get_rusage_as ()
|
||||||
if (getrlimit (RLIMIT_AS, &limit) < 0)
|
does. Allow the address space size to grow by at most MAX_ALLOC_TOTAL. */
|
||||||
|
initial_rusage_as = get_rusage_as ();
|
||||||
|
if (initial_rusage_as == 0)
|
||||||
return 77;
|
return 77;
|
||||||
if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > MAX_ALLOC_TOTAL)
|
|
||||||
limit.rlim_max = MAX_ALLOC_TOTAL;
|
|
||||||
limit.rlim_cur = limit.rlim_max;
|
|
||||||
if (setrlimit (RLIMIT_AS, &limit) < 0)
|
|
||||||
return 77;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
arg = atoi (argv[1]);
|
arg = atoi (argv[1]);
|
||||||
if (arg == 0)
|
if (arg == 0)
|
||||||
@@ -80,30 +83,28 @@ main (int argc, char *argv[])
|
|||||||
if (memory == NULL)
|
if (memory == NULL)
|
||||||
return 1;
|
return 1;
|
||||||
memset (memory, 17, MAX_ALLOC_TOTAL);
|
memset (memory, 17, MAX_ALLOC_TOTAL);
|
||||||
return 78;
|
result = 78;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
/* Perform the test and test whether it triggers a permanent memory
|
|
||||||
allocation of more than MAX_ALLOC_TOTAL bytes. */
|
|
||||||
|
|
||||||
for (repeat = 0; repeat < NUM_ROUNDS; repeat++)
|
|
||||||
{
|
{
|
||||||
/* This may produce a temporary memory allocation of 11000 bytes.
|
/* Perform the test and test whether it triggers a permanent memory
|
||||||
but should not result in a permanent memory allocation. */
|
allocation of more than MAX_ALLOC_TOTAL bytes. */
|
||||||
if (dprintf (STDOUT_FILENO, "%011000d\n", 17) == -1
|
int repeat;
|
||||||
&& errno == ENOMEM)
|
|
||||||
return 1;
|
for (repeat = 0; repeat < NUM_ROUNDS; repeat++)
|
||||||
|
{
|
||||||
|
/* This may produce a temporary memory allocation of 11000 bytes.
|
||||||
|
but should not result in a permanent memory allocation. */
|
||||||
|
if (dprintf (STDOUT_FILENO, "%011000d\n", 17) == -1
|
||||||
|
&& errno == ENOMEM)
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
if (get_rusage_as () > initial_rusage_as + MAX_ALLOC_TOTAL)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
int
|
|
||||||
main (int argc, char *argv[])
|
|
||||||
{
|
|
||||||
return 77;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
@@ -9,14 +9,14 @@
|
|||||||
) 2>/dev/null
|
) 2>/dev/null
|
||||||
malloc_result=$?
|
malloc_result=$?
|
||||||
if test $malloc_result = 77; then
|
if test $malloc_result = 77; then
|
||||||
echo "Skipping test: getrlimit and setrlimit don't work"
|
echo "Skipping test: no way to determine address space size"
|
||||||
exit 77
|
exit 77
|
||||||
fi
|
fi
|
||||||
|
|
||||||
./test-dprintf-posix2${EXEEXT} 1 > /dev/null
|
./test-dprintf-posix2${EXEEXT} 1 > /dev/null
|
||||||
result=$?
|
result=$?
|
||||||
if test $result = 77; then
|
if test $result = 77; then
|
||||||
echo "Skipping test: getrlimit and setrlimit don't work"
|
echo "Skipping test: no way to determine address space size"
|
||||||
exit 77
|
exit 77
|
||||||
fi
|
fi
|
||||||
if test $result != 0; then
|
if test $result != 0; then
|
||||||
@@ -24,7 +24,7 @@ if test $result != 0; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if test $malloc_result = 78; then
|
if test $malloc_result = 78; then
|
||||||
echo "Skipping test: getrlimit and setrlimit don't work"
|
echo "Skipping test: get_rusage_as() doesn't work"
|
||||||
exit 77
|
exit 77
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@@ -20,15 +20,18 @@
|
|||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#if HAVE_GETRLIMIT && HAVE_SETRLIMIT
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/time.h>
|
|
||||||
#include <sys/resource.h>
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
|
#if HAVE_GETRLIMIT && HAVE_SETRLIMIT
|
||||||
|
# include <sys/types.h>
|
||||||
|
# include <sys/time.h>
|
||||||
|
# include <sys/resource.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "resource-ext.h"
|
||||||
|
|
||||||
/* Test against a memory leak in the fprintf replacement. */
|
/* Test against a memory leak in the fprintf replacement. */
|
||||||
|
|
||||||
/* Number of iterations across the loop. */
|
/* Number of iterations across the loop. */
|
||||||
@@ -45,32 +48,32 @@
|
|||||||
int
|
int
|
||||||
main (int argc, char *argv[])
|
main (int argc, char *argv[])
|
||||||
{
|
{
|
||||||
struct rlimit limit;
|
uintptr_t initial_rusage_as;
|
||||||
int arg;
|
int arg;
|
||||||
int repeat;
|
int result;
|
||||||
|
|
||||||
/* Limit the amount of malloc()ed memory to MAX_ALLOC_TOTAL or less. */
|
/* Limit the amount of malloc()ed memory to MAX_ALLOC_TOTAL or less. */
|
||||||
|
|
||||||
/* On BSD systems, malloc() is limited by RLIMIT_DATA. */
|
/* On BSD systems, malloc() is limited by RLIMIT_DATA. */
|
||||||
#ifdef RLIMIT_DATA
|
#if HAVE_GETRLIMIT && HAVE_SETRLIMIT && defined RLIMIT_DATA
|
||||||
if (getrlimit (RLIMIT_DATA, &limit) < 0)
|
{
|
||||||
return 77;
|
struct rlimit limit;
|
||||||
if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > MAX_ALLOC_TOTAL)
|
|
||||||
limit.rlim_max = MAX_ALLOC_TOTAL;
|
if (getrlimit (RLIMIT_DATA, &limit) >= 0)
|
||||||
limit.rlim_cur = limit.rlim_max;
|
{
|
||||||
if (setrlimit (RLIMIT_DATA, &limit) < 0)
|
if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > MAX_ALLOC_TOTAL)
|
||||||
return 77;
|
limit.rlim_max = MAX_ALLOC_TOTAL;
|
||||||
|
limit.rlim_cur = limit.rlim_max;
|
||||||
|
(void) setrlimit (RLIMIT_DATA, &limit);
|
||||||
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
/* On Linux systems, malloc() is limited by RLIMIT_AS. */
|
/* On Linux systems, malloc() is limited by RLIMIT_AS.
|
||||||
#ifdef RLIMIT_AS
|
On some systems, setrlimit of RLIMIT_AS doesn't work but get_rusage_as ()
|
||||||
if (getrlimit (RLIMIT_AS, &limit) < 0)
|
does. Allow the address space size to grow by at most MAX_ALLOC_TOTAL. */
|
||||||
|
initial_rusage_as = get_rusage_as ();
|
||||||
|
if (initial_rusage_as == 0)
|
||||||
return 77;
|
return 77;
|
||||||
if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > MAX_ALLOC_TOTAL)
|
|
||||||
limit.rlim_max = MAX_ALLOC_TOTAL;
|
|
||||||
limit.rlim_cur = limit.rlim_max;
|
|
||||||
if (setrlimit (RLIMIT_AS, &limit) < 0)
|
|
||||||
return 77;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
arg = atoi (argv[1]);
|
arg = atoi (argv[1]);
|
||||||
if (arg == 0)
|
if (arg == 0)
|
||||||
@@ -79,30 +82,28 @@ main (int argc, char *argv[])
|
|||||||
if (memory == NULL)
|
if (memory == NULL)
|
||||||
return 1;
|
return 1;
|
||||||
memset (memory, 17, MAX_ALLOC_TOTAL);
|
memset (memory, 17, MAX_ALLOC_TOTAL);
|
||||||
return 78;
|
result = 78;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
/* Perform the test and test whether it triggers a permanent memory
|
|
||||||
allocation of more than MAX_ALLOC_TOTAL bytes. */
|
|
||||||
|
|
||||||
for (repeat = 0; repeat < NUM_ROUNDS; repeat++)
|
|
||||||
{
|
{
|
||||||
/* This may produce a temporary memory allocation of 11000 bytes.
|
/* Perform the test and test whether it triggers a permanent memory
|
||||||
but should not result in a permanent memory allocation. */
|
allocation of more than MAX_ALLOC_TOTAL bytes. */
|
||||||
if (fprintf (stdout, "%011000d\n", 17) == -1
|
int repeat;
|
||||||
&& errno == ENOMEM)
|
|
||||||
return 1;
|
for (repeat = 0; repeat < NUM_ROUNDS; repeat++)
|
||||||
|
{
|
||||||
|
/* This may produce a temporary memory allocation of 11000 bytes.
|
||||||
|
but should not result in a permanent memory allocation. */
|
||||||
|
if (fprintf (stdout, "%011000d\n", 17) == -1
|
||||||
|
&& errno == ENOMEM)
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
if (get_rusage_as () > initial_rusage_as + MAX_ALLOC_TOTAL)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
int
|
|
||||||
main (int argc, char *argv[])
|
|
||||||
{
|
|
||||||
return 77;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
@@ -9,14 +9,14 @@
|
|||||||
) 2>/dev/null
|
) 2>/dev/null
|
||||||
malloc_result=$?
|
malloc_result=$?
|
||||||
if test $malloc_result = 77; then
|
if test $malloc_result = 77; then
|
||||||
echo "Skipping test: getrlimit and setrlimit don't work"
|
echo "Skipping test: no way to determine address space size"
|
||||||
exit 77
|
exit 77
|
||||||
fi
|
fi
|
||||||
|
|
||||||
./test-fprintf-posix3${EXEEXT} 1 > /dev/null
|
./test-fprintf-posix3${EXEEXT} 1 > /dev/null
|
||||||
result=$?
|
result=$?
|
||||||
if test $result = 77; then
|
if test $result = 77; then
|
||||||
echo "Skipping test: getrlimit and setrlimit don't work"
|
echo "Skipping test: no way to determine address space size"
|
||||||
exit 77
|
exit 77
|
||||||
fi
|
fi
|
||||||
if test $result != 0; then
|
if test $result != 0; then
|
||||||
@@ -24,7 +24,7 @@ if test $result != 0; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if test $malloc_result = 78; then
|
if test $malloc_result = 78; then
|
||||||
echo "Skipping test: getrlimit and setrlimit don't work"
|
echo "Skipping test: get_rusage_as() doesn't work"
|
||||||
exit 77
|
exit 77
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user