From patchwork Mon Sep 3 09:18:45 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wayne Xia X-Patchwork-Id: 181339 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id E9BF72C0091 for ; Mon, 3 Sep 2012 19:22:22 +1000 (EST) Received: from localhost ([::1]:42856 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1T8SrM-0004AU-SX for incoming@patchwork.ozlabs.org; Mon, 03 Sep 2012 05:22:20 -0400 Received: from eggs.gnu.org ([208.118.235.92]:42564) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1T8Sr5-00041M-RE for qemu-devel@nongnu.org; Mon, 03 Sep 2012 05:22:05 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1T8Sqz-0007ol-AG for qemu-devel@nongnu.org; Mon, 03 Sep 2012 05:22:03 -0400 Received: from e23smtp03.au.ibm.com ([202.81.31.145]:52366) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1T8Sqy-0007oS-7V for qemu-devel@nongnu.org; Mon, 03 Sep 2012 05:21:57 -0400 Received: from /spool/local by e23smtp03.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Mon, 3 Sep 2012 19:20:36 +1000 Received: from d23relay04.au.ibm.com (202.81.31.246) by e23smtp03.au.ibm.com (202.81.31.209) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Mon, 3 Sep 2012 19:20:33 +1000 Received: from d23av02.au.ibm.com (d23av02.au.ibm.com [9.190.235.138]) by d23relay04.au.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id q839Cqlh24051908 for ; Mon, 3 Sep 2012 19:12:53 +1000 Received: from d23av02.au.ibm.com (loopback [127.0.0.1]) by d23av02.au.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id q839Lm5i018473 for ; Mon, 3 Sep 2012 19:21:49 +1000 Received: from RedHat62GAWSWenchao ([9.115.122.34]) by d23av02.au.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id q839JI4l012127; Mon, 3 Sep 2012 19:21:47 +1000 From: Wenchao Xia To: qemu-devel@nongnu.org Date: Mon, 3 Sep 2012 17:18:45 +0800 Message-Id: <1346663926-20188-6-git-send-email-xiawenc@linux.vnet.ibm.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1346663926-20188-1-git-send-email-xiawenc@linux.vnet.ibm.com> References: <1346663926-20188-1-git-send-email-xiawenc@linux.vnet.ibm.com> x-cbid: 12090309-6102-0000-0000-0000022A205E X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 202.81.31.145 Cc: kwolf@redhat.com, aliguori@us.ibm.com, stefanha@gmail.com, pbonzini@redhat.com, eblake@redhat.com, Wenchao Xia Subject: [Qemu-devel] [PATCH 5/6] libqblock test example X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org In this example, user first create two qcow2 images, and then get the backing file relationship information of them. Then does write and read sync IO on them. Signed-off-by: Wenchao Xia --- tests/libqblock/libqblock-test.c | 219 ++++++++++++++++++++++++++++++++++++++ 1 files changed, 219 insertions(+), 0 deletions(-) create mode 100644 tests/libqblock/libqblock-test.c diff --git a/tests/libqblock/libqblock-test.c b/tests/libqblock/libqblock-test.c new file mode 100644 index 0000000..9a1eac5 --- /dev/null +++ b/tests/libqblock/libqblock-test.c @@ -0,0 +1,219 @@ +#include +#include +#include +#include +#include + +#include "libqblock.h" + +static unsigned char buf_r[1024]; +static unsigned char buf_w[1024] = {4, 0, 0, 2}; + +struct verify_data { + unsigned char *buf_r; + unsigned char *buf_w; + int len; +}; + +static void print_loc(struct QBlockOptionLoc *loc) +{ + switch (loc->prot_type) { + case QB_PROTO_NONE: + printf("protocol type [none]."); + break; + case QB_PROTO_FILE: + printf("protocol type [file], filename [%s].", + loc->prot_op.o_file.filename); + break; + default: + printf("protocol type not supported."); + break; + } +} + +static void print_info_image_static(struct QBlockInfoImageStatic *info) +{ + printf("=======image location:\n"); + print_loc(&info->loc); + printf("\nvirtual_size %" PRId64 ", format type %d,", + info->virt_size, info->fmt_type); + printf("allocated size %" PRId64 ", encrypt %d,", + info->allocated_size, info->encrypt); + printf("\nbacking image location:\n"); + print_loc(&info->backing_loc); + printf("\n"); +} + +static void test_check(struct verify_data *vdata) +{ + int cmp; + cmp = memcmp(vdata->buf_r, vdata->buf_w, vdata->len); + if (cmp == 0) { + printf("compare succeed, %d.\n", vdata->buf_r[24]); + } else { + printf("!!! compare fail, %d.\n", vdata->buf_r[24]); + exit(1); + } +} + +int main(int argc, char **argv) +{ + char *filename1, *filename2; + struct QBroker *broker = NULL; + struct QBlockState *qbs = NULL; + struct QBlockOptionLoc *ol = NULL; + struct QBlockOptionFormat *of = NULL; + struct QBlockInfoImageStatic *info_st = NULL; + int ret, flag; + int test_offset = 0; + int test_len = 512; + struct verify_data vdata; + char err_str[1024]; + + vdata.buf_r = buf_r; + vdata.buf_w = buf_w; + vdata.len = test_len; + + filename1 = (char *)"./qemu_image1"; + filename2 = (char *)"./qemu_image2"; + printf("qemu test, filename1 is %s, filename2 is %s.\n", + filename1, filename2); + + libqblock_init(); + + ret = qb_broker_new(&broker); + if (ret < 0) { + goto free; + } + + ret = qb_state_new(broker, &qbs); + if (ret < 0) { + goto free; + } + + ret = qb_ol_new(broker, &ol); + if (ret < 0) { + goto free; + } + + ret = qb_of_new(broker, &of); + if (ret < 0) { + goto free; + } + + /* create a new image */ + + ol->prot_type = QB_PROTO_FILE; + ol->prot_op.o_file.filename = filename2; + of->fmt_type = QB_FMT_QCOW2; + of->fmt_op.o_qcow2.virt_size = 100 * 1024; + flag = 0; + + ret = qb_create(broker, qbs, ol, of, flag); + if (ret < 0) { + qb_error_get_human_str(broker, err_str, sizeof(err_str)); + printf("create fail 1. %s.\n", err_str); + goto unlink; + } + + ol->prot_type = QB_PROTO_FILE; + ol->prot_op.o_file.filename = filename1; + of->fmt_type = QB_FMT_QCOW2; + of->fmt_op.o_qcow2.backing_loc.prot_type = QB_PROTO_FILE; + of->fmt_op.o_qcow2.backing_loc.prot_op.o_file.filename = filename2; + flag = 0; + ret = qb_create(broker, qbs, ol, of, flag); + if (ret < 0) { + qb_error_get_human_str(broker, err_str, sizeof(err_str)); + printf("create fail 2. %s.\n", err_str); + goto unlink; + } + + /* get informations */ + ol->prot_type = QB_PROTO_FILE; + ol->prot_op.o_file.filename = filename1; + of->fmt_type = QB_FMT_NONE; + flag = LIBQBLOCK_O_NO_BACKING; + ret = qb_open(broker, qbs, ol, of, flag); + if (ret < 0) { + qb_error_get_human_str(broker, err_str, sizeof(err_str)); + printf("info getting, open failed. %s.\n", err_str); + goto free; + } + + while (1) { + ret = qb_info_image_static_get(broker, qbs, &info_st); + if (ret < 0) { + qb_error_get_human_str(broker, err_str, sizeof(err_str)); + printf("info get error. %s.\n", err_str); + goto close; + } + print_info_image_static(info_st); + qb_close(broker, qbs); + if (info_st->backing_loc.prot_type == QB_FMT_NONE) { + break; + } + *ol = info_st->backing_loc; + ret = qb_open(broker, qbs, ol, of, flag); + if (ret < 0) { + qb_error_get_human_str(broker, err_str, sizeof(err_str)); + printf("info getting, open failed in backing file. %s.\n", + err_str); + goto free; + } + qb_info_image_static_delete(broker, &info_st); + } + /* read and write the image */ + ol->prot_type = QB_PROTO_FILE; + ol->prot_op.o_file.filename = filename1; + of->fmt_type = QB_FMT_NONE; + flag = LIBQBLOCK_O_RDWR; + ret = qb_open(broker, qbs, ol, of, flag); + if (ret < 0) { + qb_error_get_human_str(broker, err_str, sizeof(err_str)); + printf("open failed. %s.\n", err_str); + goto free; + } + + buf_w[24] = 3; + memset(buf_r, 0, sizeof(buf_r)); + + ret = qb_write(broker, qbs, buf_w, test_len, test_offset); + if (ret < 0) { + qb_error_get_human_str(broker, err_str, sizeof(err_str)); + printf("%s.\n", err_str); + goto close; + } + + ret = qb_read(broker, qbs, buf_r, test_len, test_offset); + if (ret < 0) { + qb_error_get_human_str(broker, err_str, sizeof(err_str)); + printf("%s.\n", err_str); + goto close; + } + + test_check(&vdata); + + close: + qb_close(broker, qbs); + unlink: + unlink(filename1); + unlink(filename2); + free: + if (info_st != NULL) { + qb_info_image_static_delete(broker, &info_st); + } + if (qbs != NULL) { + qb_state_delete(broker, &qbs); + } + if (ol != NULL) { + qb_ol_delete(broker, &ol); + } + if (of != NULL) { + qb_of_delete(broker, &of); + } + if (broker != NULL) { + qb_broker_delete(&broker); + } + return 0; +}