yaffs u-boot: Fix erase for inband tags.
[yaffs2.git] / direct / basic-test / dtest.c
index fa48158d402b36afed578d9fcd47ab2ac48299f9..3cd13abe5593d7c9d6df12b9125e27c7f6342725 100644 (file)
@@ -9,12 +9,9 @@
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
- *
  */
 
 
-
-
 #include <stdio.h>
 #include <string.h>
 #include <unistd.h>
@@ -515,7 +512,7 @@ void leave_unlinked_file(const char *path,int maxIterations,int siz)
 void dumpDirFollow(const char *dname)
 {
        yaffs_DIR *d;
-       yaffs_dirent *de;
+       struct yaffs_dirent *de;
        struct yaffs_stat s;
        char str[100];
 
@@ -533,7 +530,7 @@ void dumpDirFollow(const char *dname)
 
                        yaffs_lstat(str,&s);
 
-                       printf("%s ino %d length %d mode %X ",de->d_name,(int)s.st_ino,(int)s.st_size,s.st_mode);
+                       printf("%s ino %lld length %d mode %X ",de->d_name,(int)s.st_ino,s.st_size,s.st_mode);
                        switch(s.st_mode & S_IFMT)
                        {
                                case S_IFREG: printf("data file"); break;
@@ -562,7 +559,7 @@ void dumpDirFollow(const char *dname)
 void dump_directory_tree_worker(const char *dname,int recursive)
 {
        yaffs_DIR *d;
-       yaffs_dirent *de;
+       struct yaffs_dirent *de;
        struct yaffs_stat s;
        char str[1000];
 
@@ -580,7 +577,8 @@ void dump_directory_tree_worker(const char *dname,int recursive)
 
                        yaffs_lstat(str,&s);
 
-                       printf("%s inode %d obj %x length %d mode %X ",str,s.st_ino,de->d_dont_use,(int)s.st_size,s.st_mode);
+                       printf("%s inode %d obj %x length %lld mode %X ",
+                               str,s.st_ino,de->d_dont_use, s.st_size,s.st_mode);
                        switch(s.st_mode & S_IFMT)
                        {
                                case S_IFREG: printf("data file"); break;
@@ -897,7 +895,7 @@ int huge_directory_test_on_path(char *path)
 {
 
        yaffs_DIR *d;
-       yaffs_dirent *de;
+       struct yaffs_dirent *de;
        struct yaffs_stat s;
 
        int f;
@@ -1546,7 +1544,7 @@ void lookup_test(const char *mountpt)
 
 
        yaffs_DIR *d;
-       yaffs_dirent *de;
+       struct yaffs_dirent *de;
 
        yaffs_start_up();
 
@@ -2755,6 +2753,425 @@ void link_follow_test(const char *mountpt)
 
 }
 
+void max_files_test(const char *mountpt)
+{
+       char fn[100];
+       char sn[100];
+       char hn[100];
+       int result;
+       int h;
+       int i;
+
+       yaffs_trace_mask = 0;
+
+       yaffs_start_up();
+
+       yaffs_mount(mountpt);
+
+       for(i = 0; i < 5000; i++) {
+               sprintf(fn,"%s/file%d", mountpt, i);
+               yaffs_unlink(fn);
+               h = yaffs_open(fn,O_CREAT| O_RDWR, S_IREAD | S_IWRITE);
+               if(h < 0)
+                       printf("File %s not created\n", fn);
+               yaffs_write(h,fn,100);
+               result = yaffs_close(h);
+       }
+       for(i = 0; i < 5; i++){
+               sprintf(fn,"%s/file%d",mountpt, i);
+               yaffs_unlink(fn);
+       }
+
+       for(i = 1000; i < 1010; i++){
+               sprintf(fn,"%s/file%d",mountpt, i);
+               h = yaffs_open(fn,O_CREAT| O_RDWR, S_IREAD | S_IWRITE);
+               yaffs_write(h,fn,100);
+               if(h < 0)
+                       printf("File %s not created\n", fn);
+               result = yaffs_close(h);
+       }
+
+       yaffs_unmount(mountpt);
+
+       //h =yaffs_open(hn,O_RDWR,0);
+
+}
+void case_insensitive_test(const char *mountpt)
+{
+        char fn[100];
+        char fn2[100];
+        char buffer[100];
+        int ret;
+        struct yaffs_stat s;
+        int h;
+        char *x;
+
+       yaffs_trace_mask = 0;
+
+       yaffs_start_up();
+
+       yaffs_mount(mountpt);
+       dump_directory_tree(mountpt);
+
+       sprintf(fn,"%s/Abc.Txt",mountpt);
+       yaffs_unlink(fn);
+       h = yaffs_open(fn, O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE);
+
+       ret = yaffs_write(h,fn, strlen(fn) + 1);
+
+       ret = yaffs_close(h);
+
+       dump_directory_tree(mountpt);
+
+
+       strcpy(fn2, fn);
+       x = fn2;
+       while(*x) {
+               *x = toupper(*x);
+               x++;
+        }
+
+        h = yaffs_open(fn2, O_RDONLY, 0);
+        ret = yaffs_read(h, buffer, 100);
+
+        if (ret != strlen(fn) + 1 || memcmp(buffer, fn, ret)){
+               printf("wrong file read\n");
+        } else {
+               printf("File %s is the same as file %s\n", fn, fn2);
+        }
+
+        ret = yaffs_stat(fn2, &s);
+
+       printf("renaming\n");
+
+        ret = yaffs_rename(fn, fn2);
+       dump_directory_tree(mountpt);
+
+}
+
+void start_twice(const char *mountpt)
+{
+         printf("About to do first yaffs_start\n");
+         yaffs_start_up();
+         printf("started\n");
+         printf("First mount returns %d\n", yaffs_mount(mountpt));
+         printf("About to do second yaffs_start\n");
+         yaffs_start_up();
+         printf("started\n");
+         printf("Second mount returns %d\n", yaffs_mount(mountpt));
+}
+
+#define N_WRITES 2000
+#define STRIDE  2000
+
+#define BUFFER_N 1100
+unsigned  xxbuffer[BUFFER_N];
+
+
+void set_buffer(int n)
+{
+       int i;
+       for(i = 0; i < BUFFER_N; i++)
+               xxbuffer[i] = i + n;
+}
+
+void write_big_sparse_file(int h)
+{
+       int i;
+       loff_t offset = 0;
+       loff_t pos;
+       int n = sizeof(xxbuffer);
+       int wrote;
+
+       for(i = 0; i < N_WRITES; i++) {
+               printf("writing at %lld\n", offset);
+               set_buffer(i);
+               pos = yaffs_lseek(h, offset, SEEK_SET);
+               if(pos != offset) {
+                       printf("mismatched seek pos %lld offset %lld\n",
+                               pos, offset);
+                       perror("lseek64");
+                       exit(1);
+               }
+               wrote = yaffs_write(h, xxbuffer, n);
+
+               if(wrote != n) {
+                       printf("mismatched write wrote %d n %d\n", wrote, n);
+                       exit(1);
+               }
+
+               offset += (STRIDE * sizeof(xxbuffer));
+       }
+
+       yaffs_ftruncate(h, offset);
+
+}
+
+
+
+
+void verify_big_sparse_file(int h)
+{
+       unsigned check_buffer[BUFFER_N];
+       int i;
+       loff_t offset = 0;
+       loff_t pos;
+       int n = sizeof(check_buffer);
+       int result;
+       const char * check_type;
+       int checks_failed = 0;
+       int checks_passed = 0;
+
+       for(i = 0; i < N_WRITES * STRIDE; i++) {
+               if(i % STRIDE) {
+                       check_type = "zero";
+                       memset(xxbuffer,0, n);
+               } else {
+                       check_type = "buffer";
+                       set_buffer(i/STRIDE);
+               }
+               //printf("%s checking %lld\n", check_type, offset);
+               pos = yaffs_lseek(h, offset, SEEK_SET);
+               if(pos != offset) {
+                       printf("mismatched seek pos %lld offset %lld\n",
+                               pos, offset);
+                       perror("lseek64");
+                       exit(1);
+               }
+               result = yaffs_read(h, check_buffer, n);
+
+               if(result != n) {
+                       printf("mismatched read result %d n %d\n", result, n);
+                       exit(1);
+               }
+
+
+
+
+               if(memcmp(xxbuffer, check_buffer, n)) {
+                       int j;
+
+                       printf("buffer at %lld mismatches\n", pos);
+                       printf("xxbuffer ");
+                       for(j = 0; j < 20; j++)
+                               printf(" %d",xxbuffer[j]);
+                       printf("\n");
+                       printf("check_buffer ");
+                       for(j = 0; j < 20; j++)
+                               printf(" %d",check_buffer[j]);
+                       printf("\n");
+
+                       checks_failed++;
+               } else {
+                       checks_passed++;
+               }
+
+               offset += sizeof(xxbuffer);
+       }
+
+       printf("%d checks passed, %d checks failed\n", checks_passed, checks_failed);
+
+}
+
+
+void large_file_test(const char *mountpt)
+{
+       char xx_buffer[1000];
+       int i;
+       int handle;
+       char fullname[100];
+       loff_t file_end;
+
+       yaffs_trace_mask = 0;
+
+       yaffs_start_up();
+
+       yaffs_mount(mountpt);
+       printf("mounted\n");
+        dumpDir(mountpt);
+
+       sprintf(fullname, "%s/%s", mountpt, "big-test-file");
+
+       handle = yaffs_open(fullname, O_RDONLY, 0);
+
+       handle = yaffs_open(fullname, O_CREAT | O_RDWR | O_TRUNC, S_IREAD | S_IWRITE);
+
+       if(handle < 0) {
+               perror("opening file");
+               exit(1);
+       }
+
+       write_big_sparse_file(handle);
+       verify_big_sparse_file(handle);
+
+       yaffs_close(handle);
+
+       printf("Job done\n");
+       yaffs_unmount(mountpt);
+
+       yaffs_mount(mountpt);
+       printf("mounted again\n");
+        dumpDir(mountpt);
+       handle = yaffs_open(fullname, O_RDONLY, 0);
+       verify_big_sparse_file(handle);
+       yaffs_unmount(mountpt);
+
+
+       yaffs_mount_common(mountpt, 0, 1);
+       printf("mounted with no checkpt\n");
+        dumpDir(mountpt);
+       handle = yaffs_open(fullname, O_RDONLY, 0);
+       verify_big_sparse_file(handle);
+       yaffs_unmount(mountpt);
+
+       /* Check resize by adding to the end, resizing back and verifying. */
+       yaffs_mount_common(mountpt, 0, 1);
+       printf("checking resize\n");
+        dumpDir(mountpt);
+       handle = yaffs_open(fullname, O_RDWR, 0);
+
+       file_end = yaffs_lseek(handle, 0, SEEK_END);
+       printf("file_end %lld\n", file_end);
+       for(i = 0; i < 10000; i++)
+               yaffs_write(handle, xx_buffer, sizeof(xx_buffer));
+       yaffs_ftruncate(handle, file_end);
+
+       verify_big_sparse_file(handle);
+       yaffs_unmount(mountpt);
+
+}
+
+
+int  mk_dir(const char *mp, const char *name)
+{
+       char full_name[100];
+
+       sprintf(full_name, "%s/%s", mp, name);
+
+       return yaffs_mkdir(full_name, S_IREAD| S_IWRITE);
+}
+
+int  mk_file(const char *mp, const char *name)
+{
+       char full_name[100];
+       int h;
+
+       sprintf(full_name, "%s/%s", mp, name);
+
+       h = yaffs_open(full_name, O_RDWR | O_CREAT | O_TRUNC, S_IREAD| S_IWRITE);
+
+       yaffs_write(h, name, strlen(name));
+
+       yaffs_close(h);
+       return 0;
+}
+
+void xx_test(const char *mountpt)
+{
+       char xx_buffer[1000];
+
+       yaffs_start_up();
+
+       yaffs_format(mountpt,0,0,0);
+
+       yaffs_mount(mountpt);
+       printf("mounted\n");
+       dumpDir(mountpt);
+
+       printf("create files\n");
+
+       mk_dir(mountpt, "foo");
+       mk_file(mountpt, "foo/f1");
+       mk_file(mountpt, "foo/f2");
+       mk_file(mountpt, "foo/f3");
+       mk_file(mountpt, "foo/f4");
+       dump_directory_tree(mountpt);
+
+       printf("unmount and remount\n");
+
+       /* Unmount/remount */
+       yaffs_unmount(mountpt);
+       yaffs_mount(mountpt);
+       dump_directory_tree(mountpt);
+}
+
+void yy_test(const char *mountpt)
+{
+       char xx_buffer[1000];
+
+       yaffs_start_up();
+
+       yaffs_mount(mountpt);
+       dump_directory_tree(mountpt);
+}
+
+
+void readdir_test(const char *mountpt)
+{
+       char xx_buffer[1000];
+       int i;
+       int handle;
+       char fullname[100];
+
+       yaffs_DIR *dirs[100];
+
+
+       yaffs_trace_mask = 0;
+
+       yaffs_start_up();
+
+       yaffs_mount(mountpt);
+
+       for(i = 0; i < 100; i++) {
+                dirs[i] = yaffs_opendir(mountpt);
+                printf("%2d %p,", i, dirs[i]);
+       }
+
+       printf("\n");
+
+       for(i = 0; i < 100; i++) {
+                if(dirs[i])
+                         yaffs_closedir(dirs[i]);
+       }
+
+
+       for(i = 0; i < 100; i++) {
+                dirs[i] = yaffs_opendir(mountpt);
+                printf("%2d %p,", i, dirs[i]);
+       }
+
+       yaffs_unmount(mountpt);
+
+
+}
+
+void format_test(const char *mountpt)
+{
+       int ret;
+
+       yaffs_start_up();
+
+       ret = yaffs_format(mountpt, 0, 0, 0);
+       printf("yaffs_format(...,0, 0, 0) of unmounted returned %d\n", ret);
+
+       yaffs_mount(mountpt);
+
+       ret = yaffs_format(mountpt, 0, 0, 0);
+       printf("yaffs_format(...,0, 0, 0) of mounted returned %d\n", ret);
+
+       ret = yaffs_format(mountpt, 1, 0, 0);
+       printf("yaffs_format(...,1, 0, 0) of mounted returned %d\n", ret);
+
+       ret = yaffs_mount(mountpt);
+       printf("mount should return 0 returned %d\n", ret);
+
+       ret = yaffs_format(mountpt, 1, 0, 1);
+       printf("yaffs_format(...,1, 0, 1) of mounted returned %d\n", ret);
+
+       ret = yaffs_mount(mountpt);
+       printf("mount should return -1 returned %d\n", ret);
+}
+
 int random_seed;
 int simulate_power_failure;
 
@@ -2791,7 +3208,7 @@ int main(int argc, char *argv[])
         //checkpoint_upgrade_test("/flash/flash",20);
          //small_overwrite_test("/flash/flash",1000);
          //checkpoint_fill_test("/flash/flash",20);
-       // random_small_file_test("/flash/flash",10000);
+       //random_small_file_test("/flash/flash",10000);
         // huge_array_test("/flash/flash",10);
 
 
@@ -2820,7 +3237,23 @@ int main(int argc, char *argv[])
 
         //test_flash_traffic("yaffs2");
         // link_follow_test("/yaffs2");
-        basic_utime_test("/yaffs2");
+        //basic_utime_test("/yaffs2");
+
+
+       //format_test("/yaffs2");
+
+       //max_files_test("/yaffs2");
+
+        //start_twice("/yaffs2");
+
+        //large_file_test("/yaffs2");
+        //readdir_test("/yaffs2");
+
+        //basic_utime_test("/yaffs2");
+        //case_insensitive_test("/yaffs2");
+
+        yy_test("/yaffs2");
+
 
         return 0;