[Pkg-libvirt-commits] [SCM] Libguestfs Debian packaging branch, experimental, updated. debian/1%1.21.40-1
Richard W.M. Jones
rjones at redhat.com
Sat Jun 1 11:04:28 UTC 2013
The following commit has been merged in the experimental branch:
commit 5faba45fe1adfaeb316e4616d4e3a4937e57e599
Author: Richard W.M. Jones <rjones at redhat.com>
Date: Wed May 1 09:44:47 2013 +0100
tests/c-api: Various code refactorings.
- Don't use fixed names for the disks. This will allow us to
parallelize this test.
- Add a new "GETKEY:<key>" String parameter which can retrieve keys
from the handle. The temporary disk names are stored as keys.
- Don't test the close callback. However this uses the close callback
mechanism to delete the temporary disks, and in any case close
callbacks are well tested by the language binding tests.
- The generated code now produces a static array of tests (instead of
a 'perform_tests' function), making it possible to parallelize.
diff --git a/generator/actions.ml b/generator/actions.ml
index bc58a48..0bb04be 100644
--- a/generator/actions.ml
+++ b/generator/actions.ml
@@ -2566,11 +2566,11 @@ data." };
style = RString "format", [String "filename"], [];
tests = [
InitEmpty, Always, TestResultString (
- [["disk_format"; "test1.img"]], "raw");
+ [["disk_format"; "GETKEY:test1"]], "raw");
InitEmpty, Always, TestResultString (
- [["disk_format"; "test2.img"]], "raw");
+ [["disk_format"; "GETKEY:test2"]], "raw");
InitEmpty, Always, TestResultString (
- [["disk_format"; "test3.img"]], "raw");
+ [["disk_format"; "GETKEY:test3"]], "raw");
];
shortdesc = "detect the disk format of a disk image";
longdesc = "\
@@ -2588,11 +2588,11 @@ See also: L<guestfs(3)/DISK IMAGE FORMATS>" };
style = RInt64 "size", [String "filename"], [];
tests = [
InitEmpty, Always, TestResult (
- [["disk_virtual_size"; "test1.img"]], "ret == UINT64_C (524288000)");
+ [["disk_virtual_size"; "GETKEY:test1"]], "ret == UINT64_C (524288000)");
InitEmpty, Always, TestResult (
- [["disk_virtual_size"; "test2.img"]], "ret == UINT64_C (52428800)");
+ [["disk_virtual_size"; "GETKEY:test2"]], "ret == UINT64_C (52428800)");
InitEmpty, Always, TestResult (
- [["disk_virtual_size"; "test3.img"]], "ret == UINT64_C (10485760)");
+ [["disk_virtual_size"; "GETKEY:test3"]], "ret == UINT64_C (10485760)");
];
shortdesc = "return virtual size of a disk";
longdesc = "\
@@ -2607,11 +2607,11 @@ circumstances. See L<guestfs(3)/CVE-2010-3851>." };
style = RBool "backingfile", [String "filename"], [];
tests = [
InitEmpty, Always, TestResultFalse (
- [["disk_has_backing_file"; "test1.img"]]);
+ [["disk_has_backing_file"; "GETKEY:test1"]]);
InitEmpty, Always, TestResultFalse (
- [["disk_has_backing_file"; "test2.img"]]);
+ [["disk_has_backing_file"; "GETKEY:test2"]]);
InitEmpty, Always, TestResultFalse (
- [["disk_has_backing_file"; "test3.img"]]);
+ [["disk_has_backing_file"; "GETKEY:test3"]]);
];
shortdesc = "return whether disk has a backing file";
longdesc = "\
diff --git a/generator/tests_c_api.ml b/generator/tests_c_api.ml
index 371ee70..3564be9 100644
--- a/generator/tests_c_api.ml
+++ b/generator/tests_c_api.ml
@@ -99,31 +99,12 @@ let rec generate_tests () =
let nr_tests = List.length test_names in
pr "size_t nr_tests = %d;\n" nr_tests;
pr "\n";
-
- pr "\
-size_t
-perform_tests (guestfs_h *g)
-{
- size_t test_num = 0;
- size_t nr_failed = 0;
-
-";
-
- iteri (
- fun i test_name ->
- pr " test_num++;\n";
- pr " next_test (g, test_num, nr_tests, \"%s\");\n" test_name;
- pr " if (%s (g) == -1) {\n" test_name;
- pr " printf (\"FAIL: %%s\\n\", \"%s\");\n" test_name;
- pr " nr_failed++;\n";
- pr " }\n";
+ pr "struct test tests[%d] = {\n" nr_tests;
+ List.iter (
+ fun name ->
+ pr " { .name = \"%s\", .test_fn = %s },\n" (c_quote name) name
) test_names;
-
- pr "\
-
- return nr_failed;
-}
-"
+ pr "};\n"
and generate_one_test name optional i (init, prereq, test) =
let test_name = sprintf "test_%s_%d" name i in
@@ -349,6 +330,10 @@ and generate_test_command_call ?(expect_error = false) ?test ?ret test_name cmd=
List.iter (
function
| OptString _, "NULL", _ -> ()
+ | String _, arg, sym
+ when String.length arg >= 7 && String.sub arg 0 7 = "GETKEY:" ->
+ pr " const char *%s = guestfs_get_private (g, \"%s\");\n"
+ sym (c_quote (String.sub arg 7 (String.length arg - 7)))
| Pathname _, arg, sym
| Device _, arg, sym
| Mountable _, arg, sym
diff --git a/tests/c-api/tests-main.c b/tests/c-api/tests-main.c
index 69d567e..1e569da 100644
--- a/tests/c-api/tests-main.c
+++ b/tests/c-api/tests-main.c
@@ -162,14 +162,6 @@ print_strings (char *const *argv)
printf ("\t%s\n", argv[argc]);
}
-static void
-incr (guestfs_h *g, void *iv, uint64_t event, int eh, int flags,
- const char *buf, size_t buf_len, const uint64_t *array, size_t array_len)
-{
- int *i = (int *) iv;
- (*i)++;
-}
-
static int compare_lists (char **, char **, int (*) (const char *, const char *));
/* Compare 'ret' to the string list that follows. */
@@ -393,9 +385,8 @@ substitute_srcdir (const char *path)
return ret;
}
-void
-next_test (guestfs_h *g, size_t test_num, size_t nr_tests,
- const char *test_name)
+static void
+next_test (guestfs_h *g, size_t test_num, const char *test_name)
{
if (guestfs_get_verbose (g))
printf ("-------------------------------------------------------------------------------\n");
@@ -418,32 +409,36 @@ skipped (const char *test_name, const char *fs, ...)
test_name, reason);
}
-int
-main (int argc, char *argv[])
+static void
+delete_file (guestfs_h *g, void *filenamev,
+ uint64_t event, int eh, int flags,
+ const char *buf, size_t buf_len,
+ const uint64_t *array, size_t array_len)
{
- const char *filename;
- int fd;
- size_t nr_failed ;
- int close_sentinel = 1;
- guestfs_h *g;
+ char *filename = filenamev;
- setbuf (stdout, NULL);
+ unlink (filename);
+ free (filename);
+}
- no_test_warnings ();
+static void
+add_disk (guestfs_h *g, const char *key, off_t size)
+{
+ CLEANUP_FREE char *tmpdir = guestfs_get_tmpdir (g);
+ char *filename;
+ int fd;
- g = guestfs_create ();
- if (g == NULL) {
- printf ("FAIL: guestfs_create\n");
+ if (asprintf (&filename, "%s/diskXXXXXX", tmpdir) == -1) {
+ perror ("asprintf");
exit (EXIT_FAILURE);
}
- filename = "test1.img";
- fd = open (filename, O_WRONLY|O_CREAT|O_NOCTTY|O_TRUNC|O_CLOEXEC, 0666);
+ fd = mkostemp (filename, O_WRONLY|O_CREAT|O_NOCTTY|O_TRUNC|O_CLOEXEC);
if (fd == -1) {
- perror (filename);
+ perror ("mkstemp");
exit (EXIT_FAILURE);
}
- if (ftruncate (fd, 524288000) == -1) {
+ if (ftruncate (fd, size) == -1) {
perror ("ftruncate");
close (fd);
unlink (filename);
@@ -454,55 +449,43 @@ main (int argc, char *argv[])
unlink (filename);
exit (EXIT_FAILURE);
}
- if (guestfs_add_drive (g, filename) == -1) {
- printf ("FAIL: guestfs_add_drive %s\n", filename);
- exit (EXIT_FAILURE);
- }
- filename = "test2.img";
- fd = open (filename, O_WRONLY|O_CREAT|O_NOCTTY|O_TRUNC|O_CLOEXEC, 0666);
- if (fd == -1) {
- perror (filename);
- exit (EXIT_FAILURE);
- }
- if (ftruncate (fd, 52428800) == -1) {
- perror ("ftruncate");
- close (fd);
- unlink (filename);
- exit (EXIT_FAILURE);
- }
- if (close (fd) == -1) {
- perror (filename);
- unlink (filename);
- exit (EXIT_FAILURE);
- }
if (guestfs_add_drive (g, filename) == -1) {
printf ("FAIL: guestfs_add_drive %s\n", filename);
exit (EXIT_FAILURE);
}
- filename = "test3.img";
- fd = open (filename, O_WRONLY|O_CREAT|O_NOCTTY|O_TRUNC|O_CLOEXEC, 0666);
- if (fd == -1) {
- perror (filename);
+ if (guestfs_set_event_callback (g, delete_file,
+ GUESTFS_EVENT_CLOSE, 0, filename) == -1) {
+ printf ("FAIL: guestfs_set_event_callback (GUESTFS_EVENT_CLOSE)\n");
exit (EXIT_FAILURE);
}
- if (ftruncate (fd, 10485760) == -1) {
- perror ("ftruncate");
- close (fd);
- unlink (filename);
- exit (EXIT_FAILURE);
- }
- if (close (fd) == -1) {
- perror (filename);
- unlink (filename);
- exit (EXIT_FAILURE);
- }
- if (guestfs_add_drive (g, filename) == -1) {
- printf ("FAIL: guestfs_add_drive %s\n", filename);
+
+ /* Record the real filename in the named private key. Tests can
+ * retrieve these names using the magic "GETKEY:<key>" String
+ * parameter.
+ */
+ guestfs_set_private (g, key, filename);
+}
+
+/* Create the handle, with attached disks. */
+static guestfs_h *
+create_handle (void)
+{
+ guestfs_h *g;
+
+ g = guestfs_create ();
+ if (g == NULL) {
+ printf ("FAIL: guestfs_create\n");
exit (EXIT_FAILURE);
}
+ add_disk (g, "test1", 524288000);
+
+ add_disk (g, "test2", 52428800);
+
+ add_disk (g, "test3", 10485760);
+
if (guestfs_add_drive_ro (g, "../data/test.iso") == -1) {
printf ("FAIL: guestfs_add_drive_ro ../data/test.iso\n");
exit (EXIT_FAILURE);
@@ -529,21 +512,43 @@ main (int argc, char *argv[])
exit (EXIT_FAILURE);
}
- nr_failed = perform_tests (g);
+ return g;
+}
- /* Check close callback is called. */
- guestfs_set_event_callback (g, incr, GUESTFS_EVENT_CLOSE, 0, &close_sentinel);
+static size_t
+perform_tests (guestfs_h *g)
+{
+ size_t test_num;
+ size_t nr_failed = 0;
+ struct test *t;
+
+ for (test_num = 0; test_num < nr_tests; ++test_num) {
+ t = &tests[test_num];
+ next_test (g, test_num, t->name);
+ if (t->test_fn (g) == -1) {
+ printf ("FAIL: %s\n", t->name);
+ nr_failed++;
+ }
+ }
- guestfs_close (g);
+ return nr_failed;
+}
- if (close_sentinel != 2) {
- fprintf (stderr, "FAIL: close callback was not called\n");
- exit (EXIT_FAILURE);
- }
+int
+main (int argc, char *argv[])
+{
+ size_t nr_failed;
+ guestfs_h *g;
+
+ setbuf (stdout, NULL);
+
+ no_test_warnings ();
+
+ g = create_handle ();
- unlink ("test1.img");
- unlink ("test2.img");
- unlink ("test3.img");
+ nr_failed = perform_tests (g);
+
+ guestfs_close (g);
if (nr_failed > 0) {
printf ("***** %zu / %zu tests FAILED *****\n", nr_failed, nr_tests);
diff --git a/tests/c-api/tests.h b/tests/c-api/tests.h
index 1226790..2c846d9 100644
--- a/tests/c-api/tests.h
+++ b/tests/c-api/tests.h
@@ -19,6 +19,11 @@
#ifndef TESTS_H_
#define TESTS_H_
+struct test {
+ int (*test_fn) (guestfs_h *g);
+ const char *name;
+};
+extern struct test tests[];
extern size_t nr_tests;
extern int init_none (guestfs_h *g);
@@ -29,7 +34,6 @@ extern int init_basic_fs (guestfs_h *g);
extern int init_basic_fs_on_lvm (guestfs_h *g);
extern int init_iso_fs (guestfs_h *g);
extern int init_scratch_fs (guestfs_h *g);
-extern size_t perform_tests (guestfs_h *g);
extern void no_test_warnings (void);
extern int is_string_list (char **ret, size_t n, ...);
extern int is_device_list (char **ret, size_t n, ...);
@@ -40,7 +44,6 @@ extern const char *get_key (char **hash, const char *key);
extern int check_hash (char **ret, const char *key, const char *expected);
extern int match_re (const char *str, const char *pattern);
extern char *substitute_srcdir (const char *path);
-extern void next_test (guestfs_h *g, size_t test_num, size_t nr_tests, const char *test_name);
extern void skipped (const char *test_name, const char *fs, ...) __attribute__((format (printf,2,3)));
#endif /* TESTS_H_ */
--
Libguestfs Debian packaging
More information about the Pkg-libvirt-commits
mailing list