Commit 62516a0a authored by Peter Maydell's avatar Peter Maydell
Browse files

Merge remote-tracking branch 'remotes/huth-gitlab/tags/pull-request-2019-05-21' into staging



- qtest patches to get rid of the global_qtest variable in more tests
- some iotests patches that have multiple reviews and thus are ready to go

# gpg: Signature made Tue 21 May 2019 11:40:31 BST
# gpg:                using RSA key 2ED9D774FE702DB5
# gpg: Good signature from "Thomas Huth <th.huth@gmx.de>" [full]
# gpg:                 aka "Thomas Huth <thuth@redhat.com>" [full]
# gpg:                 aka "Thomas Huth <huth@tuxfamily.org>" [full]
# gpg:                 aka "Thomas Huth <th.huth@posteo.de>" [unknown]
# Primary key fingerprint: 27B8 8847 EEE0 2501 18F3  EAB9 2ED9 D774 FE70 2DB5

* remotes/huth-gitlab/tags/pull-request-2019-05-21:
  tests/qemu-iotests: Remove the "_supported_os Linux" line from many tests
  cirrus / travis: Add gnu-sed and bash for macOS and FreeBSD
  tests/qemu-iotests: Do not hard-code the path to bash
  tests/qemu-iotests/check: Pick a default machine if necessary
  tests/qemu-iotests/005: Add a sanity check for large sparse file support
  tests/hd-geo-test: Use qtest_init() instead of qtest_start()
  tests/device-introspect: Use qtest_init() instead of qtest_start()
  tests/qom-test: Use qtest_init() instead of qtest_start()
  tests/numa-test: Use qtest_init() instead of qtest_start()
  tests/q35-test: Make test independent of global_qtest
  tests/libqos: Get rid of global_qtest dependency in qvring_init()
  tests/libqtest: Fix description of qtest_vinitf() and qtest_initf()
  tests/libqtest: Remove unused global_qtest-related wrapper functions

Signed-off-by: default avatarPeter Maydell <peter.maydell@linaro.org>
parents 293c76cb b3763a19
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -7,7 +7,7 @@ freebsd_12_task:
    cpu: 8
    memory: 8G
  install_script: pkg install -y
    bison curl cyrus-sasl git glib gmake gnutls
    bash bison curl cyrus-sasl git glib gmake gnutls gsed
    nettle perl5 pixman pkgconf png usbredir
  script:
    - mkdir build
@@ -20,7 +20,7 @@ macos_task:
  osx_instance:
    image: mojave-base
  install_script:
    - brew install pkg-config python glib pixman make sdl2
    - brew install pkg-config python gnu-sed glib pixman make sdl2
  script:
    - ./configure --python=/usr/local/bin/python3 || { cat config.log; exit 1; }
    - gmake -j$(sysctl -n hw.ncpu)
+1 −0
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ addons:
    packages:
      - glib
      - pixman
      - gnu-sed


# The channel name "irc.oftc.net#qemu" is encrypted against qemu/qemu
+46 −39
Original line number Diff line number Diff line
@@ -26,7 +26,8 @@

const char common_args[] = "-nodefaults -machine none";

static QList *qom_list_types(const char *implements, bool abstract)
static QList *qom_list_types(QTestState * qts, const char *implements,
                             bool abstract)
{
    QDict *resp;
    QList *ret;
@@ -36,8 +37,8 @@ static QList *qom_list_types(const char *implements, bool abstract)
    if (implements) {
        qdict_put_str(args, "implements", implements);
    }
    resp = qmp("{'execute': 'qom-list-types',"
               " 'arguments': %p }", args);
    resp = qtest_qmp(qts, "{'execute': 'qom-list-types', 'arguments': %p }",
                     args);
    g_assert(qdict_haskey(resp, "return"));
    ret = qdict_get_qlist(resp, "return");
    qobject_ref(ret);
@@ -95,12 +96,12 @@ static QDict *type_list_find(QList *types, const char *name)
    return NULL;
}

static QList *device_type_list(bool abstract)
static QList *device_type_list(QTestState *qts, bool abstract)
{
    return qom_list_types("device", abstract);
    return qom_list_types(qts, "device", abstract);
}

