]> git.saurik.com Git - apple/copyfile.git/blob - copyfile_test/main.c
copyfile-166.tar.gz
[apple/copyfile.git] / copyfile_test / main.c
1 //
2 // main.c
3 // copyfile_test
4 //
5
6 #include <stdbool.h>
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <string.h>
10 #include <sys/mount.h>
11 #include <sys/stat.h>
12 #include <removefile.h>
13
14 #include "sparse_test.h"
15 #include "stat_test.h"
16 #include "test_utils.h"
17
18 #define DISK_IMAGE_SIZE_MB 512
19
20 #if TARGET_OS_OSX
21 #define TEST_DIR MOUNT_PATH
22 #define USING_DISK_IMAGE 1
23 #else
24 #define TEST_DIR "/tmp/copyfile_test"
25 #define USING_DISK_IMAGE 0
26 #endif // TARGET_OS_OSX
27
28 #define MIN_BLOCKSIZE_B 512
29 #define DEFAULT_BLOCKSIZE_B 4096
30 #define MAX_BLOCKSIZE_B 16384
31
32 int main(__unused int argc, __unused const char * argv[]) {
33 bool failed = false;
34 struct statfs stb;
35
36 // Create a disk image to run our tests in.
37 if (USING_DISK_IMAGE) {
38 disk_image_create(APFS_FSTYPE, DISK_IMAGE_SIZE_MB);
39 } else {
40 (void)removefile(TEST_DIR, NULL, REMOVEFILE_RECURSIVE);
41 assert_no_err(mkdir(TEST_DIR, 0777));
42 }
43
44 // Make sure the test directory exists, is apfs formatted,
45 // and that we have a sane block size.
46 assert_no_err(statfs(TEST_DIR, &stb));
47 assert_no_err(memcmp(stb.f_fstypename, APFS_FSTYPE, sizeof(APFS_FSTYPE)));
48 if (stb.f_bsize < MIN_BLOCKSIZE_B || stb.f_bsize > MAX_BLOCKSIZE_B) {
49 stb.f_bsize = DEFAULT_BLOCKSIZE_B;
50 }
51
52 // Run our tests.
53 sranddev();
54 failed |= do_sparse_test(TEST_DIR, stb.f_bsize);
55 failed |= do_sparse_recursive_test(TEST_DIR, stb.f_bsize);
56 failed |= do_fcopyfile_offset_test(TEST_DIR, stb.f_bsize);
57 failed |= do_preserve_dst_flags_test(TEST_DIR, stb.f_bsize);
58
59 // Cleanup the disk image we ran our tests on.
60 if (USING_DISK_IMAGE) {
61 disk_image_destroy(false);
62 } else {
63 (void)removefile(TEST_DIR, NULL, REMOVEFILE_RECURSIVE);
64 }
65
66 return failed ? EXIT_FAILURE : EXIT_SUCCESS;
67 }