mirror of
https://github.com/libguestfs/libguestfs.git
synced 2026-03-21 22:53:37 +00:00
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.
This commit is contained in:
51
HACKING
51
HACKING
@@ -168,36 +168,43 @@ 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).
|
||||
|
||||
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.
|
||||
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.
|
||||
|
||||
The ISO block device (/dev/sdd) comes from images/test.iso.
|
||||
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.
|
||||
|
||||
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.
|
||||
|
||||
Don't assume anything about the previous contents of the block
|
||||
devices. Use 'Init*' to create some initial scenarios.
|
||||
|
||||
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.
|
||||
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.
|
||||
|
||||
In addition, packagers can skip individual tests by setting the
|
||||
environment variables: eg:
|
||||
environment variables: eg:
|
||||
|
||||
SKIP_TEST_<CMD>_<NUM>=1 SKIP_TEST_COMMAND_3=1 (skips test #3 of command)
|
||||
SKIP_TEST_<CMD>=1 SKIP_TEST_ZEROFREE=1 (skips all zerofree tests)
|
||||
|
||||
and packagers can run only certain tests by setting eg:
|
||||
|
||||
TEST_ONLY="vfs_type zerofree"
|
||||
|
||||
See capitests/tests.c for more details of how these environment
|
||||
variables work.
|
||||
|
||||
Debugging
|
||||
----------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -1406,13 +1406,13 @@ See also C<guestfs_list_filesystems>.");
|
||||
|
||||
("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<guestfs_download>, C<guestfs_pread>.");
|
||||
|
||||
("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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user