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 */
|
#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;
|
va_list ap;
|
||||||
int sock, qmpsock, i;
|
QTestState *s = g_new0(QTestState, 1);
|
||||||
gchar *socket_path;
|
|
||||||
gchar *qmp_socket_path;
|
|
||||||
gchar *command;
|
|
||||||
const char *qemu_binary = qtest_qemu_binary();
|
|
||||||
const char *trace = g_getenv("QTEST_TRACE");
|
const char *trace = g_getenv("QTEST_TRACE");
|
||||||
g_autofree char *tracearg = trace ?
|
g_autofree char *tracearg = trace ?
|
||||||
g_strdup_printf("-trace %s ", trace) : g_strdup("");
|
g_strdup_printf("-trace %s ", trace) : g_strdup("");
|
||||||
|
g_autoptr(GString) command = g_string_new("");
|
||||||
|
|
||||||
s = g_new(QTestState, 1);
|
va_start(ap, fmt);
|
||||||
|
g_string_append_printf(command, CMD_EXEC "%s %s",
|
||||||
socket_path = g_strdup_printf("%s/qtest-%d.sock",
|
qtest_qemu_binary(), tracearg);
|
||||||
g_get_tmp_dir(), getpid());
|
g_string_append_vprintf(command, fmt, ap);
|
||||||
qmp_socket_path = g_strdup_printf("%s/qtest-%d.qmp",
|
va_end(ap);
|
||||||
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);
|
|
||||||
|
|
||||||
qtest_add_abrt_handler(kill_qemu_hook_func, s);
|
qtest_add_abrt_handler(kill_qemu_hook_func, s);
|
||||||
|
|
||||||
command = g_strdup_printf(CMD_EXEC "%s %s"
|
g_test_message("starting QEMU: %s", command->str);
|
||||||
"-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;
|
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
s->qemu_pid = fork();
|
s->qemu_pid = fork();
|
||||||
if (s->qemu_pid == 0) {
|
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)) {
|
if (!g_setenv("QEMU_AUDIO_DRV", "none", true)) {
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
execlp("/bin/sh", "sh", "-c", command, NULL);
|
execlp("/bin/sh", "sh", "-c", command->str, NULL);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
s->qemu_pid = qtest_create_process(command);
|
s->qemu_pid = qtest_create_process(command->str);
|
||||||
#endif /* _WIN32 */
|
#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);
|
s->fd = socket_accept(sock);
|
||||||
if (s->fd >= 0) {
|
if (s->fd >= 0) {
|
||||||
s->qmp_fd = socket_accept(qmpsock);
|
s->qmp_fd = socket_accept(qmpsock);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user