...

Source file src/victortoso.com/qapi-go/pkg/qapi/commands_test.go

Documentation: victortoso.com/qapi-go/pkg/qapi

     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 // TODO: Not used yet
    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  		/* FIXME: inserted > image > backing_file not appearing on ret's Marshal!
   111  		{
   112  			name:  `query-block`,
   113  			input: `{"execute":"query-block"}`,
   114  			ret: `{"return":[{"device":"ide0-hd0","qdev":"ide_disk","type":"unknown","removable":false,"locked":false,` +
   115  				`"inserted":{"file":"disks/test.qcow2","ro":false,"drv":"qcow2","backing_file_depth":1,` +
   116  				`"encrypted":false,"detect_zeroes":"on",` +
   117  				`"bps":1000000,"bps_rd":0,"bps_wr":0,"iops":1000000,"iops_rd":0,` +
   118  				`"iops_wr":0,"image":{"backing_file":"base.qcow2","filename":"disks/test.qcow2","format":"qcow2","virtual-size":2048000,` +
   119  				`"full-backing-filename":"disks/base.qcow2","backing-filename-format":"qcow2",` +
   120  				`"snapshots":[{"id":"1","name":"snapshot1","vm-state-size":0,"date-sec":10000200,` +
   121  				`"date-nsec":12,"vm-clock-sec":206,"vm-clock-nsec":30}],` +
   122  				`"backing-image":{"filename":"disks/base.qcow2","format":"qcow2","virtual-size":2048000}},` +
   123  				`"bps_max":8000000,"bps_rd_max":0,"bps_wr_max":0,"iops_max":0,"iops_rd_max":0,` +
   124  				`"iops_wr_max":0,"iops_size":0,"write_threshold":0` +
   125  				`},` +
   126  				`"io-status":"ok"},` +
   127  				`{"io-status":"ok","device":"ide1-cd0", "locked":false, "removable":true,` +
   128  				`"qdev":"/machine/unattached/device[23]","tray_open":false,"type":"unknown"},` +
   129  				`{"device":"floppy0","locked":false,"removable":true,` +
   130  				`"qdev":"/machine/unattached/device[20]","type":"unknown"},` +
   131  				`{"device":"sd0","locked":false,"removable":true,"type":"unknown"}]}`,
   132  		},
   133  		/* FIXME: Need a pretty-print-compare
   134  		{
   135  			name:  `query-blockstats`,
   136  			input: `{"execute":"query-blockstats"}`,
   137  			ret: `{"return":[{"device":"ide0-hd0","parent":{"stats":{"wr_highest_offset":3686448128,` +
   138  				`"wr_bytes":9786368,"wr_operations":751,"rd_bytes":122567168,"rd_operations":36772,` +
   139  				`"wr_total_times_ns":313253456,"rd_total_times_ns":3465673657,"flush_total_times_ns":49653,` +
   140  				`"flush_operations":61,"rd_merged":0,"wr_merged":0,"idle_time_ns":2953431879,` +
   141  				`"account_invalid":true,"account_failed":false}},` +
   142  				`"stats":{"wr_highest_offset":2821110784,"wr_bytes":9786368,"wr_operations":692,` +
   143  				`"rd_bytes":122739200,"rd_operations":36604,"flush_operations":51,"wr_total_times_ns":313253456,` +
   144  				`"rd_total_times_ns":3465673657,"flush_total_times_ns":49653,"rd_merged":0,"wr_merged":0,` +
   145  				`"idle_time_ns":2953431879,"account_invalid":true,"account_failed":false},` +
   146  				`"qdev":"/machine/unattached/device[23]"},{"device":"ide1-cd0","stats":{"wr_highest_offset":0,` +
   147  				`"wr_bytes":0,"wr_operations":0,"rd_bytes":0,"rd_operations":0,"flush_operations":0,` +
   148  				`"wr_total_times_ns":0,"rd_total_times_ns":0,"flush_total_times_ns":0,"rd_merged":0,` +
   149  				`"wr_merged":0,"account_invalid":false,"account_failed":false},` +
   150  				`"qdev":"/machine/unattached/device[24]"},{"device":"floppy0","stats":{"wr_highest_offset":0,` +
   151  				`"wr_bytes":0,"wr_operations":0,"rd_bytes":0,"rd_operations":0,"flush_operations":0,` +
   152  				`"wr_total_times_ns":0,"rd_total_times_ns":0,"flush_total_times_ns":0,"rd_merged":0,` +
   153  				`"wr_merged":0,"account_invalid":false,"account_failed":false},` +
   154  				`"qdev":"/machine/unattached/device[16]"},{"device":"sd0","stats":{"wr_highest_offset":0,` +
   155  				`"wr_bytes":0,"wr_operations":0,"rd_bytes":0,"rd_operations":0,"flush_operations":0,` +
   156  				`"wr_total_times_ns":0,"rd_total_times_ns":0,"flush_total_times_ns":0,"rd_merged":0,` +
   157  				`"wr_merged":0,"account_invalid":false,"account_failed":false}}]}`,
   158  		},
   159  		*/
   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  		/* FIXME: Backing File not showing
   197  		{
   198  			name:  `query-named-block-nodes`,
   199  			input: `{"execute":"query-named-block-nodes"}`,
   200  			ret: `{"return":[{"file":"disks/test.qcow2","node-name":"my-node","ro":false,"drv":"qcow2",` +
   201  				`"backing_file_depth":1,"encrypted":false,"detect_zeroes":"off",` +
   202  				`"bps":1000000,"bps_rd":0,"bps_wr":0,"iops":1000000,"iops_rd":0,"iops_wr":0,` +
   203  				`"image":{"filename":"disks/test.qcow2","format":"qcow2","virtual-size":2048000,` +
   204  				`"full-backing-filename":"disks/base.qcow2","backing-filename-format":"qcow2",` +
   205  				`"snapshots":[{"id":"1","name":"snapshot1","vm-state-size":0,"date-sec":10000200,` +
   206  				`"date-nsec":12,"vm-clock-sec":206,"vm-clock-nsec":30}],` +
   207  				`"backing-image":{"filename":"disks/base.qcow2","format":"qcow2","virtual-size":2048000},` +
   208  				`"backing_file":"base.qcow2"` + // FIXME: WHERE ARE YOU?
   209  				`},` +
   210  				`"bps_max":8000000,"bps_rd_max":0,"bps_wr_max":0,` +
   211  				`"iops_max":0,"iops_rd_max":0,"iops_wr_max":0,"iops_size":0,"write_threshold":0` +
   212  				`}]}`,
   213  		},
   214  		*/
   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  		/* FIXME: Skip due need of handling unicode.
   797  		{
   798  			name:  `qom-list`,
   799  			input: `{"execute":"qom-list","arguments":{"path":"/chardevs"}}`,
   800  			ret: `{"return":[{"name":"type","type":"string"},` +
   801  				`{"name":"parallel0","type":"child<chardev-vc>"},` +
   802  				`{"name":"serial0","type":"child<chardev-vc>"},` +
   803  				`{"name":"mon0","type":"child<chardev-stdio>"}]}`,
   804  		},
   805  		*/
   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  		// First Marshal and Unmarshall Command and later it's expected result
  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