Add more basic tests and some clean up.
authorCharles Manning <cdhmanning@gmail.com>
Thu, 19 Mar 2020 02:15:24 +0000 (15:15 +1300)
committerCharles Manning <cdhmanning@gmail.com>
Thu, 19 Mar 2020 02:15:24 +0000 (15:15 +1300)
Signed-off-by: Charles Manning <cdhmanning@gmail.com>
rtems/rtems-y-test/basic-test/yaffs-rtems-basic-test.c
rtems/rtems-y-test/fsx/README
rtems/rtems-y-test/fsx/rtems-fsx.c

index 27448f2122037c14f25b1ee3368b67b6dbca54bb..b3ac44b9404217f3b5d041b5f1d42f2aea905a85 100644 (file)
 #include <rtems/libio.h>
 #include <yaffs/rtems_yaffs.h>
 
-
-#define YPATH "/yaffs_mount_pt"
-
-
-
-
-
 void set_uint8_t_buffer(uint8_t *buf, uint32_t n, uint8_t start, uint8_t inc)
 {
        while (n) {
@@ -31,9 +24,20 @@ void set_uint8_t_buffer(uint8_t *buf, uint32_t n, uint8_t start, uint8_t inc)
        }
 }
 
+void make_test_file_name(char *out, int out_size, char *root_path, char *dir, char *file, int index)
+{
+       if (index >= 0)
+               snprintf(out, out_size, "%s/%s/%s-%d",
+                                       root_path, dir, file, index);
+       else
+               snprintf(out, out_size, "%s/%s/%s",
+                                       root_path, dir, file);
+}
 
