1 package qapi
2
3 import (
4 "encoding/json"
5 "strings"
6 "testing"
7 )
8
9 func TestCommands(t *testing.T) {
10 tests := []struct {
11 name string
12 input string
13 ret string
14 }{
15 {
16 name: `query-status`,
17 input: `{"execute":"query-status"}`,
18 ret: `{"return":{"running":true,"singlestep":false,"status":"running"}}`,
19 },
20 {
21 name: `set-action`,
22 input: `{"execute":"set-action",` +
23 `"arguments":{"reboot":"shutdown","shutdown":"pause","panic":"pause","watchdog":"inject-nmi"}}`,
24 ret: `{"return":{}}`,
25 },
26 {
27 name: `eject`,
28 input: `{"execute":"eject","arguments":{"id":"ide1-0-1"}}`,
29 ret: `{"return":{}}`,
30 },
31 {
32 name: `blockdev-open-tray`,
33 input: `{"execute":"blockdev-open-tray","arguments":{"id":"ide0-1-0"}}`,
34 ret: `{"return":{}}`,
35 },
36 {
37 name: `blockdev-close-tray`,
38 input: `{"execute":"blockdev-close-tray","arguments":{"id":"ide0-1-0"}}`,
39 ret: `{"return":{}}`,
40 },
41 {
42 name: `blockdev-remove-medium`,
43 input: `{"execute":"blockdev-remove-medium","arguments":{"id":"ide0-1-0"}}`,
44 ret: `{"return":{}}`,
45 },
46 {
47 name: `blockdev-insert-medium`,
48 input: `{"execute":"blockdev-insert-medium",` +
49 `"arguments":{"id":"ide0-1-0","node-name":"node0"}}`,
50 ret: `{"return":{}}`,
51 },
52 {
53 name: `blockdev-change-medium`,
54 input: `{"execute":"blockdev-change-medium",` +
55 `"arguments":{"id":"ide0-1-0","filename":"/srv/images/Fedora-12-x86_64-DVD.iso","format":"raw"}}`,
56 ret: `{"return":{}}`,
57 },
58 {
59 name: `blockdev-change-medium`,
60 input: `{"execute":"blockdev-change-medium",` +
61 `"arguments":{"id":"floppyA","filename":"/srv/images/ro.img","format":"raw","read-only-mode":"retain"}}`,
62 ret: `{"return":{}}`,
63 },
64 {
65 name: `blockdev-change-medium`,
66 input: `{"execute":"blockdev-change-medium",` +
67 `"arguments":{"id":"floppyA","filename":"/srv/images/ro.img","format":"raw","read-only-mode":"read-only"}}`,
68 ret: `{"return":{}}`,
69 },
70 {
71 name: `block_set_io_throttle`,
72 input: `{"execute":"block_set_io_throttle",` +
73 `"arguments":{"id":"virtio-blk-pci0/virtio-backend","bps":0,"bps_rd":0,"bps_wr":0,` +
74 `"iops":512,"iops_rd":0,"iops_wr":0,"bps_max":0,"bps_rd_max":0,"bps_wr_max":0,` +
75 `"iops_max":0,"iops_rd_max":0,"iops_wr_max":0,"bps_max_length":0,"iops_size":0}}`,
76 ret: `{"return":{}}`,
77 },
78 {
79 name: `block_set_io_throttle`,
80 input: `{"execute":"block_set_io_throttle",` +
81 `"arguments":{"id":"ide0-1-0","bps":1000000,"bps_rd":0,"bps_wr":0,"iops":0,"iops_rd":0,` +
82 `"iops_wr":0,"bps_max":8000000,"bps_rd_max":0,"bps_wr_max":0,"iops_max":0,` +
83 `"iops_rd_max":0,"iops_wr_max":0,"bps_max_length":60,"iops_size":0}}`,
84 ret: `{"return":{}}`,
85 },
86 {
87 name: `block-latency-histogram-set`,
88 input: `{"execute":"block-latency-histogram-set",` +
89 `"arguments":{"id":"drive0","boundaries":[10,50,100]}}`,
90 ret: `{"return":{}}`,
91 },
92 {
93 name: `block-latency-histogram-set`,
94 input: `{"execute":"block-latency-histogram-set",` +
95 `"arguments":{"id":"drive0","boundaries-write":[10,50,100]}}`,
96 ret: `{"return":{}}`,
97 },
98 {
99 name: `block-latency-histogram-set`,
100 input: `{"execute":"block-latency-histogram-set",` +
101 `"arguments":{"id":"drive0","boundaries":[10,50,100],"boundaries-write":[10,50,100]}}`,
102 ret: `{"return":{}}`,
103 },
104 {
105 name: `block-latency-histogram-set`,
106 input: `{"execute":"block-latency-histogram-set",` +
107 `"arguments":{"id":"drive0"}}`,
108 ret: `{"return":{}}`,
109 },
110
160 {
161 name: `block_resize`,
162 input: `{"execute":"block_resize",` +
163 `"arguments":{"device":"scratch","size":1073741824}}`,
164 ret: `{"return":{}}`,
165 },
166 {
167 name: `blockdev-snapshot-sync`,
168 input: `{"execute":"blockdev-snapshot-sync",` +
169 `"arguments":{"device":"ide-hd0","snapshot-file":"/some/place/my-image","format":"qcow2"}}`,
170 ret: `{"return":{}}`,
171 },
172 {
173 name: `blockdev-snapshot`,
174 input: `{"execute":"blockdev-snapshot",` +
175 `"arguments":{"node":"ide-hd0","overlay":"node1534"}}`,
176 ret: `{"return":{}}`,
177 },
178 {
179 name: `block-commit`,
180 input: `{"execute":"block-commit",` +
181 `"arguments":{"device":"virtio0","top":"/tmp/snap1.qcow2"}}`,
182 ret: `{"return":{}}`,
183 },
184 {
185 name: `drive-backup`,
186 input: `{"execute":"drive-backup",` +
187 `"arguments":{"device":"drive0","sync":"full","target":"backup.img"}}`,
188 ret: `{"return":{}}`,
189 },
190 {
191 name: `blockdev-backup`,
192 input: `{"execute":"blockdev-backup",` +
193 `"arguments":{"device":"src-id","sync":"full","target":"tgt-id"}}`,
194 ret: `{"return":{}}`,
195 },
196
215 {
216 name: `drive-mirror`,
217 input: `{"execute":"drive-mirror",` +
218 `"arguments":{"device":"ide-hd0","target":"/some/place/my-image","format":"qcow2","sync":"full"}}`,
219 ret: `{"return":{}}`,
220 },
221 {
222 name: `block-dirty-bitmap-add`,
223 input: `{"execute":"block-dirty-bitmap-add",` +
224 `"arguments":{"node":"drive0","name":"bitmap0"}}`,
225 ret: `{"return":{}}`,
226 },
227 {
228 name: `block-dirty-bitmap-remove`,
229 input: `{"execute":"block-dirty-bitmap-remove",` +
230 `"arguments":{"node":"drive0","name":"bitmap0"}}`,
231 ret: `{"return":{}}`,
232 },
233 {
234 name: `block-dirty-bitmap-clear`,
235 input: `{"execute":"block-dirty-bitmap-clear",` +
236 `"arguments":{"node":"drive0","name":"bitmap0"}}`,
237 ret: `{"return":{}}`,
238 },
239 {
240 name: `block-dirty-bitmap-enable`,
241 input: `{"execute":"block-dirty-bitmap-enable",` +
242 `"arguments":{"node":"drive0","name":"bitmap0"}}`,
243 ret: `{"return":{}}`,
244 },
245 {
246 name: `block-dirty-bitmap-disable`,
247 input: `{"execute":"block-dirty-bitmap-disable",` +
248 `"arguments":{"node":"drive0","name":"bitmap0"}}`,
249 ret: `{"return":{}}`,
250 },
251 {
252 name: `block-dirty-bitmap-merge`,
253 input: `{"execute":"block-dirty-bitmap-merge",` +
254 `"arguments":{"node":"drive0","target":"bitmap0","bitmaps":["bitmap1"]}}`,
255 ret: `{"return":{}}`,
256 },
257 {
258 name: `blockdev-mirror`,
259 input: `{"execute":"blockdev-mirror",` +
260 `"arguments":{"device":"ide-hd0","target":"target0","sync":"full"}}`,
261 ret: `{"return":{}}`,
262 },
263 {
264 name: `block-stream`,
265 input: `{"execute":"block-stream",` +
266 `"arguments":{"device":"virtio0","base":"/tmp/master.qcow2"}}`,
267 ret: `{"return":{}}`,
268 },
269 {
270 name: `blockdev-add`,
271 input: `{"execute":"blockdev-add",` +
272 `"arguments":{"driver":"qcow2","node-name":"test1",` +
273 `"file":{"driver":"file","filename":"test.qcow2"}}}`,
274 ret: `{"return":{}}`,
275 },
276 {
277 name: `blockdev-add`,
278 input: `{"execute":"blockdev-add",` +
279 `"arguments":{"driver":"qcow2","node-name":"node0","discard":"unmap",` +
280 `"cache":{"direct":true},"file":{"driver":"file","filename":"/tmp/test.qcow2"},` +
281 `"backing":{"driver":"raw","file":{"driver":"file","filename":"/dev/fdset/4"}}}}`,
282 ret: `{"return":{}}`,
283 },
284 {
285 name: `blockdev-del`,
286 input: `{"execute":"blockdev-del",` +
287 `"arguments":{"node-name":"node0"}}`,
288 ret: `{"return":{}}`,
289 },
290 {
291 name: `block-set-write-threshold`,
292 input: `{"execute":"block-set-write-threshold",` +
293 `"arguments":{"node-name":"mydev","write-threshold":17179869184}}`,
294 ret: `{"return":{}}`,
295 },
296 {
297 name: `x-blockdev-change`,
298 input: `{"execute":"x-blockdev-change",` +
299 `"arguments":{"parent":"disk1","node":"new_node"}}`,
300 ret: `{"return":{}}`,
301 },
302 {
303 name: `x-blockdev-change`,
304 input: `{"execute":"x-blockdev-change",` +
305 `"arguments":{"parent":"disk1","child":"children.1"}}`,
306 ret: `{"return":{}}`,
307 },
308 {
309 name: `x-blockdev-set-iothread`,
310 input: `{"execute":"x-blockdev-set-iothread",` +
311 `"arguments":{"node-name":"disk1","iothread":"iothread0"}}`,
312 ret: `{"return":{}}`,
313 },
314 {
315 name: `x-blockdev-set-iothread`,
316 input: `{"execute":"x-blockdev-set-iothread",` +
317 `"arguments":{"node-name":"disk1","iothread":null}}`,
318 ret: `{"return":{}}`,
319 },
320 {
321 name: `blockdev-snapshot-delete-internal-sync`,
322 input: `{"execute":"blockdev-snapshot-delete-internal-sync",` +
323 `"arguments":{"device":"ide-hd0","name":"snapshot0"}}`,
324 ret: `{"return":{"id":"1","name":"snapshot0","vm-state-size":0,` +
325 `"date-sec":1000012,"date-nsec":10,"vm-clock-sec":100,` +
326 `"vm-clock-nsec":20,"icount":220414}}`,
327 },
328 {
329 name: `query-chardev`,
330 input: `{"execute":"query-chardev"}`,
331 ret: `{"return":[{"label":"charchannel0",` +
332 `"filename":"unix:/var/lib/libvirt/qemu/seabios.rhel6.agent,server=on",` +
333 `"frontend-open":false},` +
334 `{"label":"charmonitor",` +
335 `"filename":"unix:/var/lib/libvirt/qemu/seabios.rhel6.monitor,server=on",` +
336 `"frontend-open":true},` +
337 `{"label":"charserial0","filename":"pty:/dev/pts/2","frontend-open":true}]}`,
338 },
339 {
340 name: `query-chardev-backends`,
341 input: `{"execute":"query-chardev-backends"}`,
342 ret: `{"return":[{"name":"udp"},{"name":"tcp"},{"name":"unix"},{"name":"spiceport"}]}`,
343 },
344 {
345 name: `ringbuf-write`,
346 input: `{"execute":"ringbuf-write",` +
347 `"arguments":{"device":"foo","data":"abcdefgh","format":"utf8"}}`,
348 ret: `{"return":{}}`,
349 },
350 {
351 name: `ringbuf-read`,
352 input: `{"execute":"ringbuf-read","arguments":{"device":"foo","size":1000,"format":"utf8"}}`,
353 ret: `{"return":"abcdefgh"}`,
354 },
355 {
356 name: `chardev-add`,
357 input: `{"execute":"chardev-add",` +
358 `"arguments":{"id":"foo","backend":{"type":"null","data":{}}}}`,
359 ret: `{"return":{}}`,
360 },
361 {
362 name: `chardev-add`,
363 input: `{"execute":"chardev-add",` +
364 `"arguments":{"id":"bar","backend":{"type":"file","data":{"out":"/tmp/bar.log"}}}}`,
365 ret: `{"return":{}}`,
366 },
367 {
368 name: `chardev-add`,
369 input: `{"execute":"chardev-add",` +
370 `"arguments":{"id":"baz","backend":{"type":"pty","data":{}}}}`,
371 ret: `{"return":{"pty":"/dev/pty/42"}}`,
372 },
373 {
374 name: `chardev-change`,
375 input: `{"execute":"chardev-change",` +
376 `"arguments":{"id":"baz","backend":{"type":"pty","data":{}}}}`,
377 ret: `{"return":{"pty":"/dev/pty/42"}}`,
378 },
379 {
380 name: `chardev-change`,
381 input: `{"execute":"chardev-change",` +
382 `"arguments":{"id":"charchannel2",` +
383 `"backend":{"type":"socket",` +
384 `"data":{` +
385 `"addr":{"type":"unix",` +
386 `"data":{"path":"/tmp/charchannel2.socket"}},` +
387 `"server":true,` +
388 `"wait":false}}}}`,
389 ret: `{"return":{}}`,
390 },
391 {
392 name: `chardev-remove`,
393 input: `{"execute":"chardev-remove",` +
394 `"arguments":{"id":"foo"}}`,
395 ret: `{"return":{}}`,
396 },
397 {
398 name: `chardev-send-break`,
399 input: `{"execute":"chardev-send-break",` +
400 `"arguments":{"id":"foo"}}`,
401 ret: `{"return":{}}`,
402 },
403 {
404 name: `dump-guest-memory`,
405 input: `{"execute":"dump-guest-memory",` +
406 `"arguments":{"paging":false,"protocol":"fd:dump"}}`,
407 ret: `{"return":{}}`,
408 },
409 {
410 name: `query-dump`,
411 input: `{"execute":"query-dump"}`,
412 ret: `{"return":{"status":"active","completed":1024000,"total":2048000}}`,
413 },
414 {
415 name: `query-dump-guest-memory-capability`,
416 input: `{"execute":"query-dump-guest-memory-capability"}`,
417 ret: `{"return":{"formats":["elf","kdump-zlib","kdump-lzo","kdump-snappy"]}}`,
418 },
419 {
420 name: `set_link`,
421 input: `{"execute":"set_link",` +
422 `"arguments":{"name":"e1000.0","up":false}}`,
423 ret: `{"return":{}}`,
424 },
425 {
426 name: `netdev_add`,
427 input: `{"execute":"netdev_add",` +
428 `"arguments":{"id":"netdev1","type":"user","dnssearch":["example.org"]}}`,
429 ret: `{"return":{}}`,
430 },
431 {
432 name: `netdev_del`,
433 input: `{"execute":"netdev_del",` +
434 `"arguments":{"id":"netdev1"}}`,
435 ret: `{"return":{}}`,
436 },
437 {
438 name: `query-rx-filter`,
439 input: `{"execute":"query-rx-filter",` +
440 `"arguments":{"name":"vnet0"}}`,
441 ret: `{"return":[{"name":"vnet0","promiscuous":true,"multicast":"normal","unicast":"normal",` +
442 `"vlan":"normal","broadcast-allowed":false,"multicast-overflow":false,"unicast-overflow":false,` +
443 `"main-mac":"52:54:00:12:34:56","vlan-table":[4,0],"unicast-table":[],` +
444 `"multicast-table":["01:00:5e:00:00:01","33:33:00:00:00:01","33:33:ff:12:34:56"]}]}`,
445 },
446 {
447 name: `announce-self`,
448 input: `{"execute":"announce-self",` +
449 `"arguments":{"initial":50,"max":550,"rounds":10,"step":50,"interfaces":["vn2","vn3"],"id":"bob"}}`,
450 ret: `{"return":{}}`,
451 },
452 {
453 name: `query-rocker`,
454 input: `{"execute":"query-rocker","arguments":{"name":"sw1"}}`,
455 ret: `{"return":{"name":"sw1","id":1327446905938,"ports":2}}`,
456 },
457 {
458 name: `query-rocker-ports`,
459 input: `{"execute":"query-rocker-ports","arguments":{"name":"sw1"}}`,
460 ret: `{"return":[{"name":"sw1.1","enabled":true,"link-up":true,"speed":10000,` +
461 `"duplex":"full","autoneg":"off"},` +
462 `{"name":"sw1.2","enabled":true,"link-up":true,"speed":10000,` +
463 `"duplex":"full","autoneg":"off"}]}`,
464 },
465 {
466 name: `query-rocker-of-dpa-flows`,
467 input: `{"execute":"query-rocker-of-dpa-flows",` +
468 `"arguments":{"name":"sw1"}}`,
469 ret: `{"return":[{"cookie":0,"hits":138,"key":{"priority":1,"tbl-id":0,"in-pport":0},` +
470 `"mask":{"in-pport":4294901760},"action":{"goto-tbl":10}}]}`,
471 },
472 {
473 name: `query-rocker-of-dpa-groups`,
474 input: `{"execute":"query-rocker-of-dpa-groups",` +
475 `"arguments":{"name":"sw1"}}`,
476 ret: `{"return":[{"id":251723778,"type":0,"vlan-id":3841,"pport":2,"out-pport":2,"pop-vlan":1},` +
477 `{"id":251723776,"type":0,"vlan-id":3841,"pport":0,"out-pport":0,"pop-vlan":1},` +
478 `{"id":251658241,"type":0,"vlan-id":3840,"pport":1,"out-pport":1,"pop-vlan":1},` +
479 `{"id":251658240,"type":0,"vlan-id":3840,"pport":0,"out-pport":0,"pop-vlan":1}]}`,
480 },
481 {
482 name: `query-tpm-models`,
483 input: `{"execute":"query-tpm-models"}`,
484 ret: `{"return":["tpm-tis","tpm-crb","tpm-spapr"]}`,
485 },
486 {
487 name: `query-tpm-types`,
488 input: `{"execute":"query-tpm-types"}`,
489 ret: `{"return":["passthrough","emulator"]}`,
490 },
491 {
492 name: `query-tpm`,
493 input: `{"execute":"query-tpm"}`,
494 ret: `{"return":[{"id":"tpm0","model":"tpm-tis","options":{"type":"passthrough","data":` +
495 `{"path":"/dev/tpm0","cancel-path":"/sys/class/misc/tpm0/device/cancel"}}}]}`,
496 },
497 {
498 name: `set_password`,
499 input: `{"execute":"set_password","arguments":{"protocol":"vnc","password":"secret"}}`,
500 ret: `{"return":{}}`,
501 },
502 {
503 name: `expire_password`,
504 input: `{"execute":"expire_password","arguments":{"protocol":"vnc","time":"+60"}}`,
505 ret: `{"return":{}}`,
506 },
507 {
508 name: `screendump`,
509 input: `{"execute":"screendump","arguments":{"filename":"/tmp/image"}}`,
510 ret: `{"return":{}}`,
511 },
512 {
513 name: `query-spice`,
514 input: `{"execute":"query-spice"}`,
515 ret: `{"return":{"enabled":true,"migrated":false,"host":"0.0.0.0","port":5920,"tls-port":5921,"auth":"spice",` +
516 `"mouse-mode":"client","channels":[` +
517 `{"host":"127.0.0.1","port":"54924","family":"ipv4","connection-id":1804289383,"channel-type":1,"channel-id":0,"tls":true},` +
518 `{"host":"127.0.0.1","port":"36710","family":"ipv4","connection-id":1804289383,"channel-type":4,"channel-id":0,"tls":false}]}}`,
519 },
520 {
521 name: `query-vnc`,
522 input: `{"execute":"query-vnc"}`,
523 ret: `{"return":{"enabled":true,"host":"0.0.0.0","family":"ipv4","service":"50402","auth":"vnc",` +
524 `"clients":[{"host":"127.0.0.1","service":"50401","family":"ipv4","websocket":false}]}}`,
525 },
526 {
527 name: `query-mice`,
528 input: `{"execute":"query-mice"}`,
529 ret: `{"return":[{"name":"QEMUMicrosoftMouse","index":0,"current":false,"absolute":false},` +
530 `{"name":"QEMUPS/2Mouse","index":1,"current":true,"absolute":true}]}`,
531 },
532 {
533 name: `send-key`,
534 input: `{"execute":"send-key",` +
535 `"arguments":{"keys":[{"type":"qcode","data":"ctrl"},` +
536 `{"type":"qcode","data":"alt"},` +
537 `{"type":"qcode","data":"delete"}]}}`,
538 ret: `{"return":{}}`,
539 },
540 {
541 name: `input-send-event`,
542 input: `{"execute":"input-send-event",` +
543 `"arguments":{"device":"video0",` +
544 `"events":[{"type":"btn",` +
545 `"data":{"button":"left","down":true}}]}}`,
546 ret: `{"return":{}}`,
547 },
548 {
549 name: `input-send-event`,
550 input: `{"execute":"input-send-event",` +
551 `"arguments":{"events":[` +
552 `{"type":"key","data":{"key":{"type":"qcode","data":"ctrl"},"down":true}},` +
553 `{"type":"key","data":{"key":{"type":"qcode","data":"alt"},"down":true}},` +
554 `{"type":"key","data":{"key":{"type":"qcode","data":"delete"},"down":true}}]}}`,
555 ret: `{"return":{}}`,
556 },
557 {
558 name: `input-send-event`,
559 input: `{"execute":"input-send-event",` +
560 `"arguments":{"events":[` +
561 `{"type":"abs","data":{"axis":"x","value":20000}},` +
562 `{"type":"abs","data":{"axis":"y","value":400}}]}}`,
563 ret: `{"return":{}}`,
564 },
565 {
566 name: `display-reload`,
567 input: `{"execute":"display-reload","arguments":{"type":"vnc","tls-certs":true}}`,
568 ret: `{"return":{}}`,
569 },
570 {
571 name: `query-migrate`,
572 input: `{"execute":"query-migrate"}`,
573 ret: `{"return":{}}`,
574 },
575 {
576 name: `query-migrate`,
577 input: `{"execute":"query-migrate"}`,
578 ret: `{"return":{"status":"completed","ram":{"transferred":123,"remaining":123,"total":246,"duplicate":123,` +
579 `"skipped":0,"normal":123,"normal-bytes":123456,"dirty-pages-rate":0,"mbps":0,"dirty-sync-count":15,` +
580 `"postcopy-requests":0,"page-size":0,"multifd-bytes":0,"pages-per-second":0,"precopy-bytes":0,` +
581 `"downtime-bytes":0,"postcopy-bytes":0},` +
582 `"total-time":12345,"downtime":12345,"setup-time":12345}}`,
583 },
584 {
585 name: `query-migrate`,
586 input: `{"execute":"query-migrate"}`,
587 ret: `{"return":{"status":"failed"}}`,
588 },
589 {
590 name: `query-migrate`,
591 input: `{"execute":"query-migrate"}`,
592 ret: `{"return":{"status":"active","ram":{"transferred":3720,"remaining":1053304,"total":1057024,"duplicate":123,` +
593 `"skipped":0,"normal":123,"normal-bytes":123456,"dirty-pages-rate":0,"mbps":0,"dirty-sync-count":15,` +
594 `"postcopy-requests":0,"page-size":0,"multifd-bytes":0,"pages-per-second":0,"precopy-bytes":0,"downtime-bytes":0,"postcopy-bytes":0},` +
595 `"disk":{"transferred":91136,"remaining":20880384,"total":20971520,"duplicate":0,"skipped":0,"normal":0,"normal-bytes":0,` +
596 `"dirty-pages-rate":0,"mbps":0,"dirty-sync-count":0,"postcopy-requests":0,"page-size":0,"multifd-bytes":0,"pages-per-second":0,` +
597 `"precopy-bytes":0,"downtime-bytes":0,"postcopy-bytes":0},"total-time":12345,"expected-downtime":12345,"setup-time":12345}}`,
598 },
599 {
600 name: `query-migrate`,
601 input: `{"execute":"query-migrate"}`,
602 ret: `{"return":{"status":"active","ram":{"transferred":3720,"remaining":1053304,"total":1057024,"duplicate":10,` +
603 `"skipped":0,"normal":3333,"normal-bytes":3412992,"dirty-pages-rate":0,"mbps":0,"dirty-sync-count":15,` +
604 `"postcopy-requests":0,"page-size":0,"multifd-bytes":0,"pages-per-second":0,"precopy-bytes":0,"downtime-bytes":0,"postcopy-bytes":0},` +
605 `"xbzrle-cache":{"cache-size":67108864,"bytes":20971520,"pages":2444343,"cache-miss":2244,"cache-miss-rate":0.123,"encoding-rate":80.1,"overflow":34434},` +
606 `"total-time":12345,"expected-downtime":12345,"setup-time":12345}}`,
607 },
608 {
609 name: `migrate-set-capabilities`,
610 input: `{"execute":"migrate-set-capabilities",` +
611 `"arguments":{"capabilities":[{"capability":"xbzrle","state":true}]}}`,
612 ret: `{"return":{}}`,
613 },
614 {
615 name: `query-migrate-capabilities`,
616 input: `{"execute":"query-migrate-capabilities"}`,
617 ret: `{"return":[{"capability":"xbzrle","state":false},{"capability":"rdma-pin-all","state":false},` +
618 `{"capability":"auto-converge","state":false},{"capability":"zero-blocks","state":false},` +
619 `{"capability":"compress","state":false},{"capability":"events","state":true},` +
620 `{"capability":"postcopy-ram","state":false},{"capability":"x-colo","state":false}]}`,
621 },
622 {
623 name: `migrate-set-parameters`,
624 input: `{"execute":"migrate-set-parameters","arguments":{"compress-level":1}}`,
625 ret: `{"return":{}}`,
626 },
627 {
628 name: `query-migrate-parameters`,
629 input: `{"execute":"query-migrate-parameters"}`,
630 ret: `{"return":{"compress-level":1,"compress-threads":8,"decompress-threads":2,"cpu-throttle-initial":20,` +
631 `"cpu-throttle-increment":10,"max-bandwidth":33554432,"downtime-limit":300}}`,
632 },
633 {
634 name: `client_migrate_info`,
635 input: `{"execute":"client_migrate_info",` +
636 `"arguments":{"protocol":"spice","hostname":"virt42.lab.kraxel.org","port":1234}}`,
637 ret: `{"return":{}}`,
638 },
639 {
640 name: `migrate-start-postcopy`,
641 input: `{"execute":"migrate-start-postcopy"}`,
642 ret: `{"return":{}}`,
643 },
644 {
645 name: `x-colo-lost-heartbeat`,
646 input: `{"execute":"x-colo-lost-heartbeat"}`,
647 ret: `{"return":{}}`,
648 },
649 {
650 name: `migrate_cancel`,
651 input: `{"execute":"migrate_cancel"}`,
652 ret: `{"return":{}}`,
653 },
654 {
655 name: `migrate-continue`,
656 input: `{"execute":"migrate-continue","arguments":{"state":"pre-switchover"}}`,
657 ret: `{"return":{}}`,
658 },
659 {
660 name: `migrate`,
661 input: `{"execute":"migrate",` +
662 `"arguments":{"uri":"tcp:0:4446"}}`,
663 ret: `{"return":{}}`,
664 },
665 {
666 name: `migrate-incoming`,
667 input: `{"execute":"migrate-incoming",` +
668 `"arguments":{"uri":"tcp:0:4446"}}`,
669 ret: `{"return":{}}`,
670 },
671 {
672 name: `xen-save-devices-state`,
673 input: `{"execute":"xen-save-devices-state",` +
674 `"arguments":{"filename":"/tmp/save"}}`,
675 ret: `{"return":{}}`,
676 },
677 {
678 name: `xen-set-global-dirty-log`,
679 input: `{"execute":"xen-set-global-dirty-log",` +
680 `"arguments":{"enable":true}}`,
681 ret: `{"return":{}}`,
682 },
683 {
684 name: `xen-load-devices-state`,
685 input: `{"execute":"xen-load-devices-state",` +
686 `"arguments":{"filename":"/tmp/resume"}}`,
687 ret: `{"return":{}}`,
688 },
689 {
690 name: `xen-set-replication`,
691 input: `{"execute":"xen-set-replication",` +
692 `"arguments":{"enable":true,"primary":false}}`,
693 ret: `{"return":{}}`,
694 },
695 {
696 name: `query-xen-replication-status`,
697 input: `{"execute":"query-xen-replication-status"}`,
698 ret: `{"return":{"error":false}}`,
699 },
700 {
701 name: `xen-colo-do-checkpoint`,
702 input: `{"execute":"xen-colo-do-checkpoint"}`,
703 ret: `{"return":{}}`,
704 },
705 {
706 name: `query-colo-status`,
707 input: `{"execute":"query-colo-status"}`,
708 ret: `{"return":{"mode":"primary","last-mode":"none","reason":"request"}}`,
709 },
710 {
711 name: `migrate-recover`,
712 input: `{"execute":"migrate-recover",` +
713 `"arguments":{"uri":"tcp:192.168.1.200:12345"}}`,
714 ret: `{"return":{}}`,
715 },
716 {
717 name: `migrate-pause`,
718 input: `{"execute":"migrate-pause"}`,
719 ret: `{"return":{}}`,
720 },
721 {
722 name: `calc-dirty-rate`,
723 input: `{"execute":"calc-dirty-rate",` +
724 `"arguments":{"calc-time":1,"sample-pages":512}}`,
725 ret: `{"return":{}}`,
726 },
727 {
728 name: `snapshot-save`,
729 input: `{"execute":"snapshot-save",` +
730 `"arguments":{"job-id":"snapsave0","tag":"my-snap","vmstate":"disk0","devices":["disk0","disk1"]}}`,
731 ret: `{"return":{}}`,
732 },
733 {
734 name: `snapshot-load`,
735 input: `{"execute":"snapshot-load",` +
736 `"arguments":{"job-id":"snapload0","tag":"my-snap","vmstate":"disk0","devices":["disk0","disk1"]}}`,
737 ret: `{"return":{}}`,
738 },
739 {
740 name: `snapshot-delete`,
741 input: `{"execute":"snapshot-delete",` +
742 `"arguments":{"job-id":"snapdelete0","tag":"my-snap","devices":["disk0","disk1"]}}`,
743 ret: `{"return":{}}`,
744 },
745 {
746 name: `transaction`,
747 input: `{"execute":"transaction",` +
748 `"arguments":{"actions":[` +
749 `{"type":"blockdev-snapshot-sync","data":{"device":"ide-hd0",` +
750 `"snapshot-file":"/some/place/my-image",` +
751 `"format":"qcow2"}},` +
752 `{"type":"blockdev-snapshot-sync","data":{"node-name":"myfile",` +
753 `"snapshot-file":"/some/place/my-image2",` +
754 `"snapshot-node-name":"node3432",` +
755 `"format":"qcow2",` +
756 `"mode":"existing"}},` +
757 `{"type":"blockdev-snapshot-sync","data":{"device":"ide-hd1",` +
758 `"snapshot-file":"/some/place/my-image2",` +
759 `"format":"qcow2",` +
760 `"mode":"existing"}},` +
761 `{"type":"blockdev-snapshot-internal-sync","data":{` +
762 `"device":"ide-hd2",` +
763 `"name":"snapshot0"}}]}}`,
764 ret: `{"return":{}}`,
765 },
766 {
767 name: `trace-event-get-state`,
768 input: `{"execute":"trace-event-get-state","arguments":{"name":"qemu_memalign"}}`,
769 ret: `{"return":[{"name":"qemu_memalign","state":"disabled","vcpu":false}]}`,
770 },
771 {
772 name: `trace-event-set-state`,
773 input: `{"execute":"trace-event-set-state","arguments":{"name":"qemu_memalign","enable":true}}`,
774 ret: `{"return":{}}`,
775 },
776 {
777 name: `qmp_capabilities`,
778 input: `{"execute":"qmp_capabilities","arguments":{"enable":["oob"]}}`,
779 ret: `{"return":{}}`,
780 },
781 {
782 name: `query-version`,
783 input: `{"execute":"query-version"}`,
784 ret: `{"return":{"qemu":{"major":0,"minor":11,"micro":5},"package":""}}`,
785 },
786 {
787 name: `query-commands`,
788 input: `{"execute":"query-commands"}`,
789 ret: `{"return":[{"name":"query-balloon"},{"name":"system_powerdown"}]}`,
790 },
791 {
792 name: `quit`,
793 input: `{"execute":"quit"}`,
794 ret: `{"return":{}}`,
795 },
796
806 {
807 name: `qom-get`,
808 input: `{"execute":"qom-get",` +
809 `"arguments":{"path":"/machine/unattached/device[0]","property":"hotplugged"}}`,
810 ret: `{"return":false}`,
811 },
812 {
813 name: `qom-get`,
814 input: `{"execute":"qom-get",` +
815 `"arguments":{"path":"unattached/sysbus","property":"type"}}`,
816 ret: `{"return":"System"}`,
817 },
818 {
819 name: `qom-set`,
820 input: `{"execute":"qom-set",` +
821 `"arguments":{"path":"/machine","property":"graphics","value":false}}`,
822 ret: `{"return":{}}`,
823 },
824 {
825 name: `object-add`,
826 input: `{"execute":"object-add","arguments":{"qom-type":"rng-random",` +
827 `"id":"rng1","filename":"/dev/hwrng"}}`,
828 ret: `{"return":{}}`,
829 },
830 {
831 name: `object-del`,
832 input: `{"execute":"object-del","arguments":{"id":"rng1"}}`,
833 ret: `{"return":{}}`,
834 },
835 {
836 name: `device_add`,
837 input: `{"execute":"device_add",` +
838 `"arguments":{"driver":"e1000","bus":"pci.0","id":"net1"}}`,
839 ret: `{"return":{}}`,
840 },
841 {
842 name: `device_del`,
843 input: `{"execute":"device_del",` +
844 `"arguments":{"id":"net1"}}`,
845 ret: `{"return":{}}`,
846 },
847 {
848 name: `query-cpus-fast`,
849 input: `{"execute":"query-cpus-fast"}`,
850 ret: `{"return":[` +
851 `{"cpu-index":0,"qom-path":"/machine/unattached/device[0]","thread-id":25627,"props":{"socket-id":0,"core-id":0,"thread-id":0},"target":"x86_64"},` +
852 `{"cpu-index":1,"qom-path":"/machine/unattached/device[2]","thread-id":25628,"props":{"socket-id":1,"core-id":0,"thread-id":0},"target":"x86_64"}]}`,
853 },
854 {
855 name: `query-uuid`,
856 input: `{"execute":"query-uuid"}`,
857 ret: `{"return":{"UUID":"550e8400-e29b-41d4-a716-446655440000"}}`,
858 },
859 {
860 name: `system_reset`,
861 input: `{"execute":"system_reset"}`,
862 ret: `{"return":{}}`,
863 },
864 {
865 name: `system_powerdown`,
866 input: `{"execute":"system_powerdown"}`,
867 ret: `{"return":{}}`,
868 },
869 {
870 name: `system_wakeup`,
871 input: `{"execute":"system_wakeup"}`,
872 ret: `{"return":{}}`,
873 },
874 {
875 name: `inject-nmi`,
876 input: `{"execute":"inject-nmi"}`,
877 ret: `{"return":{}}`,
878 },
879 {
880 name: `query-kvm`,
881 input: `{"execute":"query-kvm"}`,
882 ret: `{"return":{"enabled":true,"present":true}}`,
883 },
884 {
885 name: `memsave`,
886 input: `{"execute":"memsave",` +
887 `"arguments":{"val":10,"size":100,"filename":"/tmp/virtual-mem-dump"}}`,
888 ret: `{"return":{}}`,
889 },
890 {
891 name: `pmemsave`,
892 input: `{"execute":"pmemsave",` +
893 `"arguments":{"val":10,"size":100,"filename":"/tmp/physical-mem-dump"}}`,
894 ret: `{"return":{}}`,
895 },
896 {
897 name: `query-memdev`,
898 input: `{"execute":"query-memdev"}`,
899 ret: `{"return":[{"id":"mem1","size":536870912,"merge":false,"dump":true,"prealloc":false,"share":false,"host-nodes":[0,1],"policy":"bind"},` +
900 `{"size":536870912,"merge":false,"dump":true,"prealloc":true,"share":false,"host-nodes":[2,3],"policy":"preferred"}]}`,
901 },
902 {
903 name: `query-hotpluggable-cpus`,
904 input: `{"execute":"query-hotpluggable-cpus"}`,
905 ret: `{"return":[{"type":"qemu64-x86_64-cpu","vcpus-count":1,"props":{"socket-id":1,"core-id":0,"thread-id":0}},` +
906 `{"type":"qemu64-x86_64-cpu","vcpus-count":1,"props":{"socket-id":0,"core-id":0,"thread-id":0},"qom-path":"/machine/unattached/device[0]"}]}`,
907 },
908 {
909 name: `balloon`,
910 input: `{"execute":"balloon",` +
911 `"arguments":{"value":536870912}}`,
912 ret: `{"return":{}}`,
913 },
914 {
915 name: `query-balloon`,
916 input: `{"execute":"query-balloon"}`,
917 ret: `{"return":{"actual":1073741824}}`,
918 },
919 {
920 name: `query-memory-devices`,
921 input: `{"execute":"query-memory-devices"}`,
922 ret: `{"return":[{"type":"dimm","data":{"id":"d1","addr":5368709120,"size":1073741824,` +
923 `"slot":0,"node":0,"memdev":"/objects/memX","hotplugged":true,"hotpluggable":true}}]}`,
924 },
925 {
926 name: `query-replay`,
927 input: `{"execute":"query-replay"}`,
928 ret: `{"return":{"mode":"play","filename":"log.rr","icount":220414}}`,
929 },
930 {
931 name: `replay-break`,
932 input: `{"execute":"replay-break","arguments":{"icount":220414}}`,
933 ret: `{"return":{}}`,
934 },
935 {
936 name: `replay-delete-break`,
937 input: `{"execute":"replay-delete-break"}`,
938 ret: `{"return":{}}`,
939 },
940 {
941 name: `replay-seek`,
942 input: `{"execute":"replay-seek","arguments":{"icount":220414}}`,
943 ret: `{"return":{}}`,
944 },
945 {
946 name: `yank`,
947 input: `{"execute":"yank",` +
948 `"arguments":{"instances":[{"type":"block-node","node-name":"nbd0"}]}}`,
949 ret: `{"return":{}}`,
950 },
951 {
952 name: `query-yank`,
953 input: `{"execute":"query-yank"}`,
954 ret: `{"return":[{"type":"block-node","node-name":"nbd0"}]}`,
955 },
956 {
957 name: `add_client`,
958 input: `{"execute":"add_client",` +
959 `"arguments":{"protocol":"vnc","fdname":"myclient"}}`,
960 ret: `{"return":{}}`,
961 },
962 {
963 name: `query-name`,
964 input: `{"execute":"query-name"}`,
965 ret: `{"return":{"name":"qemu-name"}}`,
966 },
967 {
968 name: `query-iothreads`,
969 input: `{"execute":"query-iothreads"}`,
970 ret: `{"return":[{"id":"iothread0","thread-id":3134,"poll-max-ns":0,"poll-grow":0,"poll-shrink":0,"aio-max-batch":0},` +
971 `{"id":"iothread1","thread-id":3135,"poll-max-ns":0,"poll-grow":0,"poll-shrink":0,"aio-max-batch":0}]}`,
972 },
973 {
974 name: `stop`,
975 input: `{"execute":"stop"}`,
976 ret: `{"return":{}}`,
977 },
978 {
979 name: `cont`,
980 input: `{"execute":"cont"}`,
981 ret: `{"return":{}}`,
982 },
983 {
984 name: `x-exit-preconfig`,
985 input: `{"execute":"x-exit-preconfig"}`,
986 ret: `{"return":{}}`,
987 },
988 {
989 name: `human-monitor-command`,
990 input: `{"execute":"human-monitor-command",` +
991 `"arguments":{"command-line":"info kvm"}}`,
992 ret: `{"return":"kvm support: enabled\r\n"}`,
993 },
994 {
995 name: `getfd`,
996 input: `{"execute":"getfd","arguments":{"fdname":"fd1"}}`,
997 ret: `{"return":{}}`,
998 },
999 {
1000 name: `closefd`,
1001 input: `{"execute":"closefd","arguments":{"fdname":"fd1"}}`,
1002 ret: `{"return":{}}`,
1003 },
1004 {
1005 name: `add-fd`,
1006 input: `{"execute":"add-fd","arguments":{"fdset-id":1}}`,
1007 ret: `{"return":{"fdset-id":1,"fd":3}}`,
1008 },
1009 {
1010 name: `remove-fd`,
1011 input: `{"execute":"remove-fd","arguments":{"fdset-id":1,"fd":3}}`,
1012 ret: `{"return":{}}`,
1013 },
1014 {
1015 name: `query-fdsets`,
1016 input: `{"execute":"query-fdsets"}`,
1017 ret: `{"return":[{"fdset-id":1,"fds":[{"fd":30,"opaque":"rdonly:/path/to/file"},` +
1018 `{"fd":24,"opaque":"rdwr:/path/to/file"}]},` +
1019 `{"fdset-id":0,"fds":[{"fd":28},{"fd":29}]}]}`,
1020 },
1021 {
1022 name: `query-command-line-options`,
1023 input: `{"execute":"query-command-line-options",` +
1024 `"arguments":{"option":"option-rom"}}`,
1025 ret: `{"return":[{"option":"option-rom","parameters":[{"name":"romfile","type":"string"},` +
1026 `{"name":"bootindex","type":"number"}]}]}`,
1027 },
1028 {
1029 name: `rtc-reset-reinjection`,
1030 input: `{"execute":"rtc-reset-reinjection"}`,
1031 ret: `{"return":{}}`,
1032 },
1033 {
1034 name: `query-sev`,
1035 input: `{"execute":"query-sev"}`,
1036 ret: `{"return":{"enabled":true,"api-major":0,"api-minor":0,` +
1037 `"build-id":0,"policy":0,"state":"running",` +
1038 `"handle":1}}`,
1039 },
1040 {
1041 name: `query-sev-launch-measure`,
1042 input: `{"execute":"query-sev-launch-measure"}`,
1043 ret: `{"return":{"data":"4l8LXeNlSPUDlXPJG5966/8%YZ"}}`,
1044 },
1045 {
1046 name: `query-sev-capabilities`,
1047 input: `{"execute":"query-sev-capabilities"}`,
1048 ret: `{"return":{"pdh":"8CCDD8DDD","cert-chain":"888CCCDDDEE","cbitpos":47,"reduced-phys-bits":5}}`,
1049 },
1050 {
1051 name: `query-sev-attestation-report`,
1052 input: `{"execute":"query-sev-attestation-report",` +
1053 `"arguments":{"mnonce":"aaaaaaa"}}`,
1054 ret: `{"return":{"data":"aaaaaaaabbbddddd"}}`,
1055 },
1056 {
1057 name: `dump-skeys`,
1058 input: `{"execute":"dump-skeys",` +
1059 `"arguments":{"filename":"/tmp/skeys"}}`,
1060 ret: `{"return":{}}`,
1061 },
1062 }
1063
1064 counter := 0
1065 for _, testCase := range tests {
1066 counter += 1
1067 c := Command{}
1068
1069 if err := json.Unmarshal([]byte(testCase.input), &c); err != nil {
1070 t.Fatalf("[unmarshal]-input-(%s) error on decoding %s: %s",
1071 testCase.name, testCase.input, err.Error())
1072 } else if c.Name != testCase.name {
1073 t.Fatalf("[unmarshal]-input-(%s) event name differs:\nGot:%s\nHas:%s\n",
1074 testCase.name, c.Name, testCase.name)
1075 }
1076
1077 if b, err := json.Marshal(&c); err != nil {
1078 t.Fatalf("[marshal]-input-(%s) error with %s: %s\n",
1079 testCase.name, testCase.input, err.Error())
1080 } else if strings.Compare(string(b), testCase.input) != 0 {
1081 t.Fatalf("[marshal]-input(%s) expected output failed:\nGot:%v\nHas:%s\n",
1082 testCase.name, string(b), testCase.input)
1083 }
1084
1085 ret := c.GetReturnType()
1086 if err := json.Unmarshal([]byte(testCase.ret), &ret); err != nil {
1087 t.Fatalf("[unmarshal]-ret-(%s) error on decoding %s: %s",
1088 testCase.name, testCase.ret, err.Error())
1089 }
1090
1091 if x, err := json.Marshal(&ret); err != nil {
1092 t.Fatalf("[marshal]-ret-(%s) error with %s: %s\n",
1093 testCase.name, testCase.input, err.Error())
1094 } else if strings.Compare(string(x), testCase.ret) != 0 {
1095 if string(x) != string(testCase.ret) {
1096 t.Fatalf("[marshal]-ret-(%s) expected output failed:\nGot:%v\nHas:%s\n",
1097 testCase.name, string(x), testCase.ret)
1098 }
1099 }
1100 }
1101 }
1102
View as plain text