[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 05/11] libqtest: split qtest_spawn_qemu function
From: |
Paolo Bonzini |
Subject: |
[PULL 05/11] libqtest: split qtest_spawn_qemu function |
Date: |
Wed, 8 Feb 2023 18:19:16 +0100 |
In order to create a function that allows testing of invalid command
lines, extract the parts of qtest_init_without_qmp_handshake that do
not require any successful set up of sockets.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
tests/qtest/libqtest.c | 103 ++++++++++++++++++++++-------------------
1 file changed, 55 insertions(+), 48 deletions(-)
diff --git a/tests/qtest/libqtest.c b/tests/qtest/libqtest.c
index d658222a191d..4e1f4fb91c55 100644
--- a/tests/qtest/libqtest.c
+++ b/tests/qtest/libqtest.c
@@ -360,60 +360,25 @@ static pid_t qtest_create_process(char *cmd)
}
#endif /* _WIN32 */
-QTestState *qtest_init_without_qmp_handshake(const char *extra_args)
+static QTestState *G_GNUC_PRINTF(1, 2) qtest_spawn_qemu(const char *fmt, ...)
{
- QTestState *s;
- int sock, qmpsock, i;
- gchar *socket_path;
- gchar *qmp_socket_path;
- gchar *command;
- const char *qemu_binary = qtest_qemu_binary();
+ va_list ap;
+ QTestState *s = g_new0(QTestState, 1);
const char *trace = g_getenv("QTEST_TRACE");
g_autofree char *tracearg = trace ?
g_strdup_printf("-trace %s ", trace) : g_strdup("");
+ g_autoptr(GString) command = g_string_new("");
- s = g_new(QTestState, 1);
-
- socket_path = g_strdup_printf("%s/qtest-%d.sock",
- g_get_tmp_dir(), getpid());
- qmp_socket_path = g_strdup_printf("%s/qtest-%d.qmp",
- g_get_tmp_dir(), getpid());
-
- /* It's possible that if an earlier test run crashed it might
- * have left a stale unix socket lying around. Delete any
- * stale old socket to avoid spurious test failures with
- * tests/libqtest.c:70:init_socket: assertion failed (ret != -1): (-1 !=
-1)
- */
- unlink(socket_path);
- unlink(qmp_socket_path);
-
- socket_init();
- sock = init_socket(socket_path);
- qmpsock = init_socket(qmp_socket_path);
-
- qtest_client_set_rx_handler(s, qtest_client_socket_recv_line);
- qtest_client_set_tx_handler(s, qtest_client_socket_send);
+ va_start(ap, fmt);
+ g_string_append_printf(command, CMD_EXEC "%s %s",
+ qtest_qemu_binary(), tracearg);
+ g_string_append_vprintf(command, fmt, ap);
+ va_end(ap);
qtest_add_abrt_handler(kill_qemu_hook_func, s);
- command = g_strdup_printf(CMD_EXEC "%s %s"
- "-qtest unix:%s "
- "-qtest-log %s "
- "-chardev socket,path=%s,id=char0 "
- "-mon chardev=char0,mode=control "
- "-display none "
- "%s"
- " -accel qtest",
- qemu_binary, tracearg, socket_path,
- getenv("QTEST_LOG") ? DEV_STDERR : DEV_NULL,
- qmp_socket_path,
- extra_args ?: "");
+ g_test_message("starting QEMU: %s", command->str);
- g_test_message("starting QEMU: %s", command);
-
- s->pending_events = NULL;
- s->wstatus = 0;
- s->expected_status = 0;
#ifndef _WIN32
s->qemu_pid = fork();
if (s->qemu_pid == 0) {
@@ -434,14 +399,56 @@ QTestState *qtest_init_without_qmp_handshake(const char
*extra_args)
if (!g_setenv("QEMU_AUDIO_DRV", "none", true)) {
exit(1);
}
- execlp("/bin/sh", "sh", "-c", command, NULL);
+ execlp("/bin/sh", "sh", "-c", command->str, NULL);
exit(1);
}
#else
- s->qemu_pid = qtest_create_process(command);
+ s->qemu_pid = qtest_create_process(command->str);
#endif /* _WIN32 */
- g_free(command);
+ return s;
+}
+
+QTestState *qtest_init_without_qmp_handshake(const char *extra_args)
+{
+ QTestState *s;
+ int sock, qmpsock, i;
+ gchar *socket_path;
+ gchar *qmp_socket_path;
+
+ socket_path = g_strdup_printf("%s/qtest-%d.sock",
+ g_get_tmp_dir(), getpid());
+ qmp_socket_path = g_strdup_printf("%s/qtest-%d.qmp",
+ g_get_tmp_dir(), getpid());
+
+ /*
+ * It's possible that if an earlier test run crashed it might
+ * have left a stale unix socket lying around. Delete any
+ * stale old socket to avoid spurious test failures with
+ * tests/libqtest.c:70:init_socket: assertion failed (ret != -1): (-1 !=
-1)
+ */
+ unlink(socket_path);
+ unlink(qmp_socket_path);
+
+ socket_init();
+ sock = init_socket(socket_path);
+ qmpsock = init_socket(qmp_socket_path);
+
+ s = qtest_spawn_qemu("-qtest unix:%s "
+ "-qtest-log %s "
+ "-chardev socket,path=%s,id=char0 "
+ "-mon chardev=char0,mode=control "
+ "-display none "
+ "%s"
+ " -accel qtest",
+ socket_path,
+ getenv("QTEST_LOG") ? DEV_STDERR : DEV_NULL,
+ qmp_socket_path,
+ extra_args ?: "");
+
+ qtest_client_set_rx_handler(s, qtest_client_socket_recv_line);
+ qtest_client_set_tx_handler(s, qtest_client_socket_send);
+
s->fd = socket_accept(sock);
if (s->fd >= 0) {
s->qmp_fd = socket_accept(qmpsock);
--
2.39.1
- [PULL 00/11] Misc patches for 2022-02-08, Paolo Bonzini, 2023/02/08
- [PULL 01/11] build: make meson-buildoptions.sh stable, Paolo Bonzini, 2023/02/08
- [PULL 03/11] block/iscsi: fix double-free on BUSY or similar statuses, Paolo Bonzini, 2023/02/08
- [PULL 06/11] libqtest: ensure waitpid() is only called once, Paolo Bonzini, 2023/02/08
- [PULL 11/11] target/i386: fix ADOX followed by ADCX, Paolo Bonzini, 2023/02/08
- [PULL 05/11] libqtest: split qtest_spawn_qemu function,
Paolo Bonzini <=
- [PULL 08/11] tests/tcg/i386: Introduce and use reg_t consistently, Paolo Bonzini, 2023/02/08
- [PULL 10/11] target/i386: Fix C flag for BLSI, BLSMSK, BLSR, Paolo Bonzini, 2023/02/08
- [PULL 04/11] vl: catch [accel] entry without accelerator, Paolo Bonzini, 2023/02/08
- [PULL 07/11] readconfig-test: add test for accelerator configuration, Paolo Bonzini, 2023/02/08
- [PULL 09/11] target/i386: Fix BEXTR instruction, Paolo Bonzini, 2023/02/08
- [PULL 02/11] remove unnecessary extern "C" blocks, Paolo Bonzini, 2023/02/08
- Re: [PULL 00/11] Misc patches for 2022-02-08, Thomas Huth, 2023/02/09