Commit a771729c authored by Thomas Huth's avatar Thomas Huth
Browse files

tests/drive_del-test: Use qtest_init() instead of qtest_start()



qtest_start() + qtest_end() should be avoided, since they use the
global_qtest variable that we want to get rid of in the long run
Use qtest_init() and qtest_quit() instead.

Reviewed-by: default avatarEric Blake <eblake@redhat.com>
Message-Id: <20190508142153.21555-1-thuth@redhat.com>
Signed-off-by: default avatarThomas Huth <thuth@redhat.com>
parent 1e47ac82
Loading
Loading
Loading
Loading
+32 −31
Original line number Diff line number Diff line
@@ -16,32 +16,32 @@
#include "qapi/qmp/qdict.h"

/* TODO actually test the results and get rid of this */
#define qmp_discard_response(...) qobject_unref(qmp(__VA_ARGS__))
#define qmp_discard_response(q, ...) qobject_unref(qtest_qmp(q, __VA_ARGS__))

static void drive_add(void)
static void drive_add(QTestState *qts)
{
    char *resp = hmp("drive_add 0 if=none,id=drive0");
    char *resp = qtest_hmp(qts, "drive_add 0 if=none,id=drive0");

    g_assert_cmpstr(resp, ==, "OK\r\n");
    g_free(resp);
}

static void drive_del(void)
static void drive_del(QTestState *qts)
{
    char *resp = hmp("drive_del drive0");
    char *resp = qtest_hmp(qts, "drive_del drive0");

    g_assert_cmpstr(resp, ==, "");
    g_free(resp);
}

static void device_del(void)
static void device_del(QTestState *qts)
{
    QDict *response;

    /* Complication: ignore DEVICE_DELETED event */
    qmp_discard_response("{'execute': 'device_del',"
    qmp_discard_response(qts, "{'execute': 'device_del',"
                         " 'arguments': { 'id': 'dev0' } }");
    response = qmp_receive();
    response = qtest_qmp_receive(qts);
    g_assert(response);
    g_assert(qdict_haskey(response, "return"));
    qobject_unref(response);
@@ -49,18 +49,20 @@ static void device_del(void)

static void test_drive_without_dev(void)
{
    QTestState *qts;

    /* Start with an empty drive */
    qtest_start("-drive if=none,id=drive0");
    qts = qtest_init("-drive if=none,id=drive0");

    /* Delete the drive */
    drive_del();
    drive_del(qts);

    /* Ensure re-adding the drive works - there should be no duplicate ID error
     * because the old drive must be gone.
     */
    drive_add();
    drive_add(qts);

    qtest_end();
    qtest_quit(qts);
}

/*
@@ -85,16 +87,17 @@ static void test_after_failed_device_add(void)
{
    char driver[32];
    QDict *response;
    QTestState *qts;

    snprintf(driver, sizeof(driver), "virtio-blk-%s",
             qvirtio_get_dev_type());

    qtest_start("-drive if=none,id=drive0");
    qts = qtest_init("-drive if=none,id=drive0");

    /* Make device_add fail. If this leaks the virtio-blk device then a
     * reference to drive0 will also be held (via qdev properties).
     */
    response = qmp("{'execute': 'device_add',"
    response = qtest_qmp(qts, "{'execute': 'device_add',"
                              " 'arguments': {"
                              "   'driver': %s,"
                              "   'drive': 'drive0'"
@@ -103,36 +106,34 @@ static void test_after_failed_device_add(void)
    qmp_assert_error_class(response, "GenericError");

    /* Delete the drive */
    drive_del();
    drive_del(qts);

    /* Try to re-add the drive.  This fails with duplicate IDs if a leaked
     * virtio-blk device exists that holds a reference to the old drive0.
     */
    drive_add();
    drive_add(qts);

    qtest_end();
    qtest_quit(qts);
}

static void test_drive_del_device_del(void)
{
    char *args;
    QTestState *qts;

    /* Start with a drive used by a device that unplugs instantaneously */
    args = g_strdup_printf("-drive if=none,id=drive0,file=null-co://,format=raw"
    qts = qtest_initf("-drive if=none,id=drive0,file=null-co://,format=raw"
                      " -device virtio-scsi-%s"
                      " -device scsi-hd,drive=drive0,id=dev0",
                      qvirtio_get_dev_type());
    qtest_start(args);

    /*
     * Delete the drive, and then the device
     * Doing it in this order takes notoriously tricky special paths
     */
    drive_del();
    device_del();
    drive_del(qts);
    device_del(qts);

    qtest_end();
    g_free(args);
    qtest_quit(qts);
}

int main(int argc, char **argv)