aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorPeter Maydell <peter.maydell@linaro.org>2020-04-29 15:07:33 +0100
committerPeter Maydell <peter.maydell@linaro.org>2020-04-29 15:07:33 +0100
commit648db19685b7030aa558a4ddbd3a8e53d8c9a062 (patch)
tree8e377b98cfb22b5de93054fedf3333c3cab3522e /tests
parenta7922a3c81f34f45b1ebc9670a7769edc4c42a43 (diff)
parent8ef3a4be27efccd791d05e74b7b17d918f511a76 (diff)
Merge remote-tracking branch 'remotes/armbru/tags/pull-misc-2020-04-29' into staging
Miscellaneous patches for 2020-04-29 # gpg: Signature made Wed 29 Apr 2020 07:42:52 BST # gpg: using RSA key 354BC8B3D7EB2A6B68674E5F3870B400EB918653 # gpg: issuer "armbru@redhat.com" # gpg: Good signature from "Markus Armbruster <armbru@redhat.com>" [full] # gpg: aka "Markus Armbruster <armbru@pond.sub.org>" [full] # Primary key fingerprint: 354B C8B3 D7EB 2A6B 6867 4E5F 3870 B400 EB91 8653 * remotes/armbru/tags/pull-misc-2020-04-29: (32 commits) qemu-option: pass NULL rather than 0 to the id of qemu_opts_set() libqos: Give get_machine_allocator() internal linkage fuzz: Simplify how we compute available machines and types Makefile: Drop unused, broken target recurse-fuzz smbus: Fix spd_data_generate() for number of banks > 2 bamboo, sam460ex: Tidy up error message for unsupported RAM size smbus: Fix spd_data_generate() error API violation sam460ex: Suppress useless warning on -m 32 and -m 64 qga: Fix qmp_guest_suspend_{disk, ram}() error handling qga: Fix qmp_guest_get_memory_blocks() error handling tests/test-logging: Fix test for -dfilter 0..0xffffffffffffffff migration/colo: Fix qmp_xen_colo_do_checkpoint() error handling io: Fix qio_channel_socket_close() error handling xen/pt: Fix flawed conversion to realize() virtio-net: Fix duplex=... and speed=... error handling bochs-display: Fix vgamem=SIZE error handling fdc: Fix fallback=auto error handling arm/virt: Fix virt_machine_device_plug_cb() error API violation cpus: Proper range-checking for -icount shift=N cpus: Fix configure_icount() error API violation ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'tests')
-rw-r--r--tests/qtest/fuzz/qos_fuzz.c34
-rw-r--r--tests/qtest/libqos/qos_external.c68
-rw-r--r--tests/qtest/libqos/qos_external.h10
-rw-r--r--tests/qtest/qos-test.c29
-rw-r--r--tests/test-logging.c4
-rw-r--r--tests/test-qemu-opts.c46
6 files changed, 104 insertions, 87 deletions
diff --git a/tests/qtest/fuzz/qos_fuzz.c b/tests/qtest/fuzz/qos_fuzz.c
index af28c92866..87eadb0889 100644
--- a/tests/qtest/fuzz/qos_fuzz.c
+++ b/tests/qtest/fuzz/qos_fuzz.c
@@ -36,7 +36,6 @@
#include "qapi/qapi-commands-machine.h"
#include "qapi/qapi-commands-qom.h"
-#include "qapi/qmp/qlist.h"
void *fuzz_qos_obj;
@@ -45,34 +44,19 @@ QGuestAllocator *fuzz_qos_alloc;
static const char *fuzz_target_name;
static char **fuzz_path_vec;
-/*
- * Replaced the qmp commands with direct qmp_marshal calls.
- * Probably there is a better way to do this
- */
static void qos_set_machines_devices_available(void)
{
- QDict *req = qdict_new();
- QObject *response;
- QDict *args = qdict_new();
- QList *lst;
-
- qmp_marshal_query_machines(NULL, &response, &error_abort);
- lst = qobject_to(QList, response);
- apply_to_qlist(lst, true);
-
- qobject_unref(response);
-
+ MachineInfoList *mach_info;
+ ObjectTypeInfoList *type_info;
- qdict_put_str(req, "execute", "qom-list-types");
- qdict_put_str(args, "implements", "device");
- qdict_put_bool(args, "abstract", true);
- qdict_put_obj(req, "arguments", (QObject *) args);
+ mach_info = qmp_query_machines(&error_abort);
+ machines_apply_to_node(mach_info);
+ qapi_free_MachineInfoList(mach_info);
- qmp_marshal_qom_list_types(args, &response, &error_abort);
- lst = qobject_to(QList, response);
- apply_to_qlist(lst, false);
- qobject_unref(response);
- qobject_unref(req);
+ type_info = qmp_qom_list_types(true, "device", true, true,
+ &error_abort);
+ types_apply_to_node(type_info);
+ qapi_free_ObjectTypeInfoList(type_info);
}
static char **current_path;
diff --git a/tests/qtest/libqos/qos_external.c b/tests/qtest/libqos/qos_external.c
index 398556dde0..9f5180e18d 100644
--- a/tests/qtest/libqos/qos_external.c
+++ b/tests/qtest/libqos/qos_external.c
@@ -29,66 +29,44 @@
#include "libqos/qgraph_internal.h"
#include "libqos/qos_external.h"
+static void machine_apply_to_node(const char *name)
+{
+ char *machine_name = g_strconcat(qtest_get_arch(), "/", name, NULL);
+ qos_graph_node_set_availability(machine_name, true);
+ g_free(machine_name);
+}
-void apply_to_node(const char *name, bool is_machine, bool is_abstract)
+void machines_apply_to_node(MachineInfoList *mach_info)
{
- char *machine_name = NULL;
- if (is_machine) {
- const char *arch = qtest_get_arch();
- machine_name = g_strconcat(arch, "/", name, NULL);
- name = machine_name;
+ MachineInfoList *tail;
+
+ for (tail = mach_info; tail; tail = tail->next) {
+ machine_apply_to_node(tail->value->name);
+ if (tail->value->alias) {
+ machine_apply_to_node(tail->value->alias);
+ }
}
+}
+
+static void type_apply_to_node(const char *name, bool is_abstract)
+{
qos_graph_node_set_availability(name, true);
if (is_abstract) {
qos_delete_cmd_line(name);
}
- g_free(machine_name);
}
-/**
- * apply_to_qlist(): using QMP queries QEMU for a list of
- * machines and devices available, and sets the respective node
- * as true. If a node is found, also all its produced and contained
- * child are marked available.
- *
- * See qos_graph_node_set_availability() for more info
- */
-void apply_to_qlist(QList *list, bool is_machine)
+void types_apply_to_node(ObjectTypeInfoList *type_info)
{
- const QListEntry *p;
- const char *name;
- bool abstract;
- QDict *minfo;
- QObject *qobj;
- QString *qstr;
- QBool *qbool;
-
- for (p = qlist_first(list); p; p = qlist_next(p)) {
- minfo = qobject_to(QDict, qlist_entry_obj(p));
- qobj = qdict_get(minfo, "name");
- qstr = qobject_to(QString, qobj);
- name = qstring_get_str(qstr);
-
- qobj = qdict_get(minfo, "abstract");
- if (qobj) {
- qbool = qobject_to(QBool, qobj);
- abstract = qbool_get_bool(qbool);
- } else {
- abstract = false;
- }
+ ObjectTypeInfoList *tail;
- apply_to_node(name, is_machine, abstract);
- qobj = qdict_get(minfo, "alias");
- if (qobj) {
- qstr = qobject_to(QString, qobj);
- name = qstring_get_str(qstr);
- apply_to_node(name, is_machine, abstract);
- }
+ for (tail = type_info; tail; tail = tail->next) {
+ type_apply_to_node(tail->value->name, tail->value->abstract);
}
}
-QGuestAllocator *get_machine_allocator(QOSGraphObject *obj)
+static QGuestAllocator *get_machine_allocator(QOSGraphObject *obj)
{
return obj->get_driver(obj, "memory");
}
diff --git a/tests/qtest/libqos/qos_external.h b/tests/qtest/libqos/qos_external.h
index 7b44930c55..72d7f91707 100644
--- a/tests/qtest/libqos/qos_external.h
+++ b/tests/qtest/libqos/qos_external.h
@@ -18,11 +18,13 @@
#ifndef QOS_EXTERNAL_H
#define QOS_EXTERNAL_H
-#include "libqos/qgraph.h"
-void apply_to_node(const char *name, bool is_machine, bool is_abstract);
-void apply_to_qlist(QList *list, bool is_machine);
-QGuestAllocator *get_machine_allocator(QOSGraphObject *obj);
+#include "libqos/malloc.h"
+#include "qapi/qapi-types-machine.h"
+#include "qapi/qapi-types-qom.h"
+
+void machines_apply_to_node(MachineInfoList *mach_info);
+void types_apply_to_node(ObjectTypeInfoList *type_info);
void *allocate_objects(QTestState *qts, char **path, QGuestAllocator **p_alloc);
#endif
diff --git a/tests/qtest/qos-test.c b/tests/qtest/qos-test.c
index ad193f43a5..3062a13557 100644
--- a/tests/qtest/qos-test.c
+++ b/tests/qtest/qos-test.c
@@ -19,11 +19,12 @@
#include "qemu/osdep.h"
#include <getopt.h>
#include "libqtest-single.h"
+#include "qapi/error.h"
#include "qapi/qmp/qdict.h"
-#include "qapi/qmp/qbool.h"
-#include "qapi/qmp/qstring.h"
#include "qemu/module.h"
-#include "qapi/qmp/qlist.h"
+#include "qapi/qobject-input-visitor.h"
+#include "qapi/qapi-visit-machine.h"
+#include "qapi/qapi-visit-qom.h"
#include "libqos/malloc.h"
#include "libqos/qgraph.h"
#include "libqos/qgraph_internal.h"
@@ -51,13 +52,20 @@ static void qos_set_machines_devices_available(void)
{
QDict *response;
QDict *args = qdict_new();
- QList *list;
+ QObject *ret;
+ Visitor *v;
+ MachineInfoList *mach_info;
+ ObjectTypeInfoList *type_info;
qtest_start("-machine none");
response = qmp("{ 'execute': 'query-machines' }");
- list = qdict_get_qlist(response, "return");
+ ret = qdict_get(response, "return");
- apply_to_qlist(list, true);
+ v = qobject_input_visitor_new(ret);
+ visit_type_MachineInfoList(v, NULL, &mach_info, &error_abort);
+ visit_free(v);
+ machines_apply_to_node(mach_info);
+ qapi_free_MachineInfoList(mach_info);
qobject_unref(response);
@@ -66,10 +74,13 @@ static void qos_set_machines_devices_available(void)
response = qmp("{'execute': 'qom-list-types',"
" 'arguments': %p }", args);
- g_assert(qdict_haskey(response, "return"));
- list = qdict_get_qlist(response, "return");
+ ret = qdict_get(response, "return");
- apply_to_qlist(list, false);
+ v = qobject_input_visitor_new(ret);
+ visit_type_ObjectTypeInfoList(v, NULL, &type_info, &error_abort);
+ visit_free(v);
+ types_apply_to_node(type_info);
+ qapi_free_ObjectTypeInfoList(type_info);
qtest_end();
qobject_unref(response);
diff --git a/tests/test-logging.c b/tests/test-logging.c
index 6387e4933f..8580b82420 100644
--- a/tests/test-logging.c
+++ b/tests/test-logging.c
@@ -73,10 +73,10 @@ static void test_parse_range(void)
g_assert(qemu_log_in_addr_range(UINT64_MAX));
g_assert_false(qemu_log_in_addr_range(UINT64_MAX - 1));
- qemu_set_dfilter_ranges("0..0xffffffffffffffff", &err);
+ qemu_set_dfilter_ranges("0..0xffffffffffffffff", &error_abort);
g_assert(qemu_log_in_addr_range(0));
g_assert(qemu_log_in_addr_range(UINT64_MAX));
-
+
qemu_set_dfilter_ranges("2..1", &err);
error_free_or_abort(&err);
diff --git a/tests/test-qemu-opts.c b/tests/test-qemu-opts.c
index ef96e84aed..2a0f42a09b 100644
--- a/tests/test-qemu-opts.c
+++ b/tests/test-qemu-opts.c
@@ -500,10 +500,10 @@ static void test_opts_parse(void)
g_assert(!opts);
/* TODO Cover .merge_lists = true */
- /* Buggy ID recognition */
+ /* Buggy ID recognition (fixed) */
opts = qemu_opts_parse(&opts_list_03, "x=,,id=bar", false, &error_abort);
g_assert_cmpuint(opts_count(opts), ==, 1);
- g_assert_cmpstr(qemu_opts_id(opts), ==, "bar"); /* BUG */
+ g_assert(!qemu_opts_id(opts));
g_assert_cmpstr(qemu_opt_get(opts, "x"), ==, ",id=bar");
/* Anti-social ID */
@@ -728,6 +728,47 @@ static void test_opts_parse_size(void)
qemu_opts_reset(&opts_list_02);
}
+static void test_has_help_option(void)
+{
+ static const struct {
+ const char *params;
+ /* expected value of qemu_opt_has_help_opt() with implied=false */
+ bool expect;
+ /* expected value of qemu_opt_has_help_opt() with implied=true */
+ bool expect_implied;
+ } test[] = {
+ { "help", true, false },
+ { "?", true, false },
+ { "helpme", false, false },
+ { "?me", false, false },
+ { "a,help", true, true },
+ { "a,?", true, true },
+ { "a=0,help,b", true, true },
+ { "a=0,?,b", true, true },
+ { "help,b=1", true, false },
+ { "?,b=1", true, false },
+ { "a,b,,help", true, true },
+ { "a,b,,?", true, true },
+ };
+ int i;
+ QemuOpts *opts;
+
+ for (i = 0; i < ARRAY_SIZE(test); i++) {
+ g_assert_cmpint(has_help_option(test[i].params),
+ ==, test[i].expect);
+ opts = qemu_opts_parse(&opts_list_03, test[i].params, false,
+ &error_abort);
+ g_assert_cmpint(qemu_opt_has_help_opt(opts),
+ ==, test[i].expect);
+ qemu_opts_del(opts);
+ opts = qemu_opts_parse(&opts_list_03, test[i].params, true,
+ &error_abort);
+ g_assert_cmpint(qemu_opt_has_help_opt(opts),
+ ==, test[i].expect_implied);
+ qemu_opts_del(opts);
+ }
+}
+
static void append_verify_list_01(QemuOptDesc *desc, bool with_overlapping)
{
int i = 0;
@@ -990,6 +1031,7 @@ int main(int argc, char *argv[])
g_test_add_func("/qemu-opts/opts_parse/bool", test_opts_parse_bool);
g_test_add_func("/qemu-opts/opts_parse/number", test_opts_parse_number);
g_test_add_func("/qemu-opts/opts_parse/size", test_opts_parse_size);
+ g_test_add_func("/qemu-opts/has_help_option", test_has_help_option);
g_test_add_func("/qemu-opts/append_to_null", test_opts_append_to_null);
g_test_add_func("/qemu-opts/append", test_opts_append);
g_test_add_func("/qemu-opts/to_qdict/basic", test_opts_to_qdict_basic);