From patchwork Mon Sep 10 08:26:26 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wayne Xia X-Patchwork-Id: 182822 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 0B7CA2C0096 for ; Mon, 10 Sep 2012 18:33:50 +1000 (EST) Received: from localhost ([::1]:45472 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TAzMP-000866-To for incoming@patchwork.ozlabs.org; Mon, 10 Sep 2012 04:28:49 -0400 Received: from eggs.gnu.org ([208.118.235.92]:35766) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TAzLd-0005qg-LD for qemu-devel@nongnu.org; Mon, 10 Sep 2012 04:28:07 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TAzLX-0007qR-36 for qemu-devel@nongnu.org; Mon, 10 Sep 2012 04:28:01 -0400 Received: from e23smtp04.au.ibm.com ([202.81.31.146]:48985) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TAzLW-0007qA-FF for qemu-devel@nongnu.org; Mon, 10 Sep 2012 04:27:55 -0400 Received: from /spool/local by e23smtp04.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Mon, 10 Sep 2012 18:25:37 +1000 Received: from d23relay05.au.ibm.com (202.81.31.247) by e23smtp04.au.ibm.com (202.81.31.210) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Mon, 10 Sep 2012 18:25:36 +1000 Received: from d23av03.au.ibm.com (d23av03.au.ibm.com [9.190.234.97]) by d23relay05.au.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id q8A8Ia1J29163556 for ; Mon, 10 Sep 2012 18:18:36 +1000 Received: from d23av03.au.ibm.com (loopback [127.0.0.1]) by d23av03.au.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id q8A8RndR027385 for ; Mon, 10 Sep 2012 18:27:50 +1000 Received: from RedHat62GAWSWenchao (wenchaox.cn.ibm.com [9.115.122.115]) by d23av03.au.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id q8A8QiXR025911; Mon, 10 Sep 2012 18:27:48 +1000 From: Wenchao Xia To: qemu-devel@nongnu.org Date: Mon, 10 Sep 2012 16:26:26 +0800 Message-Id: <1347265586-17698-7-git-send-email-xiawenc@linux.vnet.ibm.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1347265586-17698-1-git-send-email-xiawenc@linux.vnet.ibm.com> References: <1347265586-17698-1-git-send-email-xiawenc@linux.vnet.ibm.com> x-cbid: 12091008-9264-0000-0000-0000024D9E63 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 202.81.31.146 Cc: kwolf@redhat.com, aliguori@us.ibm.com, stefanha@gmail.com, blauwirbel@gmail.com, pbonzini@redhat.com, eblake@redhat.com, Wenchao Xia Subject: [Qemu-devel] [PATCH V2 6/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 Created a new directory in tests, and added a simple test case in it. 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/Makefile | 3 + tests/libqblock/Makefile | 28 +++++ tests/libqblock/libqblock-test.c | 231 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 262 insertions(+), 0 deletions(-) create mode 100644 tests/libqblock/Makefile create mode 100644 tests/libqblock/libqblock-test.c diff --git a/tests/Makefile b/tests/Makefile index 26a67ce..69af1e2 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -148,4 +148,7 @@ check-unit: $(patsubst %,check-%, $(check-unit-y)) check-block: $(patsubst %,check-%, $(check-block-y)) check: check-unit check-qtest +check-libqblock: + $(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) -C tests/libqblock V="$(V)" TARGET_DIR="$*/" check-libqblock,) + -include $(wildcard tests/*.d) diff --git a/tests/libqblock/Makefile b/tests/libqblock/Makefile new file mode 100644 index 0000000..dc5acda --- /dev/null +++ b/tests/libqblock/Makefile @@ -0,0 +1,28 @@ +-include ../../config-host.mak +-include $(SRC_PATH)/Makefile.objs +-include $(SRC_PATH)/rules.mak + +$(call set-vpath, $(SRC_PATH)) + +#library test case objects +libqblock-test-objs=libqblock-test.lo + +QEMU_CFLAGS+=-I $(SRC_PATH)/$(libqblock-lib-path) +libqblock-la-path = $(SRC_PATH)/$(libqblock-lib-path)/$(libqblock-lib-la) + +########################################################################## +#runtime rules: +ifeq ($(LIBTOOL),) +libqblock-test.bin: + @echo "libtool is missing, please install and rerun configure"; exit 1 +else +libqblock-test.bin: $(libqblock-test-objs) $(libqblock-la-path) + $(call quiet-command,$(LIBTOOL) --mode=link --quiet --tag=CC $(CC) -shared -rpath $(libdir) -o $@ $^ ," lt LINK $@") +endif + +check-libqblock: libqblock-test.bin + ./libqblock-test.bin + +clean: + rm -f *.lo *.o *.d *.la *.bin + rm -rf .libs diff --git a/tests/libqblock/libqblock-test.c b/tests/libqblock/libqblock-test.c new file mode 100644 index 0000000..2d1a119 --- /dev/null +++ b/tests/libqblock/libqblock-test.c @@ -0,0 +1,231 @@ +/* + * QEMU block layer library test + * + * Copyright IBM, Corp. 2012 + * + * Authors: + * Wenchao Xia + * + * This work is licensed under the terms of the GNU LGPL, version 2 or later. + * See the COPYING.LIB file in the top-level directory. + * + */ + +#include +#include +#include +#include +#include +#include +#include "libqblock.h" + +#define TEST_BUF_SIZE 1024 +static unsigned char buf_r[TEST_BUF_SIZE]; +static unsigned char buf_w[TEST_BUF_SIZE] = {0, 0, 0, 0}; + +struct VerifyData { + unsigned char *buf_r; + unsigned char *buf_w; + int len; +}; + +static void print_loc(struct QBlockProtInfo *loc) +{ + switch (loc->prot_type) { + case QB_PROT_NONE: + printf("protocol type [none]."); + break; + case QB_PROT_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 QBlockStaticInfo *info) +{ + printf("=======image location:\n"); + print_loc(&info->loc); + printf("\nvirtual_size %" PRId64 ", format type %d [%s]", + info->virt_size, info->fmt_type, qb_fmttype2str(info->fmt_type)); + printf("\nbacking image location:\n"); + print_loc(&info->backing_loc); + printf("\n"); +} + +static void test_check(struct VerifyData *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) +{ + const char *filename1, *filename2; + struct QBroker *broker = NULL; + struct QBlockState *qbs = NULL; + struct QBlockProtInfo *ol = NULL; + struct QBlockFmtInfo *of = NULL; + struct QBlockStaticInfo *info_st = NULL; + int ret, flag; + int test_offset = 510; + int test_len = 520; + struct VerifyData vdata; + char err_str[1024]; + + vdata.buf_r = buf_r; + vdata.buf_w = buf_w; + vdata.len = test_len; + + filename1 = "./qemu_image1"; + filename2 = "./qemu_image2"; + printf("qemu test, filename1 is %s, filename2 is %s.\n", + filename1, filename2); + + ret = qb_broker_new(&broker); + if (ret < 0) { + goto free; + } + + ret = qb_state_new(broker, &qbs); + if (ret < 0) { + goto free; + } + + ret = qb_prot_info_new(broker, &ol); + if (ret < 0) { + goto free; + } + + ret = qb_fmt_info_new(broker, &of); + if (ret < 0) { + goto free; + } + + /* create a new image */ + + ol->prot_type = QB_PROT_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_PROT_FILE; + ol->prot_op.o_file.filename = filename1; + of->fmt_type = QB_FMT_QCOW2; + of->fmt_op.o_qcow2.backing_loc.prot_type = QB_PROT_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_PROT_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_PROT_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[1] = 1; + buf_w[2] = 2; + buf_w[514] = 4; + 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_prot_info_delete(broker, &ol); + } + if (of != NULL) { + qb_fmt_info_delete(broker, &of); + } + if (broker != NULL) { + qb_broker_delete(&broker); + } + return 0; +}