From f93cdf1ed3323b8d9451a7f4f6365ac30ab8ba81 Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Tue, 30 Nov 2010 11:48:35 +0000 Subject: [PATCH] capitests: Add 'InitScratchFS' test environment. This should allow us to perform filesystem-based write tests much more quickly, because we don't need to recreate the filesystem from scratch each time. --- HACKING | 55 ++++++++++++++++++++++------------------ generator/generator_actions.ml | 8 +++--- generator/generator_capitests.ml | 17 +++++++++++++ generator/generator_types.ml | 21 ++++++++++++--- 4 files changed, 69 insertions(+), 32 deletions(-) diff --git a/HACKING b/HACKING index f661d1d..1121deb 100644 --- a/HACKING +++ b/HACKING @@ -168,35 +168,42 @@ Tests You can supply zero or as many tests as you want per API call. -Note that the test environment has 3 block devices, of size 500MB, -50MB and 10MB (respectively /dev/sda, /dev/sdb, /dev/sdc), and -a fourth ISO block device with some known files on it (/dev/sdd). +The test environment has 4 block devices: + /dev/sda 500MB General block device for testing. + /dev/sdb 50MB /dev/sdb1 is an ext2 filesystem used for testing + filesystem write operations. + /dev/sdc 10MB Used in a few tests where 2 block devices are needed. + /dev/sdd - ISO with fixed content (see images/test.iso). + +To be able to run the tests in a reasonable amount of time, the +virtual machine and block devices are reused between tests. So don't +try testing kill_subprocess :-x Between each test we blockdev-setrw, +umount-all, lvm-remove-all. + +Each test starts with an initial scenario, selected using one of the +'Init*' expressions, described in generator/generator_types.ml. These +initialize the disks in a particular way as described. You should not +assume anything about the previous contents of other disks that are +not initialized. + +You can add a prerequisite clause to any individual test. This is a +run-time check, which, if it fails, causes the test to be skipped. +Useful if testing a command which might not work on all variations of +libguestfs builds. A test that has prerequisite of 'Always' is run +unconditionally. -Note for partitioning purposes, the 500MB device has 1015 cylinders. -Number of cylinders was 63 for IDE emulated disks with precisely -the same size. How exactly this is calculated is a mystery. - -The ISO block device (/dev/sdd) comes from images/test.iso. - -To be able to run the tests in a reasonable amount of time, -the virtual machine and block devices are reused between tests. -So don't try testing kill_subprocess :-x +In addition, packagers can skip individual tests by setting the +environment variables: eg: -Between each test we blockdev-setrw, umount-all, lvm-remove-all. + SKIP_TEST__=1 SKIP_TEST_COMMAND_3=1 (skips test #3 of command) + SKIP_TEST_=1 SKIP_TEST_ZEROFREE=1 (skips all zerofree tests) -Don't assume anything about the previous contents of the block -devices. Use 'Init*' to create some initial scenarios. +and packagers can run only certain tests by setting eg: -You can add a prerequisite clause to any individual test. This -is a run-time check, which, if it fails, causes the test to be -skipped. Useful if testing a command which might not work on -all variations of libguestfs builds. A test that has prerequisite -of 'Always' is run unconditionally. + TEST_ONLY="vfs_type zerofree" -In addition, packagers can skip individual tests by setting the -environment variables: eg: - SKIP_TEST__=1 SKIP_TEST_COMMAND_3=1 (skips test #3 of command) - SKIP_TEST_=1 SKIP_TEST_ZEROFREE=1 (skips all zerofree tests) +See capitests/tests.c for more details of how these environment +variables work. Debugging ---------------------------------------------------------------------- diff --git a/generator/generator_actions.ml b/generator/generator_actions.ml index d66ef9d..c081606 100644 --- a/generator/generator_actions.ml +++ b/generator/generator_actions.ml @@ -1406,13 +1406,13 @@ See also C."); ("list_partitions", (RStringList "partitions", [], []), 8, [], [InitBasicFS, Always, TestOutputListOfDevices ( - [["list_partitions"]], ["/dev/sda1"]); + [["list_partitions"]], ["/dev/sda1"; "/dev/sdb1"]); InitEmpty, Always, TestOutputListOfDevices ( [["part_init"; "/dev/sda"; "mbr"]; ["part_add"; "/dev/sda"; "p"; "64"; "204799"]; ["part_add"; "/dev/sda"; "p"; "204800"; "409599"]; ["part_add"; "/dev/sda"; "p"; "409600"; "-64"]; - ["list_partitions"]], ["/dev/sda1"; "/dev/sda2"; "/dev/sda3"])], + ["list_partitions"]], ["/dev/sda1"; "/dev/sda2"; "/dev/sda3"; "/dev/sdb1"])], "list the partitions", "\ List all the partitions detected on all block devices. @@ -5513,10 +5513,10 @@ error occurs. See also C, C."); ("pwrite_device", (RInt "nbytes", [Device "device"; BufferIn "content"; Int64 "offset"], []), 275, [ProtocolLimitWarning], - [InitPartition, Always, TestOutputList ( + [InitPartition, Always, TestOutputListOfDevices ( [["pwrite_device"; "/dev/sda"; "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"; "446"]; ["blockdev_rereadpt"; "/dev/sda"]; - ["list_partitions"]], [])], + ["list_partitions"]], ["/dev/sdb1"])], "write to part of a device", "\ This command writes to part of a device. It writes the data diff --git a/generator/generator_capitests.ml b/generator/generator_capitests.ml index 190e10f..f5be3e7 100644 --- a/generator/generator_capitests.ml +++ b/generator/generator_capitests.ml @@ -257,6 +257,16 @@ int main (int argc, char *argv[]) /* Cancel previous alarm. */ alarm (0); + /* Create ext2 filesystem on /dev/sdb1 partition. */ + if (guestfs_part_disk (g, \"/dev/sdb\", \"mbr\") == -1) { + printf (\"guestfs_part_disk FAILED\\n\"); + exit (EXIT_FAILURE); + } + if (guestfs_mkfs (g, \"ext2\", \"/dev/sdb1\") == -1) { + printf (\"guestfs_mkfs (/dev/sdb1) FAILED\\n\"); + exit (EXIT_FAILURE); + } + nr_tests = %d; " (500 * 1024 * 1024) (50 * 1024 * 1024) (10 * 1024 * 1024) nr_tests; @@ -435,6 +445,13 @@ and generate_one_test_body name i test_name init test = ["umount_all"]; ["lvm_remove_all"]; ["mount_ro"; "/dev/sdd"; "/"]] + | InitScratchFS -> + pr " /* InitScratchFS for %s */\n" test_name; + List.iter (generate_test_command_call test_name) + [["blockdev_setrw"; "/dev/sda"]; + ["umount_all"]; + ["lvm_remove_all"]; + ["mount_options"; ""; "/dev/sdb1"; "/"]] ); let get_seq_last = function diff --git a/generator/generator_types.ml b/generator/generator_types.ml index be9a195..369a49a 100644 --- a/generator/generator_types.ml +++ b/generator/generator_types.ml @@ -334,15 +334,16 @@ and test_init = | InitEmpty (* /dev/sda contains a single partition /dev/sda1, with random - * content. /dev/sdb and /dev/sdc may have random content. - * No LVM. + * content. No LVM. *) | InitPartition (* /dev/sda contains a single partition /dev/sda1, which is formatted * as ext2, empty [except for lost+found] and mounted on /. - * /dev/sdb and /dev/sdc may have random content. * No LVM. + * + * Note: for testing filesystem operations, it is quicker to use + * InitScratchFS *) | InitBasicFS @@ -350,7 +351,9 @@ and test_init = * /dev/sda1 (is a PV): * /dev/VG/LV (size 8MB): * formatted as ext2, empty [except for lost+found], mounted on / - * /dev/sdb and /dev/sdc may have random content. + * + * Note: only use this if you really need a freshly created filesystem + * on LVM. Normally you should use InitScratchFS instead. *) | InitBasicFSonLVM @@ -359,6 +362,16 @@ and test_init = *) | InitISOFS + (* /dev/sdb1 (write scratch disk) is mounted on /. The filesystem + * will be empty. + * + * Note that this filesystem is not recreated between tests, and + * could contain random files and directories from previous tests. + * Therefore it is recommended that you create uniquely named files + * and directories for your tests. + *) + | InitScratchFS + (* Sequence of commands for testing. *) and seq = cmd list and cmd = string list -- 1.8.3.1