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