static void test_one_device(const char *type)
static void test_one_device(QTestState *qts, const char *type)
{
    QDict *resp;
    char *help;
@@ -109,15 +110,15 @@ static void test_one_device(const char *type)

    g_test_message("Testing device '%s'", type);

    qom_tree_start = hmp("info qom-tree");
    qtree_start = hmp("info qtree");
    qom_tree_start = qtest_hmp(qts, "info qom-tree");
    qtree_start = qtest_hmp(qts, "info qtree");

    resp = qmp("{'execute': 'device-list-properties',"
    resp = qtest_qmp(qts, "{'execute': 'device-list-properties',"
                          " 'arguments': {'typename': %s}}",
               type);
    qobject_unref(resp);

    help = hmp("device_add \"%s,help\"", type);
    help = qtest_hmp(qts, "device_add \"%s,help\"", type);
    g_free(help);

    /*
@@ -125,12 +126,12 @@ static void test_one_device(const char *type)
     * "info qom-tree" or "info qtree" have a good chance at crashing then.
     * Also make sure that the tree did not change.
     */
    qom_tree_end = hmp("info qom-tree");
    qom_tree_end = qtest_hmp(qts, "info qom-tree");
    g_assert_cmpstr(qom_tree_start, ==, qom_tree_end);
    g_free(qom_tree_start);
    g_free(qom_tree_end);

    qtree_end = hmp("info qtree");
    qtree_end = qtest_hmp(qts, "info qtree");
    g_assert_cmpstr(qtree_start, ==, qtree_end);
    g_free(qtree_start);
    g_free(qtree_end);
@@ -140,29 +141,30 @@ static void test_device_intro_list(void)
{
    QList *types;
    char *help;
    QTestState *qts;

    qtest_start(common_args);
    qts = qtest_init(common_args);

    types = device_type_list(true);
    types = device_type_list(qts, true);
    qobject_unref(types);

    help = hmp("device_add help");
    help = qtest_hmp(qts, "device_add help");
    g_free(help);

    qtest_end();
    qtest_quit(qts);
}

/*
 * Ensure all entries returned by qom-list-types implements=<parent>
 * have <parent> as a parent.
 */
static void test_qom_list_parents(const char *parent)
static void test_qom_list_parents(QTestState *qts, const char *parent)
{
    QList *types;
    QListEntry *e;
    QDict *index;

    types = qom_list_types(parent, true);
    types = qom_list_types(qts, parent, true);
    index = qom_type_index(types);

    QLIST_FOREACH_ENTRY(types, e) {
@@ -181,11 +183,12 @@ static void test_qom_list_fields(void)
    QList *all_types;
    QList *non_abstract;
    QListEntry *e;
    QTestState *qts;

    qtest_start(common_args);
    qts = qtest_init(common_args);

    all_types = qom_list_types(NULL, true);
    non_abstract = qom_list_types(NULL, false);
    all_types = qom_list_types(qts, NULL, true);
    non_abstract = qom_list_types(qts, NULL, false);

    QLIST_FOREACH_ENTRY(all_types, e) {
        QDict *d = qobject_to(QDict, qlist_entry_obj(e));
@@ -198,27 +201,29 @@ static void test_qom_list_fields(void)
        g_assert(abstract == expected_abstract);
    }

    test_qom_list_parents("object");
    test_qom_list_parents("device");
    test_qom_list_parents("sys-bus-device");
    test_qom_list_parents(qts, "object");
    test_qom_list_parents(qts, "device");
    test_qom_list_parents(qts, "sys-bus-device");

    qobject_unref(all_types);
    qobject_unref(non_abstract);
    qtest_end();
    qtest_quit(qts);
}

static void test_device_intro_none(void)
{
    qtest_start(common_args);
    test_one_device("nonexistent");
    qtest_end();
    QTestState *qts = qtest_init(common_args);

    test_one_device(qts, "nonexistent");
    qtest_quit(qts);
}

static void test_device_intro_abstract(void)
{
    qtest_start(common_args);
    test_one_device("device");
    qtest_end();
    QTestState *qts = qtest_init(common_args);

    test_one_device(qts, "device");
    qtest_quit(qts);
}

static void test_device_intro_concrete(const void *args)
@@ -226,19 +231,20 @@ static void test_device_intro_concrete(const void *args)
    QList *types;
    QListEntry *entry;
    const char *type;
    QTestState *qts;

    qtest_start(args);
    types = device_type_list(false);
    qts = qtest_init(args);
    types = device_type_list(qts, false);

    QLIST_FOREACH_ENTRY(types, entry) {
        type = qdict_get_try_str(qobject_to(QDict, qlist_entry_obj(entry)),
                                 "name");
        g_assert(type);
        test_one_device(type);
        test_one_device(qts, type);
    }

    qobject_unref(types);
    qtest_end();
    qtest_quit(qts);
    g_free((void *)args);
}

@@ -247,10 +253,11 @@ static void test_abstract_interfaces(void)
    QList *all_types;
    QListEntry *e;
    QDict *index;
    QTestState *qts;

    qtest_start(common_args);
    qts = qtest_init(common_args);

    all_types = qom_list_types("interface", true);
    all_types = qom_list_types(qts, "interface", true);
    index = qom_type_index(all_types);

    QLIST_FOREACH_ENTRY(all_types, e) {
@@ -273,7 +280,7 @@ static void test_abstract_interfaces(void)

    qobject_unref(all_types);
    qobject_unref(index);
    qtest_end();
    qtest_quit(qts);
}

static void add_machine_test_case(const char *mname)
+41 −35
Original line number Diff line number Diff line
@@ -77,33 +77,35 @@ static bool is_hd(const CHST *expected_chst)
    return expected_chst && expected_chst->cyls;
}

static void test_cmos_byte(int reg, int expected)
static void test_cmos_byte(QTestState *qts, int reg, int expected)
{
    enum { cmos_base = 0x70 };
    int actual;

    outb(cmos_base + 0, reg);
    actual = inb(cmos_base + 1);
    qtest_outb(qts, cmos_base + 0, reg);
    actual = qtest_inb(qts, cmos_base + 1);
    g_assert(actual == expected);
}

static void test_cmos_bytes(int reg0, int n, uint8_t expected[])
static void test_cmos_bytes(QTestState *qts, int reg0, int n,
                            uint8_t expected[])
{
    int i;

    for (i = 0; i < 9; i++) {
        test_cmos_byte(reg0 + i, expected[i]);
        test_cmos_byte(qts, reg0 + i, expected[i]);
    }
}

static void test_cmos_disk_data(void)
static void test_cmos_disk_data(QTestState *qts)
{
    test_cmos_byte(0x12,
    test_cmos_byte(qts, 0x12,
                   (is_hd(cur_ide[0]) ? 0xf0 : 0) |
                   (is_hd(cur_ide[1]) ? 0x0f : 0));
}

static void test_cmos_drive_cyl(int reg0, const CHST *expected_chst)
static void test_cmos_drive_cyl(QTestState *qts, int reg0,
                                const CHST *expected_chst)
{
    if (is_hd(expected_chst)) {
        int c = expected_chst->cyls;
@@ -113,29 +115,29 @@ static void test_cmos_drive_cyl(int reg0, const CHST *expected_chst)
            c & 0xff, c >> 8, h, 0xff, 0xff, 0xc0 | ((h > 8) << 3),
            c & 0xff, c >> 8, s
        };
        test_cmos_bytes(reg0, 9, expected_bytes);
        test_cmos_bytes(qts, reg0, 9, expected_bytes);
    } else {
        int i;

        for (i = 0; i < 9; i++) {
            test_cmos_byte(reg0 + i, 0);
            test_cmos_byte(qts, reg0 + i, 0);
        }
    }
}

static void test_cmos_drive1(void)
static void test_cmos_drive1(QTestState *qts)
{
    test_cmos_byte(0x19, is_hd(cur_ide[0]) ? 47 : 0);
    test_cmos_drive_cyl(0x1b, cur_ide[0]);
    test_cmos_byte(qts, 0x19, is_hd(cur_ide[0]) ? 47 : 0);
    test_cmos_drive_cyl(qts, 0x1b, cur_ide[0]);
}

static void test_cmos_drive2(void)
static void test_cmos_drive2(QTestState *qts)
{
    test_cmos_byte(0x1a, is_hd(cur_ide[1]) ? 47 : 0);
    test_cmos_drive_cyl(0x24, cur_ide[1]);
    test_cmos_byte(qts, 0x1a, is_hd(cur_ide[1]) ? 47 : 0);
    test_cmos_drive_cyl(qts, 0x24, cur_ide[1]);
}

static void test_cmos_disktransflag(void)
static void test_cmos_disktransflag(QTestState *qts)
{
    int val, i;

@@ -145,15 +147,15 @@ static void test_cmos_disktransflag(void)
            val |= cur_ide[i]->trans << (2 * i);
        }
    }
    test_cmos_byte(0x39, val);
    test_cmos_byte(qts, 0x39, val);
}

