aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorRichard Henderson <richard.henderson@linaro.org>2022-08-08 09:57:37 -0700
committerRichard Henderson <richard.henderson@linaro.org>2022-08-08 09:57:37 -0700
commit8a1337e60400ef54432e063164faf5043a55555d (patch)
treeb41a8db1f3e8d035e45f76d85a2292eba26cc388 /tests
parent0b86b4e0dabbef15ba8d50e13bfecc582df70653 (diff)
parentf6a5f380627ab2af384bf2f2940d29386dea11ff (diff)
downloadqemu-8a1337e60400ef54432e063164faf5043a55555d.zip
qemu-8a1337e60400ef54432e063164faf5043a55555d.tar.gz
qemu-8a1337e60400ef54432e063164faf5043a55555d.tar.bz2
Merge tag 'for-upstream' of https://gitlab.com/bonzini/qemu into staging
* Fix and tests for -readconfig * Fixes for changeable block size # -----BEGIN PGP SIGNATURE----- # # iQFIBAABCAAyFiEE8TM4V0tmI4mGbHaCv/vSX3jHroMFAmLxB6wUHHBib256aW5p # QHJlZGhhdC5jb20ACgkQv/vSX3jHroMbgQgAmj38xh/KurUvjAwlki9OF+jIXem/ # r7eHtc6wG/dGN7CyL+EK08c2GfPIphhii3JGfLT3P/xHvHRVgYow2AELNvYSG85M # SBQGfDsHLoKvY6Wni3AolECvtGycXkd30RtrzqdTT8iZyIhTTsikEG2hSgE+Z6Yy # 9XGPHN9puTkkD5HYnDV1+T4+yc28F8UTVob3fv9b7LMH7mSYz7UN5Tw4zB7DjOL1 # JNTuYqW9JN1X1vIYKxYw9Y5Jb3qNjnl8y6if8bPuvrLRw94sd0ax23yEQHwtgcUj # cYGcvZ2/X0SQg4AHTsqGJCuffKNDfHhmmA7w0Xb2DEvBvoveYOaDp3dKZQ== # =L9FI # -----END PGP SIGNATURE----- # gpg: Signature made Mon 08 Aug 2022 05:55:08 AM PDT # gpg: using RSA key F13338574B662389866C7682BFFBD25F78C7AE83 # gpg: issuer "pbonzini@redhat.com" # gpg: Good signature from "Paolo Bonzini <bonzini@gnu.org>" [undefined] # gpg: aka "Paolo Bonzini <pbonzini@redhat.com>" [undefined] # gpg: WARNING: This key is not certified with a trusted signature! # gpg: There is no indication that the signature belongs to the owner. # Primary key fingerprint: 46F5 9FBD 57D6 12E7 BFD4 E2F7 7E15 100C CD36 69B1 # Subkey fingerprint: F133 3857 4B66 2389 866C 7682 BFFB D25F 78C7 AE83 * tag 'for-upstream' of https://gitlab.com/bonzini/qemu: tests/qtest: add scenario for -readconfig handling vl: remove dead code in parse_memory_options() vl: fix [memory] section with -readconfig scsi-disk: ensure block size is non-zero and changes limited to bits 8-15 scsi-disk: fix overflow when block size is not a multiple of BDRV_SECTOR_SIZE Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Diffstat (limited to 'tests')
-rw-r--r--tests/qtest/meson.build1
-rw-r--r--tests/qtest/readconfig-test.c195
2 files changed, 196 insertions, 0 deletions
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
index 3a47401..be4b30d 100644
--- a/tests/qtest/meson.build
+++ b/tests/qtest/meson.build
@@ -26,6 +26,7 @@ qtests_generic = [
'qom-test',
'test-hmp',
'qos-test',
+ 'readconfig-test',
]
if config_host.has_key('CONFIG_MODULES')
qtests_generic += [ 'modules-test' ]
diff --git a/tests/qtest/readconfig-test.c b/tests/qtest/readconfig-test.c
new file mode 100644
index 0000000..2e604d7
--- /dev/null
+++ b/tests/qtest/readconfig-test.c
@@ -0,0 +1,195 @@
+/*
+ * Validate -readconfig
+ *
+ * Copyright (c) 2022 Red Hat, Inc.
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ */
+
+#include "qemu/osdep.h"
+#include "libqtest.h"
+#include "qapi/error.h"
+#include "qapi/qapi-visit-machine.h"
+#include "qapi/qapi-visit-qom.h"
+#include "qapi/qapi-visit-ui.h"
+#include "qapi/qmp/qdict.h"
+#include "qapi/qmp/qlist.h"
+#include "qapi/qobject-input-visitor.h"
+#include "qapi/qmp/qstring.h"
+#include "qemu/units.h"
+
+static QTestState *qtest_init_with_config(const char *cfgdata)
+{
+ GError *error = NULL;
+ g_autofree char *args = NULL;
+ int cfgfd = -1;
+ g_autofree char *cfgpath = NULL;
+ QTestState *qts;
+ ssize_t ret;
+
+ cfgfd = g_file_open_tmp("readconfig-test-XXXXXX", &cfgpath, &error);
+ g_assert_no_error(error);
+ g_assert_cmpint(cfgfd, >=, 0);
+
+ ret = qemu_write_full(cfgfd, cfgdata, strlen(cfgdata));
+ if (ret < 0) {
+ unlink(cfgpath);
+ }
+ g_assert_cmpint(ret, ==, strlen(cfgdata));
+
+ close(cfgfd);
+
+ args = g_strdup_printf("-nodefaults -machine none -readconfig %s", cfgpath);
+
+ qts = qtest_init(args);
+
+ unlink(cfgpath);
+
+ return qts;
+}
+
+static void test_x86_memdev_resp(QObject *res)
+{
+ Visitor *v;
+ g_autoptr(MemdevList) memdevs = NULL;
+ Memdev *memdev;
+
+ g_assert(res);
+ v = qobject_input_visitor_new(res);
+ visit_type_MemdevList(v, NULL, &memdevs, &error_abort);
+
+ g_assert(memdevs);
+ g_assert(memdevs->value);
+ g_assert(!memdevs->next);
+
+ memdev = memdevs->value;
+ g_assert_cmpstr(memdev->id, ==, "ram");
+ g_assert_cmpint(memdev->size, ==, 200 * MiB);
+
+ visit_free(v);
+}
+
+static void test_x86_memdev(void)
+{
+ QDict *resp;
+ QTestState *qts;
+ const char *cfgdata =
+ "[memory]\n"
+ "size = \"200\"";
+
+ qts = qtest_init_with_config(cfgdata);
+ /* Test valid command */
+ resp = qtest_qmp(qts, "{ 'execute': 'query-memdev' }");
+ test_x86_memdev_resp(qdict_get(resp, "return"));
+ qobject_unref(resp);
+
+ qtest_quit(qts);
+}
+
+
+#ifdef CONFIG_SPICE
+static void test_spice_resp(QObject *res)
+{
+ Visitor *v;
+ g_autoptr(SpiceInfo) spice = NULL;
+
+ g_assert(res);
+ v = qobject_input_visitor_new(res);
+ visit_type_SpiceInfo(v, "spcie", &spice, &error_abort);
+
+ g_assert(spice);
+ g_assert(spice->enabled);
+
+ visit_free(v);
+}
+
+static void test_spice(void)
+{
+ QDict *resp;
+ QTestState *qts;
+ const char *cfgdata =
+ "[spice]\n"
+ "disable-ticketing = \"on\"\n"
+ "unix = \"on\"\n";
+
+ qts = qtest_init_with_config(cfgdata);
+ /* Test valid command */
+ resp = qtest_qmp(qts, "{ 'execute': 'query-spice' }");
+ test_spice_resp(qdict_get(resp, "return"));
+ qobject_unref(resp);
+
+ qtest_quit(qts);
+}
+#endif
+
+static void test_object_rng_resp(QObject *res)
+{
+ Visitor *v;
+ g_autoptr(ObjectPropertyInfoList) objs = NULL;
+ ObjectPropertyInfoList *tmp;
+ ObjectPropertyInfo *obj;
+ bool seen_rng = false;
+
+ g_assert(res);
+ v = qobject_input_visitor_new(res);
+ visit_type_ObjectPropertyInfoList(v, NULL, &objs, &error_abort);
+
+ g_assert(objs);
+ tmp = objs;
+ while (tmp) {
+ g_assert(tmp->value);
+
+ obj = tmp->value;
+ if (g_str_equal(obj->name, "rng0") &&
+ g_str_equal(obj->type, "child<rng-builtin>")) {
+ seen_rng = true;
+ }
+
+ tmp = tmp->next;
+ }
+
+ g_assert(seen_rng);
+
+ visit_free(v);
+}
+
+static void test_object_rng(void)
+{
+ QDict *resp;
+ QTestState *qts;
+ const char *cfgdata =
+ "[object]\n"
+ "qom-type = \"rng-builtin\"\n"
+ "id = \"rng0\"\n";
+
+ qts = qtest_init_with_config(cfgdata);
+ /* Test valid command */
+ resp = qtest_qmp(qts,
+ "{ 'execute': 'qom-list',"
+ " 'arguments': {'path': '/objects' }}");
+ test_object_rng_resp(qdict_get(resp, "return"));
+ qobject_unref(resp);
+
+ qtest_quit(qts);
+}
+
+int main(int argc, char *argv[])
+{
+ const char *arch;
+ g_test_init(&argc, &argv, NULL);
+
+ arch = qtest_get_arch();
+
+ if (g_str_equal(arch, "i386") ||
+ g_str_equal(arch, "x86_64")) {
+ qtest_add_func("readconfig/x86/memdev", test_x86_memdev);
+ }
+#ifdef CONFIG_SPICE
+ qtest_add_func("readconfig/spice", test_spice);
+#endif
+
+ qtest_add_func("readconfig/object-rng", test_object_rng);
+
+ return g_test_run();
+}