I'd be remiss if I didn't enhance the testsuite to exercise the nbd plugin (after all, the best way to make sure something doesn't regress is to cover it in the testsuite). Borrows heavily from test-file, with the main difference being that I wrap three nbdkit processes instead of one.
Signed-off-by: Eric Blake <ebl...@redhat.com> --- .gitignore | 1 + tests/Makefile.am | 8 ++++ tests/test-nbd.c | 119 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 128 insertions(+) create mode 100644 tests/test-nbd.c diff --git a/.gitignore b/.gitignore index 4baaaad..17b1688 100644 --- a/.gitignore +++ b/.gitignore @@ -49,6 +49,7 @@ Makefile.in /tests/test-file /tests/test-gzip /tests/test-newstyle +/tests/test-nbd /tests/test-ocaml /tests/test-ocaml-plugin.so /tests/test-oldstyle diff --git a/tests/Makefile.am b/tests/Makefile.am index c5429cb..aefb0ca 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -210,6 +210,14 @@ test_file_SOURCES = test-file.c test.h test_file_CFLAGS = $(WARNINGS_CFLAGS) $(LIBGUESTFS_CFLAGS) test_file_LDADD = libtest.la $(LIBGUESTFS_LIBS) +# nbd plugin test. +check_PROGRAMS += test-nbd +TESTS += test-nbd + +test_nbd_SOURCES = test-nbd.c test.h +test_nbd_CFLAGS = $(WARNINGS_CFLAGS) $(LIBGUESTFS_CFLAGS) +test_nbd_LDADD = libtest.la $(LIBGUESTFS_LIBS) + # gzip plugin test. if HAVE_ZLIB if HAVE_GUESTFISH diff --git a/tests/test-nbd.c b/tests/test-nbd.c new file mode 100644 index 0000000..646c0c3 --- /dev/null +++ b/tests/test-nbd.c @@ -0,0 +1,119 @@ +/* nbdkit + * Copyright (C) 2017 Red Hat Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of Red Hat nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY RED HAT AND CONTRIBUTORS ''AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL RED HAT OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <config.h> + +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include <inttypes.h> +#include <string.h> +#include <unistd.h> + +#include <guestfs.h> + +#include "test.h" + +int +main (int argc, char *argv[]) +{ + guestfs_h *g; + int r; + char *data; + char *sockarg = NULL; + size_t i, size; + + /* If wrapping once is good, why not do it twice! Shows that we can + * convert between either style of server options. */ + if (test_start_nbdkit ("-o", "file", "file=file-data", NULL) == -1) + exit (EXIT_FAILURE); + + if (asprintf (&sockarg, "socket=%s", sock) < 0) { + perror ("asprintf"); + exit (EXIT_FAILURE); + } + if (test_start_nbdkit ("-e", "wrap", "nbd", sockarg, NULL) == -1) + exit (EXIT_FAILURE); + free (sockarg); + + if (asprintf (&sockarg, "socket=%s", sock) < 0) { + perror ("asprintf"); + exit (EXIT_FAILURE); + } + if (test_start_nbdkit ("-o", "nbd", sockarg, "export=wrap", NULL) == -1) + exit (EXIT_FAILURE); + free (sockarg); + + g = guestfs_create (); + if (g == NULL) { + perror ("guestfs_create"); + exit (EXIT_FAILURE); + } + + r = guestfs_add_drive_opts (g, "", + GUESTFS_ADD_DRIVE_OPTS_FORMAT, "raw", + GUESTFS_ADD_DRIVE_OPTS_PROTOCOL, "nbd", + GUESTFS_ADD_DRIVE_OPTS_SERVER, server, + -1); + if (r == -1) + exit (EXIT_FAILURE); + + if (guestfs_launch (g) == -1) + exit (EXIT_FAILURE); + + /* Check the data in the file is \x01-\x08 repeated 512 times. */ + data = guestfs_pread_device (g, "/dev/sda", 8 * 512, 0, &size); + if (!data) + exit (EXIT_FAILURE); + if (size != 8 * 512) { + fprintf (stderr, "%s FAILED: unexpected size (actual: %zu, expected: 512)\n", + program_name, size); + exit (EXIT_FAILURE); + } + + for (i = 0; i < 512 * 8; i += 8) { + if (data[i] != 1 || data[i+1] != 2 || + data[i+2] != 3 || data[i+3] != 4 || + data[i+4] != 5 || data[i+5] != 6 || + data[i+6] != 7 || data[i+7] != 8) { + fprintf (stderr, "%s FAILED: unexpected data returned at offset %zu\n", + program_name, i); + exit (EXIT_FAILURE); + } + } + + free (data); + + guestfs_close (g); + exit (EXIT_SUCCESS); +} -- 2.13.6 _______________________________________________ Libguestfs mailing list Libguestfs@redhat.com https://www.redhat.com/mailman/listinfo/libguestfs