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:
parent
5fddf0c045
commit
6f02691ff4
@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user