Message ID | 20240606044419.8806-3-anisinha@redhat.com |
---|---|
State | New |
Headers | show |
Series | x86 cpu test refactoring | expand |
On Thu, Jun 06, 2024 at 10:14:18AM +0530, Ani Sinha wrote: > Added a new test api qtest_has_cpu() in order to check availability of some > cpu models in the current QEMU binary. The specific architecture of the QEMU > binary is selected using the QTEST_QEMU_BINARY environment variable. This api > would be useful to run tests against some older cpu models after checking if > QEMU actually supported these models. > > CC: thuth@redhat.com > Signed-off-by: Ani Sinha <anisinha@redhat.com> > --- > tests/qtest/libqtest.c | 84 ++++++++++++++++++++++++++++++++++++++++++ > tests/qtest/libqtest.h | 8 ++++ > 2 files changed, 92 insertions(+) > > diff --git a/tests/qtest/libqtest.c b/tests/qtest/libqtest.c > index d8f80d335e..135a607728 100644 > --- a/tests/qtest/libqtest.c > +++ b/tests/qtest/libqtest.c > @@ -37,6 +37,7 @@ > #include "qapi/qmp/qjson.h" > #include "qapi/qmp/qlist.h" > #include "qapi/qmp/qstring.h" > +#include "qapi/qmp/qbool.h" > > #define MAX_IRQ 256 > > @@ -1471,6 +1472,12 @@ struct MachInfo { > char *alias; > }; > > +struct CpuInfo { > + char *name; > + char *alias_of; > + bool deprecated; > +}; > + > static void qtest_free_machine_list(struct MachInfo *machines) > { > if (machines) { > @@ -1550,6 +1557,83 @@ static struct MachInfo *qtest_get_machines(const char *var) > return machines; > } > > +static struct CpuInfo *qtest_get_cpus(void) > +{ > + static struct CpuInfo *cpus; > + QDict *response, *minfo; > + QList *list; > + const QListEntry *p; > + QObject *qobj; > + QString *qstr; > + QBool *qbool; > + QTestState *qts; > + int idx; > + > + if (cpus) { > + return cpus; > + } > + > + silence_spawn_log = !g_test_verbose(); > + > + qts = qtest_init_with_env(NULL, "-machine none"); > + response = qtest_qmp(qts, "{ 'execute': 'query-cpu-definitions' }"); > + g_assert(response); > + list = qdict_get_qlist(response, "return"); > + g_assert(list); > + > + cpus = g_new(struct CpuInfo, qlist_size(list) + 1); Just use g_new0 here. > + > + for (p = qlist_first(list), idx = 0; p; p = qlist_next(p), idx++) { > + minfo = qobject_to(QDict, qlist_entry_obj(p)); > + g_assert(minfo); > + > + qobj = qdict_get(minfo, "name"); > + g_assert(qobj); > + qstr = qobject_to(QString, qobj); > + g_assert(qstr); > + cpus[idx].name = g_strdup(qstring_get_str(qstr)); > + > + qobj = qdict_get(minfo, "alias_of"); > + if (qobj) { /* old machines do not report aliases */ > + qstr = qobject_to(QString, qobj); > + g_assert(qstr); > + cpus[idx].alias_of = g_strdup(qstring_get_str(qstr)); > + } else { > + cpus[idx].alias_of = NULL; > + } > + > + qobj = qdict_get(minfo, "deprecated"); > + qbool = qobject_to(QBool, qobj); > + g_assert(qbool); > + cpus[idx].deprecated = qbool_get_bool(qbool); > + } > + > + qtest_quit(qts); > + qobject_unref(response); > + > + silence_spawn_log = false; > + > + memset(&cpus[idx], 0, sizeof(struct CpuInfo)); /* Terminating entry */ Not required with g_new0 usage. > + return cpus; > +} With the minor change Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> With regards, Daniel
diff --git a/tests/qtest/libqtest.c b/tests/qtest/libqtest.c index d8f80d335e..135a607728 100644 --- a/tests/qtest/libqtest.c +++ b/tests/qtest/libqtest.c @@ -37,6 +37,7 @@ #include "qapi/qmp/qjson.h" #include "qapi/qmp/qlist.h" #include "qapi/qmp/qstring.h" +#include "qapi/qmp/qbool.h" #define MAX_IRQ 256 @@ -1471,6 +1472,12 @@ struct MachInfo { char *alias; }; +struct CpuInfo { + char *name; + char *alias_of; + bool deprecated; +}; + static void qtest_free_machine_list(struct MachInfo *machines) { if (machines) { @@ -1550,6 +1557,83 @@ static struct MachInfo *qtest_get_machines(const char *var) return machines; } +static struct CpuInfo *qtest_get_cpus(void) +{ + static struct CpuInfo *cpus; + QDict *response, *minfo; + QList *list; + const QListEntry *p; + QObject *qobj; + QString *qstr; + QBool *qbool; + QTestState *qts; + int idx; + + if (cpus) { + return cpus; + } + + silence_spawn_log = !g_test_verbose(); + + qts = qtest_init_with_env(NULL, "-machine none"); + response = qtest_qmp(qts, "{ 'execute': 'query-cpu-definitions' }"); + g_assert(response); + list = qdict_get_qlist(response, "return"); + g_assert(list); + + cpus = g_new(struct CpuInfo, qlist_size(list) + 1); + + for (p = qlist_first(list), idx = 0; p; p = qlist_next(p), idx++) { + minfo = qobject_to(QDict, qlist_entry_obj(p)); + g_assert(minfo); + + qobj = qdict_get(minfo, "name"); + g_assert(qobj); + qstr = qobject_to(QString, qobj); + g_assert(qstr); + cpus[idx].name = g_strdup(qstring_get_str(qstr)); + + qobj = qdict_get(minfo, "alias_of"); + if (qobj) { /* old machines do not report aliases */ + qstr = qobject_to(QString, qobj); + g_assert(qstr); + cpus[idx].alias_of = g_strdup(qstring_get_str(qstr)); + } else { + cpus[idx].alias_of = NULL; + } + + qobj = qdict_get(minfo, "deprecated"); + qbool = qobject_to(QBool, qobj); + g_assert(qbool); + cpus[idx].deprecated = qbool_get_bool(qbool); + } + + qtest_quit(qts); + qobject_unref(response); + + silence_spawn_log = false; + + memset(&cpus[idx], 0, sizeof(struct CpuInfo)); /* Terminating entry */ + return cpus; +} + +bool qtest_has_cpu(const char *cpu) +{ + struct CpuInfo *cpus; + int i; + + cpus = qtest_get_cpus(); + + for (i = 0; cpus[i].name != NULL; i++) { + if (g_str_equal(cpu, cpus[i].name) || + (cpus[i].alias_of && g_str_equal(cpu, cpus[i].alias_of))) { + return true; + } + } + + return false; +} + void qtest_cb_for_every_machine(void (*cb)(const char *machine), bool skip_old_versioned) { diff --git a/tests/qtest/libqtest.h b/tests/qtest/libqtest.h index 6e3d3525bf..c94b64f960 100644 --- a/tests/qtest/libqtest.h +++ b/tests/qtest/libqtest.h @@ -949,6 +949,14 @@ bool qtest_has_machine(const char *machine); */ bool qtest_has_machine_with_env(const char *var, const char *machine); +/** + * qtest_has_cpu: + * @cpu: The cpu to look for + * + * Returns: true if the cpu is available in the target binary. + */ +bool qtest_has_cpu(const char *cpu); + /** * qtest_has_device: * @device: The device to look for
Added a new test api qtest_has_cpu() in order to check availability of some cpu models in the current QEMU binary. The specific architecture of the QEMU binary is selected using the QTEST_QEMU_BINARY environment variable. This api would be useful to run tests against some older cpu models after checking if QEMU actually supported these models. CC: thuth@redhat.com Signed-off-by: Ani Sinha <anisinha@redhat.com> --- tests/qtest/libqtest.c | 84 ++++++++++++++++++++++++++++++++++++++++++ tests/qtest/libqtest.h | 8 ++++ 2 files changed, 92 insertions(+)