Commit d43e59e7 authored by Yury Kotov's avatar Yury Kotov Committed by Dr. David Alan Gilbert
Browse files

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: default avatarYury Kotov <yury-kotov@yandex-team.ru>
Message-Id: <20190903162246.18524-3-yury-kotov@yandex-team.ru>
Acked-by: default avatarThomas Huth <thuth@redhat.com>
Reviewed-by: default avatarDr. David Alan Gilbert <dgilbert@redhat.com>
Signed-off-by: default avatarDr. David Alan Gilbert <dgilbert@redhat.com>
parent b9d68df6
Loading
Loading
Loading
Loading
+21 −15
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ struct QTestState
    int qmp_fd;
    pid_t qemu_pid;  /* our child QEMU process */
    int wstatus;
    int expected_status;
    bool big_endian;
    bool irq_level[MAX_IRQ];
    GString *rx;
@@ -111,6 +112,11 @@ bool qtest_probe_child(QTestState *s)
    return false;
}

void qtest_set_expected_status(QTestState *s, int status)
{
    s->expected_status = status;
}

static void kill_qemu(QTestState *s)
{
    pid_t pid = s->qemu_pid;
@@ -124,15 +130,15 @@ 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.
     */
    wstatus = s->wstatus;
    if (wstatus) {
        if (WIFEXITED(wstatus)) {
    if (WIFEXITED(wstatus) && WEXITSTATUS(wstatus) != s->expected_status) {
        fprintf(stderr, "%s:%d: kill_qemu() tried to terminate QEMU "
                    "process but encountered exit status %d\n",
                    __FILE__, __LINE__, WEXITSTATUS(wstatus));
                "process but encountered exit status %d (expected %d)\n",
                __FILE__, __LINE__, WEXITSTATUS(wstatus), s->expected_status);
        abort();
    } else if (WIFSIGNALED(wstatus)) {
        int sig = WTERMSIG(wstatus);
        const char *signame = strsignal(sig) ?: "unknown ???";
@@ -141,7 +147,6 @@ static void kill_qemu(QTestState *s)
        fprintf(stderr, "%s:%d: kill_qemu() detected QEMU death "
                "from signal %d (%s)%s\n",
                __FILE__, __LINE__, sig, signame, dump);
        }
        abort();
    }
}
@@ -246,6 +251,7 @@ QTestState *qtest_init_without_qmp_handshake(const char *extra_args)
    g_test_message("starting QEMU: %s", command);

    s->wstatus = 0;
    s->expected_status = 0;
    s->qemu_pid = fork();
    if (s->qemu_pid == 0) {
        setenv("QEMU_AUDIO_DRV", "none", true);
+9 −0
Original line number Diff line number Diff line
@@ -708,4 +708,13 @@ void qmp_assert_error_class(QDict *rsp, const char *class);
 */
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