qemu/tests/qtest/libqtest.c
<<
>>
Prefs
   1/*
   2 * QTest
   3 *
   4 * Copyright IBM, Corp. 2012
   5 * Copyright Red Hat, Inc. 2012
   6 * Copyright SUSE LINUX Products GmbH 2013
   7 *
   8 * Authors:
   9 *  Anthony Liguori   <aliguori@us.ibm.com>
  10 *  Paolo Bonzini     <pbonzini@redhat.com>
  11 *  Andreas Färber    <afaerber@suse.de>
  12 *
  13 * This work is licensed under the terms of the GNU GPL, version 2 or later.
  14 * See the COPYING file in the top-level directory.
  15 */
  16
  17#include "qemu/osdep.h"
  18
  19#ifndef _WIN32
  20#include <sys/socket.h>
  21#include <sys/wait.h>
  22#include <sys/un.h>
  23#endif /* _WIN32 */
  24#ifdef __linux__
  25#include <sys/prctl.h>
  26#endif /* __linux__ */
  27#ifdef __FreeBSD__
  28#include <sys/procctl.h>
  29#endif /* __FreeBSD__ */
  30
  31#include "libqtest.h"
  32#include "libqmp.h"
  33#include "qemu/accel.h"
  34#include "qemu/ctype.h"
  35#include "qemu/cutils.h"
  36#include "qemu/sockets.h"
  37#include "qobject/qdict.h"
  38#include "qobject/qjson.h"
  39#include "qobject/qlist.h"
  40#include "qobject/qstring.h"
  41#include "qobject/qbool.h"
  42
  43#define MAX_IRQ 256
  44
  45#ifndef _WIN32
  46# define SOCKET_TIMEOUT 50
  47# define CMD_EXEC   "exec "
  48# define DEV_STDERR "/dev/fd/2"
  49# define DEV_NULL   "/dev/null"
  50#else
  51# define SOCKET_TIMEOUT 50000
  52# define CMD_EXEC   ""
  53# define DEV_STDERR "2"
  54# define DEV_NULL   "nul"
  55#endif
  56
  57#define WAITPID_TIMEOUT 30
  58
  59typedef void (*QTestSendFn)(QTestState *s, const char *buf);
  60typedef void (*ExternalSendFn)(void *s, const char *buf);
  61typedef GString* (*QTestRecvFn)(QTestState *);
  62
  63typedef struct QTestClientTransportOps {
  64    QTestSendFn     send;      /* for sending qtest commands */
  65
  66    /*
  67     * use external_send to send qtest command strings through functions which
  68     * do not accept a QTestState as the first parameter.
  69     */
  70    ExternalSendFn  external_send;
  71
  72    QTestRecvFn     recv_line; /* for receiving qtest command responses */
  73} QTestTransportOps;
  74
  75struct QTestState
  76{
  77    int fd;
  78    int qmp_fd;
  79    int sock;
  80    int qmpsock;
  81    pid_t qemu_pid;  /* our child QEMU process */
  82    int wstatus;
  83#ifdef _WIN32
  84    DWORD exit_code;
  85#endif
  86    int expected_status;
  87    bool big_endian;
  88    bool irq_level[MAX_IRQ];
  89    GString *rx;
  90    QTestTransportOps ops;
  91    GList *pending_events;
  92    QTestQMPEventCallback eventCB;
  93    void *eventData;
  94};
  95
  96static GHookList abrt_hooks;
  97static void (*sighandler_old)(int);
  98static bool silence_spawn_log;
  99
 100static int qtest_query_target_endianness(QTestState *s);
 101
 102static void qtest_client_socket_send(QTestState*, const char *buf);
 103static void socket_send(int fd, const char *buf, size_t size);
 104
 105static GString *qtest_client_socket_recv_line(QTestState *);
 106
 107static void qtest_client_set_tx_handler(QTestState *s, QTestSendFn send);
 108static void qtest_client_set_rx_handler(QTestState *s, QTestRecvFn recv);
 109
 110static int init_socket(const char *socket_path)
 111{
 112    int sock = qtest_socket_server(socket_path);
 113    qemu_set_cloexec(sock);
 114    return sock;
 115}
 116
 117static int socket_accept(int sock)
 118{
 119    struct sockaddr_un addr;
 120    socklen_t addrlen;
 121    int ret;
 122    /*
 123     * timeout unit of blocking receive calls is different among platforms.
 124     * It's in seconds on non-Windows platforms but milliseconds on Windows.
 125     */
 126#ifndef _WIN32
 127    struct timeval timeout = { .tv_sec = SOCKET_TIMEOUT,
 128                               .tv_usec = 0 };
 129#else
 130    DWORD timeout = SOCKET_TIMEOUT;
 131#endif
 132
 133    if (setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO,
 134                   (void *)&timeout, sizeof(timeout))) {
 135        fprintf(stderr, "%s failed to set SO_RCVTIMEO: %s\n",
 136                __func__, strerror(errno));
 137        close(sock);
 138        return -1;
 139    }
 140
 141    do {
 142        addrlen = sizeof(addr);
 143        ret = accept(sock, (struct sockaddr *)&addr, &addrlen);
 144    } while (ret == -1 && errno == EINTR);
 145    if (ret == -1) {
 146        fprintf(stderr, "%s failed: %s\n", __func__, strerror(errno));
 147    }
 148    close(sock);
 149
 150    return ret;
 151}
 152
 153pid_t qtest_pid(QTestState *s)
 154{
 155    return s->qemu_pid;
 156}
 157
 158bool qtest_probe_child(QTestState *s)
 159{
 160    pid_t pid = s->qemu_pid;
 161
 162    if (pid != -1) {
 163#ifndef _WIN32
 164        pid = waitpid(pid, &s->wstatus, WNOHANG);
 165        if (pid == 0) {
 166            return true;
 167        }
 168#else
 169        GetExitCodeProcess((HANDLE)pid, &s->exit_code);
 170        if (s->exit_code == STILL_ACTIVE) {
 171            return true;
 172        }
 173        CloseHandle((HANDLE)pid);
 174#endif
 175        s->qemu_pid = -1;
 176        qtest_remove_abrt_handler(s);
 177    }
 178    return false;
 179}
 180
 181void qtest_set_expected_status(QTestState *s, int status)
 182{
 183    s->expected_status = status;
 184}
 185
 186static void qtest_check_status(QTestState *s)
 187{
 188    assert(s->qemu_pid == -1);
 189
 190    /*
 191     * Check whether qemu exited with expected exit status; anything else is
 192     * fishy and should be logged with as much detail as possible.
 193     */
 194#ifndef _WIN32
 195    int wstatus = s->wstatus;
 196    if (WIFEXITED(wstatus) && WEXITSTATUS(wstatus) != s->expected_status) {
 197        fprintf(stderr, "%s:%d: kill_qemu() tried to terminate QEMU "
 198                "process but encountered exit status %d (expected %d)\n",
 199                __FILE__, __LINE__, WEXITSTATUS(wstatus), s->expected_status);
 200        abort();
 201    } else if (WIFSIGNALED(wstatus)) {
 202        int sig = WTERMSIG(wstatus);
 203        const char *signame = strsignal(sig) ?: "unknown ???";
 204        const char *dump = WCOREDUMP(wstatus) ? " (core dumped)" : "";
 205
 206        fprintf(stderr, "%s:%d: kill_qemu() detected QEMU death "
 207                "from signal %d (%s)%s\n",
 208                __FILE__, __LINE__, sig, signame, dump);
 209        abort();
 210    }
 211#else
 212    if (s->exit_code != s->expected_status) {
 213        fprintf(stderr, "%s:%d: kill_qemu() tried to terminate QEMU "
 214                "process but encountered exit status %ld (expected %d)\n",
 215                __FILE__, __LINE__, s->exit_code, s->expected_status);
 216        abort();
 217    }
 218#endif
 219}
 220
 221void qtest_system_reset_nowait(QTestState *s)
 222{
 223    /* Request the system reset, but do not wait for it to complete */
 224    qtest_qmp_assert_success(s, "{'execute': 'system_reset' }");
 225}
 226
 227void qtest_system_reset(QTestState *s)
 228{
 229    qtest_system_reset_nowait(s);
 230    /*
 231     * Wait for the RESET event, which is sent once the system reset
 232     * has actually completed.
 233     */
 234    qtest_qmp_eventwait(s, "RESET");
 235}
 236
 237void qtest_wait_qemu(QTestState *s)
 238{
 239    if (s->qemu_pid != -1) {
 240#ifndef _WIN32
 241        pid_t pid;
 242        uint64_t end;
 243
 244        /* poll for a while until sending SIGKILL */
 245        end = g_get_monotonic_time() + WAITPID_TIMEOUT * G_TIME_SPAN_SECOND;
 246
 247        do {
 248            pid = waitpid(s->qemu_pid, &s->wstatus, WNOHANG);
 249            if (pid != 0) {
 250                break;
 251            }
 252            g_usleep(100 * 1000);
 253        } while (g_get_monotonic_time() < end);
 254
 255        if (pid == 0) {
 256            kill(s->qemu_pid, SIGKILL);
 257            pid = RETRY_ON_EINTR(waitpid(s->qemu_pid, &s->wstatus, 0));
 258        }
 259
 260        assert(pid == s->qemu_pid);
 261#else
 262        DWORD ret;
 263
 264        ret = WaitForSingleObject((HANDLE)s->qemu_pid, INFINITE);
 265        assert(ret == WAIT_OBJECT_0);
 266        GetExitCodeProcess((HANDLE)s->qemu_pid, &s->exit_code);
 267        CloseHandle((HANDLE)s->qemu_pid);
 268#endif
 269
 270        s->qemu_pid = -1;
 271        qtest_remove_abrt_handler(s);
 272    }
 273    qtest_check_status(s);
 274}
 275
 276void qtest_kill_qemu(QTestState *s)
 277{
 278    /* Skip wait if qtest_probe_child() already reaped */
 279    if (s->qemu_pid != -1) {
 280#ifndef _WIN32
 281        kill(s->qemu_pid, SIGTERM);
 282#else
 283        TerminateProcess((HANDLE)s->qemu_pid, s->expected_status);
 284#endif
 285        qtest_wait_qemu(s);
 286        return;
 287    }
 288
 289    qtest_check_status(s);
 290}
 291
 292static void kill_qemu_hook_func(void *s)
 293{
 294    qtest_kill_qemu(s);
 295}
 296
 297static void sigabrt_handler(int signo)
 298{
 299    g_hook_list_invoke(&abrt_hooks, FALSE);
 300}
 301
 302static void setup_sigabrt_handler(void)
 303{
 304    sighandler_old = signal(SIGABRT, sigabrt_handler);
 305}
 306
 307static void cleanup_sigabrt_handler(void)
 308{
 309    signal(SIGABRT, sighandler_old);
 310}
 311
 312static bool hook_list_is_empty(GHookList *hook_list)
 313{
 314    GHook *hook = g_hook_first_valid(hook_list, TRUE);
 315
 316    if (!hook) {
 317        return true;
 318    }
 319
 320    g_hook_unref(hook_list, hook);
 321    return false;
 322}
 323
 324void qtest_add_abrt_handler(GHookFunc fn, const void *data)
 325{
 326    GHook *hook;
 327
 328    if (!abrt_hooks.is_setup) {
 329        g_hook_list_init(&abrt_hooks, sizeof(GHook));
 330    }
 331
 332    /* Only install SIGABRT handler once */
 333    if (hook_list_is_empty(&abrt_hooks)) {
 334        setup_sigabrt_handler();
 335    }
 336
 337    hook = g_hook_alloc(&abrt_hooks);
 338    hook->func = fn;
 339    hook->data = (void *)data;
 340
 341    g_hook_prepend(&abrt_hooks, hook);
 342}
 343
 344void qtest_remove_abrt_handler(void *data)
 345{
 346    GHook *hook = g_hook_find_data(&abrt_hooks, TRUE, data);
 347
 348    if (!hook) {
 349        return;
 350    }
 351
 352    g_hook_destroy_link(&abrt_hooks, hook);
 353
 354    /* Uninstall SIGABRT handler on last instance */
 355    if (hook_list_is_empty(&abrt_hooks)) {
 356        cleanup_sigabrt_handler();
 357    }
 358}
 359
 360static const char *qtest_qemu_binary(const char *var)
 361{
 362    const char *qemu_bin;
 363
 364    if (var) {
 365        qemu_bin = getenv(var);
 366        if (qemu_bin) {
 367            return qemu_bin;
 368        }
 369    }
 370
 371    qemu_bin = getenv("QTEST_QEMU_BINARY");
 372    if (!qemu_bin) {
 373        fprintf(stderr, "Environment variable QTEST_QEMU_BINARY required\n");
 374        exit(1);
 375    }
 376
 377    return qemu_bin;
 378}
 379
 380#ifdef _WIN32
 381static pid_t qtest_create_process(char *cmd)
 382{
 383    STARTUPINFO si;
 384    PROCESS_INFORMATION pi;
 385    BOOL ret;
 386
 387    ZeroMemory(&si, sizeof(si));
 388    si.cb = sizeof(si);
 389    ZeroMemory(&pi, sizeof(pi));
 390
 391    ret = CreateProcess(NULL,   /* module name */
 392                        cmd,    /* command line */
 393                        NULL,   /* process handle not inheritable */
 394                        NULL,   /* thread handle not inheritable */
 395                        FALSE,  /* set handle inheritance to FALSE */
 396                        0,      /* No creation flags */
 397                        NULL,   /* use parent's environment block */
 398                        NULL,   /* use parent's starting directory */
 399                        &si,    /* pointer to STARTUPINFO structure */
 400                        &pi     /* pointer to PROCESS_INFORMATION structure */
 401                        );
 402    if (ret == 0) {
 403        fprintf(stderr, "%s:%d: unable to create a new process (%s)\n",
 404                __FILE__, __LINE__, strerror(GetLastError()));
 405        abort();
 406    }
 407
 408    return (pid_t)pi.hProcess;
 409}
 410#endif /* _WIN32 */
 411
 412static QTestState *G_GNUC_PRINTF(2, 3) qtest_spawn_qemu(const char *qemu_bin,
 413                                                        const char *fmt, ...)
 414{
 415    va_list ap;
 416    QTestState *s = g_new0(QTestState, 1);
 417    const char *trace = g_getenv("QTEST_TRACE");
 418    g_autofree char *tracearg = trace ?
 419        g_strdup_printf("-trace %s ", trace) : g_strdup("");
 420    g_autoptr(GString) command = g_string_new("");
 421
 422    va_start(ap, fmt);
 423    g_string_append_printf(command, CMD_EXEC "%s %s", qemu_bin, tracearg);
 424    g_string_append_vprintf(command, fmt, ap);
 425    va_end(ap);
 426
 427    qtest_add_abrt_handler(kill_qemu_hook_func, s);
 428
 429    if (!silence_spawn_log) {
 430        g_test_message("starting QEMU: %s", command->str);
 431    }
 432
 433#ifndef _WIN32
 434    s->qemu_pid = fork();
 435    if (s->qemu_pid == 0) {
 436#ifdef __linux__
 437        /*
 438         * Although we register a ABRT handler to kill off QEMU
 439         * when g_assert() triggers, we want an extra safety
 440         * net. The QEMU process might be non-functional and
 441         * thus not have responded to SIGTERM. The test script
 442         * might also have crashed with SEGV, in which case the
 443         * cleanup handlers won't ever run.
 444         *
 445         * This PR_SET_PDEATHSIG setup will ensure any remaining
 446         * QEMU will get terminated with SIGKILL in these cases.
 447         */
 448        prctl(PR_SET_PDEATHSIG, SIGKILL, 0, 0, 0);
 449#endif /* __linux__ */
 450#ifdef __FreeBSD__
 451        int sig = SIGKILL;
 452        procctl(P_PID, getpid(), PROC_PDEATHSIG_CTL, &sig);
 453#endif /* __FreeBSD__ */
 454        execlp("/bin/sh", "sh", "-c", command->str, NULL);
 455        exit(1);
 456    }
 457#else
 458    s->qemu_pid = qtest_create_process(command->str);
 459#endif /* _WIN32 */
 460
 461    return s;
 462}
 463
 464static char *qtest_socket_path(const char *suffix)
 465{
 466    return g_strdup_printf("%s/qtest-%d.%s", g_get_tmp_dir(), getpid(), suffix);
 467}
 468
 469static QTestState *qtest_init_internal(const char *qemu_bin,
 470                                       const char *extra_args,
 471                                       bool do_connect)
 472{
 473    QTestState *s;
 474    int sock, qmpsock, i;
 475    g_autofree gchar *socket_path = qtest_socket_path("sock");
 476    g_autofree gchar *qmp_socket_path = qtest_socket_path("qmp");
 477
 478    /*
 479     * It's possible that if an earlier test run crashed it might
 480     * have left a stale unix socket lying around. Delete any
 481     * stale old socket to avoid spurious test failures with
 482     * tests/libqtest.c:70:init_socket: assertion failed (ret != -1): (-1 != -1)
 483     */
 484    unlink(socket_path);
 485    unlink(qmp_socket_path);
 486
 487    socket_init();
 488    sock = init_socket(socket_path);
 489    qmpsock = init_socket(qmp_socket_path);
 490
 491    s = qtest_spawn_qemu(qemu_bin,
 492                         "-qtest unix:%s "
 493                         "-qtest-log %s "
 494                         "-chardev socket,path=%s,id=char0 "
 495                         "-mon chardev=char0,mode=control "
 496                         "-display none "
 497                         "-audio none "
 498                         "%s"
 499                         " -accel qtest",
 500                         socket_path,
 501                         getenv("QTEST_LOG") ? DEV_STDERR : DEV_NULL,
 502                         qmp_socket_path,
 503                         extra_args ?: "");
 504
 505    qtest_client_set_rx_handler(s, qtest_client_socket_recv_line);
 506    qtest_client_set_tx_handler(s, qtest_client_socket_send);
 507
 508    s->rx = g_string_new("");
 509    for (i = 0; i < MAX_IRQ; i++) {
 510        s->irq_level[i] = false;
 511    }
 512
 513    s->fd = -1;
 514    s->qmp_fd = -1;
 515    s->sock = sock;
 516    s->qmpsock = qmpsock;
 517    if (do_connect) {
 518        qtest_connect(s);
 519    }
 520
 521    /*
 522     * Stopping QEMU for debugging is not supported on Windows.
 523     *
 524     * Using DebugActiveProcess() API can suspend the QEMU process,
 525     * but gdb cannot attach to the process. Using the undocumented
 526     * NtSuspendProcess() can suspend the QEMU process and gdb can
 527     * attach to the process, but gdb cannot resume it.
 528     */
 529#ifndef _WIN32
 530    if (getenv("QTEST_STOP")) {
 531        kill(s->qemu_pid, SIGSTOP);
 532    }
 533#endif
 534
 535   return s;
 536}
 537
 538void qtest_connect(QTestState *s)
 539{
 540    g_autofree gchar *socket_path = qtest_socket_path("sock");
 541    g_autofree gchar *qmp_socket_path = qtest_socket_path("qmp");
 542
 543    g_assert(s->sock >= 0 && s->qmpsock >= 0);
 544    s->fd = socket_accept(s->sock);
 545    if (s->fd >= 0) {
 546        s->qmp_fd = socket_accept(s->qmpsock);
 547    }
 548    unlink(socket_path);
 549    unlink(qmp_socket_path);
 550    g_assert(s->fd >= 0 && s->qmp_fd >= 0);
 551    s->sock = s->qmpsock = -1;
 552    /* ask endianness of the target */
 553    s->big_endian = qtest_query_target_endianness(s);
 554}
 555
 556QTestState *qtest_init_without_qmp_handshake(const char *extra_args)
 557{
 558    return qtest_init_internal(qtest_qemu_binary(NULL), extra_args, true);
 559}
 560
 561void qtest_qmp_handshake(QTestState *s, QList *capabilities)
 562{
 563    /* Read the QMP greeting and then do the handshake */
 564    QDict *greeting = qtest_qmp_receive(s);
 565    qobject_unref(greeting);
 566
 567    if (capabilities) {
 568        qtest_qmp_assert_success(s,
 569                                 "{ 'execute': 'qmp_capabilities', "
 570                                 "'arguments': { 'enable': %p } }",
 571                                 qobject_ref(capabilities));
 572    } else {
 573        qtest_qmp_assert_success(s, "{ 'execute': 'qmp_capabilities' }");
 574    }
 575}
 576
 577QTestState *qtest_init_ext(const char *var, const char *extra_args,
 578                           QList *capabilities, bool do_connect)
 579{
 580    QTestState *s = qtest_init_internal(qtest_qemu_binary(var), extra_args,
 581                                        do_connect);
 582
 583    if (do_connect) {
 584        qtest_qmp_handshake(s, capabilities);
 585    } else {
 586        /*
 587         * If the connection is delayed, the capabilities must be set
 588         * at that moment.
 589         */
 590        assert(!capabilities);
 591    }
 592    return s;
 593}
 594
 595QTestState *qtest_init(const char *extra_args)
 596{
 597    return qtest_init_ext(NULL, extra_args, NULL, true);
 598}
 599
 600QTestState *qtest_vinitf(const char *fmt, va_list ap)
 601{
 602    char *args = g_strdup_vprintf(fmt, ap);
 603    QTestState *s;
 604
 605    s = qtest_init(args);
 606    g_free(args);
 607    return s;
 608}
 609
 610QTestState *qtest_initf(const char *fmt, ...)
 611{
 612    va_list ap;
 613    QTestState *s;
 614
 615    va_start(ap, fmt);
 616    s = qtest_vinitf(fmt, ap);
 617    va_end(ap);
 618    return s;
 619}
 620
 621QTestState *qtest_init_with_serial(const char *extra_args, int *sock_fd)
 622{
 623    int sock_fd_init;
 624    g_autofree char *sock_dir = NULL;
 625    char *sock_path;
 626    QTestState *qts;
 627
 628    sock_dir = g_dir_make_tmp("qtest-serial-XXXXXX", NULL);
 629    g_assert_true(sock_dir != NULL);
 630    sock_path = g_strdup_printf("%s/sock", sock_dir);
 631
 632    socket_init();
 633    sock_fd_init = init_socket(sock_path);
 634
 635    qts = qtest_initf("-chardev socket,id=s0,path=%s -serial chardev:s0 %s",
 636                      sock_path, extra_args);
 637
 638    *sock_fd = socket_accept(sock_fd_init);
 639
 640    unlink(sock_path);
 641    g_free(sock_path);
 642    rmdir(sock_dir);
 643
 644    g_assert_true(*sock_fd >= 0);
 645
 646    return qts;
 647}
 648
 649void qtest_quit(QTestState *s)
 650{
 651    qtest_remove_abrt_handler(s);
 652
 653    qtest_kill_qemu(s);
 654    close(s->fd);
 655    close(s->qmp_fd);
 656    g_string_free(s->rx, true);
 657
 658    for (GList *it = s->pending_events; it != NULL; it = it->next) {
 659        qobject_unref((QDict *)it->data);
 660    }
 661
 662    g_list_free(s->pending_events);
 663
 664    g_free(s);
 665}
 666
 667static void socket_send(int fd, const char *buf, size_t size)
 668{
 669    ssize_t res = qemu_send_full(fd, buf, size);
 670
 671    assert(res == size);
 672}
 673
 674static void qtest_client_socket_send(QTestState *s, const char *buf)
 675{
 676    socket_send(s->fd, buf, strlen(buf));
 677}
 678
 679static void G_GNUC_PRINTF(2, 3) qtest_sendf(QTestState *s, const char *fmt, ...)
 680{
 681    va_list ap;
 682
 683    va_start(ap, fmt);
 684    gchar *str = g_strdup_vprintf(fmt, ap);
 685    va_end(ap);
 686
 687    s->ops.send(s, str);
 688    g_free(str);
 689}
 690
 691static GString *qtest_client_socket_recv_line(QTestState *s)
 692{
 693    GString *line;
 694    size_t offset;
 695    char *eol;
 696
 697    while ((eol = strchr(s->rx->str, '\n')) == NULL) {
 698        ssize_t len;
 699        char buffer[1024];
 700
 701        len = recv(s->fd, buffer, sizeof(buffer), 0);
 702        if (len == -1 && errno == EINTR) {
 703            continue;
 704        }
 705
 706        if (len == -1 || len == 0) {
 707            fprintf(stderr, "Broken pipe\n");
 708            abort();
 709        }
 710
 711        g_string_append_len(s->rx, buffer, len);
 712    }
 713
 714    offset = eol - s->rx->str;
 715    line = g_string_new_len(s->rx->str, offset);
 716    g_string_erase(s->rx, 0, offset + 1);
 717
 718    return line;
 719}
 720
 721static gchar **qtest_rsp_args(QTestState *s, int expected_args)
 722{
 723    GString *line;
 724    gchar **words;
 725    int i;
 726
 727redo:
 728    line = s->ops.recv_line(s);
 729    words = g_strsplit(line->str, " ", 0);
 730    g_string_free(line, TRUE);
 731
 732    if (strcmp(words[0], "IRQ") == 0) {
 733        long irq;
 734        int ret;
 735
 736        g_assert(words[1] != NULL);
 737        g_assert(words[2] != NULL);
 738
 739        ret = qemu_strtol(words[2], NULL, 0, &irq);
 740        g_assert(!ret);
 741        g_assert_cmpint(irq, >=, 0);
 742        g_assert_cmpint(irq, <, MAX_IRQ);
 743
 744        if (strcmp(words[1], "raise") == 0) {
 745            s->irq_level[irq] = true;
 746        } else {
 747            s->irq_level[irq] = false;
 748        }
 749
 750        g_strfreev(words);
 751        goto redo;
 752    }
 753
 754    g_assert(words[0] != NULL);
 755    g_assert_cmpstr(words[0], ==, "OK");
 756
 757    for (i = 0; i < expected_args; i++) {
 758        g_assert(words[i] != NULL);
 759    }
 760
 761    return words;
 762}
 763
 764static void qtest_rsp(QTestState *s)
 765{
 766    gchar **words = qtest_rsp_args(s, 0);
 767
 768    g_strfreev(words);
 769}
 770
 771static int qtest_query_target_endianness(QTestState *s)
 772{
 773    gchar **args;
 774    int big_endian;
 775
 776    qtest_sendf(s, "endianness\n");
 777    args = qtest_rsp_args(s, 1);
 778    g_assert(strcmp(args[1], "big") == 0 || strcmp(args[1], "little") == 0);
 779    big_endian = strcmp(args[1], "big") == 0;
 780    g_strfreev(args);
 781
 782    return big_endian;
 783}
 784
 785QDict *qtest_qmp_receive(QTestState *s)
 786{
 787    while (true) {
 788        QDict *response = qtest_qmp_receive_dict(s);
 789
 790        if (!qdict_get_try_str(response, "event")) {
 791            return response;
 792        }
 793
 794        if (!s->eventCB ||
 795            !s->eventCB(s, qdict_get_str(response, "event"),
 796                        response, s->eventData)) {
 797            /* Stash the event for a later consumption */
 798            s->pending_events = g_list_append(s->pending_events, response);
 799        } else {
 800            qobject_unref(response);
 801        }
 802    }
 803}
 804
 805QDict *qtest_qmp_receive_dict(QTestState *s)
 806{
 807    g_assert(s->qmp_fd >= 0);
 808    return qmp_fd_receive(s->qmp_fd);
 809}
 810
 811int qtest_socket_server(const char *socket_path)
 812{
 813    struct sockaddr_un addr;
 814    int sock;
 815    int ret;
 816
 817    sock = socket(PF_UNIX, SOCK_STREAM, 0);
 818    g_assert_cmpint(sock, !=, -1);
 819
 820    addr.sun_family = AF_UNIX;
 821    snprintf(addr.sun_path, sizeof(addr.sun_path), "%s", socket_path);
 822
 823    ret = RETRY_ON_EINTR(bind(sock, (struct sockaddr *)&addr, sizeof(addr)));
 824    g_assert_cmpint(ret, !=, -1);
 825    ret = listen(sock, 1);
 826    g_assert_cmpint(ret, !=, -1);
 827
 828    return sock;
 829}
 830
 831#ifndef _WIN32
 832void qtest_qmp_vsend_fds(QTestState *s, int *fds, size_t fds_num,
 833                         const char *fmt, va_list ap)
 834{
 835    g_assert(s->qmp_fd >= 0);
 836    qmp_fd_vsend_fds(s->qmp_fd, fds, fds_num, fmt, ap);
 837}
 838#endif
 839
 840void qtest_qmp_vsend(QTestState *s, const char *fmt, va_list ap)
 841{
 842    g_assert(s->qmp_fd >= 0);
 843    qmp_fd_vsend(s->qmp_fd, fmt, ap);
 844}
 845
 846#ifndef _WIN32
 847QDict *qtest_vqmp_fds(QTestState *s, int *fds, size_t fds_num,
 848                      const char *fmt, va_list ap)
 849{
 850    qtest_qmp_vsend_fds(s, fds, fds_num, fmt, ap);
 851
 852    /* Receive reply */
 853    return qtest_qmp_receive(s);
 854}
 855#endif
 856
 857QDict *qtest_vqmp(QTestState *s, const char *fmt, va_list ap)
 858{
 859    qtest_qmp_vsend(s, fmt, ap);
 860
 861    /* Receive reply */
 862    return qtest_qmp_receive(s);
 863}
 864
 865#ifndef _WIN32
 866QDict *qtest_qmp_fds(QTestState *s, int *fds, size_t fds_num,
 867                     const char *fmt, ...)
 868{
 869    va_list ap;
 870    QDict *response;
 871
 872    va_start(ap, fmt);
 873    response = qtest_vqmp_fds(s, fds, fds_num, fmt, ap);
 874    va_end(ap);
 875    return response;
 876}
 877#endif
 878
 879QDict *qtest_qmp(QTestState *s, const char *fmt, ...)
 880{
 881    va_list ap;
 882    QDict *response;
 883
 884    va_start(ap, fmt);
 885    response = qtest_vqmp(s, fmt, ap);
 886    va_end(ap);
 887    return response;
 888}
 889
 890void qtest_qmp_send(QTestState *s, const char *fmt, ...)
 891{
 892    va_list ap;
 893
 894    va_start(ap, fmt);
 895    qtest_qmp_vsend(s, fmt, ap);
 896    va_end(ap);
 897}
 898
 899void qtest_qmp_send_raw(QTestState *s, const char *fmt, ...)
 900{
 901    va_list ap;
 902
 903    g_assert(s->qmp_fd >= 0);
 904    va_start(ap, fmt);
 905    qmp_fd_vsend_raw(s->qmp_fd, fmt, ap);
 906    va_end(ap);
 907}
 908
 909void qtest_qmp_set_event_callback(QTestState *s,
 910                                  QTestQMPEventCallback cb, void *opaque)
 911{
 912    s->eventCB = cb;
 913    s->eventData = opaque;
 914}
 915
 916QDict *qtest_qmp_event_ref(QTestState *s, const char *event)
 917{
 918    while (s->pending_events) {
 919
 920        GList *first = s->pending_events;
 921        QDict *response = (QDict *)first->data;
 922
 923        s->pending_events = g_list_delete_link(s->pending_events, first);
 924
 925        if (!strcmp(qdict_get_str(response, "event"), event)) {
 926            return response;
 927        }
 928        qobject_unref(response);
 929    }
 930    return NULL;
 931}
 932
 933QDict *qtest_qmp_eventwait_ref(QTestState *s, const char *event)
 934{
 935    QDict *response = qtest_qmp_event_ref(s, event);
 936
 937    if (response) {
 938        return response;
 939    }
 940
 941    for (;;) {
 942        response = qtest_qmp_receive_dict(s);
 943        if ((qdict_haskey(response, "event")) &&
 944            (strcmp(qdict_get_str(response, "event"), event) == 0)) {
 945            return response;
 946        }
 947        qobject_unref(response);
 948    }
 949}
 950
 951void qtest_qmp_eventwait(QTestState *s, const char *event)
 952{
 953    QDict *response;
 954
 955    response = qtest_qmp_eventwait_ref(s, event);
 956    qobject_unref(response);
 957}
 958
 959char *qtest_vhmp(QTestState *s, const char *fmt, va_list ap)
 960{
 961    char *cmd;
 962    QDict *resp;
 963    char *ret;
 964
 965    cmd = g_strdup_vprintf(fmt, ap);
 966    resp = qtest_qmp(s, "{'execute': 'human-monitor-command',"
 967                     " 'arguments': {'command-line': %s}}",
 968                     cmd);
 969    ret = g_strdup(qdict_get_try_str(resp, "return"));
 970    g_assert(ret);
 971    qobject_unref(resp);
 972    g_free(cmd);
 973    return ret;
 974}
 975
 976char *qtest_hmp(QTestState *s, const char *fmt, ...)
 977{
 978    va_list ap;
 979    char *ret;
 980
 981    va_start(ap, fmt);
 982    ret = qtest_vhmp(s, fmt, ap);
 983    va_end(ap);
 984    return ret;
 985}
 986
 987const char *qtest_get_arch(void)
 988{
 989    const char *qemu = qtest_qemu_binary(NULL);
 990    const char *end = strrchr(qemu, '-');
 991
 992    if (!end) {
 993        fprintf(stderr, "Can't determine architecture from binary name.\n");
 994        exit(1);
 995    }
 996
 997    if (!strstr(qemu, "-system-")) {
 998        fprintf(stderr, "QTEST_QEMU_BINARY must end with *-system-<arch> "
 999                "where 'arch' is the target\narchitecture (x86_64, aarch64, "
1000                "etc).\n");
1001        exit(1);
1002    }
1003
1004    return end + 1;
1005}
1006
1007static bool qtest_qom_has_concrete_type(const char *parent_typename,
1008                                        const char *child_typename,
1009                                        QList **cached_list)
1010{
1011    QList *list = cached_list ? *cached_list : NULL;
1012    const QListEntry *p;
1013    QObject *qobj;
1014    QString *qstr;
1015    QDict *devinfo;
1016    int idx;
1017
1018    if (!list) {
1019        QDict *resp;
1020        QDict *args;
1021        QTestState *qts = qtest_init("-machine none");
1022
1023        args = qdict_new();
1024        qdict_put_bool(args, "abstract", false);
1025        qdict_put_str(args, "implements", parent_typename);
1026
1027        resp = qtest_qmp(qts, "{'execute': 'qom-list-types', 'arguments': %p }",
1028                         args);
1029        g_assert(qdict_haskey(resp, "return"));
1030        list = qdict_get_qlist(resp, "return");
1031        qobject_ref(list);
1032        qobject_unref(resp);
1033
1034        qtest_quit(qts);
1035
1036        if (cached_list) {
1037            *cached_list = list;
1038        }
1039    }
1040
1041    for (p = qlist_first(list), idx = 0; p; p = qlist_next(p), idx++) {
1042        devinfo = qobject_to(QDict, qlist_entry_obj(p));
1043        g_assert(devinfo);
1044
1045        qobj = qdict_get(devinfo, "name");
1046        g_assert(qobj);
1047        qstr = qobject_to(QString, qobj);
1048        g_assert(qstr);
1049        if (g_str_equal(qstring_get_str(qstr), child_typename)) {
1050            return true;
1051        }
1052    }
1053
1054    return false;
1055}
1056
1057bool qtest_has_accel(const char *accel_name)
1058{
1059    static QList *list;
1060    g_autofree char *accel_type = NULL;
1061
1062    if (g_str_equal(accel_name, "kvm")) {
1063        int i;
1064        const char *arch = qtest_get_arch();
1065        const char *targets[] = { CONFIG_KVM_TARGETS };
1066
1067        for (i = 0; i < ARRAY_SIZE(targets); i++) {
1068            if (!strncmp(targets[i], arch, strlen(arch))) {
1069                if (!access("/dev/kvm", R_OK | W_OK)) {
1070                    return true;
1071                }
1072            }
1073        }
1074        return false;
1075    }
1076
1077    accel_type = g_strconcat(accel_name, ACCEL_CLASS_SUFFIX, NULL);
1078
1079    return qtest_qom_has_concrete_type("accel", accel_type, &list);
1080}
1081
1082bool qtest_get_irq(QTestState *s, int num)
1083{
1084    /* dummy operation in order to make sure irq is up to date */
1085    qtest_inb(s, 0);
1086
1087    return s->irq_level[num];
1088}
1089
1090void qtest_module_load(QTestState *s, const char *prefix, const char *libname)
1091{
1092    qtest_sendf(s, "module_load %s %s\n", prefix, libname);
1093    qtest_rsp(s);
1094}
1095
1096static int64_t qtest_clock_rsp(QTestState *s)
1097{
1098    gchar **words;
1099    int64_t clock;
1100    words = qtest_rsp_args(s, 2);
1101    clock = g_ascii_strtoll(words[1], NULL, 0);
1102    g_strfreev(words);
1103    return clock;
1104}
1105
1106int64_t qtest_clock_step_next(QTestState *s)
1107{
1108    qtest_sendf(s, "clock_step\n");
1109    return qtest_clock_rsp(s);
1110}
1111
1112int64_t qtest_clock_step(QTestState *s, int64_t step)
1113{
1114    qtest_sendf(s, "clock_step %"PRIi64"\n", step);
1115    return qtest_clock_rsp(s);
1116}
1117
1118int64_t qtest_clock_set(QTestState *s, int64_t val)
1119{
1120    qtest_sendf(s, "clock_set %"PRIi64"\n", val);
1121    return qtest_clock_rsp(s);
1122}
1123
1124void qtest_irq_intercept_out(QTestState *s, const char *qom_path)
1125{
1126    qtest_sendf(s, "irq_intercept_out %s\n", qom_path);
1127    qtest_rsp(s);
1128}
1129
1130void qtest_irq_intercept_out_named(QTestState *s, const char *qom_path, const char *name)
1131{
1132    qtest_sendf(s, "irq_intercept_out %s %s\n", qom_path, name);
1133    qtest_rsp(s);
1134}
1135
1136void qtest_irq_intercept_in(QTestState *s, const char *qom_path)
1137{
1138    qtest_sendf(s, "irq_intercept_in %s\n", qom_path);
1139    qtest_rsp(s);
1140}
1141
1142void qtest_set_irq_in(QTestState *s, const char *qom_path, const char *name,
1143                      int num, int level)
1144{
1145    if (!name) {
1146        name = "unnamed-gpio-in";
1147    }
1148    qtest_sendf(s, "set_irq_in %s %s %d %d\n", qom_path, name, num, level);
1149    qtest_rsp(s);
1150}
1151
1152static void qtest_out(QTestState *s, const char *cmd, uint16_t addr, uint32_t value)
1153{
1154    qtest_sendf(s, "%s 0x%x 0x%x\n", cmd, addr, value);
1155    qtest_rsp(s);
1156}
1157
1158void qtest_outb(QTestState *s, uint16_t addr, uint8_t value)
1159{
1160    qtest_out(s, "outb", addr, value);
1161}
1162
1163void qtest_outw(QTestState *s, uint16_t addr, uint16_t value)
1164{
1165    qtest_out(s, "outw", addr, value);
1166}
1167
1168void qtest_outl(QTestState *s, uint16_t addr, uint32_t value)
1169{
1170    qtest_out(s, "outl", addr, value);
1171}
1172
1173static uint32_t qtest_in(QTestState *s, const char *cmd, uint16_t addr)
1174{
1175    gchar **args;
1176    int ret;
1177    unsigned long value;
1178
1179    qtest_sendf(s, "%s 0x%x\n", cmd, addr);
1180    args = qtest_rsp_args(s, 2);
1181    ret = qemu_strtoul(args[1], NULL, 0, &value);
1182    g_assert(!ret && value <= UINT32_MAX);
1183    g_strfreev(args);
1184
1185    return value;
1186}
1187
1188uint8_t qtest_inb(QTestState *s, uint16_t addr)
1189{
1190    return qtest_in(s, "inb", addr);
1191}
1192
1193uint16_t qtest_inw(QTestState *s, uint16_t addr)
1194{
1195    return qtest_in(s, "inw", addr);
1196}
1197
1198uint32_t qtest_inl(QTestState *s, uint16_t addr)
1199{
1200    return qtest_in(s, "inl", addr);
1201}
1202
1203static void qtest_write(QTestState *s, const char *cmd, uint64_t addr,
1204                        uint64_t value)
1205{
1206    qtest_sendf(s, "%s 0x%" PRIx64 " 0x%" PRIx64 "\n", cmd, addr, value);
1207    qtest_rsp(s);
1208}
1209
1210void qtest_writeb(QTestState *s, uint64_t addr, uint8_t value)
1211{
1212    qtest_write(s, "writeb", addr, value);
1213}
1214
1215void qtest_writew(QTestState *s, uint64_t addr, uint16_t value)
1216{
1217    qtest_write(s, "writew", addr, value);
1218}
1219
1220void qtest_writel(QTestState *s, uint64_t addr, uint32_t value)
1221{
1222    qtest_write(s, "writel", addr, value);
1223}
1224
1225void qtest_writeq(QTestState *s, uint64_t addr, uint64_t value)
1226{
1227    qtest_write(s, "writeq", addr, value);
1228}
1229
1230static uint64_t qtest_read(QTestState *s, const char *cmd, uint64_t addr)
1231{
1232    gchar **args;
1233    int ret;
1234    uint64_t value;
1235
1236    qtest_sendf(s, "%s 0x%" PRIx64 "\n", cmd, addr);
1237    args = qtest_rsp_args(s, 2);
1238    ret = qemu_strtou64(args[1], NULL, 0, &value);
1239    g_assert(!ret);
1240    g_strfreev(args);
1241
1242    return value;
1243}
1244
1245uint8_t qtest_readb(QTestState *s, uint64_t addr)
1246{
1247    return qtest_read(s, "readb", addr);
1248}
1249
1250uint16_t qtest_readw(QTestState *s, uint64_t addr)
1251{
1252    return qtest_read(s, "readw", addr);
1253}
1254
1255uint32_t qtest_readl(QTestState *s, uint64_t addr)
1256{
1257    return qtest_read(s, "readl", addr);
1258}
1259
1260uint64_t qtest_readq(QTestState *s, uint64_t addr)
1261{
1262    return qtest_read(s, "readq", addr);
1263}
1264
1265static int hex2nib(char ch)
1266{
1267    if (ch >= '0' && ch <= '9') {
1268        return ch - '0';
1269    } else if (ch >= 'a' && ch <= 'f') {
1270        return 10 + (ch - 'a');
1271    } else if (ch >= 'A' && ch <= 'F') {
1272        return 10 + (ch - 'a');
1273    } else {
1274        return -1;
1275    }
1276}
1277
1278void qtest_memread(QTestState *s, uint64_t addr, void *data, size_t size)
1279{
1280    uint8_t *ptr = data;
1281    gchar **args;
1282    size_t i;
1283
1284    if (!size) {
1285        return;
1286    }
1287
1288    qtest_sendf(s, "read 0x%" PRIx64 " 0x%zx\n", addr, size);
1289    args = qtest_rsp_args(s, 2);
1290
1291    for (i = 0; i < size; i++) {
1292        ptr[i] = hex2nib(args[1][2 + (i * 2)]) << 4;
1293        ptr[i] |= hex2nib(args[1][2 + (i * 2) + 1]);
1294    }
1295
1296    g_strfreev(args);
1297}
1298
1299uint64_t qtest_rtas_call(QTestState *s, const char *name,
1300                         uint32_t nargs, uint64_t args,
1301                         uint32_t nret, uint64_t ret)
1302{
1303    qtest_sendf(s, "rtas %s %u 0x%"PRIx64" %u 0x%"PRIx64"\n",
1304                name, nargs, args, nret, ret);
1305    qtest_rsp(s);
1306    return 0;
1307}
1308
1309static void qtest_rsp_csr(QTestState *s, uint64_t *val)
1310{
1311    gchar **args;
1312    uint64_t ret;
1313    int rc;
1314
1315    args = qtest_rsp_args(s, 3);
1316
1317    rc = qemu_strtou64(args[1], NULL, 16, &ret);
1318    g_assert(rc == 0);
1319    rc = qemu_strtou64(args[2], NULL, 16, val);
1320    g_assert(rc == 0);
1321
1322    g_strfreev(args);
1323}
1324
1325uint64_t qtest_csr_call(QTestState *s, const char *name,
1326                         uint64_t cpu, int csr,
1327                         uint64_t *val)
1328{
1329    qtest_sendf(s, "csr %s 0x%"PRIx64" %d 0x%"PRIx64"\n",
1330                    name, cpu, csr, *val);
1331
1332    qtest_rsp_csr(s, val);
1333    return 0;
1334}
1335
1336void qtest_add_func(const char *str, void (*fn)(void))
1337{
1338    gchar *path = g_strdup_printf("/%s/%s", qtest_get_arch(), str);
1339    g_test_add_func(path, fn);
1340    g_free(path);
1341}
1342
1343void qtest_add_data_func_full(const char *str, void *data,
1344                              void (*fn)(const void *),
1345                              GDestroyNotify data_free_func)
1346{
1347    gchar *path = g_strdup_printf("/%s/%s", qtest_get_arch(), str);
1348    g_test_add_data_func_full(path, data, fn, data_free_func);
1349    g_free(path);
1350}
1351
1352void qtest_add_data_func(const char *str, const void *data,
1353                         void (*fn)(const void *))
1354{
1355    gchar *path = g_strdup_printf("/%s/%s", qtest_get_arch(), str);
1356    g_test_add_data_func(path, data, fn);
1357    g_free(path);
1358}
1359
1360void qtest_bufwrite(QTestState *s, uint64_t addr, const void *data, size_t size)
1361{
1362    gchar *bdata;
1363
1364    bdata = g_base64_encode(data, size);
1365    qtest_sendf(s, "b64write 0x%" PRIx64 " 0x%zx ", addr, size);
1366    s->ops.send(s, bdata);
1367    s->ops.send(s, "\n");
1368    qtest_rsp(s);
1369    g_free(bdata);
1370}
1371
1372void qtest_bufread(QTestState *s, uint64_t addr, void *data, size_t size)
1373{
1374    gchar **args;
1375    size_t len;
1376
1377    qtest_sendf(s, "b64read 0x%" PRIx64 " 0x%zx\n", addr, size);
1378    args = qtest_rsp_args(s, 2);
1379
1380    g_base64_decode_inplace(args[1], &len);
1381    if (size != len) {
1382        fprintf(stderr, "bufread: asked for %zu bytes but decoded %zu\n",
1383                size, len);
1384        len = MIN(len, size);
1385    }
1386
1387    memcpy(data, args[1], len);
1388    g_strfreev(args);
1389}
1390
1391void qtest_memwrite(QTestState *s, uint64_t addr, const void *data, size_t size)
1392{
1393    const uint8_t *ptr = data;
1394    size_t i;
1395    char *enc;
1396
1397    if (!size) {
1398        return;
1399    }
1400
1401    enc = g_malloc(2 * size + 1);
1402
1403    for (i = 0; i < size; i++) {
1404        sprintf(&enc[i * 2], "%02x", ptr[i]);
1405    }
1406
1407    qtest_sendf(s, "write 0x%" PRIx64 " 0x%zx 0x%s\n", addr, size, enc);
1408    qtest_rsp(s);
1409    g_free(enc);
1410}
1411
1412void qtest_memset(QTestState *s, uint64_t addr, uint8_t pattern, size_t size)
1413{
1414    qtest_sendf(s, "memset 0x%" PRIx64 " 0x%zx 0x%02x\n", addr, size, pattern);
1415    qtest_rsp(s);
1416}
1417
1418QDict *qtest_vqmp_assert_failure_ref(QTestState *qts,
1419                                     const char *fmt, va_list args)
1420{
1421    QDict *response;
1422    QDict *ret;
1423
1424    response = qtest_vqmp(qts, fmt, args);
1425
1426    g_assert(response);
1427    if (!qdict_haskey(response, "error")) {
1428        g_autoptr(GString) s = qobject_to_json_pretty(QOBJECT(response), true);
1429        g_test_message("%s", s->str);
1430    }
1431    g_assert(qdict_haskey(response, "error"));
1432    g_assert(!qdict_haskey(response, "return"));
1433    ret = qdict_get_qdict(response, "error");
1434    qobject_ref(ret);
1435    qobject_unref(response);
1436
1437    return ret;
1438}
1439
1440QDict *qtest_vqmp_assert_success_ref(QTestState *qts,
1441                                     const char *fmt, va_list args)
1442{
1443    QDict *response;
1444    QDict *ret;
1445
1446    response = qtest_vqmp(qts, fmt, args);
1447
1448    g_assert(response);
1449    if (!qdict_haskey(response, "return")) {
1450        g_autoptr(GString) s = qobject_to_json_pretty(QOBJECT(response), true);
1451        g_test_message("%s", s->str);
1452    }
1453    g_assert(qdict_haskey(response, "return"));
1454    ret = qdict_get_qdict(response, "return");
1455    qobject_ref(ret);
1456    qobject_unref(response);
1457
1458    return ret;
1459}
1460
1461void qtest_vqmp_assert_success(QTestState *qts,
1462                               const char *fmt, va_list args)
1463{
1464    QDict *response;
1465
1466    response = qtest_vqmp_assert_success_ref(qts, fmt, args);
1467
1468    qobject_unref(response);
1469}
1470
1471#ifndef _WIN32
1472QDict *qtest_vqmp_fds_assert_success_ref(QTestState *qts, int *fds, size_t nfds,
1473                                         const char *fmt, va_list args)
1474{
1475    QDict *response;
1476    QDict *ret;
1477
1478    response = qtest_vqmp_fds(qts, fds, nfds, fmt, args);
1479
1480    g_assert(response);
1481    if (!qdict_haskey(response, "return")) {
1482        g_autoptr(GString) s = qobject_to_json_pretty(QOBJECT(response), true);
1483        g_test_message("%s", s->str);
1484    }
1485    g_assert(qdict_haskey(response, "return"));
1486    ret = qdict_get_qdict(response, "return");
1487    qobject_ref(ret);
1488    qobject_unref(response);
1489
1490    return ret;
1491}
1492
1493void qtest_vqmp_fds_assert_success(QTestState *qts, int *fds, size_t nfds,
1494                                   const char *fmt, va_list args)
1495{
1496    QDict *response;
1497    response = qtest_vqmp_fds_assert_success_ref(qts, fds, nfds, fmt, args);
1498    qobject_unref(response);
1499}
1500#endif /* !_WIN32 */
1501
1502QDict *qtest_qmp_assert_failure_ref(QTestState *qts, const char *fmt, ...)
1503{
1504    QDict *response;
1505    va_list ap;
1506
1507    va_start(ap, fmt);
1508    response = qtest_vqmp_assert_failure_ref(qts, fmt, ap);
1509    va_end(ap);
1510    return response;
1511}
1512
1513QDict *qtest_qmp_assert_success_ref(QTestState *qts, const char *fmt, ...)
1514{
1515    QDict *response;
1516    va_list ap;
1517    va_start(ap, fmt);
1518    response = qtest_vqmp_assert_success_ref(qts, fmt, ap);
1519    va_end(ap);
1520    return response;
1521}
1522
1523void qtest_qmp_assert_success(QTestState *qts, const char *fmt, ...)
1524{
1525    va_list ap;
1526    va_start(ap, fmt);
1527    qtest_vqmp_assert_success(qts, fmt, ap);
1528    va_end(ap);
1529}
1530
1531#ifndef _WIN32
1532QDict *qtest_qmp_fds_assert_success_ref(QTestState *qts, int *fds, size_t nfds,
1533                                        const char *fmt, ...)
1534{
1535    QDict *response;
1536    va_list ap;
1537    va_start(ap, fmt);
1538    response = qtest_vqmp_fds_assert_success_ref(qts, fds, nfds, fmt, ap);
1539    va_end(ap);
1540    return response;
1541}
1542
1543void qtest_qmp_fds_assert_success(QTestState *qts, int *fds, size_t nfds,
1544                                  const char *fmt, ...)
1545{
1546    va_list ap;
1547    va_start(ap, fmt);
1548    qtest_vqmp_fds_assert_success(qts, fds, nfds, fmt, ap);
1549    va_end(ap);
1550}
1551#endif /* !_WIN32 */
1552
1553bool qtest_big_endian(QTestState *s)
1554{
1555    return s->big_endian;
1556}
1557
1558static bool qtest_check_machine_version(const char *mname, const char *basename,
1559                                        int major, int minor)
1560{
1561    char *newname;
1562    bool is_equal;
1563
1564    newname = g_strdup_printf("%s-%i.%i", basename, major, minor);
1565    is_equal = g_str_equal(mname, newname);
1566    g_free(newname);
1567
1568    return is_equal;
1569}
1570
1571static bool qtest_is_old_versioned_machine(const char *mname)
1572{
1573    const char *dash = strrchr(mname, '-');
1574    const char *dot = strrchr(mname, '.');
1575    const char *chr;
1576    char *bname;
1577    const int major = QEMU_VERSION_MAJOR;
1578    const int minor = QEMU_VERSION_MINOR;
1579    bool res = false;
1580
1581    if (dash && dot && dot > dash) {
1582        for (chr = dash + 1; *chr; chr++) {
1583            if (!qemu_isdigit(*chr) && *chr != '.') {
1584                return false;
1585            }
1586        }
1587        /*
1588         * Now check if it is one of the latest versions. Check major + 1
1589         * and minor + 1 versions as well, since they might already exist
1590         * in the development branch.
1591         */
1592        bname = g_strdup(mname);
1593        bname[dash - mname] = 0;
1594        res = !qtest_check_machine_version(mname, bname, major + 1, 0) &&
1595              !qtest_check_machine_version(mname, bname, major, minor + 1) &&
1596              !qtest_check_machine_version(mname, bname, major, minor);
1597        g_free(bname);
1598    }
1599
1600    return res;
1601}
1602
1603struct MachInfo {
1604    char *name;
1605    char *alias;
1606};
1607
1608struct CpuModel {
1609    char *name;
1610    char *alias_of;
1611    bool deprecated;
1612};
1613
1614static void qtest_free_machine_list(struct MachInfo *machines)
1615{
1616    if (machines) {
1617        for (int i = 0; machines[i].name != NULL; i++) {
1618            g_free(machines[i].name);
1619            g_free(machines[i].alias);
1620        }
1621
1622        g_free(machines);
1623    }
1624}
1625
1626/*
1627 * Returns an array with pointers to the available machine names.
1628 * The terminating entry has the name set to NULL.
1629 */
1630static struct MachInfo *qtest_get_machines(const char *var)
1631{
1632    static struct MachInfo *machines;
1633    static char *qemu_var;
1634    QDict *response, *minfo;
1635    QList *list;
1636    const QListEntry *p;
1637    QObject *qobj;
1638    QString *qstr;
1639    QTestState *qts;
1640    int idx;
1641
1642    if (g_strcmp0(qemu_var, var)) {
1643        g_free(qemu_var);
1644        qemu_var = g_strdup(var);
1645
1646        /* new qemu, clear the cache */
1647        qtest_free_machine_list(machines);
1648        machines = NULL;
1649    }
1650
1651    if (machines) {
1652        return machines;
1653    }
1654
1655    silence_spawn_log = !g_test_verbose();
1656
1657    qts = qtest_init_ext(qemu_var, "-machine none", NULL, true);
1658    response = qtest_qmp(qts, "{ 'execute': 'query-machines' }");
1659    g_assert(response);
1660    list = qdict_get_qlist(response, "return");
1661    g_assert(list);
1662
1663    machines = g_new(struct MachInfo, qlist_size(list) + 1);
1664
1665    for (p = qlist_first(list), idx = 0; p; p = qlist_next(p), idx++) {
1666        minfo = qobject_to(QDict, qlist_entry_obj(p));
1667        g_assert(minfo);
1668
1669        qobj = qdict_get(minfo, "name");
1670        g_assert(qobj);
1671        qstr = qobject_to(QString, qobj);
1672        g_assert(qstr);
1673        machines[idx].name = g_strdup(qstring_get_str(qstr));
1674
1675        qobj = qdict_get(minfo, "alias");
1676        if (qobj) {                               /* The alias is optional */
1677            qstr = qobject_to(QString, qobj);
1678            g_assert(qstr);
1679            machines[idx].alias = g_strdup(qstring_get_str(qstr));
1680        } else {
1681            machines[idx].alias = NULL;
1682        }
1683    }
1684
1685    qtest_quit(qts);
1686    qobject_unref(response);
1687
1688    silence_spawn_log = false;
1689
1690    memset(&machines[idx], 0, sizeof(struct MachInfo)); /* Terminating entry */
1691    return machines;
1692}
1693
1694static struct CpuModel *qtest_get_cpu_models(void)
1695{
1696    static struct CpuModel *cpus;
1697    QDict *response, *minfo;
1698    QList *list;
1699    const QListEntry *p;
1700    QObject *qobj;
1701    QString *qstr;
1702    QBool *qbool;
1703    QTestState *qts;
1704    int idx;
1705
1706    if (cpus) {
1707        return cpus;
1708    }
1709
1710    silence_spawn_log = !g_test_verbose();
1711
1712    qts = qtest_init_ext(NULL, "-machine none", NULL, true);
1713    response = qtest_qmp(qts, "{ 'execute': 'query-cpu-definitions' }");
1714    g_assert(response);
1715    list = qdict_get_qlist(response, "return");
1716    g_assert(list);
1717
1718    cpus = g_new0(struct CpuModel, qlist_size(list) + 1);
1719
1720    for (p = qlist_first(list), idx = 0; p; p = qlist_next(p), idx++) {
1721        minfo = qobject_to(QDict, qlist_entry_obj(p));
1722        g_assert(minfo);
1723
1724        qobj = qdict_get(minfo, "name");
1725        g_assert(qobj);
1726        qstr = qobject_to(QString, qobj);
1727        g_assert(qstr);
1728        cpus[idx].name = g_strdup(qstring_get_str(qstr));
1729
1730        qobj = qdict_get(minfo, "alias_of");
1731        if (qobj) { /* old machines do not report aliases */
1732            qstr = qobject_to(QString, qobj);
1733            g_assert(qstr);
1734            cpus[idx].alias_of = g_strdup(qstring_get_str(qstr));
1735        } else {
1736            cpus[idx].alias_of = NULL;
1737        }
1738
1739        qobj = qdict_get(minfo, "deprecated");
1740        qbool = qobject_to(QBool, qobj);
1741        g_assert(qbool);
1742        cpus[idx].deprecated = qbool_get_bool(qbool);
1743    }
1744
1745    qtest_quit(qts);
1746    qobject_unref(response);
1747
1748    silence_spawn_log = false;
1749
1750    return cpus;
1751}
1752
1753bool qtest_has_cpu_model(const char *cpu)
1754{
1755    struct CpuModel *cpus;
1756    int i;
1757
1758    cpus = qtest_get_cpu_models();
1759
1760    for (i = 0; cpus[i].name != NULL; i++) {
1761        if (g_str_equal(cpu, cpus[i].name) ||
1762            (cpus[i].alias_of && g_str_equal(cpu, cpus[i].alias_of))) {
1763            return true;
1764        }
1765    }
1766
1767    return false;
1768}
1769
1770void qtest_cb_for_every_machine(void (*cb)(const char *machine),
1771                                bool skip_old_versioned)
1772{
1773    struct MachInfo *machines;
1774    int i;
1775
1776    machines = qtest_get_machines(NULL);
1777
1778    for (i = 0; machines[i].name != NULL; i++) {
1779        /* Ignore machines that cannot be used for qtests */
1780        if (!strncmp("xenfv", machines[i].name, 5) ||
1781            g_str_equal("xenpv", machines[i].name) ||
1782            g_str_equal("xenpvh", machines[i].name) ||
1783            g_str_equal("vmapple", machines[i].name) ||
1784            g_str_equal("nitro-enclave", machines[i].name)) {
1785            continue;
1786        }
1787        if (!skip_old_versioned ||
1788            !qtest_is_old_versioned_machine(machines[i].name)) {
1789            cb(machines[i].name);
1790        }
1791    }
1792}
1793
1794char *qtest_resolve_machine_alias(const char *var, const char *alias)
1795{
1796    struct MachInfo *machines;
1797    int i;
1798
1799    machines = qtest_get_machines(var);
1800
1801    for (i = 0; machines[i].name != NULL; i++) {
1802        if (machines[i].alias && g_str_equal(alias, machines[i].alias)) {
1803            return g_strdup(machines[i].name);
1804        }
1805    }
1806
1807    return NULL;
1808}
1809
1810bool qtest_has_machine_with_env(const char *var, const char *machine)
1811{
1812    struct MachInfo *machines;
1813    int i;
1814
1815    machines = qtest_get_machines(var);
1816
1817    for (i = 0; machines[i].name != NULL; i++) {
1818        if (g_str_equal(machine, machines[i].name) ||
1819            (machines[i].alias && g_str_equal(machine, machines[i].alias))) {
1820            return true;
1821        }
1822    }
1823
1824    return false;
1825}
1826
1827bool qtest_has_machine(const char *machine)
1828{
1829    return qtest_has_machine_with_env(NULL, machine);
1830}
1831
1832bool qtest_has_device(const char *device)
1833{
1834    static QList *list;
1835
1836    return qtest_qom_has_concrete_type("device", device, &list);
1837}
1838
1839/*
1840 * Generic hot-plugging test via the device_add QMP commands.
1841 */
1842void qtest_qmp_device_add_qdict(QTestState *qts, const char *drv,
1843                                const QDict *arguments)
1844{
1845    QDict *resp;
1846    QDict *args = arguments ? qdict_clone_shallow(arguments) : qdict_new();
1847
1848    g_assert(!qdict_haskey(args, "driver"));
1849    qdict_put_str(args, "driver", drv);
1850    resp = qtest_qmp(qts, "{'execute': 'device_add', 'arguments': %p}", args);
1851    g_assert(resp);
1852    g_assert(!qdict_haskey(resp, "event")); /* We don't expect any events */
1853    if (qdict_haskey(resp, "error")) {
1854        fprintf(stderr, "error: %s\n",
1855            qdict_get_str(qdict_get_qdict(resp, "error"), "desc"));
1856    }
1857    g_assert(!qdict_haskey(resp, "error"));
1858    qobject_unref(resp);
1859}
1860
1861void qtest_qmp_device_add(QTestState *qts, const char *driver, const char *id,
1862                          const char *fmt, ...)
1863{
1864    QDict *args;
1865    va_list ap;
1866
1867    va_start(ap, fmt);
1868    args = qdict_from_vjsonf_nofail(fmt, ap);
1869    va_end(ap);
1870
1871    g_assert(!qdict_haskey(args, "id"));
1872    qdict_put_str(args, "id", id);
1873
1874    qtest_qmp_device_add_qdict(qts, driver, args);
1875    qobject_unref(args);
1876}
1877
1878void qtest_qmp_add_client(QTestState *qts, const char *protocol, int fd)
1879{
1880    QDict *resp;
1881
1882#ifdef WIN32
1883    WSAPROTOCOL_INFOW info;
1884    g_autofree char *info64  = NULL;
1885    SOCKET s;
1886
1887    assert(fd_is_socket(fd));
1888    s = _get_osfhandle(fd);
1889    if (WSADuplicateSocketW(s, GetProcessId((HANDLE)qts->qemu_pid), &info) == SOCKET_ERROR) {
1890        g_autofree char *emsg = g_win32_error_message(WSAGetLastError());
1891        g_error("WSADuplicateSocketW failed: %s", emsg);
1892    }
1893    info64 = g_base64_encode((guchar *)&info, sizeof(info));
1894    resp = qtest_qmp(qts, "{'execute': 'get-win32-socket',"
1895                     "'arguments': {'fdname': 'fdname', 'info': %s}}", info64);
1896#else
1897    resp = qtest_qmp_fds(qts, &fd, 1, "{'execute': 'getfd',"
1898                         "'arguments': {'fdname': 'fdname'}}");
1899#endif
1900    g_assert(resp);
1901    g_assert(!qdict_haskey(resp, "event")); /* We don't expect any events */
1902    g_assert(!qdict_haskey(resp, "error"));
1903    qobject_unref(resp);
1904
1905    resp = qtest_qmp(
1906        qts, "{'execute': 'add_client',"
1907        "'arguments': {'protocol': %s, 'fdname': 'fdname'}}", protocol);
1908    g_assert(resp);
1909    g_assert(!qdict_haskey(resp, "event")); /* We don't expect any events */
1910    g_assert(!qdict_haskey(resp, "error"));
1911    qobject_unref(resp);
1912}
1913
1914/*
1915 * Generic hot-unplugging test via the device_del QMP command.
1916 * Device deletion will get one response and one event. For example:
1917 *
1918 * {'execute': 'device_del','arguments': { 'id': 'scsi-hd'}}
1919 *
1920 * will get this one:
1921 *
1922 * {"timestamp": {"seconds": 1505289667, "microseconds": 569862},
1923 *  "event": "DEVICE_DELETED", "data": {"device": "scsi-hd",
1924 *  "path": "/machine/peripheral/scsi-hd"}}
1925 *
1926 * and this one:
1927 *
1928 * {"return": {}}
1929 */
1930void qtest_qmp_device_del_send(QTestState *qts, const char *id)
1931{
1932    QDict *rsp = qtest_qmp(qts, "{'execute': 'device_del', "
1933                                "'arguments': {'id': %s}}", id);
1934    g_assert(rsp);
1935    g_assert(qdict_haskey(rsp, "return"));
1936    g_assert(!qdict_haskey(rsp, "error"));
1937    qobject_unref(rsp);
1938}
1939
1940void qtest_qmp_device_del(QTestState *qts, const char *id)
1941{
1942    qtest_qmp_device_del_send(qts, id);
1943    qtest_qmp_eventwait(qts, "DEVICE_DELETED");
1944}
1945
1946static void qtest_client_set_tx_handler(QTestState *s,
1947                    QTestSendFn send)
1948{
1949    s->ops.send = send;
1950}
1951static void qtest_client_set_rx_handler(QTestState *s, QTestRecvFn recv)
1952{
1953    s->ops.recv_line = recv;
1954}
1955/* A type-safe wrapper for s->send() */
1956static void send_wrapper(QTestState *s, const char *buf)
1957{
1958    s->ops.external_send(s, buf);
1959}
1960
1961static GString *qtest_client_inproc_recv_line(QTestState *s)
1962{
1963    GString *line;
1964    size_t offset;
1965    char *eol;
1966
1967    eol = strchr(s->rx->str, '\n');
1968    offset = eol - s->rx->str;
1969    line = g_string_new_len(s->rx->str, offset);
1970    g_string_erase(s->rx, 0, offset + 1);
1971    return line;
1972}
1973
1974QTestState *qtest_inproc_init(QTestState **s, bool log, const char* arch,
1975                    void (*send)(void*, const char*))
1976{
1977    QTestState *qts;
1978    qts = g_new0(QTestState, 1);
1979    qts->pending_events = NULL;
1980    *s = qts; /* Expose qts early on, since the query endianness relies on it */
1981    qts->wstatus = 0;
1982    for (int i = 0; i < MAX_IRQ; i++) {
1983        qts->irq_level[i] = false;
1984    }
1985
1986    qtest_client_set_rx_handler(qts, qtest_client_inproc_recv_line);
1987
1988    /* send() may not have a matching prototype, so use a type-safe wrapper */
1989    qts->ops.external_send = send;
1990    qtest_client_set_tx_handler(qts, send_wrapper);
1991
1992    qts->big_endian = qtest_query_target_endianness(qts);
1993
1994    /*
1995     * Set a dummy path for QTEST_QEMU_BINARY. Doesn't need to exist, but this
1996     * way, qtest_get_arch works for inproc qtest.
1997     */
1998    gchar *bin_path = g_strconcat("/qemu-system-", arch, NULL);
1999    if (!g_setenv("QTEST_QEMU_BINARY", bin_path, 0)) {
2000        fprintf(stderr,
2001                "Could not set environment variable QTEST_QEMU_BINARY\n");
2002        exit(1);
2003    }
2004    g_free(bin_path);
2005
2006    return qts;
2007}
2008
2009void qtest_client_inproc_recv(void *opaque, const char *str)
2010{
2011    QTestState *qts = *(QTestState **)opaque;
2012
2013    if (!qts->rx) {
2014        qts->rx = g_string_new(NULL);
2015    }
2016    g_string_append(qts->rx, str);
2017}
2018
2019void qtest_qom_set_bool(QTestState *s, const char *path, const char *property,
2020                         bool value)
2021{
2022    QDict *r;
2023
2024    r = qtest_qmp(s, "{ 'execute': 'qom-set', 'arguments': "
2025                     "{ 'path': %s, 'property': %s, 'value': %i } }",
2026                     path, property, value);
2027    qobject_unref(r);
2028}
2029
2030bool qtest_qom_get_bool(QTestState *s, const char *path, const char *property)
2031{
2032    QDict *r;
2033    bool b;
2034
2035    r = qtest_qmp(s, "{ 'execute': 'qom-get', 'arguments': "
2036                     "{ 'path': %s, 'property': %s } }", path, property);
2037    b = qdict_get_bool(r, "return");
2038    qobject_unref(r);
2039
2040    return b;
2041}
2042
2043bool have_qemu_img(void)
2044{
2045    char *rpath;
2046    const char *path = getenv("QTEST_QEMU_IMG");
2047    if (!path) {
2048        return false;
2049    }
2050
2051    rpath = realpath(path, NULL);
2052    if (!rpath) {
2053        return false;
2054    } else {
2055        free(rpath);
2056        return true;
2057    }
2058}
2059
2060bool mkimg(const char *file, const char *fmt, unsigned size_mb)
2061{
2062    gchar *cli;
2063    bool ret;
2064    int rc;
2065    GError *err = NULL;
2066    char *qemu_img_path;
2067    gchar *out, *out2;
2068    char *qemu_img_abs_path;
2069
2070    qemu_img_path = getenv("QTEST_QEMU_IMG");
2071    if (!qemu_img_path) {
2072        return false;
2073    }
2074    qemu_img_abs_path = realpath(qemu_img_path, NULL);
2075    if (!qemu_img_abs_path) {
2076        return false;
2077    }
2078
2079    cli = g_strdup_printf("%s create -f %s %s %uM", qemu_img_abs_path,
2080                          fmt, file, size_mb);
2081    ret = g_spawn_command_line_sync(cli, &out, &out2, &rc, &err);
2082    if (err || !g_spawn_check_exit_status(rc, &err)) {
2083        fprintf(stderr, "%s\n", err->message);
2084        g_error_free(err);
2085    }
2086
2087    g_free(out);
2088    g_free(out2);
2089    g_free(cli);
2090    free(qemu_img_abs_path);
2091
2092    return ret && !err;
2093}
2094