libqtest: split qtest_spawn_qemu function
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>
This commit is contained in:
parent
60c7dd22e1
commit
786c5256d3
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user