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', 'arguments': { 'driver': 'file', 'node-name': 'node-protocol', 'filename': 'TEST_DIR/t.IMGFMT' } } 9{"return": {}} 10{'execute': 'blockdev-add', 'arguments': { 'driver': 'IMGFMT', 'node-name': 'node-format', 'file': 'node-protocol' } } 11{"return": {}} 12 13=== Mountpoint not present === 14{'execute': 'block-export-add', 'arguments': { 'type': 'fuse', 'id': 'export-err', 'node-name': 'node-format', 'mountpoint': 'TEST_DIR/t.IMGFMT.fuse' } } 15{"error": {"class": "GenericError", "desc": "Failed to stat 'TEST_DIR/t.IMGFMT.fuse': No such file or directory"}} 16 17=== Mountpoint is a directory === 18{'execute': 'block-export-add', 'arguments': { 'type': 'fuse', 'id': 'export-err', 'node-name': 'node-format', 'mountpoint': 'TEST_DIR/t.IMGFMT.fuse' } } 19{"error": {"class": "GenericError", "desc": "'TEST_DIR/t.IMGFMT.fuse' is not a regular file"}} 20 21=== Mountpoint is a regular file === 22{'execute': 'block-export-add', 'arguments': { 'type': 'fuse', 'id': 'export-mp', 'node-name': 'node-format', 'mountpoint': 'TEST_DIR/t.IMGFMT.fuse' } } 23{"return": {}} 24Images are identical. 25 26=== Mount over existing file === 27{'execute': 'block-export-add', 'arguments': { 'type': 'fuse', 'id': 'export-img', 'node-name': 'node-format', 'mountpoint': 'TEST_DIR/t.IMGFMT' } } 28{"return": {}} 29Images are identical. 30 31=== Double export === 32{'execute': 'block-export-add', 'arguments': { 'type': 'fuse', 'id': 'export-err', 'node-name': 'node-format', 'mountpoint': 'TEST_DIR/t.IMGFMT.fuse' } } 33{"error": {"class": "GenericError", "desc": "There already is a FUSE export on 'TEST_DIR/t.IMGFMT.fuse'"}} 34 35=== Remove export === 36virtual size: 64 MiB (67108864 bytes) 37{'execute': 'block-export-del', 'arguments': { 'id': 'export-mp' } } 38{"return": {}} 39{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_EXPORT_DELETED", "data": {"id": "export-mp"}} 40virtual size: 0 B (0 bytes) 41 42=== Writable export === 43{'execute': 'block-export-add', 'arguments': { 'type': 'fuse', 'id': 'export-mp', 'node-name': 'node-format', 'mountpoint': 'TEST_DIR/t.IMGFMT.fuse', 'writable': true } } 44{"return": {}} 45write failed: Permission denied 46wrote 65536/65536 bytes at offset 1048576 4764 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 48wrote 65536/65536 bytes at offset 1048576 4964 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 50 51=== Resizing exports === 52{'execute': 'block-export-del', 'arguments': { 'id': 'export-mp' } } 53{"return": {}} 54{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_EXPORT_DELETED", "data": {"id": "export-mp"}} 55{'execute': 'block-export-del', 'arguments': { 'id': 'export-img' } } 56{"return": {}} 57{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_EXPORT_DELETED", "data": {"id": "export-img"}} 58{'execute': 'blockdev-del', 'arguments': { 'node-name': 'node-format' } } 59{"return": {}} 60{'execute': 'block-export-add', 'arguments': { 'type': 'fuse', 'id': 'export-mp', 'node-name': 'node-protocol', 'mountpoint': 'TEST_DIR/t.IMGFMT.fuse', 'writable': true } } 61{"return": {}} 62 63--- Try growing non-growable export --- 64(OK: Lengths of export and original are the same) 65dd: error writing 'TEST_DIR/t.IMGFMT.fuse': Input/output error 661+0 records in 670+0 records out 68 69--- Resize export --- 70(OK: Lengths of export and original are the same) 71OK: Post-truncate image size is as expected 72OK: Disk usage grew with fallocate 73 74--- Try growing growable export --- 75{'execute': 'block-export-del', 'arguments': { 'id': 'export-mp' } } 76{"return": {}} 77{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_EXPORT_DELETED", "data": {"id": "export-mp"}} 78{'execute': 'block-export-add', 'arguments': { 'type': 'fuse', 'id': 'export-mp', 'node-name': 'node-protocol', 'mountpoint': 'TEST_DIR/t.IMGFMT.fuse', 'writable': true, 'growable': true } } 79{"return": {}} 8065536+0 records in 8165536+0 records out 82(OK: Lengths of export and original are the same) 83OK: Post-grow image size is as expected 84 85--- Shrink export --- 86(OK: Lengths of export and original are the same) 87OK: Post-truncate image size is as expected 88 89=== Tear down === 90{'execute': 'quit'} 91{"return": {}} 92{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}} 93{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_EXPORT_DELETED", "data": {"id": "export-mp"}} 94 95=== Compare copy with original === 96Images are identical. 97*** done 98