ANDROID: selftests: incfs: skip large_file_test test is not enough free space

Make the large_file_test check if there is at least 3GB of free disk
space and skip the test if there is not. This is to make the tests pass
on a VM with limited disk size, now all functional tests are passing.

TAP version 13
1..26
ok 1 basic_file_ops_test
ok 2 cant_touch_index_test
ok 3 dynamic_files_and_data_test
ok 4 concurrent_reads_and_writes_test
ok 5 attribute_test
ok 6 work_after_remount_test
ok 7 child_procs_waiting_for_data_test
ok 8 multiple_providers_test
ok 9 hash_tree_test
ok 10 read_log_test
ok 11 get_blocks_test
ok 12 get_hash_blocks_test
ok 13 large_file_test
ok 14 mapped_file_test
ok 15 compatibility_test
ok 16 data_block_count_test
ok 17 hash_block_count_test
ok 18 per_uid_read_timeouts_test
ok 19 inotify_test
ok 20 verity_test
ok 21 enable_verity_test
ok 22 mmap_test
ok 23 truncate_test
ok 24 stat_test
ok 25 sysfs_test
Error mounting fs.: File exists
Error mounting fs.: File exists
ok 26 sysfs_rename_test

Bug: 211066171

Signed-off-by: Tadeusz Struk <tadeusz.struk@linaro.org>
Change-Id: I2260e2b314429251070d0163c70173f237f86476
This commit is contained in:
Tadeusz Struk 2022-03-09 15:33:45 -08:00
parent 3b25a439ce
commit 5b1bb43708

View File

@ -26,6 +26,7 @@
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/xattr.h>
#include <sys/statvfs.h>
#include <linux/random.h>
#include <linux/stat.h>
@ -43,6 +44,7 @@
#define FS_IOC_GETFLAGS _IOR('f', 1, long)
#define FS_VERITY_FL 0x00100000 /* Verity protected inode */
#define TEST_SKIP 2
#define TEST_FAILURE 1
#define TEST_SUCCESS 0
@ -2793,14 +2795,16 @@ static int get_hash_blocks_test(const char *mount_dir)
return TEST_FAILURE;
}
#define THREE_GB (3LL * 1024 * 1024 * 1024)
#define FOUR_GB (4LL * 1024 * 1024 * 1024) /* Have 1GB of margin */
static int large_file_test(const char *mount_dir)
{
char *backing_dir;
int cmd_fd = -1;
int i;
int result = TEST_FAILURE;
int result = TEST_FAILURE, ret;
uint8_t data[INCFS_DATA_FILE_BLOCK_SIZE] = {};
int block_count = 3LL * 1024 * 1024 * 1024 / INCFS_DATA_FILE_BLOCK_SIZE;
int block_count = THREE_GB / INCFS_DATA_FILE_BLOCK_SIZE;
struct incfs_fill_block *block_buf =
calloc(block_count, sizeof(struct incfs_fill_block));
struct incfs_fill_blocks fill_blocks = {
@ -2809,6 +2813,22 @@ static int large_file_test(const char *mount_dir)
};
incfs_uuid_t id;
int fd = -1;
struct statvfs svfs;
unsigned long long free_disksz;
ret = statvfs(mount_dir, &svfs);
if (ret) {
ksft_print_msg("Can't get disk size. Skipping %s...\n", __func__);
return TEST_SKIP;
}
free_disksz = (unsigned long long)svfs.f_bavail * svfs.f_bsize;
if (FOUR_GB > free_disksz) {
ksft_print_msg("Not enough free disk space (%lldMB). Skipping %s...\n",
free_disksz >> 20, __func__);
return TEST_SKIP;
}
backing_dir = create_backing_dir(mount_dir);
if (!backing_dir)
@ -2849,6 +2869,7 @@ static int large_file_test(const char *mount_dir)
failure:
close(fd);
close(cmd_fd);
unlink("very_large_file");
umount(mount_dir);
free(backing_dir);
return result;
@ -4665,9 +4686,15 @@ struct test_case {
void run_one_test(const char *mount_dir, struct test_case *test_case)
{
int ret;
ksft_print_msg("Running %s\n", test_case->name);
if (test_case->pfunc(mount_dir) == TEST_SUCCESS)
ret = test_case->pfunc(mount_dir);
if (ret == TEST_SUCCESS)
ksft_test_result_pass("%s\n", test_case->name);
else if (ret == TEST_SKIP)
ksft_test_result_skip("%s\n", test_case->name);
else
ksft_test_result_fail("%s\n", test_case->name);
}