This file simulate the caller to test the library. Signed-off-by: Wenchao Xia <xiaw...@linux.vnet.ibm.com> --- libqblock-test.c | 197 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 197 insertions(+), 0 deletions(-) create mode 100644 libqblock-test.c
diff --git a/libqblock-test.c b/libqblock-test.c new file mode 100644 index 0000000..6198924 --- /dev/null +++ b/libqblock-test.c @@ -0,0 +1,197 @@ +#include "libqblock.h" + +#include <stdarg.h> +#include <stdio.h> +#include <unistd.h> +#include <inttypes.h> + +static unsigned char buf0[1024]; +static unsigned char buf1[1024] = {4, 0, 0, 2}; + + +static int qbi_print_test(struct QBlockInfoImage *info) +{ + printf("name:%s, protocol %d, format %d, virt_size %" PRId64 " " + " allocated_size %" PRId64 + " encrypt %d, backing file %s.\n", + info->filename, info->protocol, info->format, info->virt_size, + info->allocated_size, + info->encrypt, info->backing_filename); + return 0; +} + + +int main(int argc, char **argv) +{ + struct QBlockState *qbs = NULL; + struct QBlockOptionOpen *qboo = NULL; + struct QBlockOptionCreate *qboc = NULL; + struct QBlockInfoImage *qbi = NULL; + char *filename1, *filename2; + int ret, err_no; + const char *err_msg = NULL; + + int i; + unsigned long op_size = 512; + unsigned long op_start = 1024; + + if (argc < 3) { + printf("usage: libqblock-test [filename1] [filename2].\n"); + return 0; + } + filename1 = argv[1]; + printf("qemu test, file name1 is %s.\n", filename1); + filename2 = argv[2]; + printf("qemu test, file name2 is %s.\n", filename2); + + libqblock_init(); + + ret = qb_state_new(&qbs); + if (ret < 0) { + goto free; + } + + ret = qb_oc_new(&qboc, QB_FMT_QCOW); + if (ret < 0) { + goto free; + } + + qboc->o_loc.filename = filename1; + qboc->o_loc.protocol = QB_PROTO_FILE; + qboc->o_fmt.fmt_type = QB_FMT_QCOW; + qboc->o_fmt.fmt_op.o_qcow.virt_size = 128 * 1024 * 1024; + + ret = qb_create(qbs, qboc); + if (ret < 0) { + printf("failed to create image, ret is %d.\n", ret); + if (ret == QB_ERR_INTERNAL_ERR) { + err_msg = qb_error_get_detail(qbs, &err_no); + printf("errno is %d, msg is %s.\n", err_no, err_msg); + } + goto free; + } + + qboc->o_loc.filename = filename2; + qboc->o_loc.protocol = QB_PROTO_FILE; + qboc->o_fmt.fmt_type = QB_FMT_QCOW2; + qboc->o_fmt.fmt_op.o_qcow2.backing_file = filename1; + + ret = qb_create(qbs, qboc); + if (ret < 0) { + printf("failed to create image, ret is %d.\n", ret); + if (ret == QB_ERR_INTERNAL_ERR) { + err_msg = qb_error_get_detail(qbs, &err_no); + printf("errno is %d, msg is %s.\n", err_no, err_msg); + } + goto free; + } + + ret = qb_oo_new(&qboo); + if (ret < 0) { + goto unlink; + } + + qboo->o_loc.filename = filename2; + qboo->o_loc.protocol = QB_PROTO_FILE; + qboo->o_fmt_type = QB_FMT_QCOW2; + qboo->o_flag = LIBQBLOCK_O_RDWR; + + ret = qb_open(qbs, qboo); + if (ret < 0) { + printf("failed to open image, ret is %d.\n", ret); + if (ret == QB_ERR_INTERNAL_ERR) { + err_msg = qb_error_get_detail(qbs, &err_no); + printf("errno is %d, msg is %s.\n", err_no, err_msg); + } + goto unlink; + } + + ret = qb_write(qbs, buf1, op_size, op_start); + if (ret < 0) { + printf("failed to write image, ret is %d.\n", ret); + if (ret == QB_ERR_INTERNAL_ERR) { + err_msg = qb_error_get_detail(qbs, &err_no); + printf("errno is %d, msg is %s.\n", err_no, err_msg); + } + goto close; + } + ret = qb_read(qbs, buf0, op_size, op_start); + if (ret < 0) { + printf("failed to read image, ret is %d.\n", ret); + if (ret == QB_ERR_INTERNAL_ERR) { + err_msg = qb_error_get_detail(qbs, &err_no); + printf("errno is %d, msg is %s.\n", err_no, err_msg); + } + goto close; + } + + for (i = 0; i < op_size; i++) { + if (buf0[i] != buf1[i]) { + printf("mismatch found at %d.\n", i); + break; + } + } + + /* check backing chain */ + ret = qb_infoimage_get(qbs, &qbi); + if (ret < 0) { + printf("failed to get image info, ret is %d.\n", ret); + if (ret == QB_ERR_INTERNAL_ERR) { + err_msg = qb_error_get_detail(qbs, &err_no); + printf("errno is %d, msg is %s.\n", err_no, err_msg); + } + goto close; + } + qbi_print_test(qbi); + + while (qbi->backing_filename != NULL) { + qb_close(qbs); + qboo->o_loc.filename = qbi->backing_filename; + qboo->o_loc.protocol = QB_PROTO_FILE; + qboo->o_fmt_type = QB_FMT_NONE; + qboo->o_flag = 0; + ret = qb_open(qbs, qboo); + if (ret < 0) { + printf("failed to open back image %s, ret is %d.\n", + qbi->backing_filename, ret); + if (ret == QB_ERR_INTERNAL_ERR) { + err_msg = qb_error_get_detail(qbs, &err_no); + printf("errno is %d, msg is %s.\n", err_no, err_msg); + } + goto close; + } + qb_infoimage_free(&qbi); + ret = qb_infoimage_get(qbs, &qbi); + if (ret < 0) { + printf("failed to get image info, ret is %d.\n", ret); + if (ret == QB_ERR_INTERNAL_ERR) { + err_msg = qb_error_get_detail(qbs, &err_no); + printf("errno is %d, msg is %s.\n", err_no, err_msg); + } + goto close; + } + qbi_print_test(qbi); + } + + printf("test done.\n"); + + close: + qb_close(qbs); + unlink: + unlink(filename1); + unlink(filename2); + free: + if (qbs != NULL) { + qb_state_free(&qbs); + } + if (qboo != NULL) { + qb_oo_free(&qboo); + } + if (qboc != NULL) { + qb_oc_free(&qboc); + } + if (qbi != NULL) { + qb_infoimage_free(&qbi); + } + return 0; +} -- 1.7.1