tests/qtest: Extract qtest_qom_has_concrete_type() helper

Extract qtest_qom_has_concrete_type() out of qtest_has_device()
in order to re-use it in the following commit.

Reviewed-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Akihiko Odaki <akihiko.odaki@daynix.com>
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Message-ID: <20250130103728.536-2-philmd@linaro.org>
Signed-off-by: Fabiano Rosas <farosas@suse.de>
This commit is contained in:
Philippe Mathieu-Daudé 2025-01-30 11:37:27 +01:00 committed by Fabiano Rosas
parent 5fddf0c045
commit 6f02691ff4

View File

@ -1011,6 +1011,56 @@ const char *qtest_get_arch(void)
return end + 1; return end + 1;
} }
static bool qtest_qom_has_concrete_type(const char *parent_typename,
const char *child_typename,
QList **cached_list)
{
QList *list = cached_list ? *cached_list : NULL;
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", parent_typename);
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);
if (cached_list) {
*cached_list = list;
}
}
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), child_typename)) {
return true;
}
}
return false;
}
bool qtest_has_accel(const char *accel_name) bool qtest_has_accel(const char *accel_name)
{ {
if (g_str_equal(accel_name, "tcg")) { if (g_str_equal(accel_name, "tcg")) {
@ -1790,45 +1840,8 @@ bool qtest_has_machine(const char *machine)
bool qtest_has_device(const char *device) bool qtest_has_device(const char *device)
{ {
static QList *list; static QList *list;
const QListEntry *p;
QObject *qobj;
QString *qstr;
QDict *devinfo;
int idx;
if (!list) { return qtest_qom_has_concrete_type("device", device, &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;
} }
/* /*