1QA output created by 308 2=== Set up === 3Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864 4wrote 67108864/67108864 bytes at offset 0 564 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 6{'execute': 'qmp_capabilities'} 7{"return": {}} 8{'execute': 'blockdev-add', 9 'arguments': { 10 'driver': 'file', 11 'node-name': 'node-protocol', 12 'filename': 'TEST_DIR/t.IMGFMT' 13 } } 14{"return": {}} 15{'execute': 'blockdev-add', 16 'arguments': { 17 'driver': 'IMGFMT', 18 'node-name': 'node-format', 19 'file': 'node-protocol' 20 } } 21{"return": {}} 22 23=== Mountpoint not present === 24{'execute': 'block-export-add', 25 'arguments': { 26 'type': 'fuse', 27 'id': 'export-err', 28 'node-name': 'node-format', 29 'mountpoint': 'TEST_DIR/t.IMGFMT.fuse' 30 } } 31{"error": {"class": "GenericError", "desc": "Failed to stat 'TEST_DIR/t.IMGFMT.fuse': No such file or directory"}} 32 33=== Mountpoint is a directory === 34{'execute': 'block-export-add', 35 'arguments': { 36 'type': 'fuse', 37 'id': 'export-err', 38 'node-name': 'node-format', 39 'mountpoint': 'TEST_DIR/t.IMGFMT.fuse' 40 } } 41{"error": {"class": "GenericError", "desc": "'TEST_DIR/t.IMGFMT.fuse' is not a regular file"}} 42 43=== Mountpoint is a regular file === 44{'execute': 'block-export-add', 45 'arguments': { 46 'type': 'fuse', 47 'id': 'export-mp', 48 'node-name': 'node-format', 49 'mountpoint': 'TEST_DIR/t.IMGFMT.fuse' 50 } } 51{"return": {}} 52Images are identical. 53Permissions pre-chmod: 400 54chmod: changing permissions of 'TEST_DIR/t.IMGFMT.fuse': Read-only file system 55Permissions post-+w: 400 56Permissions post-+x: 500 57 58=== Mount over existing file === 59{'execute': 'block-export-add', 60 'arguments': { 61 'type': 'fuse', 62 'id': 'export-img', 63 'node-name': 'node-format', 64 'mountpoint': 'TEST_DIR/t.IMGFMT' 65 } } 66{"return": {}} 67Images are identical. 68 69=== Double export === 70{'execute': 'block-export-add', 71 'arguments': { 72 'type': 'fuse', 73 'id': 'export-err', 74 'node-name': 'node-format', 75 'mountpoint': 'TEST_DIR/t.IMGFMT.fuse' 76 } } 77{"error": {"class": "GenericError", "desc": "There already is a FUSE export on 'TEST_DIR/t.IMGFMT.fuse'"}} 78 79=== Remove export === 80virtual size: 64 MiB (67108864 bytes) 81{'execute': 'block-export-del', 82 'arguments': { 83 'id': 'export-mp' 84 } } 85{"return": {}} 86{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_EXPORT_DELETED", "data": {"id": "export-mp"}} 87virtual size: 0 B (0 bytes) 88 89=== Writable export === 90{'execute': 'block-export-add', 91 'arguments': { 92 'type': 'fuse', 93 'id': 'export-mp', 94 'node-name': 'node-format', 95 'mountpoint': 'TEST_DIR/t.IMGFMT.fuse', 'writable': true 96 } } 97{"return": {}} 98Writing to read-only export failed: OK 99wrote 65536/65536 bytes at offset 1048576 10064 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 101wrote 65536/65536 bytes at offset 1048576 10264 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 103 104=== Resizing exports === 105{'execute': 'block-export-del', 106 'arguments': { 107 'id': 'export-mp' 108 } } 109{"return": {}} 110{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_EXPORT_DELETED", "data": {"id": "export-mp"}} 111{'execute': 'block-export-del', 112 'arguments': { 113 'id': 'export-img' 114 } } 115{"return": {}} 116{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_EXPORT_DELETED", "data": {"id": "export-img"}} 117{'execute': 'blockdev-del', 118 'arguments': { 119 'node-name': 'node-format' 120 } } 121{"return": {}} 122{'execute': 'block-export-add', 123 'arguments': { 124 'type': 'fuse', 125 'id': 'export-mp', 126 'node-name': 'node-protocol', 127 'mountpoint': 'TEST_DIR/t.IMGFMT.fuse', 'writable': true 128 } } 129{"return": {}} 130 131--- Try growing non-growable export --- 132(OK: Lengths of export and original are the same) 133dd: error writing 'TEST_DIR/t.IMGFMT.fuse': Input/output error 1341+0 records in 1350+0 records out 136 137--- Resize export --- 138(OK: Lengths of export and original are the same) 139OK: Post-truncate image size is as expected 140OK: Disk usage grew with fallocate 141 142--- Try growing growable export --- 143{'execute': 'block-export-del', 144 'arguments': { 145 'id': 'export-mp' 146 } } 147{"return": {}} 148{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_EXPORT_DELETED", "data": {"id": "export-mp"}} 149{'execute': 'block-export-add', 150 'arguments': { 151 'type': 'fuse', 152 'id': 'export-mp', 153 'node-name': 'node-protocol', 154 'mountpoint': 'TEST_DIR/t.IMGFMT.fuse', 'writable': true, 'growable': true 155 } } 156{"return": {}} 15765536+0 records in 15865536+0 records out 159(OK: Lengths of export and original are the same) 160OK: Post-grow image size is as expected 161 162--- Shrink export --- 163(OK: Lengths of export and original are the same) 164OK: Post-truncate image size is as expected 165 166=== Tear down === 167{'execute': 'quit'} 168{"return": {}} 169{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}} 170{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_EXPORT_DELETED", "data": {"id": "export-mp"}} 171 172=== Compare copy with original === 173Images are identical. 174 175=== Writing zeroes while unmapping === 176Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864 177wrote 67108864/67108864 bytes at offset 0 17864 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 179{'execute': 'qmp_capabilities'} 180{"return": {}} 181{'execute': 'blockdev-add', 182 'arguments': { 183 'driver': 'IMGFMT', 184 'node-name': 'node-format', 185 'file': { 186 'driver': 'file', 187 'filename': 'TEST_DIR/t.IMGFMT' 188 } 189 } } 190{"return": {}} 191{'execute': 'block-export-add', 192 'arguments': { 193 'type': 'fuse', 194 'id': 'export', 195 'node-name': 'node-format', 196 'mountpoint': 'TEST_DIR/t.IMGFMT.fuse', 'writable': true 197 } } 198{"return": {}} 199wrote 67108864/67108864 bytes at offset 0 20064 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 201read 67108864/67108864 bytes at offset 0 20264 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 203{'execute': 'quit'} 204{"return": {}} 205{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}} 206{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_EXPORT_DELETED", "data": {"id": "export"}} 207read 67108864/67108864 bytes at offset 0 20864 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 209*** done 210