summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruno Haible <bruno@clisp.org>2021-08-29 01:03:29 +0200
committerBruno Haible <bruno@clisp.org>2021-08-29 01:03:29 +0200
commitd2e97793f7501e3985103686b050210bbe1da2f3 (patch)
tree3860666e6d6e1a4dd7c48a64e14ec3dbc16d850d
parentecf9863b1f2ed7562b3031d2c6fc010622cd48fe (diff)
downloadgnulib-d2e97793f7501e3985103686b050210bbe1da2f3.tar.gz
Skip some tests when running under QEMU user-mode.
* tests/qemu.h: New file. * tests/test-get-rusage-as.c: Include qemu.h. (main): Skip the test when running under QEMU. * tests/test-get-rusage-data.c: Include qemu.h. (main): Skip the test when running under QEMU. * tests/test-printf-posix2.c: Include qemu.h. (main): Return with code 77 when running under QEMU. * tests/test-fprintf-posix2.c: Include qemu.h. (main): Return with code 77 when running under QEMU. * tests/test-fprintf-posix3.c: Include qemu.h. (main): Return with code 79 when running under QEMU. * tests/test-fprintf-posix3.sh: Skip the test when the return code was 79. * tests/test-dprintf-posix2.c: Include qemu.h. (main): Return with code 79 when running under QEMU. Use return code 80 instead of 78. * tests/test-dprintf-posix2.sh: Skip the test when the return code was 79. Update for changed return code. * modules/get-rusage-as-tests (Files): Add qemu.h. (Depends-on): Add stdbool. * modules/get-rusage-data-tests (Files): Add qemu.h. (Depends-on): Add stdbool. * modules/fprintf-posix-tests (Files): Add qemu.h. (Depends-on): Add stdbool. * modules/dprintf-posix-tests (Files): Add qemu.h. (Depends-on): Add stdbool.
-rw-r--r--ChangeLog30
-rw-r--r--modules/dprintf-posix-tests2
-rw-r--r--modules/fprintf-posix-tests2
-rw-r--r--modules/get-rusage-as-tests2
-rw-r--r--modules/get-rusage-data-tests2
-rw-r--r--tests/qemu.h99
-rw-r--r--tests/test-dprintf-posix2.c9
-rwxr-xr-xtests/test-dprintf-posix2.sh8
-rw-r--r--tests/test-fprintf-posix2.c5
-rw-r--r--tests/test-fprintf-posix3.c7
-rwxr-xr-xtests/test-fprintf-posix3.sh6
-rw-r--r--tests/test-get-rusage-as.c6
-rw-r--r--tests/test-get-rusage-data.c6
-rw-r--r--tests/test-printf-posix2.c5
14 files changed, 185 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index 2479ea6f51..12187eaf97 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,35 @@
2021-08-28 Bruno Haible <bruno@clisp.org>
+ Skip some tests when running under QEMU user-mode.
+ * tests/qemu.h: New file.
+ * tests/test-get-rusage-as.c: Include qemu.h.
+ (main): Skip the test when running under QEMU.
+ * tests/test-get-rusage-data.c: Include qemu.h.
+ (main): Skip the test when running under QEMU.
+ * tests/test-printf-posix2.c: Include qemu.h.
+ (main): Return with code 77 when running under QEMU.
+ * tests/test-fprintf-posix2.c: Include qemu.h.
+ (main): Return with code 77 when running under QEMU.
+ * tests/test-fprintf-posix3.c: Include qemu.h.
+ (main): Return with code 79 when running under QEMU.
+ * tests/test-fprintf-posix3.sh: Skip the test when the return code was
+ 79.
+ * tests/test-dprintf-posix2.c: Include qemu.h.
+ (main): Return with code 79 when running under QEMU. Use return code 80
+ instead of 78.
+ * tests/test-dprintf-posix2.sh: Skip the test when the return code was
+ 79. Update for changed return code.
+ * modules/get-rusage-as-tests (Files): Add qemu.h.
+ (Depends-on): Add stdbool.
+ * modules/get-rusage-data-tests (Files): Add qemu.h.
+ (Depends-on): Add stdbool.
+ * modules/fprintf-posix-tests (Files): Add qemu.h.
+ (Depends-on): Add stdbool.
+ * modules/dprintf-posix-tests (Files): Add qemu.h.
+ (Depends-on): Add stdbool.
+
+2021-08-28 Bruno Haible <bruno@clisp.org>
+
sigabbrev_np, sigdescr_np: Fix compilation error on Linux/alpha.
* lib/sigabbrev_np.c (sigabbrev_np): When SIGINFO and SIGPWR have the
same value, give precendence to SIGPWR.
diff --git a/modules/dprintf-posix-tests b/modules/dprintf-posix-tests
index 0c5a6e8cba..09ebbc06f9 100644
--- a/modules/dprintf-posix-tests
+++ b/modules/dprintf-posix-tests
@@ -5,10 +5,12 @@ tests/test-printf-posix.output
tests/test-dprintf-posix2.sh
tests/test-dprintf-posix2.c
tests/infinity.h
+tests/qemu.h
tests/signature.h
tests/macros.h
Depends-on:
+stdbool
stdint
get-rusage-as
diff --git a/modules/fprintf-posix-tests b/modules/fprintf-posix-tests
index 258e3bfb28..de0a8df796 100644
--- a/modules/fprintf-posix-tests
+++ b/modules/fprintf-posix-tests
@@ -8,10 +8,12 @@ tests/test-fprintf-posix2.c
tests/test-fprintf-posix3.sh
tests/test-fprintf-posix3.c
tests/infinity.h
+tests/qemu.h
tests/signature.h
tests/macros.h
Depends-on:
+stdbool
stdint
get-rusage-as
diff --git a/modules/get-rusage-as-tests b/modules/get-rusage-as-tests
index 9941009e37..67c011d712 100644
--- a/modules/get-rusage-as-tests
+++ b/modules/get-rusage-as-tests
@@ -1,8 +1,10 @@
Files:
tests/test-get-rusage-as.c
+tests/qemu.h
tests/macros.h
Depends-on:
+stdbool
configure.ac:
diff --git a/modules/get-rusage-data-tests b/modules/get-rusage-data-tests
index 109cce53e9..d18d30bc23 100644
--- a/modules/get-rusage-data-tests
+++ b/modules/get-rusage-data-tests
@@ -1,9 +1,11 @@
Files:
tests/test-get-rusage-data.c
+tests/qemu.h
tests/macros.h
m4/musl.m4
Depends-on:
+stdbool
configure.ac:
gl_MUSL_LIBC
diff --git a/tests/qemu.h b/tests/qemu.h
new file mode 100644
index 0000000000..403b779281
--- /dev/null
+++ b/tests/qemu.h
@@ -0,0 +1,99 @@
+/* Determine whether the current process is running under QEMU.
+ Copyright (C) 2021 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2021. */
+
+#include <stdbool.h>
+#ifdef __linux__
+# include <fcntl.h>
+# include <string.h>
+# include <unistd.h>
+#endif
+
+/* This function determines whether the current process is running under QEMU
+ (user-mode).
+
+ It does so by looking at parts of the environment that QEMU does not emulate
+ 100% perfectly well.
+
+ For comparison, the techniques given in the paper
+ Thomas Raffetseder, Christopher Kruegel, Engin Kirda
+ "Detecting System Emulators"
+ 2007
+ https://publik.tuwien.ac.at/files/pub-inf_5317.pdf
+ apply to both the QEMU system mode and QEMU user mode. */
+
+static bool
+is_running_under_qemu_user (void)
+{
+#ifdef __linux__
+ char buf[4096 + 1];
+ int fd;
+
+# if defined __m68k__
+ fd = open ("/proc/hardware", O_RDONLY);
+ if (fd >= 0)
+ {
+ int n = read (fd, buf, sizeof (buf) - 1);
+ close (fd);
+ if (n > 0)
+ {
+ buf[n] = '\0';
+ if (strstr (buf, "qemu") != NULL)
+ return true;
+ }
+ }
+# endif
+
+ fd = open ("/proc/cpuinfo", O_RDONLY);
+ if (fd >= 0)
+ {
+ int n = read (fd, buf, sizeof (buf) - 1);
+ close (fd);
+ if (n > 0)
+ {
+ buf[n] = '\0';
+# if defined __hppa__
+ if (strstr (buf, "QEMU") != NULL)
+ return true;
+# endif
+# if !(defined __i386__ || defined __x86_64__)
+ if (strstr (buf, "AuthenticAMD") != NULL
+ || strstr (buf, "GenuineIntel") != NULL)
+ return true;
+# endif
+# if !(defined __arm__ || defined __aarch64__)
+ if (strstr (buf, "ARM") != NULL
+ || strcasestr (buf, "aarch64") != NULL)
+ return true;
+# endif
+# if !defined __sparc__
+ if (strcasestr (buf, "SPARC") != NULL)
+ return true;
+# endif
+# if !defined __powerpc__
+ if (strstr (buf, "POWER") != NULL)
+ return true;
+# endif
+ }
+ }
+
+ /* If you need more heuristics, look at system calls that are not perfectly
+ well emulated in qemu/linux-user/syscall.c. */
+#endif
+
+ return false;
+}
diff --git a/tests/test-dprintf-posix2.c b/tests/test-dprintf-posix2.c
index bd5997567e..67e14f7c81 100644
--- a/tests/test-dprintf-posix2.c
+++ b/tests/test-dprintf-posix2.c
@@ -31,6 +31,7 @@
# include <sys/resource.h>
#endif
+#include "qemu.h"
#include "resource-ext.h"
/* Test against a memory leak in the fprintf replacement. */
@@ -53,6 +54,12 @@ main (int argc, char *argv[])
int arg;
int result;
+ if (is_running_under_qemu_user ())
+ {
+ fprintf (stderr, "Skipping test: cannot trust address space size when running under QEMU\n");
+ return 79;
+ }
+
/* Limit the amount of malloc()ed memory to MAX_ALLOC_TOTAL or less. */
/* On AIX systems, malloc() is limited by RLIMIT_DATA. */
@@ -85,7 +92,7 @@ main (int argc, char *argv[])
if (memory == NULL)
return 1;
memset (memory, 17, MAX_ALLOC_TOTAL);
- result = 78;
+ result = 80;
}
else
{
diff --git a/tests/test-dprintf-posix2.sh b/tests/test-dprintf-posix2.sh
index 0fb38591d0..7a548188f3 100755
--- a/tests/test-dprintf-posix2.sh
+++ b/tests/test-dprintf-posix2.sh
@@ -4,7 +4,7 @@
(${CHECKER} ./test-dprintf-posix2${EXEEXT} 0
result=$?
- if test $result != 77 && test $result != 78; then result=1; fi
+ if test $result != 77 && test $result != 79 && test $result != 80; then result=1; fi
exit $result
) 2>/dev/null
malloc_result=$?
@@ -12,6 +12,10 @@ if test $malloc_result = 77; then
echo "Skipping test: no way to determine address space size"
exit 77
fi
+if test $malloc_result = 79; then
+ echo "Skipping test: cannot trust address space size when running under QEMU"
+ exit 77
+fi
${CHECKER} ./test-dprintf-posix2${EXEEXT} 1 > /dev/null
result=$?
@@ -23,7 +27,7 @@ if test $result != 0; then
exit 1
fi
-if test $malloc_result = 78; then
+if test $malloc_result = 80; then
echo "Skipping test: get_rusage_as() doesn't work"
exit 77
fi
diff --git a/tests/test-fprintf-posix2.c b/tests/test-fprintf-posix2.c
index 8c3ea8bbc4..47f29116d3 100644
--- a/tests/test-fprintf-posix2.c
+++ b/tests/test-fprintf-posix2.c
@@ -32,6 +32,8 @@
#include <string.h>
#include <errno.h>
+#include "qemu.h"
+
int
main (int argc, char *argv[])
{
@@ -39,6 +41,9 @@ main (int argc, char *argv[])
int arg;
int ret;
+ if (is_running_under_qemu_user ())
+ return 77;
+
/* Some printf implementations allocate temporary space with malloc. */
/* On BSD systems, malloc() is limited by RLIMIT_DATA. */
#ifdef RLIMIT_DATA
diff --git a/tests/test-fprintf-posix3.c b/tests/test-fprintf-posix3.c
index 41172b4ea1..458f95784c 100644
--- a/tests/test-fprintf-posix3.c
+++ b/tests/test-fprintf-posix3.c
@@ -48,6 +48,7 @@ main ()
# include <sys/resource.h>
#endif
+#include "qemu.h"
#include "resource-ext.h"
/* Test against a memory leak in the fprintf replacement. */
@@ -70,6 +71,12 @@ main (int argc, char *argv[])
int arg;
int result;
+ if (is_running_under_qemu_user ())
+ {
+ fprintf (stderr, "Skipping test: cannot trust address space size when running under QEMU\n");
+ return 79;
+ }
+
/* Limit the amount of malloc()ed memory to MAX_ALLOC_TOTAL or less. */
/* On AIX systems, malloc() is limited by RLIMIT_DATA. */
diff --git a/tests/test-fprintf-posix3.sh b/tests/test-fprintf-posix3.sh
index 96609c7f2f..a79273ee2e 100755
--- a/tests/test-fprintf-posix3.sh
+++ b/tests/test-fprintf-posix3.sh
@@ -4,7 +4,7 @@
(${CHECKER} ./test-fprintf-posix3${EXEEXT} 0
result=$?
- if test $result != 77 && test $result != 78 && test $result != 80; then result=1; fi
+ if test $result != 77 && test $result != 78 && test $result != 79 && test $result != 80; then result=1; fi
exit $result
) 2>/dev/null
malloc_result=$?
@@ -16,6 +16,10 @@ if test $malloc_result = 78; then
echo "Skipping test: cannot trust address space size on this platform"
exit 77
fi
+if test $malloc_result = 79; then
+ echo "Skipping test: cannot trust address space size when running under QEMU"
+ exit 77
+fi
${CHECKER} ./test-fprintf-posix3${EXEEXT} 1 > /dev/null
result=$?
diff --git a/tests/test-get-rusage-as.c b/tests/test-get-rusage-as.c
index 41646db2b4..7adb8cda30 100644
--- a/tests/test-get-rusage-as.c
+++ b/tests/test-get-rusage-as.c
@@ -21,6 +21,7 @@
#include <stdio.h>
#include <stdlib.h>
+#include "qemu.h"
#include "macros.h"
void *memchunk1;
@@ -46,6 +47,11 @@ main ()
fprintf (stderr, "Skipping test: no way to determine address space size\n");
return 77;
}
+ else if (is_running_under_qemu_user ())
+ {
+ fprintf (stderr, "Skipping test: running under QEMU\n");
+ return 77;
+ }
else
{
/* The address space size is positive. */
diff --git a/tests/test-get-rusage-data.c b/tests/test-get-rusage-data.c
index c626540a32..a5acb4705c 100644
--- a/tests/test-get-rusage-data.c
+++ b/tests/test-get-rusage-data.c
@@ -21,6 +21,7 @@
#include <stdio.h>
#include <stdlib.h>
+#include "qemu.h"
#include "macros.h"
void *memchunk1;
@@ -46,6 +47,11 @@ main ()
fprintf (stderr, "Skipping test: no way to determine data segment size\n");
return 77;
}
+ else if (is_running_under_qemu_user ())
+ {
+ fprintf (stderr, "Skipping test: running under QEMU\n");
+ return 77;
+ }
else
{
/* The data segment size is positive, except possibly at the beginning. */
diff --git a/tests/test-printf-posix2.c b/tests/test-printf-posix2.c
index dc3c4e5f29..f8da617438 100644
--- a/tests/test-printf-posix2.c
+++ b/tests/test-printf-posix2.c
@@ -32,6 +32,8 @@
#include <string.h>
#include <errno.h>
+#include "qemu.h"
+
int
main (int argc, char *argv[])
{
@@ -39,6 +41,9 @@ main (int argc, char *argv[])
int arg;
int ret;
+ if (is_running_under_qemu_user ())
+ return 77;
+
/* Some printf implementations allocate temporary space with malloc. */
/* On BSD systems, malloc() is limited by RLIMIT_DATA. */
#ifdef RLIMIT_DATA