[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] libqtest: Rework qtest_rsp()
From: |
Marc-André Lureau |
Subject: |
Re: [PATCH] libqtest: Rework qtest_rsp() |
Date: |
Tue, 26 Jan 2021 20:10:35 +0400 |
On Tue, Jan 26, 2021 at 7:19 PM Markus Armbruster <armbru@redhat.com> wrote:
>
> qtest_rsp() is used in two different ways: (1) return some arguments
> to caller, which the caller must free, and (2) return no arguments to
> caller. Passing non-zero @expected_args gets you (1), and passing
> zero gets you (2).
>
> Having "the return value must be freed" depend on an argument this way
> is less than ideal.
>
> Provide separate functions for the two ways: (1) qtest_rsp_args()
> takes @expected_args (possibly zero), and returns that number of
> arguments. Caller must free the return value always. (2) qtest_rsp()
> assumes zero, and returns nothing.
>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
> tests/qtest/libqtest.c | 50 ++++++++++++++++++++++--------------------
> 1 file changed, 26 insertions(+), 24 deletions(-)
>
> diff --git a/tests/qtest/libqtest.c b/tests/qtest/libqtest.c
> index 5249a628cc..fd043b0570 100644
> --- a/tests/qtest/libqtest.c
> +++ b/tests/qtest/libqtest.c
> @@ -503,7 +503,7 @@ static GString *qtest_client_socket_recv_line(QTestState
> *s)
> return line;
> }
>
> -static gchar **qtest_rsp(QTestState *s, int expected_args)
> +static gchar **qtest_rsp_args(QTestState *s, int expected_args)
> {
> GString *line;
> gchar **words;
> @@ -539,25 +539,27 @@ redo:
> g_assert(words[0] != NULL);
> g_assert_cmpstr(words[0], ==, "OK");
>
> - if (expected_args) {
> - for (i = 0; i < expected_args; i++) {
> - g_assert(words[i] != NULL);
> - }
> - } else {
> - g_strfreev(words);
> - words = NULL;
> + for (i = 0; i < expected_args; i++) {
> + g_assert(words[i] != NULL);
> }
>
> return words;
> }
>
> +static void qtest_rsp(QTestState *s)
> +{
> + gchar **words = qtest_rsp_args(s, 0);
You may even use g_auto(GStrv) if you fancy that.
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> +
> + g_strfreev(words);
> +}
> +
> static int qtest_query_target_endianness(QTestState *s)
> {
> gchar **args;
> int big_endian;
>
> qtest_sendf(s, "endianness\n");
> - args = qtest_rsp(s, 1);
> + args = qtest_rsp_args(s, 1);
> g_assert(strcmp(args[1], "big") == 0 || strcmp(args[1], "little") == 0);
> big_endian = strcmp(args[1], "big") == 0;
> g_strfreev(args);
> @@ -892,14 +894,14 @@ bool qtest_get_irq(QTestState *s, int num)
> void qtest_module_load(QTestState *s, const char *prefix, const char
> *libname)
> {
> qtest_sendf(s, "module_load %s %s\n", prefix, libname);
> - qtest_rsp(s, 0);
> + qtest_rsp(s);
> }
>
> static int64_t qtest_clock_rsp(QTestState *s)
> {
> gchar **words;
> int64_t clock;
> - words = qtest_rsp(s, 2);
> + words = qtest_rsp_args(s, 2);
> clock = g_ascii_strtoll(words[1], NULL, 0);
> g_strfreev(words);
> return clock;
> @@ -926,13 +928,13 @@ int64_t qtest_clock_set(QTestState *s, int64_t val)
> void qtest_irq_intercept_out(QTestState *s, const char *qom_path)
> {
> qtest_sendf(s, "irq_intercept_out %s\n", qom_path);
> - qtest_rsp(s, 0);
> + qtest_rsp(s);
> }
>
> void qtest_irq_intercept_in(QTestState *s, const char *qom_path)
> {
> qtest_sendf(s, "irq_intercept_in %s\n", qom_path);
> - qtest_rsp(s, 0);
> + qtest_rsp(s);
> }
>
> void qtest_set_irq_in(QTestState *s, const char *qom_path, const char *name,
> @@ -942,13 +944,13 @@ void qtest_set_irq_in(QTestState *s, const char
> *qom_path, const char *name,
> name = "unnamed-gpio-in";
> }
> qtest_sendf(s, "set_irq_in %s %s %d %d\n", qom_path, name, num, level);
> - qtest_rsp(s, 0);
> + qtest_rsp(s);
> }
>
> static void qtest_out(QTestState *s, const char *cmd, uint16_t addr,
> uint32_t value)
> {
> qtest_sendf(s, "%s 0x%x 0x%x\n", cmd, addr, value);
> - qtest_rsp(s, 0);
> + qtest_rsp(s);
> }
>
> void qtest_outb(QTestState *s, uint16_t addr, uint8_t value)
> @@ -973,7 +975,7 @@ static uint32_t qtest_in(QTestState *s, const char *cmd,
> uint16_t addr)
> unsigned long value;
>
> qtest_sendf(s, "%s 0x%x\n", cmd, addr);
> - args = qtest_rsp(s, 2);
> + args = qtest_rsp_args(s, 2);
> ret = qemu_strtoul(args[1], NULL, 0, &value);
> g_assert(!ret && value <= UINT32_MAX);
> g_strfreev(args);
> @@ -1000,7 +1002,7 @@ static void qtest_write(QTestState *s, const char *cmd,
> uint64_t addr,
> uint64_t value)
> {
> qtest_sendf(s, "%s 0x%" PRIx64 " 0x%" PRIx64 "\n", cmd, addr, value);
> - qtest_rsp(s, 0);
> + qtest_rsp(s);
> }
>
> void qtest_writeb(QTestState *s, uint64_t addr, uint8_t value)
> @@ -1030,7 +1032,7 @@ static uint64_t qtest_read(QTestState *s, const char
> *cmd, uint64_t addr)
> uint64_t value;
>
> qtest_sendf(s, "%s 0x%" PRIx64 "\n", cmd, addr);
> - args = qtest_rsp(s, 2);
> + args = qtest_rsp_args(s, 2);
> ret = qemu_strtou64(args[1], NULL, 0, &value);
> g_assert(!ret);
> g_strfreev(args);
> @@ -1082,7 +1084,7 @@ void qtest_memread(QTestState *s, uint64_t addr, void
> *data, size_t size)
> }
>
> qtest_sendf(s, "read 0x%" PRIx64 " 0x%zx\n", addr, size);
> - args = qtest_rsp(s, 2);
> + args = qtest_rsp_args(s, 2);
>
> for (i = 0; i < size; i++) {
> ptr[i] = hex2nib(args[1][2 + (i * 2)]) << 4;
> @@ -1098,7 +1100,7 @@ uint64_t qtest_rtas_call(QTestState *s, const char
> *name,
> {
> qtest_sendf(s, "rtas %s %u 0x%"PRIx64" %u 0x%"PRIx64"\n",
> name, nargs, args, nret, ret);
> - qtest_rsp(s, 0);
> + qtest_rsp(s);
> return 0;
> }
>
> @@ -1134,7 +1136,7 @@ void qtest_bufwrite(QTestState *s, uint64_t addr, const
> void *data, size_t size)
> qtest_sendf(s, "b64write 0x%" PRIx64 " 0x%zx ", addr, size);
> s->ops.send(s, bdata);
> s->ops.send(s, "\n");
> - qtest_rsp(s, 0);
> + qtest_rsp(s);
> g_free(bdata);
> }
>
> @@ -1144,7 +1146,7 @@ void qtest_bufread(QTestState *s, uint64_t addr, void
> *data, size_t size)
> size_t len;
>
> qtest_sendf(s, "b64read 0x%" PRIx64 " 0x%zx\n", addr, size);
> - args = qtest_rsp(s, 2);
> + args = qtest_rsp_args(s, 2);
>
> g_base64_decode_inplace(args[1], &len);
> if (size != len) {
> @@ -1174,14 +1176,14 @@ void qtest_memwrite(QTestState *s, uint64_t addr,
> const void *data, size_t size)
> }
>
> qtest_sendf(s, "write 0x%" PRIx64 " 0x%zx 0x%s\n", addr, size, enc);
> - qtest_rsp(s, 0);
> + qtest_rsp(s);
> g_free(enc);
> }
>
> void qtest_memset(QTestState *s, uint64_t addr, uint8_t pattern, size_t size)
> {
> qtest_sendf(s, "memset 0x%" PRIx64 " 0x%zx 0x%02x\n", addr, size,
> pattern);
> - qtest_rsp(s, 0);
> + qtest_rsp(s);
> }
>
> void qtest_qmp_assert_success(QTestState *qts, const char *fmt, ...)
> --
> 2.26.2
>
>
--
Marc-André Lureau