Skip to content

Commit

Permalink
libqtest: split qtest_spawn_qemu function
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
bonzini committed Feb 9, 2023
1 parent 0a1f673 commit 86aa438
Showing 1 changed file with 56 additions and 49 deletions.
105 changes: 56 additions & 49 deletions tests/qtest/libqtest.c
Expand Up @@ -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);

s->pending_events = NULL;
s->wstatus = 0;
s->expected_status = 0;
g_test_message("starting QEMU: %s", command->str);

#ifndef _WIN32
s->qemu_pid = fork();
if (s->qemu_pid == 0) {
Expand All @@ -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);
Expand Down

0 comments on commit 86aa438

Please sign in to comment.