aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/fs-tests/integrity/integck.c112
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();