static void test_cmos(void)
static void test_cmos(QTestState *qts)
{
    test_cmos_disk_data();
    test_cmos_drive1();
    test_cmos_drive2();
    test_cmos_disktransflag();
    test_cmos_disk_data(qts);
    test_cmos_drive1(qts);
    test_cmos_drive2(qts);
    test_cmos_disktransflag(qts);
}

static int append_arg(int argc, char *argv[], int argv_sz, char *arg)
@@ -238,14 +240,15 @@ static void test_ide_none(void)
{
    char **argv = g_new0(char *, ARGV_SIZE);
    char *args;
    QTestState *qts;

    setup_common(argv, ARGV_SIZE);
    args = g_strjoinv(" ", argv);
    qtest_start(args);
    qts = qtest_init(args);
    g_strfreev(argv);
    g_free(args);
    test_cmos();
    qtest_end();
    test_cmos(qts);
    qtest_quit(qts);
}

static void test_ide_mbr(bool use_device, MBRcontents mbr)
@@ -255,6 +258,7 @@ static void test_ide_mbr(bool use_device, MBRcontents mbr)
    int argc;
    Backend i;
    const char *dev;
    QTestState *qts;

    argc = setup_common(argv, ARGV_SIZE);
    for (i = 0; i < backend_last; i++) {
@@ -263,11 +267,11 @@ static void test_ide_mbr(bool use_device, MBRcontents mbr)
        argc = setup_ide(argc, argv, ARGV_SIZE, i, dev, i, mbr);
    }
    args = g_strjoinv(" ", argv);
    qtest_start(args);
    qts = qtest_init(args);
    g_strfreev(argv);
    g_free(args);
    test_cmos();
    qtest_end();
    test_cmos(qts);
    qtest_quit(qts);
}

