In a QEMU user-mode environment (for various CPUs), the test-posix_spawn-fchdir test fails.
The reason is that when the program opens "/", it actually is the /usr/<cpu>-linux-gnu directory, and the "pwd" program thus prints the string "/usr/<cpu>-linux-gnu", not "/" as expected. This patch skips the parts of the test that are not supported under QEMU user-mode. 2021-08-29 Bruno Haible <br...@clisp.org> posix_spawn_file_actions_addfchdir: Avoid test failure under QEMU. * tests/test-posix_spawn-fchdir.c: Include qemu.h. (is_qemu): New variable. (test): Under QEMU user-mode, don't expect that "pwd" produces the result "/". (main): Initialize is_qemu. Under QEMU user-mode, skip the relative file name test. * modules/posix_spawn_file_actions_addfchdir-tests (Files): Add qemu.h. (Depends-on): Add stdbool. diff --git a/modules/posix_spawn_file_actions_addfchdir-tests b/modules/posix_spawn_file_actions_addfchdir-tests index 789a85d2e..903a30f85 100644 --- a/modules/posix_spawn_file_actions_addfchdir-tests +++ b/modules/posix_spawn_file_actions_addfchdir-tests @@ -2,12 +2,14 @@ Files: tests/test-posix_spawn_file_actions_addfchdir.c tests/test-posix_spawn-fchdir.c tests/signature.h +tests/qemu.h tests/macros.h Depends-on: posix_spawn_file_actions_init posix_spawn_file_actions_destroy posix_spawnp-tests +stdbool findprog configure.ac: diff --git a/tests/test-posix_spawn-fchdir.c b/tests/test-posix_spawn-fchdir.c index 0f7137446..297a2de47 100644 --- a/tests/test-posix_spawn-fchdir.c +++ b/tests/test-posix_spawn-fchdir.c @@ -32,6 +32,9 @@ #include <sys/wait.h> #include "findprog.h" +#include "qemu.h" + +static bool is_qemu; static int fd_safer (int fd) @@ -135,10 +138,17 @@ test (const char *pwd_prog) fprintf (stderr, "could not read expected output\n"); exit (1); } - if (memcmp (line, "/\n", 2) != 0) + /* For a process running under QEMU user-mode, rootfd points to the directory + that is the value of the QEMU_LD_PREFIX environment variable or of the -L + command-line option, and the line produced by 'pwd' is that directory, not + "/". */ + if (!is_qemu) { - fprintf (stderr, "read output is not the expected output\n"); - exit (1); + if (memcmp (line, "/\n", 2) != 0) + { + fprintf (stderr, "read output is not the expected output\n"); + exit (1); + } } fclose (fp); status = 0; @@ -160,19 +170,22 @@ test (const char *pwd_prog) int main () { + is_qemu = is_running_under_qemu_user (); + test ("pwd"); /* Verify that if a program is given as a relative file name with at least one slash, it is interpreted w.r.t. the current directory after fchdir has been executed. */ - { - const char *abs_pwd_prog = find_in_path ("pwd"); - - if (abs_pwd_prog != NULL - && abs_pwd_prog[0] == '/' - && abs_pwd_prog[1] != '0' && abs_pwd_prog[1] != '/') - test (&abs_pwd_prog[1]); - } + if (!is_qemu) + { + const char *abs_pwd_prog = find_in_path ("pwd"); + + if (abs_pwd_prog != NULL + && abs_pwd_prog[0] == '/' + && abs_pwd_prog[1] != '0' && abs_pwd_prog[1] != '/') + test (&abs_pwd_prog[1]); + } return 0; }