qemu/tests/qtest/readconfig-test.c
<<
>>
Prefs
   1/*
   2 * Validate -readconfig
   3 *
   4 * Copyright (c) 2022 Red Hat, Inc.
   5 *
   6 * This work is licensed under the terms of the GNU GPL, version 2 or later.
   7 * See the COPYING file in the top-level directory.
   8 */
   9
  10#include "qemu/osdep.h"
  11#include "libqtest.h"
  12#include "qapi/error.h"
  13#include "qapi/qapi-visit-machine.h"
  14#include "qapi/qapi-visit-qom.h"
  15#include "qapi/qapi-visit-ui.h"
  16#include "qapi/qmp/qdict.h"
  17#include "qapi/qmp/qlist.h"
  18#include "qapi/qobject-input-visitor.h"
  19#include "qapi/qmp/qstring.h"
  20#include "qemu/units.h"
  21
  22static QTestState *qtest_init_with_config(const char *cfgdata)
  23{
  24    GError *error = NULL;
  25    g_autofree char *args = NULL;
  26    int cfgfd = -1;
  27    g_autofree char *cfgpath = NULL;
  28    QTestState *qts;
  29    ssize_t ret;
  30
  31    cfgfd = g_file_open_tmp("readconfig-test-XXXXXX", &cfgpath, &error);
  32    g_assert_no_error(error);
  33    g_assert_cmpint(cfgfd, >=, 0);
  34
  35    ret = qemu_write_full(cfgfd, cfgdata, strlen(cfgdata));
  36    close(cfgfd);
  37    if (ret < 0) {
  38        unlink(cfgpath);
  39    }
  40    g_assert_cmpint(ret, ==, strlen(cfgdata));
  41
  42    args = g_strdup_printf("-nodefaults -machine none -readconfig %s", cfgpath);
  43
  44    qts = qtest_init(args);
  45
  46    unlink(cfgpath);
  47
  48    return qts;
  49}
  50
  51static void test_x86_memdev_resp(QObject *res)
  52{
  53    Visitor *v;
  54    g_autoptr(MemdevList) memdevs = NULL;
  55    Memdev *memdev;
  56
  57    g_assert(res);
  58    v = qobject_input_visitor_new(res);
  59    visit_type_MemdevList(v, NULL, &memdevs, &error_abort);
  60
  61    g_assert(memdevs);
  62    g_assert(memdevs->value);
  63    g_assert(!memdevs->next);
  64
  65    memdev = memdevs->value;
  66    g_assert_cmpstr(memdev->id, ==, "ram");
  67    g_assert_cmpint(memdev->size, ==, 200 * MiB);
  68
  69    visit_free(v);
  70}
  71
  72static void test_x86_memdev(void)
  73{
  74    QDict *resp;
  75    QTestState *qts;
  76    const char *cfgdata =
  77        "[memory]\n"
  78        "size = \"200\"";
  79
  80    qts = qtest_init_with_config(cfgdata);
  81    /* Test valid command */
  82    resp = qtest_qmp(qts, "{ 'execute': 'query-memdev' }");
  83    test_x86_memdev_resp(qdict_get(resp, "return"));
  84    qobject_unref(resp);
  85
  86    qtest_quit(qts);
  87}
  88
  89
  90#ifdef CONFIG_SPICE
  91static void test_spice_resp(QObject *res)
  92{
  93    Visitor *v;
  94    g_autoptr(SpiceInfo) spice = NULL;
  95
  96    g_assert(res);
  97    v = qobject_input_visitor_new(res);
  98    visit_type_SpiceInfo(v, "spice", &spice, &error_abort);
  99
 100    g_assert(spice);
 101    g_assert(spice->enabled);
 102
 103    visit_free(v);
 104}
 105
 106static void test_spice(void)
 107{
 108    QDict *resp;
 109    QTestState *qts;
 110    const char *cfgdata =
 111        "[spice]\n"
 112        "disable-ticketing = \"on\"\n"
 113        "unix = \"on\"\n";
 114
 115    qts = qtest_init_with_config(cfgdata);
 116    /* Test valid command */
 117    resp = qtest_qmp(qts, "{ 'execute': 'query-spice' }");
 118    test_spice_resp(qdict_get(resp, "return"));
 119    qobject_unref(resp);
 120
 121    qtest_quit(qts);
 122}
 123#endif
 124
 125static void test_object_rng_resp(QObject *res)
 126{
 127    Visitor *v;
 128    g_autoptr(ObjectPropertyInfoList) objs = NULL;
 129    ObjectPropertyInfoList *tmp;
 130    ObjectPropertyInfo *obj;
 131    bool seen_rng = false;
 132
 133    g_assert(res);
 134    v = qobject_input_visitor_new(res);
 135    visit_type_ObjectPropertyInfoList(v, NULL, &objs, &error_abort);
 136
 137    g_assert(objs);
 138    tmp = objs;
 139    while (tmp) {
 140        g_assert(tmp->value);
 141
 142        obj = tmp->value;
 143        if (g_str_equal(obj->name, "rng0") &&
 144            g_str_equal(obj->type, "child<rng-builtin>")) {
 145            seen_rng = true;
 146            break;
 147        }
 148
 149        tmp = tmp->next;
 150    }
 151
 152    g_assert(seen_rng);
 153
 154    visit_free(v);
 155}
 156
 157static void test_object_rng(void)
 158{
 159    QDict *resp;
 160    QTestState *qts;
 161    const char *cfgdata =
 162        "[object]\n"
 163        "qom-type = \"rng-builtin\"\n"
 164        "id = \"rng0\"\n";
 165
 166    qts = qtest_init_with_config(cfgdata);
 167    /* Test valid command */
 168    resp = qtest_qmp(qts,
 169                     "{ 'execute': 'qom-list',"
 170                     "  'arguments': {'path': '/objects' }}");
 171    test_object_rng_resp(qdict_get(resp, "return"));
 172    qobject_unref(resp);
 173
 174    qtest_quit(qts);
 175}
 176
 177int main(int argc, char *argv[])
 178{
 179    const char *arch;
 180    g_test_init(&argc, &argv, NULL);
 181
 182    arch = qtest_get_arch();
 183
 184    if (g_str_equal(arch, "i386") ||
 185        g_str_equal(arch, "x86_64")) {
 186        qtest_add_func("readconfig/x86/memdev", test_x86_memdev);
 187    }
 188#ifdef CONFIG_SPICE
 189    qtest_add_func("readconfig/spice", test_spice);
 190#endif
 191
 192    qtest_add_func("readconfig/object-rng", test_object_rng);
 193
 194    return g_test_run();
 195}
 196