/*
@@ -325,6 +329,7 @@ static void test_ide_drive_user(const char *dev, bool trans)
    int argc;
    int secs = img_secs[backend_small];
    const CHST expected_chst = { secs / (4 * 32) , 4, 32, trans };
    QTestState *qts;

    argc = setup_common(argv, ARGV_SIZE);
    opts = g_strdup_printf("%s,%scyls=%d,heads=%d,secs=%d",
@@ -335,11 +340,11 @@ static void test_ide_drive_user(const char *dev, bool trans)
    argc = setup_ide(argc, argv, ARGV_SIZE, 0, opts, backend_small, mbr_chs);
    g_free(opts);
    args = g_strjoinv(" ", argv);
    qtest_start(args);
    qts = qtest_init(args);
    g_strfreev(argv);
    g_free(args);
    test_cmos();
    qtest_end();
    test_cmos(qts);
    qtest_quit(qts);
}

/*
@@ -367,6 +372,7 @@ static void test_ide_drive_cd_0(void)
    char *args;
    int argc, ide_idx;
    Backend i;
    QTestState *qts;

    argc = setup_common(argv, ARGV_SIZE);
    for (i = 0; i <= backend_empty; i++) {
@@ -375,11 +381,11 @@ static void test_ide_drive_cd_0(void)
        argc = setup_ide(argc, argv, ARGV_SIZE, ide_idx, NULL, i, mbr_blank);
    }
    args = g_strjoinv(" ", argv);
    qtest_start(args);
    qts = qtest_init(args);
    g_strfreev(argv);
    g_free(args);
    test_cmos();
    qtest_end();
    test_cmos(qts);
    qtest_quit(qts);
}

int main(int argc, char **argv)
+1 −1
Original line number Diff line number Diff line
@@ -148,7 +148,7 @@ static QVirtQueue *qvirtio_mmio_virtqueue_setup(QVirtioDevice *d,
    g_assert_cmpint(vq->size & (vq->size - 1), ==, 0);

    addr = guest_alloc(alloc, qvring_size(vq->size, dev->page_size));
    qvring_init(alloc, vq, addr);
    qvring_init(dev->qts, alloc, vq, addr);
    qvirtio_mmio_set_queue_address(d, vq->desc / dev->page_size);

    return vq;
Loading