tests/libqtest: Allow setting expected exit status

Add qtest_set_expected_status function to set expected exit status of
child process. By default expected exit status is 0.

Signed-off-by: Yury Kotov <yury-kotov@yandex-team.ru>
Message-Id: <20190903162246.18524-3-yury-kotov@yandex-team.ru>
Acked-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
This commit is contained in:
Yury Kotov 2019-09-03 19:22:45 +03:00 committed by Dr. David Alan Gilbert
parent b9d68df62a
commit d43e59e7ab
2 changed files with 29 additions and 14 deletions

View File

@ -41,6 +41,7 @@ struct QTestState
int qmp_fd; int qmp_fd;
pid_t qemu_pid; /* our child QEMU process */ pid_t qemu_pid; /* our child QEMU process */
int wstatus; int wstatus;
int expected_status;
bool big_endian; bool big_endian;
bool irq_level[MAX_IRQ]; bool irq_level[MAX_IRQ];
GString *rx; GString *rx;
@ -111,6 +112,11 @@ bool qtest_probe_child(QTestState *s)
return false; return false;
} }
void qtest_set_expected_status(QTestState *s, int status)
{
s->expected_status = status;
}
static void kill_qemu(QTestState *s) static void kill_qemu(QTestState *s)
{ {
pid_t pid = s->qemu_pid; pid_t pid = s->qemu_pid;
@ -124,24 +130,23 @@ static void kill_qemu(QTestState *s)
} }
/* /*
* We expect qemu to exit with status 0; anything else is * Check whether qemu exited with expected exit status; anything else is
* fishy and should be logged with as much detail as possible. * fishy and should be logged with as much detail as possible.
*/ */
wstatus = s->wstatus; wstatus = s->wstatus;
if (wstatus) { if (WIFEXITED(wstatus) && WEXITSTATUS(wstatus) != s->expected_status) {
if (WIFEXITED(wstatus)) { fprintf(stderr, "%s:%d: kill_qemu() tried to terminate QEMU "
fprintf(stderr, "%s:%d: kill_qemu() tried to terminate QEMU " "process but encountered exit status %d (expected %d)\n",
"process but encountered exit status %d\n", __FILE__, __LINE__, WEXITSTATUS(wstatus), s->expected_status);
__FILE__, __LINE__, WEXITSTATUS(wstatus)); abort();
} else if (WIFSIGNALED(wstatus)) { } else if (WIFSIGNALED(wstatus)) {
int sig = WTERMSIG(wstatus); int sig = WTERMSIG(wstatus);
const char *signame = strsignal(sig) ?: "unknown ???"; const char *signame = strsignal(sig) ?: "unknown ???";
const char *dump = WCOREDUMP(wstatus) ? " (core dumped)" : ""; const char *dump = WCOREDUMP(wstatus) ? " (core dumped)" : "";
fprintf(stderr, "%s:%d: kill_qemu() detected QEMU death " fprintf(stderr, "%s:%d: kill_qemu() detected QEMU death "
"from signal %d (%s)%s\n", "from signal %d (%s)%s\n",
__FILE__, __LINE__, sig, signame, dump); __FILE__, __LINE__, sig, signame, dump);
}
abort(); abort();
} }
} }
@ -246,6 +251,7 @@ QTestState *qtest_init_without_qmp_handshake(const char *extra_args)
g_test_message("starting QEMU: %s", command); g_test_message("starting QEMU: %s", command);
s->wstatus = 0; s->wstatus = 0;
s->expected_status = 0;
s->qemu_pid = fork(); s->qemu_pid = fork();
if (s->qemu_pid == 0) { if (s->qemu_pid == 0) {
setenv("QEMU_AUDIO_DRV", "none", true); setenv("QEMU_AUDIO_DRV", "none", true);

View File

@ -708,4 +708,13 @@ void qmp_assert_error_class(QDict *rsp, const char *class);
*/ */
bool qtest_probe_child(QTestState *s); bool qtest_probe_child(QTestState *s);
/**
* qtest_set_expected_status:
* @s: QTestState instance to operate on.
* @status: an expected exit status.
*
* Set expected exit status of the child.
*/
void qtest_set_expected_status(QTestState *s, int status);
#endif #endif