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