qemu/tests/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#include <sys/socket.h>
  20#include <sys/wait.h>
  21#include <sys/un.h>
  22
  23#include "libqtest.h"
  24#include "qemu-common.h"
  25#include "qemu/ctype.h"
  26#include "qemu/cutils.h"
  27#include "qapi/error.h"
  28#include "qapi/qmp/json-parser.h"
  29#include "qapi/qmp/qdict.h"
  30#include "qapi/qmp/qjson.h"
  31#include "qapi/qmp/qlist.h"
  32#include "qapi/qmp/qstring.h"
  33
  34#define MAX_IRQ 256
  35#define SOCKET_TIMEOUT 50
  36#define SOCKET_MAX_FDS 16
  37
  38struct QTestState
  39{
  40    int fd;
  41    int qmp_fd;
  42    pid_t qemu_pid;  /* our child QEMU process */
  43    int wstatus;
  44    int expected_status;
  45    bool big_endian;
  46    bool irq_level[MAX_IRQ];
  47    GString *rx;
  48};
  49
  50static GHookList abrt_hooks;
  51static struct sigaction sigact_old;
  52
  53static int qtest_query_target_endianness(QTestState *s);
  54
  55static int init_socket(const char *socket_path)
  56{
  57    struct sockaddr_un addr;
  58    int sock;
  59    int ret;
  60
  61    sock = socket(PF_UNIX, SOCK_STREAM, 0);
  62    g_assert_cmpint(sock, !=, -1);
  63
  64    addr.sun_family = AF_UNIX;
  65    snprintf(addr.sun_path, sizeof(addr.sun_path), "%s", socket_path);
  66    qemu_set_cloexec(sock);
  67
  68    do {
  69        ret = bind(sock, (struct sockaddr *)&addr, sizeof(addr));
  70    } while (ret == -1 && errno == EINTR);
  71    g_assert_cmpint(ret, !=, -1);
  72    ret = listen(sock, 1);
  73    g_assert_cmpint(ret, !=, -1);
  74
  75    return sock;
  76}
  77
  78static int socket_accept(int sock)
  79{
  80    struct sockaddr_un addr;
  81    socklen_t addrlen;
  82    int ret;
  83    struct timeval timeout = { .tv_sec = SOCKET_TIMEOUT,
  84                               .tv_usec = 0 };
  85
  86    setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (void *)&timeout,
  87               sizeof(timeout));
  88
  89    do {
  90        addrlen = sizeof(addr);
  91        ret = accept(sock, (struct sockaddr *)&addr, &addrlen);
  92    } while (ret == -1 && errno == EINTR);
  93    if (ret == -1) {
  94        fprintf(stderr, "%s failed: %s\n", __func__, strerror(errno));
  95    }
  96    close(sock);
  97
  98    return ret;
  99}
 100
 101bool qtest_probe_child(QTestState *s)
 102{
 103    pid_t pid = s->qemu_pid;
 104
 105    if (pid != -1) {
 106        pid = waitpid(pid, &s->wstatus, WNOHANG);
 107        if (pid == 0) {
 108            return true;
 109        }
 110        s->qemu_pid = -1;
 111    }
 112    return false;
 113}
 114
 115void qtest_set_expected_status(QTestState *s, int status)
 116{
 117    s->expected_status = status;
 118}
 119
 120static void kill_qemu(QTestState *s)
 121{
 122    pid_t pid = s->qemu_pid;
 123    int wstatus;
 124
 125    /* Skip wait if qtest_probe_child already reaped.  */
 126    if (pid != -1) {
 127        kill(pid, SIGTERM);
 128        TFR(pid = waitpid(s->qemu_pid, &s->wstatus, 0));
 129        assert(pid == s->qemu_pid);
 130    }
 131
 132    /*
 133     * Check whether qemu exited with expected exit status; anything else is
 134     * fishy and should be logged with as much detail as possible.
 135     */
 136    wstatus = s->wstatus;
 137    if (WIFEXITED(wstatus) && WEXITSTATUS(wstatus) != s->expected_status) {
 138        fprintf(stderr, "%s:%d: kill_qemu() tried to terminate QEMU "
 139                "process but encountered exit status %d (expected %d)\n",
 140                __FILE__, __LINE__, WEXITSTATUS(wstatus), s->expected_status);
 141        abort();
 142    } else if (WIFSIGNALED(wstatus)) {
 143        int sig = WTERMSIG(wstatus);
 144        const char *signame = strsignal(sig) ?: "unknown ???";
 145        const char *dump = WCOREDUMP(wstatus) ? " (core dumped)" : "";
 146
 147        fprintf(stderr, "%s:%d: kill_qemu() detected QEMU death "
 148                "from signal %d (%s)%s\n",
 149                __FILE__, __LINE__, sig, signame, dump);
 150        abort();
 151    }
 152}
 153
 154static void kill_qemu_hook_func(void *s)
 155{
 156    kill_qemu(s);
 157}
 158
 159static void sigabrt_handler(int signo)
 160{
 161    g_hook_list_invoke(&abrt_hooks, FALSE);
 162}
 163
 164static void setup_sigabrt_handler(void)
 165{
 166    struct sigaction sigact;
 167
 168    /* Catch SIGABRT to clean up on g_assert() failure */
 169    sigact = (struct sigaction){
 170        .sa_handler = sigabrt_handler,
 171        .sa_flags = SA_RESETHAND,
 172    };
 173    sigemptyset(&sigact.sa_mask);
 174    sigaction(SIGABRT, &sigact, &sigact_old);
 175}
 176
 177static void cleanup_sigabrt_handler(void)
 178{
 179    sigaction(SIGABRT, &sigact_old, NULL);
 180}
 181
 182void qtest_add_abrt_handler(GHookFunc fn, const void *data)
 183{
 184    GHook *hook;
 185
 186    /* Only install SIGABRT handler once */
 187    if (!abrt_hooks.is_setup) {
 188        g_hook_list_init(&abrt_hooks, sizeof(GHook));
 189    }
 190    setup_sigabrt_handler();
 191
 192    hook = g_hook_alloc(&abrt_hooks);
 193    hook->func = fn;
 194    hook->data = (void *)data;
 195
 196    g_hook_prepend(&abrt_hooks, hook);
 197}
 198
 199static const char *qtest_qemu_binary(void)
 200{
 201    const char *qemu_bin;
 202
 203    qemu_bin = getenv("QTEST_QEMU_BINARY");
 204    if (!qemu_bin) {
 205        fprintf(stderr, "Environment variable QTEST_QEMU_BINARY required\n");
 206        exit(1);
 207    }
 208
 209    return qemu_bin;
 210}
 211
 212QTestState *qtest_init_without_qmp_handshake(const char *extra_args)
 213{
 214    QTestState *s;
 215    int sock, qmpsock, i;
 216    gchar *socket_path;
 217    gchar *qmp_socket_path;
 218    gchar *command;
 219    const char *qemu_binary = qtest_qemu_binary();
 220
 221    s = g_new(QTestState, 1);
 222
 223    socket_path = g_strdup_printf("/tmp/qtest-%d.sock", getpid());
 224    qmp_socket_path = g_strdup_printf("/tmp/qtest-%d.qmp", getpid());
 225
 226    /* It's possible that if an earlier test run crashed it might
 227     * have left a stale unix socket lying around. Delete any
 228     * stale old socket to avoid spurious test failures with
 229     * tests/libqtest.c:70:init_socket: assertion failed (ret != -1): (-1 != -1)
 230     */
 231    unlink(socket_path);
 232    unlink(qmp_socket_path);
 233
 234    sock = init_socket(socket_path);
 235    qmpsock = init_socket(qmp_socket_path);
 236
 237    qtest_add_abrt_handler(kill_qemu_hook_func, s);
 238
 239    command = g_strdup_printf("exec %s "
 240                              "-qtest unix:%s "
 241                              "-qtest-log %s "
 242                              "-chardev socket,path=%s,id=char0 "
 243                              "-mon chardev=char0,mode=control "
 244                              "-accel qtest "
 245                              "-display none "
 246                              "%s", qemu_binary, socket_path,
 247                              getenv("QTEST_LOG") ? "/dev/fd/2" : "/dev/null",
 248                              qmp_socket_path,
 249                              extra_args ?: "");
 250
 251    g_test_message("starting QEMU: %s", command);
 252
 253    s->wstatus = 0;
 254    s->expected_status = 0;
 255    s->qemu_pid = fork();
 256    if (s->qemu_pid == 0) {
 257        setenv("QEMU_AUDIO_DRV", "none", true);
 258        execlp("/bin/sh", "sh", "-c", command, NULL);
 259        exit(1);
 260    }
 261
 262    g_free(command);
 263    s->fd = socket_accept(sock);
 264    if (s->fd >= 0) {
 265        s->qmp_fd = socket_accept(qmpsock);
 266    }
 267    unlink(socket_path);
 268    unlink(qmp_socket_path);
 269    g_free(socket_path);
 270    g_free(qmp_socket_path);
 271
 272    g_assert(s->fd >= 0 && s->qmp_fd >= 0);
 273
 274    s->rx = g_string_new("");
 275    for (i = 0; i < MAX_IRQ; i++) {
 276        s->irq_level[i] = false;
 277    }
 278
 279    if (getenv("QTEST_STOP")) {
 280        kill(s->qemu_pid, SIGSTOP);
 281    }
 282
 283    /* ask endianness of the target */
 284
 285    s->big_endian = qtest_query_target_endianness(s);
 286
 287    return s;
 288}
 289
 290QTestState *qtest_init(const char *extra_args)
 291{
 292    QTestState *s = qtest_init_without_qmp_handshake(extra_args);
 293    QDict *greeting;
 294
 295    /* Read the QMP greeting and then do the handshake */
 296    greeting = qtest_qmp_receive(s);
 297    qobject_unref(greeting);
 298    qobject_unref(qtest_qmp(s, "{ 'execute': 'qmp_capabilities' }"));
 299
 300    return s;
 301}
 302
 303QTestState *qtest_vinitf(const char *fmt, va_list ap)
 304{
 305    char *args = g_strdup_vprintf(fmt, ap);
 306    QTestState *s;
 307
 308    s = qtest_init(args);
 309    g_free(args);
 310    return s;
 311}
 312
 313QTestState *qtest_initf(const char *fmt, ...)
 314{
 315    va_list ap;
 316    QTestState *s;
 317
 318    va_start(ap, fmt);
 319    s = qtest_vinitf(fmt, ap);
 320    va_end(ap);
 321    return s;
 322}
 323
 324QTestState *qtest_init_with_serial(const char *extra_args, int *sock_fd)
 325{
 326    int sock_fd_init;
 327    char *sock_path, sock_dir[] = "/tmp/qtest-serial-XXXXXX";
 328    QTestState *qts;
 329
 330    g_assert_true(mkdtemp(sock_dir) != NULL);
 331    sock_path = g_strdup_printf("%s/sock", sock_dir);
 332
 333    sock_fd_init = init_socket(sock_path);
 334
 335    qts = qtest_initf("-chardev socket,id=s0,path=%s -serial chardev:s0 %s",
 336                      sock_path, extra_args);
 337
 338    *sock_fd = socket_accept(sock_fd_init);
 339
 340    unlink(sock_path);
 341    g_free(sock_path);
 342    rmdir(sock_dir);
 343
 344    g_assert_true(*sock_fd >= 0);
 345
 346    return qts;
 347}
 348
 349void qtest_quit(QTestState *s)
 350{
 351    g_hook_destroy_link(&abrt_hooks, g_hook_find_data(&abrt_hooks, TRUE, s));
 352
 353    /* Uninstall SIGABRT handler on last instance */
 354    cleanup_sigabrt_handler();
 355
 356    kill_qemu(s);
 357    close(s->fd);
 358    close(s->qmp_fd);
 359    g_string_free(s->rx, true);
 360    g_free(s);
 361}
 362
 363static void socket_send(int fd, const char *buf, size_t size)
 364{
 365    size_t offset;
 366
 367    offset = 0;
 368    while (offset < size) {
 369        ssize_t len;
 370
 371        len = write(fd, buf + offset, size - offset);
 372        if (len == -1 && errno == EINTR) {
 373            continue;
 374        }
 375
 376        g_assert_cmpint(len, >, 0);
 377
 378        offset += len;
 379    }
 380}
 381
 382static void socket_sendf(int fd, const char *fmt, va_list ap)
 383{
 384    gchar *str = g_strdup_vprintf(fmt, ap);
 385    size_t size = strlen(str);
 386
 387    socket_send(fd, str, size);
 388    g_free(str);
 389}
 390
 391static void GCC_FMT_ATTR(2, 3) qtest_sendf(QTestState *s, const char *fmt, ...)
 392{
 393    va_list ap;
 394
 395    va_start(ap, fmt);
 396    socket_sendf(s->fd, fmt, ap);
 397    va_end(ap);
 398}
 399
 400/* Sends a message and file descriptors to the socket.
 401 * It's needed for qmp-commands like getfd/add-fd */
 402static void socket_send_fds(int socket_fd, int *fds, size_t fds_num,
 403                            const char *buf, size_t buf_size)
 404{
 405    ssize_t ret;
 406    struct msghdr msg = { 0 };
 407    char control[CMSG_SPACE(sizeof(int) * SOCKET_MAX_FDS)] = { 0 };
 408    size_t fdsize = sizeof(int) * fds_num;
 409    struct cmsghdr *cmsg;
 410    struct iovec iov = { .iov_base = (char *)buf, .iov_len = buf_size };
 411
 412    msg.msg_iov = &iov;
 413    msg.msg_iovlen = 1;
 414
 415    if (fds && fds_num > 0) {
 416        g_assert_cmpuint(fds_num, <, SOCKET_MAX_FDS);
 417
 418        msg.msg_control = control;
 419        msg.msg_controllen = CMSG_SPACE(fdsize);
 420
 421        cmsg = CMSG_FIRSTHDR(&msg);
 422        cmsg->cmsg_len = CMSG_LEN(fdsize);
 423        cmsg->cmsg_level = SOL_SOCKET;
 424        cmsg->cmsg_type = SCM_RIGHTS;
 425        memcpy(CMSG_DATA(cmsg), fds, fdsize);
 426    }
 427
 428    do {
 429        ret = sendmsg(socket_fd, &msg, 0);
 430    } while (ret < 0 && errno == EINTR);
 431    g_assert_cmpint(ret, >, 0);
 432}
 433
 434static GString *qtest_recv_line(QTestState *s)
 435{
 436    GString *line;
 437    size_t offset;
 438    char *eol;
 439
 440    while ((eol = strchr(s->rx->str, '\n')) == NULL) {
 441        ssize_t len;
 442        char buffer[1024];
 443
 444        len = read(s->fd, buffer, sizeof(buffer));
 445        if (len == -1 && errno == EINTR) {
 446            continue;
 447        }
 448
 449        if (len == -1 || len == 0) {
 450            fprintf(stderr, "Broken pipe\n");
 451            abort();
 452        }
 453
 454        g_string_append_len(s->rx, buffer, len);
 455    }
 456
 457    offset = eol - s->rx->str;
 458    line = g_string_new_len(s->rx->str, offset);
 459    g_string_erase(s->rx, 0, offset + 1);
 460
 461    return line;
 462}
 463
 464static gchar **qtest_rsp(QTestState *s, int expected_args)
 465{
 466    GString *line;
 467    gchar **words;
 468    int i;
 469
 470redo:
 471    line = qtest_recv_line(s);
 472    words = g_strsplit(line->str, " ", 0);
 473    g_string_free(line, TRUE);
 474
 475    if (strcmp(words[0], "IRQ") == 0) {
 476        long irq;
 477        int ret;
 478
 479        g_assert(words[1] != NULL);
 480        g_assert(words[2] != NULL);
 481
 482        ret = qemu_strtol(words[2], NULL, 0, &irq);
 483        g_assert(!ret);
 484        g_assert_cmpint(irq, >=, 0);
 485        g_assert_cmpint(irq, <, MAX_IRQ);
 486
 487        if (strcmp(words[1], "raise") == 0) {
 488            s->irq_level[irq] = true;
 489        } else {
 490            s->irq_level[irq] = false;
 491        }
 492
 493        g_strfreev(words);
 494        goto redo;
 495    }
 496
 497    g_assert(words[0] != NULL);
 498    g_assert_cmpstr(words[0], ==, "OK");
 499
 500    if (expected_args) {
 501        for (i = 0; i < expected_args; i++) {
 502            g_assert(words[i] != NULL);
 503        }
 504    } else {
 505        g_strfreev(words);
 506    }
 507
 508    return words;
 509}
 510
 511static int qtest_query_target_endianness(QTestState *s)
 512{
 513    gchar **args;
 514    int big_endian;
 515
 516    qtest_sendf(s, "endianness\n");
 517    args = qtest_rsp(s, 1);
 518    g_assert(strcmp(args[1], "big") == 0 || strcmp(args[1], "little") == 0);
 519    big_endian = strcmp(args[1], "big") == 0;
 520    g_strfreev(args);
 521
 522    return big_endian;
 523}
 524
 525typedef struct {
 526    JSONMessageParser parser;
 527    QDict *response;
 528} QMPResponseParser;
 529
 530static void qmp_response(void *opaque, QObject *obj, Error *err)
 531{
 532    QMPResponseParser *qmp = opaque;
 533
 534    assert(!obj != !err);
 535
 536    if (err) {
 537        error_prepend(&err, "QMP JSON response parsing failed: ");
 538        error_report_err(err);
 539        abort();
 540    }
 541
 542    g_assert(!qmp->response);
 543    qmp->response = qobject_to(QDict, obj);
 544    g_assert(qmp->response);
 545}
 546
 547QDict *qmp_fd_receive(int fd)
 548{
 549    QMPResponseParser qmp;
 550    bool log = getenv("QTEST_LOG") != NULL;
 551
 552    qmp.response = NULL;
 553    json_message_parser_init(&qmp.parser, qmp_response, &qmp, NULL);
 554    while (!qmp.response) {
 555        ssize_t len;
 556        char c;
 557
 558        len = read(fd, &c, 1);
 559        if (len == -1 && errno == EINTR) {
 560            continue;
 561        }
 562
 563        if (len == -1 || len == 0) {
 564            fprintf(stderr, "Broken pipe\n");
 565            abort();
 566        }
 567
 568        if (log) {
 569            len = write(2, &c, 1);
 570        }
 571        json_message_parser_feed(&qmp.parser, &c, 1);
 572    }
 573    json_message_parser_destroy(&qmp.parser);
 574
 575    return qmp.response;
 576}
 577
 578QDict *qtest_qmp_receive(QTestState *s)
 579{
 580    return qmp_fd_receive(s->qmp_fd);
 581}
 582
 583/**
 584 * Allow users to send a message without waiting for the reply,
 585 * in the case that they choose to discard all replies up until
 586 * a particular EVENT is received.
 587 */
 588void qmp_fd_vsend_fds(int fd, int *fds, size_t fds_num,
 589                      const char *fmt, va_list ap)
 590{
 591    QObject *qobj;
 592
 593    /* Going through qobject ensures we escape strings properly */
 594    qobj = qobject_from_vjsonf_nofail(fmt, ap);
 595
 596    /* No need to send anything for an empty QObject.  */
 597    if (qobj) {
 598        int log = getenv("QTEST_LOG") != NULL;
 599        QString *qstr = qobject_to_json(qobj);
 600        const char *str;
 601
 602        /*
 603         * BUG: QMP doesn't react to input until it sees a newline, an
 604         * object, or an array.  Work-around: give it a newline.
 605         */
 606        qstring_append_chr(qstr, '\n');
 607        str = qstring_get_str(qstr);
 608
 609        if (log) {
 610            fprintf(stderr, "%s", str);
 611        }
 612        /* Send QMP request */
 613        if (fds && fds_num > 0) {
 614            socket_send_fds(fd, fds, fds_num, str, qstring_get_length(qstr));
 615        } else {
 616            socket_send(fd, str, qstring_get_length(qstr));
 617        }
 618
 619        qobject_unref(qstr);
 620        qobject_unref(qobj);
 621    }
 622}
 623
 624void qmp_fd_vsend(int fd, const char *fmt, va_list ap)
 625{
 626    qmp_fd_vsend_fds(fd, NULL, 0, fmt, ap);
 627}
 628
 629void qtest_qmp_vsend_fds(QTestState *s, int *fds, size_t fds_num,
 630                         const char *fmt, va_list ap)
 631{
 632    qmp_fd_vsend_fds(s->qmp_fd, fds, fds_num, fmt, ap);
 633}
 634
 635void qtest_qmp_vsend(QTestState *s, const char *fmt, va_list ap)
 636{
 637    qmp_fd_vsend_fds(s->qmp_fd, NULL, 0, fmt, ap);
 638}
 639
 640QDict *qmp_fdv(int fd, const char *fmt, va_list ap)
 641{
 642    qmp_fd_vsend_fds(fd, NULL, 0, fmt, ap);
 643
 644    return qmp_fd_receive(fd);
 645}
 646
 647QDict *qtest_vqmp_fds(QTestState *s, int *fds, size_t fds_num,
 648                      const char *fmt, va_list ap)
 649{
 650    qtest_qmp_vsend_fds(s, fds, fds_num, fmt, ap);
 651
 652    /* Receive reply */
 653    return qtest_qmp_receive(s);
 654}
 655
 656QDict *qtest_vqmp(QTestState *s, const char *fmt, va_list ap)
 657{
 658    qtest_qmp_vsend(s, fmt, ap);
 659
 660    /* Receive reply */
 661    return qtest_qmp_receive(s);
 662}
 663
 664QDict *qmp_fd(int fd, const char *fmt, ...)
 665{
 666    va_list ap;
 667    QDict *response;
 668
 669    va_start(ap, fmt);
 670    response = qmp_fdv(fd, fmt, ap);
 671    va_end(ap);
 672    return response;
 673}
 674
 675void qmp_fd_send(int fd, const char *fmt, ...)
 676{
 677    va_list ap;
 678
 679    va_start(ap, fmt);
 680    qmp_fd_vsend(fd, fmt, ap);
 681    va_end(ap);
 682}
 683
 684QDict *qtest_qmp_fds(QTestState *s, int *fds, size_t fds_num,
 685                     const char *fmt, ...)
 686{
 687    va_list ap;
 688    QDict *response;
 689
 690    va_start(ap, fmt);
 691    response = qtest_vqmp_fds(s, fds, fds_num, fmt, ap);
 692    va_end(ap);
 693    return response;
 694}
 695
 696QDict *qtest_qmp(QTestState *s, const char *fmt, ...)
 697{
 698    va_list ap;
 699    QDict *response;
 700
 701    va_start(ap, fmt);
 702    response = qtest_vqmp(s, fmt, ap);
 703    va_end(ap);
 704    return response;
 705}
 706
 707void qtest_qmp_send(QTestState *s, const char *fmt, ...)
 708{
 709    va_list ap;
 710
 711    va_start(ap, fmt);
 712    qtest_qmp_vsend(s, fmt, ap);
 713    va_end(ap);
 714}
 715
 716void qmp_fd_vsend_raw(int fd, const char *fmt, va_list ap)
 717{
 718    bool log = getenv("QTEST_LOG") != NULL;
 719    char *str = g_strdup_vprintf(fmt, ap);
 720
 721    if (log) {
 722        fprintf(stderr, "%s", str);
 723    }
 724    socket_send(fd, str, strlen(str));
 725    g_free(str);
 726}
 727
 728void qmp_fd_send_raw(int fd, const char *fmt, ...)
 729{
 730    va_list ap;
 731
 732    va_start(ap, fmt);
 733    qmp_fd_vsend_raw(fd, fmt, ap);
 734    va_end(ap);
 735}
 736
 737void qtest_qmp_send_raw(QTestState *s, const char *fmt, ...)
 738{
 739    va_list ap;
 740
 741    va_start(ap, fmt);
 742    qmp_fd_vsend_raw(s->qmp_fd, fmt, ap);
 743    va_end(ap);
 744}
 745
 746QDict *qtest_qmp_eventwait_ref(QTestState *s, const char *event)
 747{
 748    QDict *response;
 749
 750    for (;;) {
 751        response = qtest_qmp_receive(s);
 752        if ((qdict_haskey(response, "event")) &&
 753            (strcmp(qdict_get_str(response, "event"), event) == 0)) {
 754            return response;
 755        }
 756        qobject_unref(response);
 757    }
 758}
 759
 760void qtest_qmp_eventwait(QTestState *s, const char *event)
 761{
 762    QDict *response;
 763
 764    response = qtest_qmp_eventwait_ref(s, event);
 765    qobject_unref(response);
 766}
 767
 768char *qtest_vhmp(QTestState *s, const char *fmt, va_list ap)
 769{
 770    char *cmd;
 771    QDict *resp;
 772    char *ret;
 773
 774    cmd = g_strdup_vprintf(fmt, ap);
 775    resp = qtest_qmp(s, "{'execute': 'human-monitor-command',"
 776                     " 'arguments': {'command-line': %s}}",
 777                     cmd);
 778    ret = g_strdup(qdict_get_try_str(resp, "return"));
 779    while (ret == NULL && qdict_get_try_str(resp, "event")) {
 780        /* Ignore asynchronous QMP events */
 781        qobject_unref(resp);
 782        resp = qtest_qmp_receive(s);
 783        ret = g_strdup(qdict_get_try_str(resp, "return"));
 784    }
 785    g_assert(ret);
 786    qobject_unref(resp);
 787    g_free(cmd);
 788    return ret;
 789}
 790
 791char *qtest_hmp(QTestState *s, const char *fmt, ...)
 792{
 793    va_list ap;
 794    char *ret;
 795
 796    va_start(ap, fmt);
 797    ret = qtest_vhmp(s, fmt, ap);
 798    va_end(ap);
 799    return ret;
 800}
 801
 802const char *qtest_get_arch(void)
 803{
 804    const char *qemu = qtest_qemu_binary();
 805    const char *end = strrchr(qemu, '/');
 806
 807    return end + strlen("/qemu-system-");
 808}
 809
 810bool qtest_get_irq(QTestState *s, int num)
 811{
 812    /* dummy operation in order to make sure irq is up to date */
 813    qtest_inb(s, 0);
 814
 815    return s->irq_level[num];
 816}
 817
 818void qtest_module_load(QTestState *s, const char *prefix, const char *libname)
 819{
 820    qtest_sendf(s, "module_load %s %s\n", prefix, libname);
 821    qtest_rsp(s, 0);
 822}
 823
 824static int64_t qtest_clock_rsp(QTestState *s)
 825{
 826    gchar **words;
 827    int64_t clock;
 828    words = qtest_rsp(s, 2);
 829    clock = g_ascii_strtoll(words[1], NULL, 0);
 830    g_strfreev(words);
 831    return clock;
 832}
 833
 834int64_t qtest_clock_step_next(QTestState *s)
 835{
 836    qtest_sendf(s, "clock_step\n");
 837    return qtest_clock_rsp(s);
 838}
 839
 840int64_t qtest_clock_step(QTestState *s, int64_t step)
 841{
 842    qtest_sendf(s, "clock_step %"PRIi64"\n", step);
 843    return qtest_clock_rsp(s);
 844}
 845
 846int64_t qtest_clock_set(QTestState *s, int64_t val)
 847{
 848    qtest_sendf(s, "clock_set %"PRIi64"\n", val);
 849    return qtest_clock_rsp(s);
 850}
 851
 852void qtest_irq_intercept_out(QTestState *s, const char *qom_path)
 853{
 854    qtest_sendf(s, "irq_intercept_out %s\n", qom_path);
 855    qtest_rsp(s, 0);
 856}
 857
 858void qtest_irq_intercept_in(QTestState *s, const char *qom_path)
 859{
 860    qtest_sendf(s, "irq_intercept_in %s\n", qom_path);
 861    qtest_rsp(s, 0);
 862}
 863
 864void qtest_set_irq_in(QTestState *s, const char *qom_path, const char *name,
 865                      int num, int level)
 866{
 867    if (!name) {
 868        name = "unnamed-gpio-in";
 869    }
 870    qtest_sendf(s, "set_irq_in %s %s %d %d\n", qom_path, name, num, level);
 871    qtest_rsp(s, 0);
 872}
 873
 874static void qtest_out(QTestState *s, const char *cmd, uint16_t addr, uint32_t value)
 875{
 876    qtest_sendf(s, "%s 0x%x 0x%x\n", cmd, addr, value);
 877    qtest_rsp(s, 0);
 878}
 879
 880void qtest_outb(QTestState *s, uint16_t addr, uint8_t value)
 881{
 882    qtest_out(s, "outb", addr, value);
 883}
 884
 885void qtest_outw(QTestState *s, uint16_t addr, uint16_t value)
 886{
 887    qtest_out(s, "outw", addr, value);
 888}
 889
 890void qtest_outl(QTestState *s, uint16_t addr, uint32_t value)
 891{
 892    qtest_out(s, "outl", addr, value);
 893}
 894
 895static uint32_t qtest_in(QTestState *s, const char *cmd, uint16_t addr)
 896{
 897    gchar **args;
 898    int ret;
 899    unsigned long value;
 900
 901    qtest_sendf(s, "%s 0x%x\n", cmd, addr);
 902    args = qtest_rsp(s, 2);
 903    ret = qemu_strtoul(args[1], NULL, 0, &value);
 904    g_assert(!ret && value <= UINT32_MAX);
 905    g_strfreev(args);
 906
 907    return value;
 908}
 909
 910uint8_t qtest_inb(QTestState *s, uint16_t addr)
 911{
 912    return qtest_in(s, "inb", addr);
 913}
 914
 915uint16_t qtest_inw(QTestState *s, uint16_t addr)
 916{
 917    return qtest_in(s, "inw", addr);
 918}
 919
 920uint32_t qtest_inl(QTestState *s, uint16_t addr)
 921{
 922    return qtest_in(s, "inl", addr);
 923}
 924
 925static void qtest_write(QTestState *s, const char *cmd, uint64_t addr,
 926                        uint64_t value)
 927{
 928    qtest_sendf(s, "%s 0x%" PRIx64 " 0x%" PRIx64 "\n", cmd, addr, value);
 929    qtest_rsp(s, 0);
 930}
 931
 932void qtest_writeb(QTestState *s, uint64_t addr, uint8_t value)
 933{
 934    qtest_write(s, "writeb", addr, value);
 935}
 936
 937void qtest_writew(QTestState *s, uint64_t addr, uint16_t value)
 938{
 939    qtest_write(s, "writew", addr, value);
 940}
 941
 942void qtest_writel(QTestState *s, uint64_t addr, uint32_t value)
 943{
 944    qtest_write(s, "writel", addr, value);
 945}
 946
 947void qtest_writeq(QTestState *s, uint64_t addr, uint64_t value)
 948{
 949    qtest_write(s, "writeq", addr, value);
 950}
 951
 952static uint64_t qtest_read(QTestState *s, const char *cmd, uint64_t addr)
 953{
 954    gchar **args;
 955    int ret;
 956    uint64_t value;
 957
 958    qtest_sendf(s, "%s 0x%" PRIx64 "\n", cmd, addr);
 959    args = qtest_rsp(s, 2);
 960    ret = qemu_strtou64(args[1], NULL, 0, &value);
 961    g_assert(!ret);
 962    g_strfreev(args);
 963
 964    return value;
 965}
 966
 967uint8_t qtest_readb(QTestState *s, uint64_t addr)
 968{
 969    return qtest_read(s, "readb", addr);
 970}
 971
 972uint16_t qtest_readw(QTestState *s, uint64_t addr)
 973{
 974    return qtest_read(s, "readw", addr);
 975}
 976
 977uint32_t qtest_readl(QTestState *s, uint64_t addr)
 978{
 979    return qtest_read(s, "readl", addr);
 980}
 981
 982uint64_t qtest_readq(QTestState *s, uint64_t addr)
 983{
 984    return qtest_read(s, "readq", addr);
 985}
 986
 987static int hex2nib(char ch)
 988{
 989    if (ch >= '0' && ch <= '9') {
 990        return ch - '0';
 991    } else if (ch >= 'a' && ch <= 'f') {
 992        return 10 + (ch - 'a');
 993    } else if (ch >= 'A' && ch <= 'F') {
 994        return 10 + (ch - 'a');
 995    } else {
 996        return -1;
 997    }
 998}
 999
