diff options
Diffstat (limited to 'tests/fs-tests/integrity')
| -rw-r--r-- | tests/fs-tests/integrity/integck.c | 112 | 
1 files changed, 81 insertions, 31 deletions
| diff --git a/tests/fs-tests/integrity/integck.c b/tests/fs-tests/integrity/integck.c index ea3684b..281de81 100644 --- a/tests/fs-tests/integrity/integck.c +++ b/tests/fs-tests/integrity/integck.c @@ -29,14 +29,24 @@  #include <errno.h>  #include <limits.h>  #include <dirent.h> +#include <getopt.h>  #include <sys/mman.h>  #include "tests.h" +#define PROGRAM_VERSION "1.1"  #define PROGRAM_NAME "integck"  #include "common.h"  #define MAX_RANDOM_SEED 10000000 +/* The variables below are set by command line arguments */ +static struct { +	long repeat_cnt; +	const char *mount_point; +} args = { +	.repeat_cnt = 1, +}; +  /* Structures to store data written to the test file system,     so that we can check whether the file system is correct. */ @@ -235,7 +245,7 @@ static char *dir_path(struct dir_info *parent, const char *name)  	char *path;  	if (!parent) -		return cat_paths(tests_file_system_mount_dir, name); +		return cat_paths(args.mount_point, name);  	parent_path = dir_path(parent->parent, parent->name);  	path = cat_paths(parent_path, name);  	free(parent_path); @@ -1968,8 +1978,7 @@ void integck(void)  	dir_check(top_dir);  	check_deleted_files(); -	for (rpt = 0; tests_repeat_parameter == 0 || -				rpt < tests_repeat_parameter; ++rpt) { +	for (rpt = 0; args.repeat_cnt == 0 || rpt < args.repeat_cnt; ++rpt) {  		update_test_data();  		if (!tests_fs_is_rootfs()) { @@ -1989,44 +1998,85 @@ void integck(void)  	CHECK(rmdir(dir_name) != -1);  } -/* Title of this test */ +static const char doc[] = PROGRAM_NAME " version " PROGRAM_VERSION +" - a stress test which checks the file-system integrity.\n" +"It creates a directory named \"integck_test_dir_pid\", where where pid is the\n" +"process id. Then it randomly creates and deletes files, directories, symlinks\n" +"and hardlinks, randomly writes and truncate files, sometimes makes holes in\n" +"files, sometimes fsync()'s them. Then it un-mounts and re-mounts the test file\n" +"system and checks the contents - everything (files, dirs, etc) should be there\n" +"and the contents of the files should be correct.\n" +"This is repeated a number of times (set with -n, default 1)."; + +static const char optionsstr[] = +"-n, --repeat=<count> repeat count, default is 1; zero value - repeat forever\n" +"-h, -?, --help       print help message\n" +"-V, --version        print program version\n"; + +static const struct option long_options[] = { +	{ .name = "repeat",  .has_arg = 1, .flag = NULL, .val = 'n' }, +	{ .name = "help",    .has_arg = 0, .flag = NULL, .val = 'h' }, +	{ .name = "version", .has_arg = 0, .flag = NULL, .val = 'V' }, +	{ NULL, 0, NULL, 0}, +}; -const char *integck_get_title(void) +/* + * Parse input command-line options. Returns zero on success and -1 on error. + */ +static int parse_opts(int argc, char * const argv[])  { -	return "Test file system integrity"; -} +	while (1) { +		int key, error = 0; -/* Description of this test */ +		key = getopt_long(argc, argv, "n:Vh?", long_options, NULL); +		if (key == -1) +			break; -const char *integck_get_description(void) -{ -	return -		"Create a directory named integck_test_dir_pid " \ -		"where pid is the process id. " \ -		"Randomly create and delete files and directories. " \ -		"Randomly write to and truncate files. " \ -		"Un-mount and re-mount test file " \ -		"system (if it is not the root file system ). " \ -		"Check data. Make more random changes. " \ -		"Un-mount and re-mount again. Check again. " \ -		"Repeat some number of times. " -		"The repeat count is set by the -n or --repeat option, " \ -		"otherwise it defaults to 1. " \ -		"A repeat count of zero repeats forever."; +		switch (key) { +		case 'n': +			args.repeat_cnt = simple_strtoul(optarg, &error); +			if (error || args.repeat_cnt < 0) +				return errmsg("bad repeat count: \"%s\"", optarg); +			break; +		case 'V': +			fprintf(stderr, "%s\n", PROGRAM_VERSION); +			exit(EXIT_SUCCESS); + +		case 'h': +		case '?': +			fprintf(stderr, "%s\n\n", doc); +			fprintf(stderr, "%s\n", optionsstr); +			exit(EXIT_SUCCESS); + +		case ':': +			return errmsg("parameter is missing"); + +		default: +			fprintf(stderr, "Use -h for help\n"); +			return -1; +		} +	} + +	if (optind == argc) +		return errmsg("test file-system was not specified (use -h for help)"); +	else if (optind != argc - 1) +		return errmsg("more then one test file-system specified (use -h for help)"); + +	args.mount_point = argv[optind]; +	return 0;  }  int main(int argc, char *argv[])  { -	int run_test; +	int ret; -	/* Set default test repetition */ -	tests_repeat_parameter = 1; +	ret = parse_opts(argc, argv); +	if (ret) +		return EXIT_FAILURE; -	/* Handle common arguments */ -	run_test = tests_get_args(argc, argv, integck_get_title(), -			integck_get_description(), "n"); -	if (!run_test) -		return 1; +	/* Temporary hack - will be fixed a bit later */ +	tests_file_system_mount_dir = (void *)args.mount_point; +	tests_file_system_type = "ubifs";  	/* Change directory to the file system and check it is ok for testing */  	tests_check_test_file_system(); | 
