Fix resizing of large files.
[yaffs2.git] / direct / basic-test / dtest.c
index 247aa480c69dee4303ae8b63618dc7fa8f06130f..3739acac2ae30b145a8a0f08133bd000ff1aeeff 100644 (file)
@@ -9,7 +9,6 @@
  * 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.
- *
  */
 
 
@@ -2756,6 +2755,111 @@ 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);
+       }
+
+       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
@@ -2826,7 +2930,7 @@ void verify_big_sparse_file(int h)
                        check_type = "buffer";
                        set_buffer(i/STRIDE);
                }
-               printf("%s checking %lld\n", check_type, offset);
+               //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",
@@ -2872,8 +2976,11 @@ void verify_big_sparse_file(int h)
 
 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;
 
@@ -2917,6 +3024,21 @@ void large_file_test(const char *mountpt)
        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);
+
 }
 
 
@@ -2956,7 +3078,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);
 
 
@@ -2985,10 +3107,16 @@ int main(int argc, char *argv[])
 
         //test_flash_traffic("yaffs2");
         // link_follow_test("/yaffs2");
+        //basic_utime_test("/yaffs2");
+
+        //max_files_test("/yaffs2");
+
+        //start_twice("/yaffs2");
 
         large_file_test("/yaffs2");
 
         //basic_utime_test("/yaffs2");
+        //case_insensitive_test("/yaffs2");
 
         return 0;