-#define FNAME YPATH"/test"
-#define DIRNAME YPATH"/dirtest"
+void make_test_dir_name(char *out, int out_size, char *root_path, char *dir)
+{
+       snprintf(out, out_size, "%s/%s", root_path, dir);
+}
 
 void dump_directory_tree_worker(const char *dname,int recursive)
 {
@@ -44,22 +48,17 @@ void dump_directory_tree_worker(const char *dname,int recursive)
 
        d = opendir(dname);
 
-       if(!d)
-       {
+       if(!d) {
                printf("opendir failed\n");
-       }
-       else
-       {
-               while((de = readdir(d)) != NULL)
-               {
+       } else {
+               while((de = readdir(d)) != NULL) {
                        sprintf(str,"%s/%s",dname,de->d_name);
 
                        lstat(str,&s);
 
-                       printf("%s inode %d length %d mode %X ",
+                       printf("%s inode %d length %d mode 0%o ",
                                str, (int)s.st_ino, (int)s.st_size, s.st_mode);
-                       switch(s.st_mode & S_IFMT)
-                       {
+                       switch(s.st_mode & S_IFMT) {
                                case S_IFREG: printf("data file"); break;
                                case S_IFDIR: printf("directory"); break;
                                case S_IFLNK: printf("symlink -->");
@@ -68,49 +67,95 @@ void dump_directory_tree_worker(const char *dname,int recursive)
                                                          else
                                                                printf("\"%s\"",str);
                                                          break;
-                               default: printf("unknown"); break;
+                               default: printf("unknown mode"); break;
                        }
 
                        printf("\n");
 
                        if((s.st_mode & S_IFMT) == S_IFDIR && recursive)
                                dump_directory_tree_worker(str,1);
-
                }
-
                closedir(d);
        }
-
 }
 
 static void dump_directory_tree(const char *dname)
 {
+       printf("Directory tree of %s\n", dname);
        dump_directory_tree_worker(dname,1);
 }
 
 
+void recursively_delete(char *objname)
+{
+       struct stat s;
+       DIR *d;
+       struct dirent *de;
+       char str[500];
+
+
+       //printf("deleting %s\n", objname);
+       lstat(objname, &s);
+
+       switch(s.st_mode & S_IFMT) {
+               case S_IFREG:
+                       printf("delete data file %s returns %d\n",
+                               objname, unlink(objname));
+               break;
+               case S_IFLNK:
+                       printf("delete symlink %s returns %d\n",
+                               objname, unlink(objname));
+               break;
+               case S_IFDIR:
+                       d = opendir(objname);
+                       if(!d) {
+                               printf("opendir failed\n");
+                       } else {
+                               while((de = readdir(d)) != NULL) {
+                                       snprintf(str, sizeof(str), "%s/%s",
+                                               objname, de->d_name);
+                                       recursively_delete(str);
+                               }
+                               closedir(d);
+                       }
+                       printf("delete directory %s returns %d\n",
+                               objname, rmdir(objname));
+               break;
+       }
+}
+
+
+
 void dumpDir(const char *dname)
-{      dump_directory_tree_worker(dname,0);
+{
+       dump_directory_tree_worker(dname,0);
 }
 
-int run_the_test(void)
+int basic_file_test(char *root_path, char *test_path)
 {
+       char fname[100];
+       char dname[100];
        int fd;
        int ret;
        uint8_t buf[100];
        uint8_t buf2[100];
 
+       make_test_dir_name(dname, sizeof(dname), root_path, test_path);
+       make_test_file_name(fname, sizeof(fname), root_path, test_path, "file", -1);
 
-       dump_directory_tree(YPATH);
+       ret = mkdir(dname, 0777);
 
-       ret = mkdir(DIRNAME, 0777);
-       if (ret < 0)
-               perror("mkdir "DIRNAME);
+       if (ret < 0) {
+               perror("mkdir");
+               return ret;
+       }
 
-       fd = open(FNAME, O_RDWR | O_CREAT | O_TRUNC, 0666);
-       printf("open %s  = %d\n", FNAME, fd);
-       if (fd < 0)
-               perror("opening " FNAME);
+       fd = open(fname, O_RDWR | O_CREAT | O_TRUNC, 0777);
+       printf("open %s  = %d\n", fname, fd);
+       if (fd < 0) {
+               perror("opening test file");
+               return fd;
+       }
 
        set_uint8_t_buffer(buf, sizeof(buf), 0xAA, 1);
 
@@ -118,8 +163,17 @@ int run_the_test(void)
 
        printf("write returned %d\n", ret);
 
-       if (ret == -1)
+       if (ret < 0) {
                perror("writing file");
+               return ret;
+       }
+
+       ret = fdatasync(fd);
+
+       if (ret < 0) {
+               perror("fdatasync problem");
+               return ret;
+       }
 
        ret = lseek(fd, 0, SEEK_END);
 
@@ -132,38 +186,193 @@ int run_the_test(void)
 
        printf("reading file ret = %d\n", ret);
 
-       if (ret == -1)
+       if (ret < 0) {
                perror("reading file");
+               return ret;
+       }
 
+       dump_directory_tree(root_path);
+
+       if (memcmp(buf, buf2, sizeof(buf)) == 0) {
+               printf("buffers match\n");
+               return 0;
+       } else {
+               printf("buffers do not match\n");
+               return -1;
+       }
 
        return ret;
+}
+
+
+int create_delete_files_pass(char *root_path, char *test_path, int n_files, int del_when_done)
+{
+       char fname[100];
+       char lname[100];
+       char dname[100];
+       int *fds = NULL;
+       int ret;
+       int i;
+       uint8_t buf[100];
+       uint8_t buf2[100];
+
+       fds = malloc(n_files * sizeof (int));
+
+       if (!fds) {
+               printf("Failed to malloc\n");
+               ret = -1;
+               goto err;
+       }
 
-#if 0
-
-
-   fd = open("test1", O_CREAT);
-   printf( "fcntl flags =0x%x\n", fcntl( fd, F_GETFL ) );
-   close(fd);
-
-   fd = open("test", O_RDONLY);
-   if (fd == -1) {
-     printf("Starting on the wrong foot....\n");
-     exit(-1);
-   }
-
-   printf( "fcntl flags =0x%x\n", fcntl( fd, F_GETFL ) );
-
-   fp = fdopen(fd, "r");
-   if (fp == NULL) {
-      printf("Nothing ever goes my way!\n");
-      close(fd);
-      exit(-1);
-   } else {
-      printf("Soon, I will be able to take over the world!\n");
-      fgets(str, 200, fp);
-      printf("%s\n", str);
-      fclose(fp);
-   }
-#endif
+       make_test_dir_name(dname, sizeof(dname), root_path, test_path);
+
+       recursively_delete(dname);
+
+       ret = access(dname, F_OK);
+       printf("access of non-existing expects -1 returned %d\n", ret);
+
+       if (ret != -1) {
+               printf("access should have been -1, was %d\n", ret);
+               ret = -1;
+               goto err;
+       }
+
+       ret = mkdir(dname, 0777);
+
+       if (ret < 0) {
+               perror("mkdir");
+               goto err;
+       }
+
+       ret = access(dname, F_OK);
+       printf("access of existing returned %d\n", ret);
+
+       if (ret < 0) {
+               perror("access of existing directory");
+               goto err;
+       }
+
+       for (i = 0; i < n_files; i++) {
+
+               make_test_file_name(fname, sizeof(fname), root_path, test_path, "file-", i);
+               make_test_file_name(lname, sizeof(lname), root_path, test_path, "link-", i);
+
+               ret = symlink(fname, lname);
+
+               if (ret < 0) {
+                       perror("creating symlink");
+                       goto err;
+               }
+
+               fds[i] = open(fname, O_RDWR | O_CREAT | O_TRUNC, 0777);
+               printf("open %s  = %d\n", fname, fds[i]);
+
+               if (fds[i] < 0) {
+                       perror("opening test file");
+                       ret = fds[i];
+                       goto err;
+               }
+       }
+
+       set_uint8_t_buffer(buf, sizeof(buf), 0xAA, 1);
+
+       for(i = 0; i < n_files; i++) {
+               ret = write(fds[i], buf, sizeof(buf));
+               printf("write returned %d\n", ret);
+               if (ret < 0) {
+                       perror("writing file");
+                       goto err;
+               }
+       }
+
+       for(i = 0; i < n_files; i++) {
+               int trunc_size = sizeof(buf2)/2;
+
+               ret = lseek(fds[i], 0, SEEK_END);
+
+               printf("lseek end ret = %d\n", ret);
+
+               ret = lseek(fds[i], 0, SEEK_SET);
+               printf("lseek start ret = %d\n", ret);
+
+               ret = read(fds[i], buf2, sizeof(buf2));
+
+               printf("reading file ret = %d\n", ret);
+               if (ret < 0) {
+                       perror("reading file");
+                       goto err;
+               }
+               ret = ftruncate(fds[i], trunc_size);
+
+               if (ret < 0) {
+                       perror("ftruncate");
+                       goto err;
+               }
+
+               ret = lseek(fds[i], 0, SEEK_END);
+               if (ret != trunc_size) {
+                       printf("truncated size is %d but lseek returned %d\n",
+                               trunc_size, ret);
+                       ret = -1;
+                       goto err;
+               }
+
+
+       }
+
+       for(i = 0; i < n_files; i++) {
+               ret = close(fds[i]);
+               if (ret < 0) {
+                       perror("closing file");
+                       goto err;
+               }
+       }
+
+       dump_directory_tree(root_path);
+
+       if (memcmp(buf, buf2, sizeof(buf)) == 0) {
+               printf("buffers match\n");
+               ret = 0;
+       } else {
+               printf("buffers do not match\n");
+               ret = -1;
+       }
+
+       if (del_when_done)
+               recursively_delete(dname);
+err:
+       free(fds);
+
+       return ret;
+}
+
+int create_delete_files(char *root_path, char *test_path, int n_files, int n_passes)
+{
+       int i;
+       int ret;
+       for (i = 0; i < n_passes; i++) {
+               printf("\nCreate and Delete Files Pass %d\n", i);
+               ret = create_delete_files_pass(root_path, test_path, n_files, 1);
+               if (ret < 0)
+                       return ret;
+       }
+       return 0;
+}
+
+#define YPATH "/yaffs_mount_pt"
+#define FNAME YPATH"/test"
+#define DIRNAME YPATH"/dirtest"
+
+void check_fail(int ret)
+{
+       if (ret < 0)
+               printf("Test failed\n");
 }
 
+void run_the_test(void)
+{
+       check_fail(basic_file_test(YPATH, "basic-test-dir"));
+       check_fail(create_delete_files(YPATH, "create-del-test-dir", 15, 50));
+
+       printf("\n\n\nAll Yaffs Tests passed Ok\n\n\n");
+}
index 5b72b78ce2bc3e24c4b7ee3a3b2681bcaa022a88..d0d8b42ea02d29027e8fca3a322eb073d9f62804 100644 (file)
@@ -3,6 +3,12 @@ stress testing file system operations, particularly those related to
 seeking, truncating etc.
 
 A good output looks like:
+
+Starting
+Created simulated flash device 0x2d24348
+yaffs: 0 blocks to be sorted...
+filesystem_init("/yaffs_mount_pt") returned 0
+mkdir returned 0
 fsx_init done
 truncating to largest ever: 0x1cbf7
 truncating to largest ever: 0x27453
@@ -14,21 +20,19 @@ truncating to largest ever: 0x3fd22
 truncating to largest ever: 0x3fe0b
 truncating to largest ever: 0x3fe29
 truncating to largest ever: 0x3ff4b
-truncating to largest ever: 0x3ff8c
-truncating to largest ever: 0x3ffa2
-truncating to largest ever: 0x3ffe5
-truncating to largest ever: 0x3fff8
-skipping zero size write
-skipping zero size read
-truncating to largest ever: 0x3fffd
-truncating to largest ever: 0x3ffff
-skipping zero size read
-skipping zero size read
-skipping zero size write
-skipping zero size write
-skipping zero size read
-skipping zero size read
-skipping zero size read
-skipping zero size read
-skipping zero size read
-skipping zero size read
+All operations completed A-OK!
+fsx wanted to exit with 0
+
+Flashsim stats
+reads.....44373
+writes....46000
+erases....644
+
+
+
+To run for longer or shorter periods modify this line:
+      return fsx_main(FSX_TEST_DIR, 10000);
+
+
+This program has been run overnight (using a very large value) and no 
+problems were observed.
\ No newline at end of file
index 8749b2a553121e610ce8e90c11db66320df5714e..54b0cee694751749d13e2ac1eacae4e9f59dedf9 100644 (file)
@@ -934,5 +934,5 @@ int run_the_test(void)
        if (ret < 0)
                perror("mkdir");
 
-       return fsx_main(FSX_TEST_DIR, 100000000);
+       return fsx_main(FSX_TEST_DIR, 10000);
 }