1000void qtest_memread(QTestState *s, uint64_t addr, void *data, size_t size)
1001{
1002    uint8_t *ptr = data;
1003    gchar **args;
1004    size_t i;
1005
1006    if (!size) {
1007        return;
1008    }
1009
1010    qtest_sendf(s, "read 0x%" PRIx64 " 0x%zx\n", addr, size);
1011    args = qtest_rsp(s, 2);
1012
1013    for (i = 0; i < size; i++) {
1014        ptr[i] = hex2nib(args[1][2 + (i * 2)]) << 4;
1015        ptr[i] |= hex2nib(args[1][2 + (i * 2) + 1]);
1016    }
1017
1018    g_strfreev(args);
1019}
1020
1021uint64_t qtest_rtas_call(QTestState *s, const char *name,
1022                         uint32_t nargs, uint64_t args,
1023                         uint32_t nret, uint64_t ret)
1024{
1025    qtest_sendf(s, "rtas %s %u 0x%"PRIx64" %u 0x%"PRIx64"\n",
1026                name, nargs, args, nret, ret);
1027    qtest_rsp(s, 0);
1028    return 0;
1029}
1030
1031void qtest_add_func(const char *str, void (*fn)(void))
1032{
1033    gchar *path = g_strdup_printf("/%s/%s", qtest_get_arch(), str);
1034    g_test_add_func(path, fn);
1035    g_free(path);
1036}
1037
1038void qtest_add_data_func_full(const char *str, void *data,
1039                              void (*fn)(const void *),
1040                              GDestroyNotify data_free_func)
1041{
1042    gchar *path = g_strdup_printf("/%s/%s", qtest_get_arch(), str);
1043    g_test_add_data_func_full(path, data, fn, data_free_func);
1044    g_free(path);
1045}
1046
1047void qtest_add_data_func(const char *str, const void *data,
1048                         void (*fn)(const void *))
1049{
1050    gchar *path = g_strdup_printf("/%s/%s", qtest_get_arch(), str);
1051    g_test_add_data_func(path, data, fn);
1052    g_free(path);
1053}
1054
1055void qtest_bufwrite(QTestState *s, uint64_t addr, const void *data, size_t size)
1056{
1057    gchar *bdata;
1058
1059    bdata = g_base64_encode(data, size);
1060    qtest_sendf(s, "b64write 0x%" PRIx64 " 0x%zx ", addr, size);
1061    socket_send(s->fd, bdata, strlen(bdata));
1062    socket_send(s->fd, "\n", 1);
1063    qtest_rsp(s, 0);
1064    g_free(bdata);
1065}
1066
1067void qtest_bufread(QTestState *s, uint64_t addr, void *data, size_t size)
1068{
1069    gchar **args;
1070    size_t len;
1071
1072    qtest_sendf(s, "b64read 0x%" PRIx64 " 0x%zx\n", addr, size);
1073    args = qtest_rsp(s, 2);
1074
1075    g_base64_decode_inplace(args[1], &len);
1076    if (size != len) {
1077        fprintf(stderr, "bufread: asked for %zu bytes but decoded %zu\n",
1078                size, len);
1079        len = MIN(len, size);
1080    }
1081
1082    memcpy(data, args[1], len);
1083    g_strfreev(args);
1084}
1085
1086void qtest_memwrite(QTestState *s, uint64_t addr, const void *data, size_t size)
1087{
1088    const uint8_t *ptr = data;
1089    size_t i;
1090    char *enc;
1091
1092    if (!size) {
1093        return;
1094    }
1095
1096    enc = g_malloc(2 * size + 1);
1097
1098    for (i = 0; i < size; i++) {
1099        sprintf(&enc[i * 2], "%02x", ptr[i]);
1100    }
1101
1102    qtest_sendf(s, "write 0x%" PRIx64 " 0x%zx 0x%s\n", addr, size, enc);
1103    qtest_rsp(s, 0);
1104    g_free(enc);
1105}
1106
1107void qtest_memset(QTestState *s, uint64_t addr, uint8_t pattern, size_t size)
1108{
1109    qtest_sendf(s, "memset 0x%" PRIx64 " 0x%zx 0x%02x\n", addr, size, pattern);
1110    qtest_rsp(s, 0);
1111}
1112
1113void qtest_qmp_assert_success(QTestState *qts, const char *fmt, ...)
1114{
1115    va_list ap;
1116    QDict *response;
1117
1118    va_start(ap, fmt);
1119    response = qtest_vqmp(qts, fmt, ap);
1120    va_end(ap);
1121
1122    g_assert(response);
1123    if (!qdict_haskey(response, "return")) {
1124        QString *s = qobject_to_json_pretty(QOBJECT(response));
1125        g_test_message("%s", qstring_get_str(s));
1126        qobject_unref(s);
1127    }
1128    g_assert(qdict_haskey(response, "return"));
1129    qobject_unref(response);
1130}
1131
1132bool qtest_big_endian(QTestState *s)
1133{
1134    return s->big_endian;
1135}
1136
1137static bool qtest_check_machine_version(const char *mname, const char *basename,
1138                                        int major, int minor)
1139{
1140    char *newname;
1141    bool is_equal;
1142
1143    newname = g_strdup_printf("%s-%i.%i", basename, major, minor);
1144    is_equal = g_str_equal(mname, newname);
1145    g_free(newname);
1146
1147    return is_equal;
1148}
1149
1150static bool qtest_is_old_versioned_machine(const char *mname)
1151{
1152    const char *dash = strrchr(mname, '-');
1153    const char *dot = strrchr(mname, '.');
1154    const char *chr;
1155    char *bname;
1156    const int major = QEMU_VERSION_MAJOR;
1157    const int minor = QEMU_VERSION_MINOR;
1158    bool res = false;
1159
1160    if (dash && dot && dot > dash) {
1161        for (chr = dash + 1; *chr; chr++) {
1162            if (!qemu_isdigit(*chr) && *chr != '.') {
1163                return false;
1164            }
1165        }
1166        /*
1167         * Now check if it is one of the latest versions. Check major + 1
1168         * and minor + 1 versions as well, since they might already exist
1169         * in the development branch.
1170         */
1171        bname = g_strdup(mname);
1172        bname[dash - mname] = 0;
1173        res = !qtest_check_machine_version(mname, bname, major + 1, 0) &&
1174              !qtest_check_machine_version(mname, bname, major, minor + 1) &&
1175              !qtest_check_machine_version(mname, bname, major, minor);
1176        g_free(bname);
1177    }
1178
1179    return res;
1180}
1181
1182void qtest_cb_for_every_machine(void (*cb)(const char *machine),
1183                                bool skip_old_versioned)
1184{
1185    QDict *response, *minfo;
1186    QList *list;
1187    const QListEntry *p;
1188    QObject *qobj;
1189    QString *qstr;
1190    const char *mname;
1191    QTestState *qts;
1192
1193    qts = qtest_init("-machine none");
1194    response = qtest_qmp(qts, "{ 'execute': 'query-machines' }");
1195    g_assert(response);
1196    list = qdict_get_qlist(response, "return");
1197    g_assert(list);
1198
1199    for (p = qlist_first(list); p; p = qlist_next(p)) {
1200        minfo = qobject_to(QDict, qlist_entry_obj(p));
1201        g_assert(minfo);
1202        qobj = qdict_get(minfo, "name");
1203        g_assert(qobj);
1204        qstr = qobject_to(QString, qobj);
1205        g_assert(qstr);
1206        mname = qstring_get_str(qstr);
1207        if (!skip_old_versioned || !qtest_is_old_versioned_machine(mname)) {
1208            cb(mname);
1209        }
1210    }
1211
1212    qtest_quit(qts);
1213    qobject_unref(response);
1214}
1215
1216QDict *qtest_qmp_receive_success(QTestState *s,
1217                                 void (*event_cb)(void *opaque,
1218                                                  const char *event,
1219                                                  QDict *data),
1220                                 void *opaque)
1221{
1222    QDict *response, *ret, *data;
1223    const char *event;
1224
1225    for (;;) {
1226        response = qtest_qmp_receive(s);
1227        g_assert(!qdict_haskey(response, "error"));
1228        ret = qdict_get_qdict(response, "return");
1229        if (ret) {
1230            break;
1231        }
1232        event = qdict_get_str(response, "event");
1233        data = qdict_get_qdict(response, "data");
1234        if (event_cb) {
1235            event_cb(opaque, event, data);
1236        }
1237        qobject_unref(response);
1238    }
1239
1240    qobject_ref(ret);
1241    qobject_unref(response);
1242    return ret;
1243}
1244
1245/*
1246 * Generic hot-plugging test via the device_add QMP commands.
1247 */
1248void qtest_qmp_device_add_qdict(QTestState *qts, const char *drv,
1249                                const QDict *arguments)
1250{
1251    QDict *resp;
1252    QDict *args = arguments ? qdict_clone_shallow(arguments) : qdict_new();
1253
1254    g_assert(!qdict_haskey(args, "driver"));
1255    qdict_put_str(args, "driver", drv);
1256    resp = qtest_qmp(qts, "{'execute': 'device_add', 'arguments': %p}", args);
1257    g_assert(resp);
1258    g_assert(!qdict_haskey(resp, "event")); /* We don't expect any events */
1259    g_assert(!qdict_haskey(resp, "error"));
1260    qobject_unref(resp);
1261}
1262
1263void qtest_qmp_device_add(QTestState *qts, const char *driver, const char *id,
1264                          const char *fmt, ...)
1265{
1266    QDict *args;
1267    va_list ap;
1268
1269    va_start(ap, fmt);
1270    args = qdict_from_vjsonf_nofail(fmt, ap);
1271    va_end(ap);
1272
1273    g_assert(!qdict_haskey(args, "id"));
1274    qdict_put_str(args, "id", id);
1275
1276    qtest_qmp_device_add_qdict(qts, driver, args);
1277    qobject_unref(args);
1278}
1279
1280static void device_deleted_cb(void *opaque, const char *name, QDict *data)
1281{
1282    bool *got_event = opaque;
1283
1284    g_assert_cmpstr(name, ==, "DEVICE_DELETED");
1285    *got_event = true;
1286}
1287
1288/*
1289 * Generic hot-unplugging test via the device_del QMP command.
1290 * Device deletion will get one response and one event. For example:
1291 *
1292 * {'execute': 'device_del','arguments': { 'id': 'scsi-hd'}}
1293 *
1294 * will get this one:
1295 *
1296 * {"timestamp": {"seconds": 1505289667, "microseconds": 569862},
1297 *  "event": "DEVICE_DELETED", "data": {"device": "scsi-hd",
1298 *  "path": "/machine/peripheral/scsi-hd"}}
1299 *
1300 * and this one:
1301 *
1302 * {"return": {}}
1303 *
1304 * But the order of arrival may vary - so we've got to detect both.
1305 */
1306void qtest_qmp_device_del(QTestState *qts, const char *id)
1307{
1308    bool got_event = false;
1309    QDict *rsp;
1310
1311    qtest_qmp_send(qts, "{'execute': 'device_del', 'arguments': {'id': %s}}",
1312                   id);
1313    rsp = qtest_qmp_receive_success(qts, device_deleted_cb, &got_event);
1314    qobject_unref(rsp);
1315    if (!got_event) {
1316        rsp = qtest_qmp_receive(qts);
1317        g_assert_cmpstr(qdict_get_try_str(rsp, "event"),
1318                        ==, "DEVICE_DELETED");
1319        qobject_unref(rsp);
1320    }
1321}
1322
1323bool qmp_rsp_is_err(QDict *rsp)
1324{
1325    QDict *error = qdict_get_qdict(rsp, "error");
1326    qobject_unref(rsp);
1327    return !!error;
1328}
1329
1330void qmp_assert_error_class(QDict *rsp, const char *class)
1331{
1332    QDict *error = qdict_get_qdict(rsp, "error");
1333
1334    g_assert_cmpstr(qdict_get_try_str(error, "class"), ==, class);
1335    g_assert_nonnull(qdict_get_try_str(error, "desc"));
1336    g_assert(!qdict_haskey(rsp, "return"));
1337
1338    qobject_unref(rsp);
1339}
1340