]> Git Repo - qemu.git/blob - tests/libqtest.c
Merge remote-tracking branch 'remotes/gkurz/tags/for-upstream' into staging
[qemu.git] / tests / libqtest.c
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   <[email protected]>
10  *  Paolo Bonzini     <[email protected]>
11  *  Andreas Färber    <[email protected]>
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 #include "libqtest.h"
19
20 #include <sys/socket.h>
21 #include <sys/wait.h>
22 #include <sys/un.h>
23
24 #include "qapi/error.h"
25 #include "qapi/qmp/json-parser.h"
26 #include "qapi/qmp/json-streamer.h"
27 #include "qapi/qmp/qjson.h"
28
29 #define MAX_IRQ 256
30 #define SOCKET_TIMEOUT 50
31
32 QTestState *global_qtest;
33
34 struct QTestState
35 {
36     int fd;
37     int qmp_fd;
38     bool irq_level[MAX_IRQ];
39     GString *rx;
40     pid_t qemu_pid;  /* our child QEMU process */
41     bool big_endian;
42 };
43
44 static GHookList abrt_hooks;
45 static struct sigaction sigact_old;
46
47 #define g_assert_no_errno(ret) do { \
48     g_assert_cmpint(ret, !=, -1); \
49 } while (0)
50
51 static int qtest_query_target_endianness(QTestState *s);
52
53 static int init_socket(const char *socket_path)
54 {
55     struct sockaddr_un addr;
56     int sock;
57     int ret;
58
59     sock = socket(PF_UNIX, SOCK_STREAM, 0);
60     g_assert_no_errno(sock);
61
62     addr.sun_family = AF_UNIX;
63     snprintf(addr.sun_path, sizeof(addr.sun_path), "%s", socket_path);
64     qemu_set_cloexec(sock);
65
66     do {
67         ret = bind(sock, (struct sockaddr *)&addr, sizeof(addr));
68     } while (ret == -1 && errno == EINTR);
69     g_assert_no_errno(ret);
70     ret = listen(sock, 1);
71     g_assert_no_errno(ret);
72
73     return sock;
74 }
75
76 static int socket_accept(int sock)
77 {
78     struct sockaddr_un addr;
79     socklen_t addrlen;
80     int ret;
81     struct timeval timeout = { .tv_sec = SOCKET_TIMEOUT,
82                                .tv_usec = 0 };
83
84     setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (void *)&timeout,
85                sizeof(timeout));
86
87     do {
88         addrlen = sizeof(addr);
89         ret = accept(sock, (struct sockaddr *)&addr, &addrlen);
90     } while (ret == -1 && errno == EINTR);
91     if (ret == -1) {
92         fprintf(stderr, "%s failed: %s\n", __func__, strerror(errno));
93     }
94     close(sock);
95
96     return ret;
97 }
98
99 static void kill_qemu(QTestState *s)
100 {
101     if (s->qemu_pid != -1) {
102         kill(s->qemu_pid, SIGTERM);
103         waitpid(s->qemu_pid, NULL, 0);
104     }
105 }
106
107 static void kill_qemu_hook_func(void *s)
108 {
109     kill_qemu(s);
110 }
111
112 static void sigabrt_handler(int signo)
113 {
114     g_hook_list_invoke(&abrt_hooks, FALSE);
115 }
116
117 static void setup_sigabrt_handler(void)
118 {
119     struct sigaction sigact;
120
121     /* Catch SIGABRT to clean up on g_assert() failure */
122     sigact = (struct sigaction){
123         .sa_handler = sigabrt_handler,
124         .sa_flags = SA_RESETHAND,
125     };
126     sigemptyset(&sigact.sa_mask);
127     sigaction(SIGABRT, &sigact, &sigact_old);
128 }
129
130 static void cleanup_sigabrt_handler(void)
131 {
132     sigaction(SIGABRT, &sigact_old, NULL);
133 }
134
135 void qtest_add_abrt_handler(GHookFunc fn, const void *data)
136 {
137     GHook *hook;
138
139     /* Only install SIGABRT handler once */
140     if (!abrt_hooks.is_setup) {
141         g_hook_list_init(&abrt_hooks, sizeof(GHook));
142     }
143     setup_sigabrt_handler();
144
145     hook = g_hook_alloc(&abrt_hooks);
146     hook->func = fn;
147     hook->data = (void *)data;
148
149     g_hook_prepend(&abrt_hooks, hook);
150 }
151
152 static const char *qtest_qemu_binary(void)
153 {
154     const char *qemu_bin;
155
156     qemu_bin = getenv("QTEST_QEMU_BINARY");
157     if (!qemu_bin) {
158         fprintf(stderr, "Environment variable QTEST_QEMU_BINARY required\n");
159         exit(1);
160     }
161
162     return qemu_bin;
163 }
164
165 QTestState *qtest_init_without_qmp_handshake(const char *extra_args)
166 {
167     QTestState *s;
168     int sock, qmpsock, i;
169     gchar *socket_path;
170     gchar *qmp_socket_path;
171     gchar *command;
172     const char *qemu_binary = qtest_qemu_binary();
173
174     s = g_new(QTestState, 1);
175
176     socket_path = g_strdup_printf("/tmp/qtest-%d.sock", getpid());
177     qmp_socket_path = g_strdup_printf("/tmp/qtest-%d.qmp", getpid());
178
179     /* It's possible that if an earlier test run crashed it might
180      * have left a stale unix socket lying around. Delete any
181      * stale old socket to avoid spurious test failures with
182      * tests/libqtest.c:70:init_socket: assertion failed (ret != -1): (-1 != -1)
183      */
184     unlink(socket_path);
185     unlink(qmp_socket_path);
186
187     sock = init_socket(socket_path);
188     qmpsock = init_socket(qmp_socket_path);
189
190     qtest_add_abrt_handler(kill_qemu_hook_func, s);
191
192     s->qemu_pid = fork();
193     if (s->qemu_pid == 0) {
194         setenv("QEMU_AUDIO_DRV", "none", true);
195         command = g_strdup_printf("exec %s "
196                                   "-qtest unix:%s,nowait "
197                                   "-qtest-log %s "
198                                   "-qmp unix:%s,nowait "
199                                   "-machine accel=qtest "
200                                   "-display none "
201                                   "%s", qemu_binary, socket_path,
202                                   getenv("QTEST_LOG") ? "/dev/fd/2" : "/dev/null",
203                                   qmp_socket_path,
204                                   extra_args ?: "");
205         execlp("/bin/sh", "sh", "-c", command, NULL);
206         exit(1);
207     }
208
209     s->fd = socket_accept(sock);
210     if (s->fd >= 0) {
211         s->qmp_fd = socket_accept(qmpsock);
212     }
213     unlink(socket_path);
214     unlink(qmp_socket_path);
215     g_free(socket_path);
216     g_free(qmp_socket_path);
217
218     g_assert(s->fd >= 0 && s->qmp_fd >= 0);
219
220     s->rx = g_string_new("");
221     for (i = 0; i < MAX_IRQ; i++) {
222         s->irq_level[i] = false;
223     }
224
225     if (getenv("QTEST_STOP")) {
226         kill(s->qemu_pid, SIGSTOP);
227     }
228
229     /* ask endianness of the target */
230
231     s->big_endian = qtest_query_target_endianness(s);
232
233     return s;
234 }
235
236 QTestState *qtest_init(const char *extra_args)
237 {
238     QTestState *s = qtest_init_without_qmp_handshake(extra_args);
239
240     /* Read the QMP greeting and then do the handshake */
241     qtest_qmp_discard_response(s, "");
242     qtest_qmp_discard_response(s, "{ 'execute': 'qmp_capabilities' }");
243
244     return s;
245 }
246
247 void qtest_quit(QTestState *s)
248 {
249     g_hook_destroy_link(&abrt_hooks, g_hook_find_data(&abrt_hooks, TRUE, s));
250
251     /* Uninstall SIGABRT handler on last instance */
252     cleanup_sigabrt_handler();
253
254     kill_qemu(s);
255     close(s->fd);
256     close(s->qmp_fd);
257     g_string_free(s->rx, true);
258     g_free(s);
259 }
260
261 static void socket_send(int fd, const char *buf, size_t size)
262 {
263     size_t offset;
264
265     offset = 0;
266     while (offset < size) {
267         ssize_t len;
268
269         len = write(fd, buf + offset, size - offset);
270         if (len == -1 && errno == EINTR) {
271             continue;
272         }
273
274         g_assert_no_errno(len);
275         g_assert_cmpint(len, >, 0);
276
277         offset += len;
278     }
279 }
280
281 static void socket_sendf(int fd, const char *fmt, va_list ap)
282 {
283     gchar *str = g_strdup_vprintf(fmt, ap);
284     size_t size = strlen(str);
285
286     socket_send(fd, str, size);
287     g_free(str);
288 }
289
290 static void GCC_FMT_ATTR(2, 3) qtest_sendf(QTestState *s, const char *fmt, ...)
291 {
292     va_list ap;
293
294     va_start(ap, fmt);
295     socket_sendf(s->fd, fmt, ap);
296     va_end(ap);
297 }
298
299 static GString *qtest_recv_line(QTestState *s)
300 {
301     GString *line;
302     size_t offset;
303     char *eol;
304
305     while ((eol = strchr(s->rx->str, '\n')) == NULL) {
306         ssize_t len;
307         char buffer[1024];
308
309         len = read(s->fd, buffer, sizeof(buffer));
310         if (len == -1 && errno == EINTR) {
311             continue;
312         }
313
314         if (len == -1 || len == 0) {
315             fprintf(stderr, "Broken pipe\n");
316             exit(1);
317         }
318
319         g_string_append_len(s->rx, buffer, len);
320     }
321
322     offset = eol - s->rx->str;
323     line = g_string_new_len(s->rx->str, offset);
324     g_string_erase(s->rx, 0, offset + 1);
325
326     return line;
327 }
328
329 static gchar **qtest_rsp(QTestState *s, int expected_args)
330 {
331     GString *line;
332     gchar **words;
333     int i;
334
335 redo:
336     line = qtest_recv_line(s);
337     words = g_strsplit(line->str, " ", 0);
338     g_string_free(line, TRUE);
339
340     if (strcmp(words[0], "IRQ") == 0) {
341         int irq;
342
343         g_assert(words[1] != NULL);
344         g_assert(words[2] != NULL);
345
346         irq = strtoul(words[2], NULL, 0);
347         g_assert_cmpint(irq, >=, 0);
348         g_assert_cmpint(irq, <, MAX_IRQ);
349
350         if (strcmp(words[1], "raise") == 0) {
351             s->irq_level[irq] = true;
352         } else {
353             s->irq_level[irq] = false;
354         }
355
356         g_strfreev(words);
357         goto redo;
358     }
359
360     g_assert(words[0] != NULL);
361     g_assert_cmpstr(words[0], ==, "OK");
362
363     if (expected_args) {
364         for (i = 0; i < expected_args; i++) {
365             g_assert(words[i] != NULL);
366         }
367     } else {
368         g_strfreev(words);
369     }
370
371     return words;
372 }
373
374 static int qtest_query_target_endianness(QTestState *s)
375 {
376     gchar **args;
377     int big_endian;
378
379     qtest_sendf(s, "endianness\n");
380     args = qtest_rsp(s, 1);
381     g_assert(strcmp(args[1], "big") == 0 || strcmp(args[1], "little") == 0);
382     big_endian = strcmp(args[1], "big") == 0;
383     g_strfreev(args);
384
385     return big_endian;
386 }
387
388 typedef struct {
389     JSONMessageParser parser;
390     QDict *response;
391 } QMPResponseParser;
392
393 static void qmp_response(JSONMessageParser *parser, GQueue *tokens)
394 {
395     QMPResponseParser *qmp = container_of(parser, QMPResponseParser, parser);
396     QObject *obj;
397
398     obj = json_parser_parse(tokens, NULL);
399     if (!obj) {
400         fprintf(stderr, "QMP JSON response parsing failed\n");
401         exit(1);
402     }
403
404     g_assert(!qmp->response);
405     qmp->response = qobject_to_qdict(obj);
406     g_assert(qmp->response);
407 }
408
409 QDict *qmp_fd_receive(int fd)
410 {
411     QMPResponseParser qmp;
412     bool log = getenv("QTEST_LOG") != NULL;
413
414     qmp.response = NULL;
415     json_message_parser_init(&qmp.parser, qmp_response);
416     while (!qmp.response) {
417         ssize_t len;
418         char c;
419
420         len = read(fd, &c, 1);
421         if (len == -1 && errno == EINTR) {
422             continue;
423         }
424
425         if (len == -1 || len == 0) {
426             fprintf(stderr, "Broken pipe\n");
427             exit(1);
428         }
429
430         if (log) {
431             len = write(2, &c, 1);
432         }
433         json_message_parser_feed(&qmp.parser, &c, 1);
434     }
435     json_message_parser_destroy(&qmp.parser);
436
437     return qmp.response;
438 }
439
440 QDict *qtest_qmp_receive(QTestState *s)
441 {
442     return qmp_fd_receive(s->qmp_fd);
443 }
444
445 /**
446  * Allow users to send a message without waiting for the reply,
447  * in the case that they choose to discard all replies up until
448  * a particular EVENT is received.
449  */
450 void qmp_fd_sendv(int fd, const char *fmt, va_list ap)
451 {
452     va_list ap_copy;
453     QObject *qobj;
454
455     /* qobject_from_jsonv() silently eats leading 0xff as invalid
456      * JSON, but we want to test sending them over the wire to force
457      * resyncs */
458     if (*fmt == '\377') {
459         socket_send(fd, fmt, 1);
460         fmt++;
461     }
462
463     /* Going through qobject ensures we escape strings properly.
464      * This seemingly unnecessary copy is required in case va_list
465      * is an array type.
466      */
467     va_copy(ap_copy, ap);
468     qobj = qobject_from_jsonv(fmt, &ap_copy, &error_abort);
469     va_end(ap_copy);
470
471     /* No need to send anything for an empty QObject.  */
472     if (qobj) {
473         int log = getenv("QTEST_LOG") != NULL;
474         QString *qstr = qobject_to_json(qobj);
475         const char *str;
476
477         /*
478          * BUG: QMP doesn't react to input until it sees a newline, an
479          * object, or an array.  Work-around: give it a newline.
480          */
481         qstring_append_chr(qstr, '\n');
482         str = qstring_get_str(qstr);
483
484         if (log) {
485             fprintf(stderr, "%s", str);
486         }
487         /* Send QMP request */
488         socket_send(fd, str, qstring_get_length(qstr));
489
490         QDECREF(qstr);
491         qobject_decref(qobj);
492     }
493 }
494
495 void qtest_async_qmpv(QTestState *s, const char *fmt, va_list ap)
496 {
497     qmp_fd_sendv(s->qmp_fd, fmt, ap);
498 }
499
500 QDict *qmp_fdv(int fd, const char *fmt, va_list ap)
501 {
502     qmp_fd_sendv(fd, fmt, ap);
503
504     return qmp_fd_receive(fd);
505 }
506
507 QDict *qtest_qmpv(QTestState *s, const char *fmt, va_list ap)
508 {
509     qtest_async_qmpv(s, fmt, ap);
510
511     /* Receive reply */
512     return qtest_qmp_receive(s);
513 }
514
515 QDict *qmp_fd(int fd, const char *fmt, ...)
516 {
517     va_list ap;
518     QDict *response;
519
520     va_start(ap, fmt);
521     response = qmp_fdv(fd, fmt, ap);
522     va_end(ap);
523     return response;
524 }
525
526 void qmp_fd_send(int fd, const char *fmt, ...)
527 {
528     va_list ap;
529
530     va_start(ap, fmt);
531     qmp_fd_sendv(fd, fmt, ap);
532     va_end(ap);
533 }
534
535 QDict *qtest_qmp(QTestState *s, const char *fmt, ...)
536 {
537     va_list ap;
538     QDict *response;
539
540     va_start(ap, fmt);
541     response = qtest_qmpv(s, fmt, ap);
542     va_end(ap);
543     return response;
544 }
545
546 void qtest_async_qmp(QTestState *s, const char *fmt, ...)
547 {
548     va_list ap;
549
550     va_start(ap, fmt);
551     qtest_async_qmpv(s, fmt, ap);
552     va_end(ap);
553 }
554
555 void qtest_qmpv_discard_response(QTestState *s, const char *fmt, va_list ap)
556 {
557     QDict *response = qtest_qmpv(s, fmt, ap);
558     QDECREF(response);
559 }
560
561 void qtest_qmp_discard_response(QTestState *s, const char *fmt, ...)
562 {
563     va_list ap;
564     QDict *response;
565
566     va_start(ap, fmt);
567     response = qtest_qmpv(s, fmt, ap);
568     va_end(ap);
569     QDECREF(response);
570 }
571
572 QDict *qtest_qmp_eventwait_ref(QTestState *s, const char *event)
573 {
574     QDict *response;
575
576     for (;;) {
577         response = qtest_qmp_receive(s);
578         if ((qdict_haskey(response, "event")) &&
579             (strcmp(qdict_get_str(response, "event"), event) == 0)) {
580             return response;
581         }
582         QDECREF(response);
583     }
584 }
585
586 void qtest_qmp_eventwait(QTestState *s, const char *event)
587 {
588     QDict *response;
589
590     response = qtest_qmp_eventwait_ref(s, event);
591     QDECREF(response);
592 }
593
594 char *qtest_hmpv(QTestState *s, const char *fmt, va_list ap)
595 {
596     char *cmd;
597     QDict *resp;
598     char *ret;
599
600     cmd = g_strdup_vprintf(fmt, ap);
601     resp = qtest_qmp(s, "{'execute': 'human-monitor-command',"
602                      " 'arguments': {'command-line': %s}}",
603                      cmd);
604     ret = g_strdup(qdict_get_try_str(resp, "return"));
605     while (ret == NULL && qdict_get_try_str(resp, "event")) {
606         /* Ignore asynchronous QMP events */
607         QDECREF(resp);
608         resp = qtest_qmp_receive(s);
609         ret = g_strdup(qdict_get_try_str(resp, "return"));
610     }
611     g_assert(ret);
612     QDECREF(resp);
613     g_free(cmd);
614     return ret;
615 }
616
617 char *qtest_hmp(QTestState *s, const char *fmt, ...)
618 {
619     va_list ap;
620     char *ret;
621
622     va_start(ap, fmt);
623     ret = qtest_hmpv(s, fmt, ap);
624     va_end(ap);
625     return ret;
626 }
627
628 const char *qtest_get_arch(void)
629 {
630     const char *qemu = qtest_qemu_binary();
631     const char *end = strrchr(qemu, '/');
632
633     return end + strlen("/qemu-system-");
634 }
635
636 bool qtest_get_irq(QTestState *s, int num)
637 {
638     /* dummy operation in order to make sure irq is up to date */
639     qtest_inb(s, 0);
640
641     return s->irq_level[num];
642 }
643
644 static int64_t qtest_clock_rsp(QTestState *s)
645 {
646     gchar **words;
647     int64_t clock;
648     words = qtest_rsp(s, 2);
649     clock = g_ascii_strtoll(words[1], NULL, 0);
650     g_strfreev(words);
651     return clock;
652 }
653
654 int64_t qtest_clock_step_next(QTestState *s)
655 {
656     qtest_sendf(s, "clock_step\n");
657     return qtest_clock_rsp(s);
658 }
659
660 int64_t qtest_clock_step(QTestState *s, int64_t step)
661 {
662     qtest_sendf(s, "clock_step %"PRIi64"\n", step);
663     return qtest_clock_rsp(s);
664 }
665
666 int64_t qtest_clock_set(QTestState *s, int64_t val)
667 {
668     qtest_sendf(s, "clock_set %"PRIi64"\n", val);
669     return qtest_clock_rsp(s);
670 }
671
672 void qtest_irq_intercept_out(QTestState *s, const char *qom_path)
673 {
674     qtest_sendf(s, "irq_intercept_out %s\n", qom_path);
675     qtest_rsp(s, 0);
676 }
677
678 void qtest_irq_intercept_in(QTestState *s, const char *qom_path)
679 {
680     qtest_sendf(s, "irq_intercept_in %s\n", qom_path);
681     qtest_rsp(s, 0);
682 }
683
684 static void qtest_out(QTestState *s, const char *cmd, uint16_t addr, uint32_t value)
685 {
686     qtest_sendf(s, "%s 0x%x 0x%x\n", cmd, addr, value);
687     qtest_rsp(s, 0);
688 }
689
690 void qtest_outb(QTestState *s, uint16_t addr, uint8_t value)
691 {
692     qtest_out(s, "outb", addr, value);
693 }
694
695 void qtest_outw(QTestState *s, uint16_t addr, uint16_t value)
696 {
697     qtest_out(s, "outw", addr, value);
698 }
699
700 void qtest_outl(QTestState *s, uint16_t addr, uint32_t value)
701 {
702     qtest_out(s, "outl", addr, value);
703 }
704
705 static uint32_t qtest_in(QTestState *s, const char *cmd, uint16_t addr)
706 {
707     gchar **args;
708     uint32_t value;
709
710     qtest_sendf(s, "%s 0x%x\n", cmd, addr);
711     args = qtest_rsp(s, 2);
712     value = strtoul(args[1], NULL, 0);
713     g_strfreev(args);
714
715     return value;
716 }
717
718 uint8_t qtest_inb(QTestState *s, uint16_t addr)
719 {
720     return qtest_in(s, "inb", addr);
721 }
722
723 uint16_t qtest_inw(QTestState *s, uint16_t addr)
724 {
725     return qtest_in(s, "inw", addr);
726 }
727
728 uint32_t qtest_inl(QTestState *s, uint16_t addr)
729 {
730     return qtest_in(s, "inl", addr);
731 }
732
733 static void qtest_write(QTestState *s, const char *cmd, uint64_t addr,
734                         uint64_t value)
735 {
736     qtest_sendf(s, "%s 0x%" PRIx64 " 0x%" PRIx64 "\n", cmd, addr, value);
737     qtest_rsp(s, 0);
738 }
739
740 void qtest_writeb(QTestState *s, uint64_t addr, uint8_t value)
741 {
742     qtest_write(s, "writeb", addr, value);
743 }
744
745 void qtest_writew(QTestState *s, uint64_t addr, uint16_t value)
746 {
747     qtest_write(s, "writew", addr, value);
748 }
749
750 void qtest_writel(QTestState *s, uint64_t addr, uint32_t value)
751 {
752     qtest_write(s, "writel", addr, value);
753 }
754
755 void qtest_writeq(QTestState *s, uint64_t addr, uint64_t value)
756 {
757     qtest_write(s, "writeq", addr, value);
758 }
759
760 static uint64_t qtest_read(QTestState *s, const char *cmd, uint64_t addr)
761 {
762     gchar **args;
763     uint64_t value;
764
765     qtest_sendf(s, "%s 0x%" PRIx64 "\n", cmd, addr);
766     args = qtest_rsp(s, 2);
767     value = strtoull(args[1], NULL, 0);
768     g_strfreev(args);
769
770     return value;
771 }
772
773 uint8_t qtest_readb(QTestState *s, uint64_t addr)
774 {
775     return qtest_read(s, "readb", addr);
776 }
777
778 uint16_t qtest_readw(QTestState *s, uint64_t addr)
779 {
780     return qtest_read(s, "readw", addr);
781 }
782
783 uint32_t qtest_readl(QTestState *s, uint64_t addr)
784 {
785     return qtest_read(s, "readl", addr);
786 }
787
788 uint64_t qtest_readq(QTestState *s, uint64_t addr)
789 {
790     return qtest_read(s, "readq", addr);
791 }
792
793 static int hex2nib(char ch)
794 {
795     if (ch >= '0' && ch <= '9') {
796         return ch - '0';
797     } else if (ch >= 'a' && ch <= 'f') {
798         return 10 + (ch - 'a');
799     } else if (ch >= 'A' && ch <= 'F') {
800         return 10 + (ch - 'a');
801     } else {
802         return -1;
803     }
804 }
805
806 void qtest_memread(QTestState *s, uint64_t addr, void *data, size_t size)
807 {
808     uint8_t *ptr = data;
809     gchar **args;
810     size_t i;
811
812     if (!size) {
813         return;
814     }
815
816     qtest_sendf(s, "read 0x%" PRIx64 " 0x%zx\n", addr, size);
817     args = qtest_rsp(s, 2);
818
819     for (i = 0; i < size; i++) {
820         ptr[i] = hex2nib(args[1][2 + (i * 2)]) << 4;
821         ptr[i] |= hex2nib(args[1][2 + (i * 2) + 1]);
822     }
823
824     g_strfreev(args);
825 }
826
827 uint64_t qtest_rtas_call(QTestState *s, const char *name,
828                          uint32_t nargs, uint64_t args,
829                          uint32_t nret, uint64_t ret)
830 {
831     qtest_sendf(s, "rtas %s %u 0x%"PRIx64" %u 0x%"PRIx64"\n",
832                 name, nargs, args, nret, ret);
833     qtest_rsp(s, 0);
834     return 0;
835 }
836
837 void qtest_add_func(const char *str, void (*fn)(void))
838 {
839     gchar *path = g_strdup_printf("/%s/%s", qtest_get_arch(), str);
840     g_test_add_func(path, fn);
841     g_free(path);
842 }
843
844 void qtest_add_data_func_full(const char *str, void *data,
845                               void (*fn)(const void *),
846                               GDestroyNotify data_free_func)
847 {
848     gchar *path = g_strdup_printf("/%s/%s", qtest_get_arch(), str);
849     g_test_add_data_func_full(path, data, fn, data_free_func);
850     g_free(path);
851 }
852
853 void qtest_add_data_func(const char *str, const void *data,
854                          void (*fn)(const void *))
855 {
856     gchar *path = g_strdup_printf("/%s/%s", qtest_get_arch(), str);
857     g_test_add_data_func(path, data, fn);
858     g_free(path);
859 }
860
861 void qtest_bufwrite(QTestState *s, uint64_t addr, const void *data, size_t size)
862 {
863     gchar *bdata;
864
865     bdata = g_base64_encode(data, size);
866     qtest_sendf(s, "b64write 0x%" PRIx64 " 0x%zx ", addr, size);
867     socket_send(s->fd, bdata, strlen(bdata));
868     socket_send(s->fd, "\n", 1);
869     qtest_rsp(s, 0);
870     g_free(bdata);
871 }
872
873 void qtest_bufread(QTestState *s, uint64_t addr, void *data, size_t size)
874 {
875     gchar **args;
876     size_t len;
877
878     qtest_sendf(s, "b64read 0x%" PRIx64 " 0x%zx\n", addr, size);
879     args = qtest_rsp(s, 2);
880
881     g_base64_decode_inplace(args[1], &len);
882     if (size != len) {
883         fprintf(stderr, "bufread: asked for %zu bytes but decoded %zu\n",
884                 size, len);
885         len = MIN(len, size);
886     }
887
888     memcpy(data, args[1], len);
889     g_strfreev(args);
890 }
891
892 void qtest_memwrite(QTestState *s, uint64_t addr, const void *data, size_t size)
893 {
894     const uint8_t *ptr = data;
895     size_t i;
896     char *enc;
897
898     if (!size) {
899         return;
900     }
901
902     enc = g_malloc(2 * size + 1);
903
904     for (i = 0; i < size; i++) {
905         sprintf(&enc[i * 2], "%02x", ptr[i]);
906     }
907
908     qtest_sendf(s, "write 0x%" PRIx64 " 0x%zx 0x%s\n", addr, size, enc);
909     qtest_rsp(s, 0);
910     g_free(enc);
911 }
912
913 void qtest_memset(QTestState *s, uint64_t addr, uint8_t pattern, size_t size)
914 {
915     qtest_sendf(s, "memset 0x%" PRIx64 " 0x%zx 0x%02x\n", addr, size, pattern);
916     qtest_rsp(s, 0);
917 }
918
919 QDict *qmp(const char *fmt, ...)
920 {
921     va_list ap;
922     QDict *response;
923
924     va_start(ap, fmt);
925     response = qtest_qmpv(global_qtest, fmt, ap);
926     va_end(ap);
927     return response;
928 }
929
930 void qmp_async(const char *fmt, ...)
931 {
932     va_list ap;
933
934     va_start(ap, fmt);
935     qtest_async_qmpv(global_qtest, fmt, ap);
936     va_end(ap);
937 }
938
939 void qmp_discard_response(const char *fmt, ...)
940 {
941     va_list ap;
942
943     va_start(ap, fmt);
944     qtest_qmpv_discard_response(global_qtest, fmt, ap);
945     va_end(ap);
946 }
947 char *hmp(const char *fmt, ...)
948 {
949     va_list ap;
950     char *ret;
951
952     va_start(ap, fmt);
953     ret = qtest_hmpv(global_qtest, fmt, ap);
954     va_end(ap);
955     return ret;
956 }
957
958 bool qtest_big_endian(QTestState *s)
959 {
960     return s->big_endian;
961 }
962
963 void qtest_cb_for_every_machine(void (*cb)(const char *machine))
964 {
965     QDict *response, *minfo;
966     QList *list;
967     const QListEntry *p;
968     QObject *qobj;
969     QString *qstr;
970     const char *mname;
971
972     qtest_start("-machine none");
973     response = qmp("{ 'execute': 'query-machines' }");
974     g_assert(response);
975     list = qdict_get_qlist(response, "return");
976     g_assert(list);
977
978     for (p = qlist_first(list); p; p = qlist_next(p)) {
979         minfo = qobject_to_qdict(qlist_entry_obj(p));
980         g_assert(minfo);
981         qobj = qdict_get(minfo, "name");
982         g_assert(qobj);
983         qstr = qobject_to_qstring(qobj);
984         g_assert(qstr);
985         mname = qstring_get_str(qstr);
986         cb(mname);
987     }
988
989     qtest_end();
990     QDECREF(response);
991 }
992
993 /*
994  * Generic hot-plugging test via the device_add QMP command.
995  */
996 void qtest_qmp_device_add(const char *driver, const char *id, const char *fmt,
997                           ...)
998 {
999     QDict *response;
1000     char *cmd, *opts = NULL;
1001     va_list va;
1002
1003     if (fmt) {
1004         va_start(va, fmt);
1005         opts = g_strdup_vprintf(fmt, va);
1006         va_end(va);
1007     }
1008
1009     cmd = g_strdup_printf("{'execute': 'device_add',"
1010                           " 'arguments': { 'driver': '%s', 'id': '%s'%s%s }}",
1011                           driver, id, opts ? ", " : "", opts ? opts : "");
1012     g_free(opts);
1013
1014     response = qmp(cmd);
1015     g_free(cmd);
1016     g_assert(response);
1017     g_assert(!qdict_haskey(response, "event")); /* We don't expect any events */
1018     g_assert(!qdict_haskey(response, "error"));
1019     QDECREF(response);
1020 }
1021
1022 /*
1023  * Generic hot-unplugging test via the device_del QMP command.
1024  * Device deletion will get one response and one event. For example:
1025  *
1026  * {'execute': 'device_del','arguments': { 'id': 'scsi-hd'}}
1027  *
1028  * will get this one:
1029  *
1030  * {"timestamp": {"seconds": 1505289667, "microseconds": 569862},
1031  *  "event": "DEVICE_DELETED", "data": {"device": "scsi-hd",
1032  *  "path": "/machine/peripheral/scsi-hd"}}
1033  *
1034  * and this one:
1035  *
1036  * {"return": {}}
1037  *
1038  * But the order of arrival may vary - so we've got to detect both.
1039  */
1040 void qtest_qmp_device_del(const char *id)
1041 {
1042     QDict *response1, *response2, *event = NULL;
1043     char *cmd;
1044
1045     cmd = g_strdup_printf("{'execute': 'device_del',"
1046                           " 'arguments': { 'id': '%s' }}", id);
1047     response1 = qmp(cmd);
1048     g_free(cmd);
1049     g_assert(response1);
1050     g_assert(!qdict_haskey(response1, "error"));
1051
1052     response2 = qmp("");
1053     g_assert(response2);
1054     g_assert(!qdict_haskey(response2, "error"));
1055
1056     if (qdict_haskey(response1, "event")) {
1057         event = response1;
1058     } else if (qdict_haskey(response2, "event")) {
1059         event = response2;
1060     }
1061     g_assert(event);
1062     g_assert_cmpstr(qdict_get_str(event, "event"), ==, "DEVICE_DELETED");
1063
1064     QDECREF(response1);
1065     QDECREF(response2);
1066 }
This page took 0.080987 seconds and 4 git commands to generate.