summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Huth2021-12-20 09:10:51 +0100
committerThomas Huth2021-12-22 08:13:05 +0100
commitad9e129b0162a1342a407c8d8e2073e4562206f2 (patch)
treeb857f210baa949e27090fb44a4d7baab8c116610
parentMAINTAINERS: Update COLO Proxy section (diff)
downloadqemu-ad9e129b0162a1342a407c8d8e2073e4562206f2.tar.gz
qemu-ad9e129b0162a1342a407c8d8e2073e4562206f2.tar.xz
qemu-ad9e129b0162a1342a407c8d8e2073e4562206f2.zip
tests/qtest: Add a function that checks whether a device is available
Devices might not always be compiled into the QEMU target binaries. We already have the libqos framework that is good for handling such situations, but some of the qtests are not a real good fit for the libqos framework. Let's add a qtest_has_device() function for such tests instead. Message-Id: <20211220081054.151515-2-thuth@redhat.com> Signed-off-by: Thomas Huth <thuth@redhat.com>
-rw-r--r--tests/qtest/libqos/libqtest.h8
-rw-r--r--tests/qtest/libqtest.c44
2 files changed, 52 insertions, 0 deletions
diff --git a/tests/qtest/libqos/libqtest.h b/tests/qtest/libqos/libqtest.h
index a6d38d7ef7..cf38d273f5 100644
--- a/tests/qtest/libqos/libqtest.h
+++ b/tests/qtest/libqos/libqtest.h
@@ -719,6 +719,14 @@ void qtest_cb_for_every_machine(void (*cb)(const char *machine),
bool qtest_has_machine(const char *machine);
/**
+ * qtest_has_device:
+ * @device: The device to look for
+ *
+ * Returns: true if the device is available in the target binary.
+ */
+bool qtest_has_device(const char *device);
+
+/**
* qtest_qmp_device_add_qdict:
* @qts: QTestState instance to operate on
* @drv: Name of the device that should be added
diff --git a/tests/qtest/libqtest.c b/tests/qtest/libqtest.c
index a68326caae..41f4da4e54 100644
--- a/tests/qtest/libqtest.c
+++ b/tests/qtest/libqtest.c
@@ -1418,6 +1418,50 @@ bool qtest_has_machine(const char *machine)
return false;
}
+bool qtest_has_device(const char *device)
+{
+ static QList *list;
+ const QListEntry *p;
+ QObject *qobj;
+ QString *qstr;
+ QDict *devinfo;
+ int idx;
+
+ if (!list) {
+ QDict *resp;
+ QDict *args;
+ QTestState *qts = qtest_init("-machine none");
+
+ args = qdict_new();
+ qdict_put_bool(args, "abstract", false);
+ qdict_put_str(args, "implements", "device");
+
+ resp = qtest_qmp(qts, "{'execute': 'qom-list-types', 'arguments': %p }",
+ args);
+ g_assert(qdict_haskey(resp, "return"));
+ list = qdict_get_qlist(resp, "return");
+ qobject_ref(list);
+ qobject_unref(resp);
+
+ qtest_quit(qts);
+ }
+
+ for (p = qlist_first(list), idx = 0; p; p = qlist_next(p), idx++) {
+ devinfo = qobject_to(QDict, qlist_entry_obj(p));
+ g_assert(devinfo);
+
+ qobj = qdict_get(devinfo, "name");
+ g_assert(qobj);
+ qstr = qobject_to(QString, qobj);
+ g_assert(qstr);
+ if (g_str_equal(qstring_get_str(qstr), device)) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
/*
* Generic hot-plugging test via the device_add QMP commands.
*/