Convert the three test functions that relied on HMP "info numa" to use QMP "query-cpus-fast" instead, verifying each CPU's node-id through the structured response. Add a check_cpu_node() helper for the per-CPU assertions.
Signed-off-by: Marc-André Lureau <[email protected]> --- tests/qtest/numa-test.c | 63 +++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 51 insertions(+), 12 deletions(-) diff --git a/tests/qtest/numa-test.c b/tests/qtest/numa-test.c index d657f389474..8f563c079f6 100644 --- a/tests/qtest/numa-test.c +++ b/tests/qtest/numa-test.c @@ -19,19 +19,50 @@ static char *make_cli(const GString *generic_cli, const char *test_cli) return g_strdup_printf("%s %s", generic_cli->str, test_cli); } +static void check_cpu_node(QTestState *qts, int cpu_idx, int expected_node) +{ + QDict *resp; + QList *cpus; + QListEntry *e; + bool found = false; + + resp = qtest_qmp(qts, "{ 'execute': 'query-cpus-fast' }"); + g_assert(resp); + g_assert(qdict_haskey(resp, "return")); + cpus = qdict_get_qlist(resp, "return"); + g_assert(cpus); + + QLIST_FOREACH_ENTRY(cpus, e) { + QDict *cpu = qobject_to(QDict, qlist_entry_obj(e)); + int64_t idx = qdict_get_int(cpu, "cpu-index"); + if (idx == cpu_idx) { + QDict *props = qdict_get_qdict(cpu, "props"); + g_assert(qdict_haskey(props, "node-id")); + g_assert_cmpint(qdict_get_int(props, "node-id"), ==, expected_node); + found = true; + break; + } + } + g_assert(found); + qobject_unref(resp); +} + static void test_mon_explicit(const void *data) { QTestState *qts; - g_autofree char *s = NULL; g_autofree char *cli = NULL; + int i; cli = make_cli(data, "-machine smp.cpus=8 -numa node,nodeid=0,memdev=ram,cpus=0-3 " "-numa node,nodeid=1,cpus=4-7"); qts = qtest_init(cli); - s = qtest_hmp(qts, "info numa"); - g_assert(strstr(s, "node 0 cpus: 0 1 2 3")); - g_assert(strstr(s, "node 1 cpus: 4 5 6 7")); + for (i = 0; i < 4; i++) { + check_cpu_node(qts, i, 0); + } + for (i = 4; i < 8; i++) { + check_cpu_node(qts, i, 1); + } qtest_quit(qts); } @@ -39,16 +70,19 @@ static void test_mon_explicit(const void *data) static void test_def_cpu_split(const void *data) { QTestState *qts; - g_autofree char *s = NULL; g_autofree char *cli = NULL; + int even_cpus[] = {0, 2, 4, 6}; + int odd_cpus[] = {1, 3, 5, 7}; + int i; cli = make_cli(data, "-machine smp.cpus=8,smp.sockets=8 " "-numa node,memdev=ram -numa node"); qts = qtest_init(cli); - s = qtest_hmp(qts, "info numa"); - g_assert(strstr(s, "node 0 cpus: 0 2 4 6")); - g_assert(strstr(s, "node 1 cpus: 1 3 5 7")); + for (i = 0; i < 4; i++) { + check_cpu_node(qts, even_cpus[i], 0); + check_cpu_node(qts, odd_cpus[i], 1); + } qtest_quit(qts); } @@ -56,17 +90,22 @@ static void test_def_cpu_split(const void *data) static void test_mon_partial(const void *data) { QTestState *qts; - g_autofree char *s = NULL; g_autofree char *cli = NULL; + int node0_cpus[] = {0, 1, 2, 3, 6, 7}; + int node1_cpus[] = {4, 5}; + int i; cli = make_cli(data, "-machine smp.cpus=8 " "-numa node,nodeid=0,memdev=ram,cpus=0-1 " "-numa node,nodeid=1,cpus=4-5 "); qts = qtest_init(cli); - s = qtest_hmp(qts, "info numa"); - g_assert(strstr(s, "node 0 cpus: 0 1 2 3 6 7")); - g_assert(strstr(s, "node 1 cpus: 4 5")); + for (i = 0; i < 6; i++) { + check_cpu_node(qts, node0_cpus[i], 0); + } + for (i = 0; i < 2; i++) { + check_cpu_node(qts, node1_cpus[i], 1); + } qtest_quit(qts); } -- 2.54.0
