#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mount.h>
#include <sys/stat.h>
#include <removefile.h>
#include "sparse_test.h"
#include "stat_test.h"
#include "test_utils.h"
#define DISK_IMAGE_SIZE_MB 512
#if TARGET_OS_OSX
#define TEST_DIR MOUNT_PATH
#define USING_DISK_IMAGE 1
#else
#define TEST_DIR "/tmp/copyfile_test"
#define USING_DISK_IMAGE 0
#endif // TARGET_OS_OSX
#define MIN_BLOCKSIZE_B 512
#define DEFAULT_BLOCKSIZE_B 4096
#define MAX_BLOCKSIZE_B 16384
int main(__unused int argc, __unused const char * argv[]) {
bool failed = false;
struct statfs stb;
if (USING_DISK_IMAGE) {
disk_image_create(APFS_FSTYPE, DISK_IMAGE_SIZE_MB);
} else {
(void)removefile(TEST_DIR, NULL, REMOVEFILE_RECURSIVE);
assert_no_err(mkdir(TEST_DIR, 0777));
}
assert_no_err(statfs(TEST_DIR, &stb));
assert_no_err(memcmp(stb.f_fstypename, APFS_FSTYPE, sizeof(APFS_FSTYPE)));
if (stb.f_bsize < MIN_BLOCKSIZE_B || stb.f_bsize > MAX_BLOCKSIZE_B) {
stb.f_bsize = DEFAULT_BLOCKSIZE_B;
}
sranddev();
failed |= do_sparse_test(TEST_DIR, stb.f_bsize);
failed |= do_sparse_recursive_test(TEST_DIR, stb.f_bsize);
failed |= do_fcopyfile_offset_test(TEST_DIR, stb.f_bsize);
failed |= do_preserve_dst_flags_test(TEST_DIR, stb.f_bsize);
failed |= do_preserve_dst_tracked_test(TEST_DIR, stb.f_bsize);
if (USING_DISK_IMAGE) {
disk_image_destroy(false);
} else {
(void)removefile(TEST_DIR, NULL, REMOVEFILE_RECURSIVE);
}
return failed ? EXIT_FAILURE : EXIT_SUCCESS;
}