1
2
3
4
5
6
7
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
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
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
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