qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
To: qemu-devel@nongnu.org
Cc: stefanha@gmail.com, aliguori@us.ibm.com,
	Wenchao Xia <xiawenc@linux.vnet.ibm.com>,
	pbonzini@redhat.com
Subject: [Qemu-devel] [qemu-devel] [PATCH V2 3/3] [RFC] libqblock-test case.
Date: Thu,  9 Aug 2012 18:12:31 +0800	[thread overview]
Message-ID: <1344507151-11217-1-git-send-email-xiawenc@linux.vnet.ibm.com> (raw)

  This file simulate the caller to test the library.

Signed-off-by: Wenchao Xia <xiawenc@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

             reply	other threads:[~2012-08-09 10:12 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-08-09 10:12 Wenchao Xia [this message]
2012-08-09 17:49 ` [Qemu-devel] [qemu-devel] [PATCH V2 3/3] [RFC] libqblock-test case Blue Swirl
2012-08-10  8:38   ` Wenchao Xia

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1344507151-11217-1-git-send-email-xiawenc@linux.vnet.ibm.com \
    --to=xiawenc@linux.vnet.ibm.com \
    --cc=aliguori@us.ibm.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).