master
c 2,217 lines 55.4 KB
Raw
1 /*
2 * QTest
3 *
4 * Copyright IBM, Corp. 2012
5 * Copyright Red Hat, Inc. 2012
6 * Copyright SUSE LINUX Products GmbH 2013
7 *
8 * Authors:
9 * Anthony Liguori <aliguori@us.ibm.com>
10 * Paolo Bonzini <pbonzini@redhat.com>
11 * Andreas Färber <afaerber@suse.de>
12 *
13 * This work is licensed under the terms of the GNU GPL, version 2 or later.
14 * See the COPYING file in the top-level directory.
15 */
16
17 #include "qemu/osdep.h"
18
19 #ifndef _WIN32
20 #include <sys/socket.h>
21 #include <sys/wait.h>
22 #include <sys/un.h>
23 #endif /* _WIN32 */
24 #ifdef __linux__
25 #include <sys/prctl.h>
26 #endif /* __linux__ */
27 #ifdef __FreeBSD__
28 #include <sys/procctl.h>
29 #endif /* __FreeBSD__ */
30
31 #include "libqtest.h"
32 #include "libqmp.h"
33 #include "qemu/accel.h"
34 #include "qemu/bswap.h"
35 #include "qemu/ctype.h"
36 #include "qemu/cutils.h"
37 #include "qemu/exit-with-parent.h"
38 #include "qemu/sockets.h"
39 #include "qobject/qdict.h"
40 #include "qobject/qjson.h"
41 #include "qobject/qlist.h"
42 #include "qobject/qstring.h"
43 #include "qobject/qbool.h"
44
45 #define MAX_IRQ 256
46
47 #ifndef _WIN32
48 # define SOCKET_TIMEOUT 50
49 # define CMD_EXEC "exec "
50 # define DEV_STDERR "/dev/fd/2"
51 # define DEV_NULL "/dev/null"
52 #else
53 # define SOCKET_TIMEOUT 50000
54 # define CMD_EXEC ""
55 # define DEV_STDERR "2"
56 # define DEV_NULL "nul"
57 #endif
58
59 #define WAITPID_TIMEOUT 30
60
61 typedef void (*QTestSendFn)(QTestState *s, const char *buf);
62 typedef void (*ExternalSendFn)(void *s, const char *buf);
63 typedef GString* (*QTestRecvFn)(QTestState *);
64
65 typedef struct QTestClientTransportOps {
66 QTestSendFn send; /* for sending qtest commands */
67
68 /*
69 * use external_send to send qtest command strings through functions which
70 * do not accept a QTestState as the first parameter.
71 */
72 ExternalSendFn external_send;
73
74 QTestRecvFn recv_line; /* for receiving qtest command responses */
75 } QTestTransportOps;
76
77 struct QTestState
78 {
79 int fd;
80 int qmp_fd;
81 int sock;
82 int qmpsock;
83 pid_t qemu_pid; /* our child QEMU process */
84 int wstatus;
85 #ifdef _WIN32
86 DWORD exit_code;
87 #endif
88 int expected_status;
89 bool big_endian;
90 bool irq_level[MAX_IRQ];
91 GString *rx;
92 QTestTransportOps ops;
93 GList *pending_events;
94 QTestQMPEventCallback eventCB;
95 void *eventData;
96 };
97
98 static GHookList abrt_hooks;
99 static void (*sighandler_old)(int);
100 static bool silence_spawn_log;
101
102 static int qtest_query_target_endianness(QTestState *s);
103
104 static void qtest_client_socket_send(QTestState*, const char *buf);
105 static void socket_send(int fd, const char *buf, size_t size);
106
107 static GString *qtest_client_socket_recv_line(QTestState *);
108
109 static void qtest_client_set_tx_handler(QTestState *s, QTestSendFn send);
110 static void qtest_client_set_rx_handler(QTestState *s, QTestRecvFn recv);
111
112 static int init_socket(const char *socket_path)
113 {
114 int sock = qtest_socket_server(socket_path);
115 qemu_set_cloexec(sock);
116 return sock;
117 }
118
119 static int socket_accept(int sock)
120 {
121 struct sockaddr_un addr;
122 socklen_t addrlen;
123 int ret;
124 /*
125 * timeout unit of blocking receive calls is different among platforms.
126 * It's in seconds on non-Windows platforms but milliseconds on Windows.
127 */
128 #ifndef _WIN32
129 struct timeval timeout = { .tv_sec = SOCKET_TIMEOUT,
130 .tv_usec = 0 };
131 #else
132 DWORD timeout = SOCKET_TIMEOUT;
133 #endif
134
135 if (setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO,
136 (void *)&timeout, sizeof(timeout))) {
137 fprintf(stderr, "%s failed to set SO_RCVTIMEO: %s\n",
138 __func__, strerror(errno));
139 close(sock);
140 return -1;
141 }
142
143 do {
144 addrlen = sizeof(addr);
145 ret = accept(sock, (struct sockaddr *)&addr, &addrlen);
146 } while (ret == -1 && errno == EINTR);
147 if (ret == -1) {
148 fprintf(stderr, "%s failed: %s\n", __func__, strerror(errno));
149 }
150 close(sock);
151
152 return ret;
153 }
154
155 pid_t qtest_pid(QTestState *s)
156 {
157 return s->qemu_pid;
158 }
159
160 bool qtest_probe_child(QTestState *s)
161 {
162 pid_t pid = s->qemu_pid;
163
164 if (pid != -1) {
165 #ifndef _WIN32
166 pid = waitpid(pid, &s->wstatus, WNOHANG);
167 if (pid == 0) {
168 return true;
169 }
170 #else
171 GetExitCodeProcess((HANDLE)pid, &s->exit_code);
172 if (s->exit_code == STILL_ACTIVE) {
173 return true;
174 }
175 CloseHandle((HANDLE)pid);
176 #endif
177 s->qemu_pid = -1;
178 qtest_remove_abrt_handler(s);
179 }
180 return false;
181 }
182
183 void qtest_set_expected_status(QTestState *s, int status)
184 {
185 s->expected_status = status;
186 }
187
188 static void qtest_check_status(QTestState *s)
189 {
190 assert(s->qemu_pid == -1);
191
192 /*
193 * Check whether qemu exited with expected exit status; anything else is
194 * fishy and should be logged with as much detail as possible.
195 */
196 #ifndef _WIN32
197 int wstatus = s->wstatus;
198 if (WIFEXITED(wstatus) && WEXITSTATUS(wstatus) != s->expected_status) {
199 fprintf(stderr, "%s:%d: kill_qemu() tried to terminate QEMU "
200 "process but encountered exit status %d (expected %d)\n",
201 __FILE__, __LINE__, WEXITSTATUS(wstatus), s->expected_status);
202 abort();
203 } else if (WIFSIGNALED(wstatus)) {
204 int sig = WTERMSIG(wstatus);
205 const char *signame = strsignal(sig) ?: "unknown ???";
206 const char *dump = WCOREDUMP(wstatus) ? " (core dumped)" : "";
207
208 fprintf(stderr, "%s:%d: kill_qemu() detected QEMU death "
209 "from signal %d (%s)%s\n",
210 __FILE__, __LINE__, sig, signame, dump);
211 abort();
212 }
213 #else
214 if (s->exit_code != s->expected_status) {
215 fprintf(stderr, "%s:%d: kill_qemu() tried to terminate QEMU "
216 "process but encountered exit status %ld (expected %d)\n",
217 __FILE__, __LINE__, s->exit_code, s->expected_status);
218 abort();
219 }
220 #endif
221 }
222
223 void qtest_system_reset_nowait(QTestState *s)
224 {
225 /* Request the system reset, but do not wait for it to complete */
226 qtest_qmp_assert_success(s, "{'execute': 'system_reset' }");
227 }
228
229 void qtest_system_reset(QTestState *s)
230 {
231 qtest_system_reset_nowait(s);
232 /*
233 * Wait for the RESET event, which is sent once the system reset
234 * has actually completed.
235 */
236 qtest_qmp_eventwait(s, "RESET");
237 }
238
239 void qtest_wait_qemu(QTestState *s)
240 {
241 if (s->qemu_pid != -1) {
242 #ifndef _WIN32
243 pid_t pid;
244 uint64_t end;
245
246 /* poll for a while until sending SIGKILL */
247 end = g_get_monotonic_time() + WAITPID_TIMEOUT * G_TIME_SPAN_SECOND;
248
249 do {
250 pid = waitpid(s->qemu_pid, &s->wstatus, WNOHANG);
251 if (pid != 0) {
252 break;
253 }
254 g_usleep(100 * 1000);
255 } while (g_get_monotonic_time() < end);
256
257 if (pid == 0) {
258 kill(s->qemu_pid, SIGKILL);
259 pid = RETRY_ON_EINTR(waitpid(s->qemu_pid, &s->wstatus, 0));
260 }
261
262 assert(pid == s->qemu_pid);
263 #else
264 DWORD ret;
265
266 ret = WaitForSingleObject((HANDLE)s->qemu_pid, INFINITE);
267 assert(ret == WAIT_OBJECT_0);
268 GetExitCodeProcess((HANDLE)s->qemu_pid, &s->exit_code);
269 CloseHandle((HANDLE)s->qemu_pid);
270 #endif
271
272 s->qemu_pid = -1;
273 qtest_remove_abrt_handler(s);
274 }
275 qtest_check_status(s);
276 }
277
278 void qtest_kill_qemu(QTestState *s)
279 {
280 /* Skip wait if qtest_probe_child() already reaped */
281 if (s->qemu_pid != -1) {
282 #ifndef _WIN32
283 kill(s->qemu_pid, SIGTERM);
284 #else
285 TerminateProcess((HANDLE)s->qemu_pid, s->expected_status);
286 #endif
287 qtest_wait_qemu(s);
288 return;
289 }
290
291 qtest_check_status(s);
292 }
293
294 static void kill_qemu_hook_func(void *s)
295 {
296 qtest_kill_qemu(s);
297 }
298
299 static void sigabrt_handler(int signo)
300 {
301 g_hook_list_invoke(&abrt_hooks, FALSE);
302 }
303
304 static void setup_sigabrt_handler(void)
305 {
306 sighandler_old = signal(SIGABRT, sigabrt_handler);
307 }
308
309 static void cleanup_sigabrt_handler(void)
310 {
311 signal(SIGABRT, sighandler_old);
312 }
313
314 static bool hook_list_is_empty(GHookList *hook_list)
315 {
316 GHook *hook = g_hook_first_valid(hook_list, TRUE);
317
318 if (!hook) {
319 return true;
320 }
321
322 g_hook_unref(hook_list, hook);
323 return false;
324 }
325
326 void qtest_add_abrt_handler(GHookFunc fn, const void *data)
327 {
328 GHook *hook;
329
330 if (!abrt_hooks.is_setup) {
331 g_hook_list_init(&abrt_hooks, sizeof(GHook));
332 }
333
334 /* Only install SIGABRT handler once */
335 if (hook_list_is_empty(&abrt_hooks)) {
336 setup_sigabrt_handler();
337 }
338
339 hook = g_hook_alloc(&abrt_hooks);
340 hook->func = fn;
341 hook->data = (void *)data;
342
343 g_hook_prepend(&abrt_hooks, hook);
344 }
345
346 void qtest_remove_abrt_handler(void *data)
347 {
348 GHook *hook = g_hook_find_data(&abrt_hooks, TRUE, data);
349
350 if (!hook) {
351 return;
352 }
353
354 g_hook_destroy_link(&abrt_hooks, hook);
355
356 /* Uninstall SIGABRT handler on last instance */
357 if (hook_list_is_empty(&abrt_hooks)) {
358 cleanup_sigabrt_handler();
359 }
360 }
361
362 const char *qtest_qemu_binary(const char *var)
363 {
364 const char *qemu_bin;
365
366 if (var) {
367 qemu_bin = getenv(var);
368 if (qemu_bin) {
369 return qemu_bin;
370 }
371 }
372
373 qemu_bin = getenv("QTEST_QEMU_BINARY");
374 if (!qemu_bin) {
375 fprintf(stderr, "Environment variable QTEST_QEMU_BINARY required\n");
376 exit(1);
377 }
378
379 return qemu_bin;
380 }
381
382 #ifdef _WIN32
383 static pid_t qtest_create_process(char *cmd)
384 {
385 STARTUPINFO si;
386 PROCESS_INFORMATION pi;
387 BOOL ret;
388
389 ZeroMemory(&si, sizeof(si));
390 si.cb = sizeof(si);
391 ZeroMemory(&pi, sizeof(pi));
392
393 ret = CreateProcess(NULL, /* module name */
394 cmd, /* command line */
395 NULL, /* process handle not inheritable */
396 NULL, /* thread handle not inheritable */
397 FALSE, /* set handle inheritance to FALSE */
398 0, /* No creation flags */
399 NULL, /* use parent's environment block */
400 NULL, /* use parent's starting directory */
401 &si, /* pointer to STARTUPINFO structure */
402 &pi /* pointer to PROCESS_INFORMATION structure */
403 );
404 if (ret == 0) {
405 fprintf(stderr, "%s:%d: unable to create a new process (%s)\n",
406 __FILE__, __LINE__, strerror(GetLastError()));
407 abort();
408 }
409
410 return (pid_t)pi.hProcess;
411 }
412 #endif /* _WIN32 */
413
414 static QTestState *qtest_create_test_state(int pid)
415 {
416 QTestState *s = g_new0(QTestState, 1);
417
418 s->qemu_pid = pid;
419 qtest_add_abrt_handler(kill_qemu_hook_func, s);
420 return s;
421 }
422
423 static QTestState *qtest_spawn_qemu(const char *qemu_bin, const char *args,
424 void *opaque)
425 {
426 int pid;
427 g_autoptr(GString) command = g_string_new("");
428
429 g_string_printf(command, CMD_EXEC "%s %s", qemu_bin, args);
430
431 if (!silence_spawn_log) {
432 g_test_message("starting QEMU: %s", command->str);
433 }
434
435 #ifndef _WIN32
436 pid = fork();
437 if (pid == 0) {
438 execlp("/bin/sh", "sh", "-c", command->str, NULL);
439 exit(1);
440 }
441 #else
442 pid = qtest_create_process(command->str);
443 #endif /* _WIN32 */
444
445 return qtest_create_test_state(pid);
446 }
447
448 static char *qtest_socket_path(const char *suffix)
449 {
450 return g_strdup_printf("%s/qtest-%d.%s", g_get_tmp_dir(), getpid(), suffix);
451 }
452
453 gchar *qtest_qemu_args(const char *extra_args)
454 {
455 g_autofree gchar *socket_path = qtest_socket_path("sock");
456 g_autofree gchar *qmp_socket_path = qtest_socket_path("qmp");
457 const char *args_from_env = g_getenv("QTEST_QEMU_ARGS");
458
459 gchar *args = g_strdup_printf(
460 "-qtest unix:%s "
461 "-qtest-log %s "
462 "-chardev socket,path=%s,id=char0 "
463 "-object monitor-qmp,id=qmp0,chardev=char0 "
464 "-display none "
465 "-audio none "
466 "%s "
467 "%s "
468 "%s "
469 "-accel qtest",
470
471 socket_path,
472 qtest_verbose("qtest") ? DEV_STDERR : DEV_NULL,
473 qmp_socket_path,
474 can_exit_with_parent() ?
475 "-run-with exit-with-parent=on" : "",
476 extra_args ?: "",
477 args_from_env ?: "");
478
479 return args;
480 }
481
482 typedef QTestState *(*qtest_qemu_spawn_func)(const char *qemu_bin,
483 const char *extra_args,
484 void *opaque);
485
486 static QTestState *qtest_init_internal(const char *qemu_bin,
487 const char *extra_args,
488 bool do_connect,
489 qtest_qemu_spawn_func spawn,
490 void *opaque)
491 {
492 QTestState *s;
493 int sock, qmpsock, i;
494 g_autofree gchar *socket_path = qtest_socket_path("sock");
495 g_autofree gchar *qmp_socket_path = qtest_socket_path("qmp");
496 g_autofree gchar *args = qtest_qemu_args(extra_args);
497
498 /*
499 * It's possible that if an earlier test run crashed it might
500 * have left a stale unix socket lying around. Delete any
501 * stale old socket to avoid spurious test failures with
502 * tests/libqtest.c:70:init_socket: assertion failed (ret != -1): (-1 != -1)
503 */
504 unlink(socket_path);
505 unlink(qmp_socket_path);
506
507 socket_init();
508 sock = init_socket(socket_path);
509 qmpsock = init_socket(qmp_socket_path);
510
511 s = spawn(qemu_bin, args, opaque);
512
513 qtest_client_set_rx_handler(s, qtest_client_socket_recv_line);
514 qtest_client_set_tx_handler(s, qtest_client_socket_send);
515
516 s->rx = g_string_new("");
517 for (i = 0; i < MAX_IRQ; i++) {
518 s->irq_level[i] = false;
519 }
520
521 s->fd = -1;
522 s->qmp_fd = -1;
523 s->sock = sock;
524 s->qmpsock = qmpsock;
525 if (do_connect) {
526 qtest_connect(s);
527 }
528
529 /*
530 * Stopping QEMU for debugging is not supported on Windows.
531 *
532 * Using DebugActiveProcess() API can suspend the QEMU process,
533 * but gdb cannot attach to the process. Using the undocumented
534 * NtSuspendProcess() can suspend the QEMU process and gdb can
535 * attach to the process, but gdb cannot resume it.
536 */
537 #ifndef _WIN32
538 if (getenv("QTEST_STOP")) {
539 kill(s->qemu_pid, SIGSTOP);
540 }
541 #endif
542
543 return s;
544 }
545
546 void qtest_connect(QTestState *s)
547 {
548 g_autofree gchar *socket_path = qtest_socket_path("sock");
549 g_autofree gchar *qmp_socket_path = qtest_socket_path("qmp");
550
551 g_assert(s->sock >= 0 && s->qmpsock >= 0);
552 s->fd = socket_accept(s->sock);
553 if (s->fd >= 0) {
554 s->qmp_fd = socket_accept(s->qmpsock);
555 }
556 unlink(socket_path);
557 unlink(qmp_socket_path);
558 g_assert(s->fd >= 0 && s->qmp_fd >= 0);
559 s->sock = s->qmpsock = -1;
560 /* ask endianness of the target */
561 s->big_endian = qtest_query_target_endianness(s);
562 }
563
564 QTestState *qtest_init_without_qmp_handshake(const char *extra_args)
565 {
566 return qtest_init_internal(qtest_qemu_binary(NULL), extra_args, true,
567 qtest_spawn_qemu, NULL);
568 }
569
570 void qtest_qmp_handshake(QTestState *s, QList *capabilities)
571 {
572 /* Read the QMP greeting and then do the handshake */
573 QDict *greeting = qtest_qmp_receive(s);
574 qobject_unref(greeting);
575
576 if (capabilities) {
577 qtest_qmp_assert_success(s,
578 "{ 'execute': 'qmp_capabilities', "
579 "'arguments': { 'enable': %p } }",
580 qobject_ref(capabilities));
581 } else {
582 qtest_qmp_assert_success(s, "{ 'execute': 'qmp_capabilities' }");
583 }
584 }
585
586 QTestState *qtest_init_ext(const char *var, const char *extra_args,
587 QList *capabilities, bool do_connect)
588 {
589 QTestState *s = qtest_init_internal(qtest_qemu_binary(var), extra_args,
590 do_connect, qtest_spawn_qemu, NULL);
591
592 if (do_connect) {
593 qtest_qmp_handshake(s, capabilities);
594 } else {
595 /*
596 * If the connection is delayed, the capabilities must be set
597 * at that moment.
598 */
599 assert(!capabilities);
600 }
601 return s;
602 }
603
604 static QTestState *qtest_attach_qemu(const char *qemu_bin,
605 const char *extra_args,
606 void *opaque)
607 {
608 int pid = *(int *)opaque;
609 return qtest_create_test_state(pid);
610 }
611
612 QTestState *qtest_init_after_exec(QTestState *qts)
613 {
614 void *opaque = (void *)&qts->qemu_pid;
615 QTestState *s;
616
617 s = qtest_init_internal(NULL, NULL, true, qtest_attach_qemu, opaque);
618 qts->qemu_pid = -1;
619 qtest_qmp_handshake(s, NULL);
620 return s;
621 }
622
623 QTestState *qtest_init(const char *extra_args)
624 {
625 return qtest_init_ext(NULL, extra_args, NULL, true);
626 }
627
628 QTestState *qtest_vinitf(const char *fmt, va_list ap)
629 {
630 char *args = g_strdup_vprintf(fmt, ap);
631 QTestState *s;
632
633 s = qtest_init(args);
634 g_free(args);
635 return s;
636 }
637
638 QTestState *qtest_initf(const char *fmt, ...)
639 {
640 va_list ap;
641 QTestState *s;
642
643 va_start(ap, fmt);
644 s = qtest_vinitf(fmt, ap);
645 va_end(ap);
646 return s;
647 }
648
649 QTestState *qtest_init_with_serial(const char *extra_args, int *sock_fd)
650 {
651 int sock_fd_init;
652 g_autofree char *sock_dir = NULL;
653 char *sock_path;
654 QTestState *qts;
655
656 sock_dir = g_dir_make_tmp("qtest-serial-XXXXXX", NULL);
657 g_assert_true(sock_dir != NULL);
658 sock_path = g_strdup_printf("%s/sock", sock_dir);
659
660 socket_init();
661 sock_fd_init = init_socket(sock_path);
662
663 qts = qtest_initf("-chardev socket,id=s0,path=%s -serial chardev:s0 %s",
664 sock_path, extra_args);
665
666 *sock_fd = socket_accept(sock_fd_init);
667
668 unlink(sock_path);
669 g_free(sock_path);
670 rmdir(sock_dir);
671
672 g_assert_true(*sock_fd >= 0);
673
674 return qts;
675 }
676
677 void qtest_quit(QTestState *s)
678 {
679 qtest_remove_abrt_handler(s);
680
681 qtest_kill_qemu(s);
682 close(s->fd);
683 close(s->qmp_fd);
684 g_string_free(s->rx, true);
685
686 for (GList *it = s->pending_events; it != NULL; it = it->next) {
687 qobject_unref((QDict *)it->data);
688 }
689
690 g_list_free(s->pending_events);
691
692 g_free(s);
693 }
694
695 static void socket_send(int fd, const char *buf, size_t size)
696 {
697 ssize_t res = qemu_send_full(fd, buf, size);
698
699 assert(res == size);
700 }
701
702 static void qtest_client_socket_send(QTestState *s, const char *buf)
703 {
704 socket_send(s->fd, buf, strlen(buf));
705 }
706
707 static void G_GNUC_PRINTF(2, 3) qtest_sendf(QTestState *s, const char *fmt, ...)
708 {
709 va_list ap;
710
711 va_start(ap, fmt);
712 gchar *str = g_strdup_vprintf(fmt, ap);
713 va_end(ap);
714
715 s->ops.send(s, str);
716 g_free(str);
717 }
718
719 static GString *qtest_client_socket_recv_line(QTestState *s)
720 {
721 GString *line;
722 size_t offset;
723 char *eol;
724
725 while ((eol = strchr(s->rx->str, '\n')) == NULL) {
726 ssize_t len;
727 char buffer[1024];
728
729 len = recv(s->fd, buffer, sizeof(buffer), 0);
730 if (len == -1 && errno == EINTR) {
731 continue;
732 }
733
734 if (len == -1 || len == 0) {
735 fprintf(stderr, "Broken pipe\n");
736 abort();
737 }
738
739 g_string_append_len(s->rx, buffer, len);
740 }
741
742 offset = eol - s->rx->str;
743 line = g_string_new_len(s->rx->str, offset);
744 g_string_erase(s->rx, 0, offset + 1);
745
746 return line;
747 }
748
749 static gchar **qtest_rsp_args(QTestState *s, int expected_args)
750 {
751 GString *line;
752 gchar **words;
753 int i;
754
755 redo:
756 line = s->ops.recv_line(s);
757 words = g_strsplit(line->str, " ", 0);
758 g_string_free(line, TRUE);
759
760 if (strcmp(words[0], "IRQ") == 0) {
761 long irq;
762 int ret;
763
764 g_assert(words[1] != NULL);
765 g_assert(words[2] != NULL);
766
767 ret = qemu_strtol(words[2], NULL, 0, &irq);
768 g_assert(!ret);
769 g_assert_cmpint(irq, >=, 0);
770 g_assert_cmpint(irq, <, MAX_IRQ);
771
772 if (strcmp(words[1], "raise") == 0) {
773 s->irq_level[irq] = true;
774 } else {
775 s->irq_level[irq] = false;
776 }
777
778 g_strfreev(words);
779 goto redo;
780 }
781
782 g_assert(words[0] != NULL);
783 g_assert_cmpstr(words[0], ==, "OK");
784
785 for (i = 0; i < expected_args; i++) {
786 g_assert(words[i] != NULL);
787 }
788
789 return words;
790 }
791
792 static void qtest_rsp(QTestState *s)
793 {
794 gchar **words = qtest_rsp_args(s, 0);
795
796 g_strfreev(words);
797 }
798
799 static int qtest_query_target_endianness(QTestState *s)
800 {
801 gchar **args;
802 int big_endian;
803
804 qtest_sendf(s, "endianness\n");
805 args = qtest_rsp_args(s, 1);
806 g_assert(strcmp(args[1], "big") == 0 || strcmp(args[1], "little") == 0);
807 big_endian = strcmp(args[1], "big") == 0;
808 g_strfreev(args);
809
810 return big_endian;
811 }
812
813 QDict *qtest_qmp_receive(QTestState *s)
814 {
815 while (true) {
816 QDict *response = qtest_qmp_receive_dict(s);
817
818 if (!qdict_get_try_str(response, "event")) {
819 return response;
820 }
821
822 if (!s->eventCB ||
823 !s->eventCB(s, qdict_get_str(response, "event"),
824 response, s->eventData)) {
825 /* Stash the event for a later consumption */
826 s->pending_events = g_list_append(s->pending_events, response);
827 } else {
828 qobject_unref(response);
829 }
830 }
831 }
832
833 QDict *qtest_qmp_receive_dict(QTestState *s)
834 {
835 g_assert(s->qmp_fd >= 0);
836 return qmp_fd_receive(s->qmp_fd);
837 }
838
839 int qtest_socket_server(const char *socket_path)
840 {
841 struct sockaddr_un addr;
842 int sock;
843 int ret;
844
845 sock = socket(PF_UNIX, SOCK_STREAM, 0);
846 g_assert_cmpint(sock, !=, -1);
847
848 addr.sun_family = AF_UNIX;
849 snprintf(addr.sun_path, sizeof(addr.sun_path), "%s", socket_path);
850
851 ret = RETRY_ON_EINTR(bind(sock, (struct sockaddr *)&addr, sizeof(addr)));
852 g_assert_cmpint(ret, !=, -1);
853 ret = listen(sock, 1);
854 g_assert_cmpint(ret, !=, -1);
855
856 return sock;
857 }
858
859 #ifndef _WIN32
860 void qtest_qmp_vsend_fds(QTestState *s, int *fds, size_t fds_num,
861 const char *fmt, va_list ap)
862 {
863 g_assert(s->qmp_fd >= 0);
864 qmp_fd_vsend_fds(s->qmp_fd, fds, fds_num, fmt, ap);
865 }
866 #endif
867
868 void qtest_qmp_vsend(QTestState *s, const char *fmt, va_list ap)
869 {
870 g_assert(s->qmp_fd >= 0);
871 qmp_fd_vsend(s->qmp_fd, fmt, ap);
872 }
873
874 #ifndef _WIN32
875 QDict *qtest_vqmp_fds(QTestState *s, int *fds, size_t fds_num,
876 const char *fmt, va_list ap)
877 {
878 qtest_qmp_vsend_fds(s, fds, fds_num, fmt, ap);
879
880 /* Receive reply */
881 return qtest_qmp_receive(s);
882 }
883 #endif
884
885 QDict *qtest_vqmp(QTestState *s, const char *fmt, va_list ap)
886 {
887 qtest_qmp_vsend(s, fmt, ap);
888
889 /* Receive reply */
890 return qtest_qmp_receive(s);
891 }
892
893 #ifndef _WIN32
894 QDict *qtest_qmp_fds(QTestState *s, int *fds, size_t fds_num,
895 const char *fmt, ...)
896 {
897 va_list ap;
898 QDict *response;
899
900 va_start(ap, fmt);
901 response = qtest_vqmp_fds(s, fds, fds_num, fmt, ap);
902 va_end(ap);
903 return response;
904 }
905 #endif
906
907 QDict *qtest_qmp(QTestState *s, const char *fmt, ...)
908 {
909 va_list ap;
910 QDict *response;
911
912 va_start(ap, fmt);
913 response = qtest_vqmp(s, fmt, ap);
914 va_end(ap);
915 return response;
916 }
917
918 void qtest_qmp_send(QTestState *s, const char *fmt, ...)
919 {
920 va_list ap;
921
922 va_start(ap, fmt);
923 qtest_qmp_vsend(s, fmt, ap);
924 va_end(ap);
925 }
926
927 void qtest_qmp_send_raw(QTestState *s, const char *fmt, ...)
928 {
929 va_list ap;
930
931 g_assert(s->qmp_fd >= 0);
932 va_start(ap, fmt);
933 qmp_fd_vsend_raw(s->qmp_fd, fmt, ap);
934 va_end(ap);
935 }
936
937 void qtest_qmp_set_event_callback(QTestState *s,
938 QTestQMPEventCallback cb, void *opaque)
939 {
940 s->eventCB = cb;
941 s->eventData = opaque;
942 }
943
944 QDict *qtest_qmp_event_ref(QTestState *s, const char *event)
945 {
946 while (s->pending_events) {
947
948 GList *first = s->pending_events;
949 QDict *response = (QDict *)first->data;
950
951 s->pending_events = g_list_delete_link(s->pending_events, first);
952
953 if (!strcmp(qdict_get_str(response, "event"), event)) {
954 return response;
955 }
956 qobject_unref(response);
957 }
958 return NULL;
959 }
960
961 QDict *qtest_qmp_eventwait_ref(QTestState *s, const char *event)
962 {
963 QDict *response = qtest_qmp_event_ref(s, event);
964
965 if (response) {
966 return response;
967 }
968
969 for (;;) {
970 response = qtest_qmp_receive_dict(s);
971 if ((qdict_haskey(response, "event")) &&
972 (strcmp(qdict_get_str(response, "event"), event) == 0)) {
973 return response;
974 }
975 qobject_unref(response);
976 }
977 }
978
979 void qtest_qmp_eventwait(QTestState *s, const char *event)
980 {
981 QDict *response;
982
983 response = qtest_qmp_eventwait_ref(s, event);
984 qobject_unref(response);
985 }
986
987 char *qtest_vhmp(QTestState *s, const char *fmt, va_list ap)
988 {
989 char *cmd;
990 QDict *resp;
991 char *ret;
992
993 cmd = g_strdup_vprintf(fmt, ap);
994 resp = qtest_qmp(s, "{'execute': 'human-monitor-command',"
995 " 'arguments': {'command-line': %s}}",
996 cmd);
997 ret = g_strdup(qdict_get_try_str(resp, "return"));
998 g_assert(ret);
999 qobject_unref(resp);
1000 g_free(cmd);
1001 return ret;
1002 }
1003
1004 char *qtest_hmp(QTestState *s, const char *fmt, ...)
1005 {
1006 va_list ap;
1007 char *ret;
1008
1009 va_start(ap, fmt);
1010 ret = qtest_vhmp(s, fmt, ap);
1011 va_end(ap);
1012 return ret;
1013 }
1014
1015 void qtest_qemu_io(QTestState *s, const char *device,
1016 const char *fmt, ...)
1017 {
1018 va_list ap;
1019 g_autofree char *cmd = NULL;
1020
1021 va_start(ap, fmt);
1022 cmd = g_strdup_vprintf(fmt, ap);
1023 va_end(ap);
1024
1025 qtest_sendf(s, "qemu-io %s %s\n", device, cmd);
1026 qtest_rsp(s);
1027 }
1028
1029 const char *qtest_get_arch(void)
1030 {
1031 /*
1032 * We find and cache the architecture name once, because we need to
1033 * allocate memory to hold it. This memory will stay around for
1034 * the lifetime of this test process.
1035 */
1036 static const char *arch;
1037
1038 if (!arch) {
1039 /*
1040 * Find the rightmost occurrence of "-system-"; the architecture
1041 * name runs from there to the next whitespace.
1042 */
1043 const char *qemu = qtest_qemu_binary(NULL);
1044 const char *sysstr = g_strrstr(qemu, "-system-");
1045
1046 if (sysstr) {
1047 g_auto(GStrv) tokens = g_strsplit_set(sysstr + strlen("-system-"),
1048 " \t", 2);
1049 if (tokens && tokens[0]) {
1050 arch = g_steal_pointer(&tokens[0]);
1051 }
1052 }
1053
1054 if (!arch) {
1055 fprintf(stderr, "Can't determine architecture from binary name.\n"
1056 "QTEST_QEMU_BINARY must include *-system-<arch> where "
1057 "'arch' is the target architecture "
1058 "(x86_64, aarch64, etc).\n");
1059 exit(1);
1060 }
1061 }
1062
1063 return arch;
1064 }
1065
1066 static bool qtest_qom_has_concrete_type(const char *parent_typename,
1067 const char *child_typename,
1068 QList **cached_list)
1069 {
1070 QList *list = cached_list ? *cached_list : NULL;
1071 const QListEntry *p;
1072 QObject *qobj;
1073 QString *qstr;
1074 QDict *devinfo;
1075
1076 if (!list) {
1077 QDict *resp;
1078 QDict *args;
1079 QTestState *qts = qtest_init("-machine none");
1080
1081 args = qdict_new();
1082 qdict_put_bool(args, "abstract", false);
1083 qdict_put_str(args, "implements", parent_typename);
1084
1085 resp = qtest_qmp(qts, "{'execute': 'qom-list-types', 'arguments': %p }",
1086 args);
1087 g_assert(qdict_haskey(resp, "return"));
1088 list = qdict_get_qlist(resp, "return");
1089 qobject_ref(list);
1090 qobject_unref(resp);
1091
1092 qtest_quit(qts);
1093
1094 if (cached_list) {
1095 *cached_list = list;
1096 }
1097 }
1098
1099 for (p = qlist_first(list); p; p = qlist_next(p)) {
1100 devinfo = qobject_to(QDict, qlist_entry_obj(p));
1101 g_assert(devinfo);
1102
1103 qobj = qdict_get(devinfo, "name");
1104 g_assert(qobj);
1105 qstr = qobject_to(QString, qobj);
1106 g_assert(qstr);
1107 if (g_str_equal(qstring_get_str(qstr), child_typename)) {
1108 return true;
1109 }
1110 }
1111
1112 return false;
1113 }
1114
1115 bool qtest_has_accel(const char *accel_name)
1116 {
1117 static QList *list;
1118 g_autofree char *accel_type = NULL;
1119
1120 if (g_str_equal(accel_name, "kvm")) {
1121 int i;
1122 const char *arch = qtest_get_arch();
1123 const char *targets[] = { CONFIG_KVM_TARGETS };
1124
1125 for (i = 0; i < ARRAY_SIZE(targets); i++) {
1126 if (!strncmp(targets[i], arch, strlen(arch))) {
1127 if (!access("/dev/kvm", R_OK | W_OK)) {
1128 return true;
1129 }
1130 }
1131 }
1132 return false;
1133 }
1134
1135 accel_type = g_strconcat(accel_name, ACCEL_CLASS_SUFFIX, NULL);
1136
1137 return qtest_qom_has_concrete_type("accel", accel_type, &list);
1138 }
1139
1140 bool qtest_get_irq(QTestState *s, int num)
1141 {
1142 /* dummy operation in order to make sure irq is up to date */
1143 qtest_inb(s, 0);
1144
1145 return s->irq_level[num];
1146 }
1147
1148 void qtest_module_load(QTestState *s, const char *prefix, const char *libname)
1149 {
1150 qtest_sendf(s, "module_load %s %s\n", prefix, libname);
1151 qtest_rsp(s);
1152 }
1153
1154 void qtest_qom_tests(QTestState *s)
1155 {
1156 qtest_sendf(s, "qom-tests\n");
1157 qtest_rsp(s);
1158 }
1159
1160 static int64_t qtest_clock_rsp(QTestState *s)
1161 {
1162 gchar **words;
1163 int64_t clock;
1164 words = qtest_rsp_args(s, 2);
1165 clock = g_ascii_strtoll(words[1], NULL, 0);
1166 g_strfreev(words);
1167 return clock;
1168 }
1169
1170 int64_t qtest_clock_step_next(QTestState *s)
1171 {
1172 qtest_sendf(s, "clock_step\n");
1173 return qtest_clock_rsp(s);
1174 }
1175
1176 int64_t qtest_clock_step(QTestState *s, int64_t step)
1177 {
1178 qtest_sendf(s, "clock_step %"PRIi64"\n", step);
1179 return qtest_clock_rsp(s);
1180 }
1181
1182 int64_t qtest_clock_set(QTestState *s, int64_t val)
1183 {
1184 qtest_sendf(s, "clock_set %"PRIi64"\n", val);
1185 return qtest_clock_rsp(s);
1186 }
1187
1188 void qtest_irq_intercept_out(QTestState *s, const char *qom_path)
1189 {
1190 qtest_sendf(s, "irq_intercept_out %s\n", qom_path);
1191 qtest_rsp(s);
1192 }
1193
1194 void qtest_irq_intercept_out_named(QTestState *s, const char *qom_path, const char *name)
1195 {
1196 qtest_sendf(s, "irq_intercept_out %s %s\n", qom_path, name);
1197 qtest_rsp(s);
1198 }
1199
1200 void qtest_irq_intercept_in(QTestState *s, const char *qom_path)
1201 {
1202 qtest_sendf(s, "irq_intercept_in %s\n", qom_path);
1203 qtest_rsp(s);
1204 }
1205
1206 void qtest_set_irq_in(QTestState *s, const char *qom_path, const char *name,
1207 int num, int level)
1208 {
1209 if (!name) {
1210 name = "unnamed-gpio-in";
1211 }
1212 qtest_sendf(s, "set_irq_in %s %s %d %d\n", qom_path, name, num, level);
1213 qtest_rsp(s);
1214 }
1215
1216 static void qtest_out(QTestState *s, const char *cmd, uint16_t addr, uint32_t value)
1217 {
1218 qtest_sendf(s, "%s 0x%x 0x%x\n", cmd, addr, value);
1219 qtest_rsp(s);
1220 }
1221
1222 void qtest_outb(QTestState *s, uint16_t addr, uint8_t value)
1223 {
1224 qtest_out(s, "outb", addr, value);
1225 }
1226
1227 void qtest_outw(QTestState *s, uint16_t addr, uint16_t value)
1228 {
1229 qtest_out(s, "outw", addr, qtest_big_endian(s) ? bswap16(value) : value);
1230 }
1231
1232 void qtest_outl(QTestState *s, uint16_t addr, uint32_t value)
1233 {
1234 qtest_out(s, "outl", addr, qtest_big_endian(s) ? bswap32(value) : value);
1235 }
1236
1237 static uint32_t qtest_in(QTestState *s, const char *cmd, uint16_t addr)
1238 {
1239 gchar **args;
1240 int ret;
1241 unsigned long value;
1242
1243 qtest_sendf(s, "%s 0x%x\n", cmd, addr);
1244 args = qtest_rsp_args(s, 2);
1245 ret = qemu_strtoul(args[1], NULL, 0, &value);
1246 g_assert(!ret && value <= UINT32_MAX);
1247 g_strfreev(args);
1248
1249 return value;
1250 }
1251
1252 uint8_t qtest_inb(QTestState *s, uint16_t addr)
1253 {
1254 return qtest_in(s, "inb", addr);
1255 }
1256
1257 uint16_t qtest_inw(QTestState *s, uint16_t addr)
1258 {
1259 uint16_t v = qtest_in(s, "inw", addr);
1260
1261 return qtest_big_endian(s) ? bswap16(v) : v;
1262 }
1263
1264 uint32_t qtest_inl(QTestState *s, uint16_t addr)
1265 {
1266 uint32_t v = qtest_in(s, "inl", addr);
1267
1268 return qtest_big_endian(s) ? bswap32(v) : v;
1269 }
1270
1271 static void qtest_write(QTestState *s, const char *cmd, uint64_t addr,
1272 uint64_t value)
1273 {
1274 qtest_sendf(s, "%s 0x%" PRIx64 " 0x%" PRIx64 "\n", cmd, addr, value);
1275 qtest_rsp(s);
1276 }
1277
1278 void qtest_writeb(QTestState *s, uint64_t addr, uint8_t value)
1279 {
1280 qtest_write(s, "writeb", addr, value);
1281 }
1282
1283 void qtest_writew(QTestState *s, uint64_t addr, uint16_t value)
1284 {
1285 qtest_write(s, "writew", addr, value);
1286 }
1287
1288 void qtest_writel(QTestState *s, uint64_t addr, uint32_t value)
1289 {
1290 qtest_write(s, "writel", addr, value);
1291 }
1292
1293 void qtest_writeq(QTestState *s, uint64_t addr, uint64_t value)
1294 {
1295 qtest_write(s, "writeq", addr, value);
1296 }
1297
1298 static uint64_t qtest_read(QTestState *s, const char *cmd, uint64_t addr)
1299 {
1300 gchar **args;
1301 int ret;
1302 uint64_t value;
1303
1304 qtest_sendf(s, "%s 0x%" PRIx64 "\n", cmd, addr);
1305 args = qtest_rsp_args(s, 2);
1306 ret = qemu_strtou64(args[1], NULL, 0, &value);
1307 g_assert(!ret);
1308 g_strfreev(args);
1309
1310 return value;
1311 }
1312
1313 uint8_t qtest_readb(QTestState *s, uint64_t addr)
1314 {
1315 return qtest_read(s, "readb", addr);
1316 }
1317
1318 uint16_t qtest_readw(QTestState *s, uint64_t addr)
1319 {
1320 return qtest_read(s, "readw", addr);
1321 }
1322
1323 uint32_t qtest_readl(QTestState *s, uint64_t addr)
1324 {
1325 return qtest_read(s, "readl", addr);
1326 }
1327
1328 uint64_t qtest_readq(QTestState *s, uint64_t addr)
1329 {
1330 return qtest_read(s, "readq", addr);
1331 }
1332
1333 static int hex2nib(char ch)
1334 {
1335 if (ch >= '0' && ch <= '9') {
1336 return ch - '0';
1337 } else if (ch >= 'a' && ch <= 'f') {
1338 return 10 + (ch - 'a');
1339 } else if (ch >= 'A' && ch <= 'F') {
1340 return 10 + (ch - 'a');
1341 } else {
1342 return -1;
1343 }
1344 }
1345
1346 void qtest_memread(QTestState *s, uint64_t addr, void *data, size_t size)
1347 {
1348 uint8_t *ptr = data;
1349 gchar **args;
1350 size_t i;
1351
1352 if (!size) {
1353 return;
1354 }
1355
1356 qtest_sendf(s, "read 0x%" PRIx64 " 0x%zx\n", addr, size);
1357 args = qtest_rsp_args(s, 2);
1358
1359 for (i = 0; i < size; i++) {
1360 ptr[i] = hex2nib(args[1][2 + (i * 2)]) << 4;
1361 ptr[i] |= hex2nib(args[1][2 + (i * 2) + 1]);
1362 }
1363
1364 g_strfreev(args);
1365 }
1366
1367 uint64_t qtest_rtas_call(QTestState *s, const char *name,
1368 uint32_t nargs, uint64_t args,
1369 uint32_t nret, uint64_t ret)
1370 {
1371 qtest_sendf(s, "rtas %s %u 0x%"PRIx64" %u 0x%"PRIx64"\n",
1372 name, nargs, args, nret, ret);
1373 qtest_rsp(s);
1374 return 0;
1375 }
1376
1377 static void qtest_rsp_csr(QTestState *s, uint64_t *val)
1378 {
1379 gchar **args;
1380 uint64_t ret;
1381 int rc;
1382
1383 args = qtest_rsp_args(s, 3);
1384
1385 rc = qemu_strtou64(args[1], NULL, 16, &ret);
1386 g_assert(rc == 0);
1387 rc = qemu_strtou64(args[2], NULL, 16, val);
1388 g_assert(rc == 0);
1389
1390 g_strfreev(args);
1391 }
1392
1393 uint64_t qtest_csr_call(QTestState *s, const char *name,
1394 uint64_t cpu, int csr,
1395 uint64_t *val)
1396 {
1397 qtest_sendf(s, "csr %s 0x%"PRIx64" %d 0x%"PRIx64"\n",
1398 name, cpu, csr, *val);
1399
1400 qtest_rsp_csr(s, val);
1401 return 0;
1402 }
1403
1404 void qtest_add_func(const char *str, void (*fn)(void))
1405 {
1406 gchar *path = g_strdup_printf("/%s/%s", qtest_get_arch(), str);
1407 g_test_add_func(path, fn);
1408 g_free(path);
1409 }
1410
1411 void qtest_add_data_func_full(const char *str, void *data,
1412 void (*fn)(const void *),
1413 GDestroyNotify data_free_func)
1414 {
1415 gchar *path = g_strdup_printf("/%s/%s", qtest_get_arch(), str);
1416 g_test_add_data_func_full(path, data, fn, data_free_func);
1417 g_free(path);
1418 }
1419
1420 void qtest_add_data_func(const char *str, const void *data,
1421 void (*fn)(const void *))
1422 {
1423 gchar *path = g_strdup_printf("/%s/%s", qtest_get_arch(), str);
1424 g_test_add_data_func(path, data, fn);
1425 g_free(path);
1426 }
1427
1428 void qtest_bufwrite(QTestState *s, uint64_t addr, const void *data, size_t size)
1429 {
1430 gchar *bdata;
1431
1432 bdata = g_base64_encode(data, size);
1433 qtest_sendf(s, "b64write 0x%" PRIx64 " 0x%zx ", addr, size);
1434 s->ops.send(s, bdata);
1435 s->ops.send(s, "\n");
1436 qtest_rsp(s);
1437 g_free(bdata);
1438 }
1439
1440 void qtest_bufread(QTestState *s, uint64_t addr, void *data, size_t size)
1441 {
1442 gchar **args;
1443 size_t len;
1444
1445 qtest_sendf(s, "b64read 0x%" PRIx64 " 0x%zx\n", addr, size);
1446 args = qtest_rsp_args(s, 2);
1447
1448 g_base64_decode_inplace(args[1], &len);
1449 if (size != len) {
1450 fprintf(stderr, "bufread: asked for %zu bytes but decoded %zu\n",
1451 size, len);
1452 len = MIN(len, size);
1453 }
1454
1455 memcpy(data, args[1], len);
1456 g_strfreev(args);
1457 }
1458
1459 void qtest_memwrite(QTestState *s, uint64_t addr, const void *data, size_t size)
1460 {
1461 const uint8_t *ptr = data;
1462 size_t i;
1463 char *enc;
1464
1465 if (!size) {
1466 return;
1467 }
1468
1469 enc = g_malloc(2 * size + 1);
1470
1471 for (i = 0; i < size; i++) {
1472 sprintf(&enc[i * 2], "%02x", ptr[i]);
1473 }
1474
1475 qtest_sendf(s, "write 0x%" PRIx64 " 0x%zx 0x%s\n", addr, size, enc);
1476 qtest_rsp(s);
1477 g_free(enc);
1478 }
1479
1480 void qtest_memset(QTestState *s, uint64_t addr, uint8_t pattern, size_t size)
1481 {
1482 qtest_sendf(s, "memset 0x%" PRIx64 " 0x%zx 0x%02x\n", addr, size, pattern);
1483 qtest_rsp(s);
1484 }
1485
1486 QDict *qtest_vqmp_assert_failure_ref(QTestState *qts,
1487 const char *fmt, va_list args)
1488 {
1489 QDict *response;
1490 QDict *ret;
1491
1492 response = qtest_vqmp(qts, fmt, args);
1493
1494 g_assert(response);
1495 if (!qdict_haskey(response, "error")) {
1496 g_autoptr(GString) s = qobject_to_json_pretty(QOBJECT(response), true);
1497 g_test_message("%s", s->str);
1498 }
1499 g_assert(qdict_haskey(response, "error"));
1500 g_assert(!qdict_haskey(response, "return"));
1501 ret = qdict_get_qdict(response, "error");
1502 qobject_ref(ret);
1503 qobject_unref(response);
1504
1505 return ret;
1506 }
1507
1508 QDict *qtest_vqmp_assert_success_ref(QTestState *qts,
1509 const char *fmt, va_list args)
1510 {
1511 QDict *response;
1512 QDict *ret;
1513
1514 response = qtest_vqmp(qts, fmt, args);
1515
1516 g_assert(response);
1517 if (!qdict_haskey(response, "return")) {
1518 g_autoptr(GString) s = qobject_to_json_pretty(QOBJECT(response), true);
1519 g_test_message("%s", s->str);
1520 }
1521 g_assert(qdict_haskey(response, "return"));
1522 ret = qdict_get_qdict(response, "return");
1523 qobject_ref(ret);
1524 qobject_unref(response);
1525
1526 return ret;
1527 }
1528
1529 void qtest_vqmp_assert_success(QTestState *qts,
1530 const char *fmt, va_list args)
1531 {
1532 QDict *response;
1533
1534 response = qtest_vqmp_assert_success_ref(qts, fmt, args);
1535
1536 qobject_unref(response);
1537 }
1538
1539 #ifndef _WIN32
1540 QDict *qtest_vqmp_fds_assert_success_ref(QTestState *qts, int *fds, size_t nfds,
1541 const char *fmt, va_list args)
1542 {
1543 QDict *response;
1544 QDict *ret;
1545
1546 response = qtest_vqmp_fds(qts, fds, nfds, fmt, args);
1547
1548 g_assert(response);
1549 if (!qdict_haskey(response, "return")) {
1550 g_autoptr(GString) s = qobject_to_json_pretty(QOBJECT(response), true);
1551 g_test_message("%s", s->str);
1552 }
1553 g_assert(qdict_haskey(response, "return"));
1554 ret = qdict_get_qdict(response, "return");
1555 qobject_ref(ret);
1556 qobject_unref(response);
1557
1558 return ret;
1559 }
1560
1561 void qtest_vqmp_fds_assert_success(QTestState *qts, int *fds, size_t nfds,
1562 const char *fmt, va_list args)
1563 {
1564 QDict *response;
1565 response = qtest_vqmp_fds_assert_success_ref(qts, fds, nfds, fmt, args);
1566 qobject_unref(response);
1567 }
1568 #endif /* !_WIN32 */
1569
1570 QDict *qtest_qmp_assert_failure_ref(QTestState *qts, const char *fmt, ...)
1571 {
1572 QDict *response;
1573 va_list ap;
1574
1575 va_start(ap, fmt);
1576 response = qtest_vqmp_assert_failure_ref(qts, fmt, ap);
1577 va_end(ap);
1578 return response;
1579 }
1580
1581 QDict *qtest_qmp_assert_success_ref(QTestState *qts, const char *fmt, ...)
1582 {
1583 QDict *response;
1584 va_list ap;
1585 va_start(ap, fmt);
1586 response = qtest_vqmp_assert_success_ref(qts, fmt, ap);
1587 va_end(ap);
1588 return response;
1589 }
1590
1591 void qtest_qmp_assert_success(QTestState *qts, const char *fmt, ...)
1592 {
1593 va_list ap;
1594 va_start(ap, fmt);
1595 qtest_vqmp_assert_success(qts, fmt, ap);
1596 va_end(ap);
1597 }
1598
1599 #ifndef _WIN32
1600 QDict *qtest_qmp_fds_assert_success_ref(QTestState *qts, int *fds, size_t nfds,
1601 const char *fmt, ...)
1602 {
1603 QDict *response;
1604 va_list ap;
1605 va_start(ap, fmt);
1606 response = qtest_vqmp_fds_assert_success_ref(qts, fds, nfds, fmt, ap);
1607 va_end(ap);
1608 return response;
1609 }
1610
1611 void qtest_qmp_fds_assert_success(QTestState *qts, int *fds, size_t nfds,
1612 const char *fmt, ...)
1613 {
1614 va_list ap;
1615 va_start(ap, fmt);
1616 qtest_vqmp_fds_assert_success(qts, fds, nfds, fmt, ap);
1617 va_end(ap);
1618 }
1619 #endif /* !_WIN32 */
1620
1621 bool qtest_big_endian(QTestState *s)
1622 {
1623 return s->big_endian;
1624 }
1625
1626 static bool qtest_check_machine_version(const char *mname, const char *basename,
1627 int major, int minor)
1628 {
1629 char *newname;
1630 bool is_equal;
1631
1632 newname = g_strdup_printf("%s-%i.%i", basename, major, minor);
1633 is_equal = g_str_equal(mname, newname);
1634 g_free(newname);
1635
1636 return is_equal;
1637 }
1638
1639 static bool qtest_is_old_versioned_machine(const char *mname)
1640 {
1641 const char *dash = strrchr(mname, '-');
1642 const char *dot = strrchr(mname, '.');
1643 const char *chr;
1644 char *bname;
1645 const int major = QEMU_VERSION_MAJOR;
1646 const int minor = QEMU_VERSION_MINOR;
1647 bool res = false;
1648
1649 if (dash && dot && dot > dash) {
1650 for (chr = dash + 1; *chr; chr++) {
1651 if (!qemu_isdigit(*chr) && *chr != '.') {
1652 return false;
1653 }
1654 }
1655 /*
1656 * Now check if it is one of the latest versions. Check major + 1
1657 * and minor + 1 versions as well, since they might already exist
1658 * in the development branch.
1659 */
1660 bname = g_strdup(mname);
1661 bname[dash - mname] = 0;
1662 res = !qtest_check_machine_version(mname, bname, major + 1, 0) &&
1663 !qtest_check_machine_version(mname, bname, major, minor + 1) &&
1664 !qtest_check_machine_version(mname, bname, major, minor);
1665 g_free(bname);
1666 }
1667
1668 return res;
1669 }
1670
1671 struct MachInfo {
1672 char *name;
1673 char *alias;
1674 };
1675
1676 struct CpuModel {
1677 char *name;
1678 char *alias_of;
1679 bool deprecated;
1680 };
1681
1682 static void qtest_free_machine_list(struct MachInfo *machines)
1683 {
1684 if (machines) {
1685 for (int i = 0; machines[i].name != NULL; i++) {
1686 g_free(machines[i].name);
1687 g_free(machines[i].alias);
1688 }
1689
1690 g_free(machines);
1691 }
1692 }
1693
1694 /*
1695 * Returns an array with pointers to the available machine names.
1696 * The terminating entry has the name set to NULL.
1697 */
1698 static struct MachInfo *qtest_get_machines(const char *var)
1699 {
1700 static struct MachInfo *machines;
1701 static char *qemu_bin;
1702 const char *new_qemu_bin;
1703 QDict *response, *minfo;
1704 QList *list;
1705 const QListEntry *p;
1706 QObject *qobj;
1707 QString *qstr;
1708 QTestState *qts;
1709 int idx;
1710
1711 new_qemu_bin = qtest_qemu_binary(var);
1712 if (g_strcmp0(qemu_bin, new_qemu_bin)) {
1713 g_free(qemu_bin);
1714 qemu_bin = g_strdup(new_qemu_bin);
1715
1716 /* new qemu, clear the cache */
1717 qtest_free_machine_list(machines);
1718 machines = NULL;
1719 }
1720
1721 if (machines) {
1722 return machines;
1723 }
1724
1725 silence_spawn_log = !g_test_verbose();
1726
1727 qts = qtest_init_ext(var, "-machine none", NULL, true);
1728 response = qtest_qmp(qts, "{ 'execute': 'query-machines' }");
1729 g_assert(response);
1730 list = qdict_get_qlist(response, "return");
1731 g_assert(list);
1732
1733 machines = g_new(struct MachInfo, qlist_size(list) + 1);
1734
1735 for (p = qlist_first(list), idx = 0; p; p = qlist_next(p), idx++) {
1736 minfo = qobject_to(QDict, qlist_entry_obj(p));
1737 g_assert(minfo);
1738
1739 qobj = qdict_get(minfo, "name");
1740 g_assert(qobj);
1741 qstr = qobject_to(QString, qobj);
1742 g_assert(qstr);
1743 machines[idx].name = g_strdup(qstring_get_str(qstr));
1744
1745 qobj = qdict_get(minfo, "alias");
1746 if (qobj) { /* The alias is optional */
1747 qstr = qobject_to(QString, qobj);
1748 g_assert(qstr);
1749 machines[idx].alias = g_strdup(qstring_get_str(qstr));
1750 } else {
1751 machines[idx].alias = NULL;
1752 }
1753 }
1754
1755 qtest_quit(qts);
1756 qobject_unref(response);
1757
1758 silence_spawn_log = false;
1759
1760 memset(&machines[idx], 0, sizeof(struct MachInfo)); /* Terminating entry */
1761 return machines;
1762 }
1763
1764 static struct CpuModel *qtest_get_cpu_models(void)
1765 {
1766 static struct CpuModel *cpus;
1767 QDict *response, *minfo;
1768 QList *list;
1769 const QListEntry *p;
1770 QObject *qobj;
1771 QString *qstr;
1772 QBool *qbool;
1773 QTestState *qts;
1774 int idx;
1775
1776 if (cpus) {
1777 return cpus;
1778 }
1779
1780 silence_spawn_log = !g_test_verbose();
1781
1782 qts = qtest_init_ext(NULL, "-machine none", NULL, true);
1783 response = qtest_qmp(qts, "{ 'execute': 'query-cpu-definitions' }");
1784 g_assert(response);
1785 list = qdict_get_qlist(response, "return");
1786 g_assert(list);
1787
1788 cpus = g_new0(struct CpuModel, qlist_size(list) + 1);
1789
1790 for (p = qlist_first(list), idx = 0; p; p = qlist_next(p), idx++) {
1791 minfo = qobject_to(QDict, qlist_entry_obj(p));
1792 g_assert(minfo);
1793
1794 qobj = qdict_get(minfo, "name");
1795 g_assert(qobj);
1796 qstr = qobject_to(QString, qobj);
1797 g_assert(qstr);
1798 cpus[idx].name = g_strdup(qstring_get_str(qstr));
1799
1800 qobj = qdict_get(minfo, "alias_of");
1801 if (qobj) { /* old machines do not report aliases */
1802 qstr = qobject_to(QString, qobj);
1803 g_assert(qstr);
1804 cpus[idx].alias_of = g_strdup(qstring_get_str(qstr));
1805 } else {
1806 cpus[idx].alias_of = NULL;
1807 }
1808
1809 qobj = qdict_get(minfo, "deprecated");
1810 qbool = qobject_to(QBool, qobj);
1811 g_assert(qbool);
1812 cpus[idx].deprecated = qbool_get_bool(qbool);
1813 }
1814
1815 qtest_quit(qts);
1816 qobject_unref(response);
1817
1818 silence_spawn_log = false;
1819
1820 return cpus;
1821 }
1822
1823 bool qtest_has_cpu_model(const char *cpu)
1824 {
1825 struct CpuModel *cpus;
1826 int i;
1827
1828 cpus = qtest_get_cpu_models();
1829
1830 for (i = 0; cpus[i].name != NULL; i++) {
1831 if (g_str_equal(cpu, cpus[i].name) ||
1832 (cpus[i].alias_of && g_str_equal(cpu, cpus[i].alias_of))) {
1833 return true;
1834 }
1835 }
1836
1837 return false;
1838 }
1839
1840 void qtest_cb_for_every_machine(void (*cb)(const char *machine),
1841 bool skip_old_versioned)
1842 {
1843 struct MachInfo *machines;
1844 int i;
1845
1846 machines = qtest_get_machines(NULL);
1847
1848 for (i = 0; machines[i].name != NULL; i++) {
1849 /* Ignore machines that cannot be used for qtests */
1850 if (!strncmp("xenfv", machines[i].name, 5) ||
1851 g_str_equal("xenpv", machines[i].name) ||
1852 g_str_equal("xenpvh", machines[i].name) ||
1853 g_str_equal("vmapple", machines[i].name) ||
1854 g_str_equal("nitro", machines[i].name) ||
1855 g_str_equal("nitro-enclave", machines[i].name)) {
1856 continue;
1857 }
1858 if (!skip_old_versioned ||
1859 !qtest_is_old_versioned_machine(machines[i].name)) {
1860 cb(machines[i].name);
1861 }
1862 }
1863 }
1864
1865 char *qtest_resolve_machine_alias(const char *var, const char *alias)
1866 {
1867 struct MachInfo *machines;
1868 int i;
1869
1870 machines = qtest_get_machines(var);
1871
1872 for (i = 0; machines[i].name != NULL; i++) {
1873 if (machines[i].alias && g_str_equal(alias, machines[i].alias)) {
1874 return g_strdup(machines[i].name);
1875 }
1876 }
1877
1878 return NULL;
1879 }
1880
1881 bool qtest_has_machine_with_env(const char *var, const char *machine)
1882 {
1883 struct MachInfo *machines;
1884 int i;
1885
1886 machines = qtest_get_machines(var);
1887
1888 for (i = 0; machines[i].name != NULL; i++) {
1889 if (g_str_equal(machine, machines[i].name) ||
1890 (machines[i].alias && g_str_equal(machine, machines[i].alias))) {
1891 return true;
1892 }
1893 }
1894
1895 return false;
1896 }
1897
1898 bool qtest_has_machine(const char *machine)
1899 {
1900 return qtest_has_machine_with_env(NULL, machine);
1901 }
1902
1903 bool qtest_has_device(const char *device)
1904 {
1905 static QList *list;
1906
1907 return qtest_qom_has_concrete_type("device", device, &list);
1908 }
1909
1910 /*
1911 * Generic hot-plugging test via the device_add QMP commands.
1912 */
1913 void qtest_qmp_device_add_qdict(QTestState *qts, const char *drv,
1914 const QDict *arguments)
1915 {
1916 QDict *resp;
1917 QDict *args = arguments ? qdict_clone_shallow(arguments) : qdict_new();
1918
1919 g_assert(!qdict_haskey(args, "driver"));
1920 qdict_put_str(args, "driver", drv);
1921 resp = qtest_qmp(qts, "{'execute': 'device_add', 'arguments': %p}", args);
1922 g_assert(resp);
1923 g_assert(!qdict_haskey(resp, "event")); /* We don't expect any events */
1924 if (qdict_haskey(resp, "error")) {
1925 fprintf(stderr, "error: %s\n",
1926 qdict_get_str(qdict_get_qdict(resp, "error"), "desc"));
1927 }
1928 g_assert(!qdict_haskey(resp, "error"));
1929 qobject_unref(resp);
1930 }
1931
1932 void qtest_qmp_device_add(QTestState *qts, const char *driver, const char *id,
1933 const char *fmt, ...)
1934 {
1935 QDict *args;
1936 va_list ap;
1937
1938 va_start(ap, fmt);
1939 args = qdict_from_vjsonf_nofail(fmt, ap);
1940 va_end(ap);
1941
1942 g_assert(!qdict_haskey(args, "id"));
1943 qdict_put_str(args, "id", id);
1944
1945 qtest_qmp_device_add_qdict(qts, driver, args);
1946 qobject_unref(args);
1947 }
1948
1949 void qtest_qmp_add_client(QTestState *qts, const char *protocol, int fd)
1950 {
1951 QDict *resp;
1952
1953 #ifdef WIN32
1954 WSAPROTOCOL_INFOW info;
1955 g_autofree char *info64 = NULL;
1956 SOCKET s;
1957
1958 assert(fd_is_socket(fd));
1959 s = _get_osfhandle(fd);
1960 if (WSADuplicateSocketW(s, GetProcessId((HANDLE)qts->qemu_pid), &info) == SOCKET_ERROR) {
1961 g_autofree char *emsg = g_win32_error_message(WSAGetLastError());
1962 g_error("WSADuplicateSocketW failed: %s", emsg);
1963 }
1964 info64 = g_base64_encode((guchar *)&info, sizeof(info));
1965 resp = qtest_qmp(qts, "{'execute': 'get-win32-socket',"
1966 "'arguments': {'fdname': 'fdname', 'info': %s}}", info64);
1967 #else
1968 resp = qtest_qmp_fds(qts, &fd, 1, "{'execute': 'getfd',"
1969 "'arguments': {'fdname': 'fdname'}}");
1970 #endif
1971 g_assert(resp);
1972 g_assert(!qdict_haskey(resp, "event")); /* We don't expect any events */
1973 g_assert(!qdict_haskey(resp, "error"));
1974 qobject_unref(resp);
1975
1976 resp = qtest_qmp(
1977 qts, "{'execute': 'add_client',"
1978 "'arguments': {'protocol': %s, 'fdname': 'fdname'}}", protocol);
1979 g_assert(resp);
1980 g_assert(!qdict_haskey(resp, "event")); /* We don't expect any events */
1981 g_assert(!qdict_haskey(resp, "error"));
1982 qobject_unref(resp);
1983 }
1984
1985 /*
1986 * Generic hot-unplugging test via the device_del QMP command.
1987 * Device deletion will get one response and one event. For example:
1988 *
1989 * {'execute': 'device_del','arguments': { 'id': 'scsi-hd'}}
1990 *
1991 * will get this one:
1992 *
1993 * {"timestamp": {"seconds": 1505289667, "microseconds": 569862},
1994 * "event": "DEVICE_DELETED", "data": {"device": "scsi-hd",
1995 * "path": "/machine/peripheral/scsi-hd"}}
1996 *
1997 * and this one:
1998 *
1999 * {"return": {}}
2000 */
2001 void qtest_qmp_device_del_send(QTestState *qts, const char *id)
2002 {
2003 QDict *rsp = qtest_qmp(qts, "{'execute': 'device_del', "
2004 "'arguments': {'id': %s}}", id);
2005 g_assert(rsp);
2006 g_assert(qdict_haskey(rsp, "return"));
2007 g_assert(!qdict_haskey(rsp, "error"));
2008 qobject_unref(rsp);
2009 }
2010
2011 void qtest_qmp_device_del(QTestState *qts, const char *id)
2012 {
2013 qtest_qmp_device_del_send(qts, id);
2014 qtest_qmp_eventwait(qts, "DEVICE_DELETED");
2015 }
2016
2017 static void qtest_client_set_tx_handler(QTestState *s,
2018 QTestSendFn send)
2019 {
2020 s->ops.send = send;
2021 }
2022 static void qtest_client_set_rx_handler(QTestState *s, QTestRecvFn recv)
2023 {
2024 s->ops.recv_line = recv;
2025 }
2026 /* A type-safe wrapper for s->send() */
2027 static void send_wrapper(QTestState *s, const char *buf)
2028 {
2029 s->ops.external_send(s, buf);
2030 }
2031
2032 static GString *qtest_client_inproc_recv_line(QTestState *s)
2033 {
2034 GString *line;
2035 size_t offset;
2036 char *eol;
2037
2038 eol = strchr(s->rx->str, '\n');
2039 offset = eol - s->rx->str;
2040 line = g_string_new_len(s->rx->str, offset);
2041 g_string_erase(s->rx, 0, offset + 1);
2042 return line;
2043 }
2044
2045 QTestState *qtest_inproc_init(QTestState **s, bool log, const char* arch,
2046 void (*send)(void*, const char*))
2047 {
2048 QTestState *qts;
2049 qts = g_new0(QTestState, 1);
2050 qts->pending_events = NULL;
2051 *s = qts; /* Expose qts early on, since the query endianness relies on it */
2052 qts->wstatus = 0;
2053 for (int i = 0; i < MAX_IRQ; i++) {
2054 qts->irq_level[i] = false;
2055 }
2056
2057 qtest_client_set_rx_handler(qts, qtest_client_inproc_recv_line);
2058
2059 /* send() may not have a matching prototype, so use a type-safe wrapper */
2060 qts->ops.external_send = send;
2061 qtest_client_set_tx_handler(qts, send_wrapper);
2062
2063 qts->big_endian = qtest_query_target_endianness(qts);
2064
2065 /*
2066 * Set a dummy path for QTEST_QEMU_BINARY. Doesn't need to exist, but this
2067 * way, qtest_get_arch works for inproc qtest.
2068 */
2069 gchar *bin_path = g_strconcat("/qemu-system-", arch, NULL);
2070 if (!g_setenv("QTEST_QEMU_BINARY", bin_path, 0)) {
2071 fprintf(stderr,
2072 "Could not set environment variable QTEST_QEMU_BINARY\n");
2073 exit(1);
2074 }
2075 g_free(bin_path);
2076
2077 return qts;
2078 }
2079
2080 void qtest_client_inproc_recv(void *opaque, const char *str)
2081 {
2082 QTestState *qts = *(QTestState **)opaque;
2083
2084 if (!qts->rx) {
2085 qts->rx = g_string_new(NULL);
2086 }
2087 g_string_append(qts->rx, str);
2088 }
2089
2090 void qtest_qom_set_bool(QTestState *s, const char *path, const char *property,
2091 bool value)
2092 {
2093 QDict *r;
2094
2095 r = qtest_qmp(s, "{ 'execute': 'qom-set', 'arguments': "
2096 "{ 'path': %s, 'property': %s, 'value': %i } }",
2097 path, property, value);
2098 qobject_unref(r);
2099 }
2100
2101 bool qtest_qom_get_bool(QTestState *s, const char *path, const char *property)
2102 {
2103 QDict *r;
2104 bool b;
2105
2106 r = qtest_qmp(s, "{ 'execute': 'qom-get', 'arguments': "
2107 "{ 'path': %s, 'property': %s } }", path, property);
2108 b = qdict_get_bool(r, "return");
2109 qobject_unref(r);
2110
2111 return b;
2112 }
2113
2114 bool have_qemu_img(void)
2115 {
2116 char *rpath;
2117 const char *path = getenv("QTEST_QEMU_IMG");
2118 if (!path) {
2119 return false;
2120 }
2121
2122 rpath = realpath(path, NULL);
2123 if (!rpath) {
2124 return false;
2125 } else {
2126 free(rpath);
2127 return true;
2128 }
2129 }
2130
2131 bool mkimg(const char *file, const char *fmt, unsigned size_mb)
2132 {
2133 gchar *cli;
2134 bool ret;
2135 int rc;
2136 GError *err = NULL;
2137 char *qemu_img_path;
2138 gchar *out, *out2;
2139 char *qemu_img_abs_path;
2140
2141 qemu_img_path = getenv("QTEST_QEMU_IMG");
2142 if (!qemu_img_path) {
2143 return false;
2144 }
2145 qemu_img_abs_path = realpath(qemu_img_path, NULL);
2146 if (!qemu_img_abs_path) {
2147 return false;
2148 }
2149
2150 cli = g_strdup_printf("%s create -f %s %s %uM", qemu_img_abs_path,
2151 fmt, file, size_mb);
2152 ret = g_spawn_command_line_sync(cli, &out, &out2, &rc, &err);
2153 if (err || !g_spawn_check_exit_status(rc, &err)) {
2154 fprintf(stderr, "%s\n", err->message);
2155 g_error_free(err);
2156 }
2157
2158 g_free(out);
2159 g_free(out2);
2160 g_free(cli);
2161 free(qemu_img_abs_path);
2162
2163 return ret && !err;
2164 }
2165
2166 bool qtest_verbose(const char *domain)
2167 {
2168 const gchar *found, *log = g_getenv("QTEST_LOG");
2169
2170 assert(domain);
2171
2172 if (log) {
2173 /*
2174 * verbose=true for all domains if:
2175 * QTEST_LOG=
2176 * QTEST_LOG=1
2177 * other one-character variations
2178 */
2179 if (log[0] == '\0' || log[1] == '\0') {
2180 return true;
2181 }
2182
2183 /*
2184 * verbose=true for specified domains if:
2185 * QTEST_LOG=<domain>
2186 * QTEST_LOG=<domain1>,<domain2>
2187 * allows other separators, except - and +
2188 *
2189 * verbose=false for specified domains if:
2190 * QTEST_LOG=-<domain>
2191 * QTEST_LOG=<domain1>,-<domain2> (only false for domain2)
2192 * allows other separators, except - and +
2193 */
2194 found = g_strstr_len(log, -1, domain);
2195
2196 if (found) {
2197 /* reject options given twice */
2198 assert(!g_strstr_len(found + strlen(domain), -1, domain));
2199
2200 if (found > log) {
2201 ptrdiff_t i = found - log - 1;
2202 if (log[i] == '-') {
2203 return false;
2204 }
2205 }
2206 return true;
2207 } else {
2208 /*
2209 * If filtering out a specific domain, all others are
2210 * enabled.
2211 */
2212 return !!g_strstr_len(log, -1, "-");
2213 }
2214 }
2215
2216 return false;
2217 }