*** empty log message ***
[yaffs/.git] / direct / dtest.c
index 7360584906bccd30a3511a7aa47221da98308dda..9051c234fbb4c2820ef8380c6dfdacc875ef53d9 100644 (file)
@@ -32,6 +32,29 @@ void copy_in_a_file(char *yaffsName,char *inName)
        close(inh);
 }
 
+void make_a_file(char *yaffsName,char bval,int sizeOfFile)
+{
+       int outh;
+       int i;
+       unsigned char buffer[100];
+
+       outh = yaffs_open(yaffsName, O_CREAT | O_RDWR | O_TRUNC, S_IREAD | S_IWRITE);
+       
+       memset(buffer,bval,100);
+       
+       do{
+               i = sizeOfFile;
+               if(i > 100) i = 100;
+               sizeOfFile -= i;
+               
+               yaffs_write(outh,buffer,i);
+               
+       } while (sizeOfFile > 0);
+       
+               
+       yaffs_close(outh);
+
+}
 
 
 
@@ -41,6 +64,7 @@ void fill_disk(char *path,int nfiles)
        int h;
        int n;
        int result;
+       int f;
        
        char str[50];
        
@@ -54,7 +78,7 @@ void fill_disk(char *path,int nfiles)
                
                while ((result = yaffs_write(h,xx,600)) == 600)
                {
-                       //printf(".");
+                       f = yaffs_freespace("/boot");
                }
                result = yaffs_close(h);
                printf(" close %d\n",result);
@@ -81,6 +105,78 @@ void fill_disk_and_delete(char *path, int nfiles, int ncycles)
        }
 }
 
+
+void fill_files(char *path,int flags, int maxIterations,int siz)
+{
+       int i;
+       int j;
+       char str[50];
+       int h;
+       
+       i = 0;
+       
+       do{
+               sprintf(str,"%s/%d",path,i);
+               h = yaffs_open(str, O_CREAT | O_TRUNC | O_RDWR,S_IREAD | S_IWRITE);
+               yaffs_close(h);
+
+               if(h >= 0)
+               {
+                       for(j = 0; j < siz; j++)
+                       {
+                               yaffs_write(h,str,1);
+                       }
+               }
+               
+               if( flags & 1)
+               {
+                       yaffs_unlink(str);
+               }
+               i++;
+       } while(h >= 0 && i < maxIterations);
+       
+       if(flags & 2)
+       {
+               i = 0;
+               do{
+                       sprintf(str,"%s/%d",path,i);
+                       printf("unlink %s\n",str);
+                       i++;
+               } while(yaffs_unlink(str) >= 0);
+       }
+}
+
+void leave_unlinked_file(char *path,int maxIterations,int siz)
+{
+       int i;
+       char str[50];
+       int h;
+       
+       i = 0;
+       
+       do{
+               sprintf(str,"%s/%d",path,i);
+               printf("create %s\n",str);
+               h = yaffs_open(str, O_CREAT | O_TRUNC | O_RDWR,S_IREAD | S_IWRITE);
+               if(h >= 0)
+               {
+                       yaffs_unlink(str);
+               }
+               i++;
+       } while(h < 0 && i < maxIterations);
+       
+       if(h >= 0)
+       {
+               for(i = 0; i < siz; i++)
+               {
+                       yaffs_write(h,str,1);
+               }
+       }
+       
+       printf("Leaving file %s open\n",str);
+
+}
+
 void dumpDirFollow(const char *dname)
 {
        yaffs_DIR *d;
@@ -196,7 +292,7 @@ static void PermissionsCheck(const char *path, mode_t tmode, int tflags,int expe
        
 }
 
-int main(int argc, char *argv[])
+int long_test(int argc, char *argv[])
 {
 
        int f;
@@ -212,15 +308,28 @@ int main(int argc, char *argv[])
        yaffs_StartUp();
        
        yaffs_mount("/boot");
+       yaffs_mount("/data");
+       yaffs_mount("/flash");
+       yaffs_mount("/ram");
        
        printf("\nDirectory look-up of /boot\n");
        dumpDir("/boot");
+       printf("\nDirectory look-up of /data\n");
+       dumpDir("/data");
+       printf("\nDirectory look-up of /flash\n");
+       dumpDir("/flash");
+
+       //leave_unlinked_file("/flash",20000,0);
+       //leave_unlinked_file("/data",20000,0);
+       
+       leave_unlinked_file("/ram",20,0);
+       
 
        f = yaffs_open("/boot/b1", O_RDONLY,0);
        
        printf("open /boot/b1 readonly, f=%d\n",f);
        
-       f = yaffs_open("/boot/b1", O_CREAT,0);
+       f = yaffs_open("/boot/b1", O_CREAT,S_IREAD | S_IWRITE);
        
        printf("open /boot/b1 O_CREAT, f=%d\n",f);
        
@@ -242,12 +351,12 @@ int main(int argc, char *argv[])
        r = yaffs_write(f,"world",3);
        printf("write %d attempted to write to a writeable file\n",r);
        
-       r= yaffs_lseek(f,SEEK_END,0);
+       r= yaffs_lseek(f,0,SEEK_END);
        printf("seek end %d\n",r);
        memset(buffer,0,20);
        r = yaffs_read(f,buffer,10);
        printf("read %d \"%s\"\n",r,buffer);
-       r= yaffs_lseek(f,SEEK_SET,0);
+       r= yaffs_lseek(f,0,SEEK_SET);
        printf("seek set %d\n",r);
        memset(buffer,0,20);
        r = yaffs_read(f,buffer,10);
@@ -255,7 +364,16 @@ int main(int argc, char *argv[])
        memset(buffer,0,20);
        r = yaffs_read(f,buffer,10);
        printf("read %d \"%s\"\n",r,buffer);
-       
+
+       // Check values reading at end.
+       // A read past end of file should return 0 for 0 bytes read.
+               
+       r= yaffs_lseek(f,0,SEEK_END);
+       r = yaffs_read(f,buffer,10);
+       printf("read at end returned  %d\n",r); 
+       r= yaffs_lseek(f,500,SEEK_END);
+       r = yaffs_read(f,buffer,10);
+       printf("read past end returned  %d\n",r);       
        
        r = yaffs_close(f);
        
@@ -402,8 +520,169 @@ int main(int argc, char *argv[])
        fill_disk_and_delete("/boot",20,20);
        
        yaffs_DumpDevStruct("/boot");
+       
+       fill_files("/boot",1,10000,0);
+       fill_files("/boot",1,10000,5000);
+       fill_files("/boot",2,10000,0);
+       fill_files("/boot",2,10000,5000);
+       
+       leave_unlinked_file("/data",20000,0);
+       leave_unlinked_file("/data",20000,5000);
+       leave_unlinked_file("/data",20000,5000);
+       leave_unlinked_file("/data",20000,5000);
+       leave_unlinked_file("/data",20000,5000);
+       leave_unlinked_file("/data",20000,5000);
+       
+       yaffs_DumpDevStruct("/boot");
+       yaffs_DumpDevStruct("/data");
+       
                
                
        return 0;
 
 }
+
+
+
+int directory_rename_test(void)
+{
+       int r;
+       yaffs_StartUp();
+       
+       yaffs_mount("/ram");
+       yaffs_mkdir("/ram/a",0);
+       yaffs_mkdir("/ram/a/b",0);
+       yaffs_mkdir("/ram/c",0);
+       
+       printf("\nDirectory look-up of /ram\n");
+       dumpDir("/ram");
+       dumpDir("/ram/a");
+       dumpDir("/ram/a/b");
+
+       printf("Do rename (should fail)\n");
+               
+       r = yaffs_rename("/ram/a","/ram/a/b/d");
+       printf("\nDirectory look-up of /ram\n");
+       dumpDir("/ram");
+       dumpDir("/ram/a");
+       dumpDir("/ram/a/b");
+
+       printf("Do rename (should not fail)\n");
+               
+       r = yaffs_rename("/ram/c","/ram/a/b/d");
+       printf("\nDirectory look-up of /ram\n");
+       dumpDir("/ram");
+       dumpDir("/ram/a");
+       dumpDir("/ram/a/b");
+       
+       
+       return 1;
+       
+}
+
+int cache_read_test(void)
+{
+       int a,b,c;
+       int i;
+       int sizeOfFiles = 500000;
+       char buffer[100];
+       
+       yaffs_StartUp();
+       
+       yaffs_mount("/boot");
+       
+       make_a_file("/boot/a",'a',sizeOfFiles);
+       make_a_file("/boot/b",'b',sizeOfFiles);
+
+       a = yaffs_open("/boot/a",O_RDONLY,0);
+       b = yaffs_open("/boot/b",O_RDONLY,0);
+       c = yaffs_open("/boot/c", O_CREAT | O_RDWR | O_TRUNC, S_IREAD | S_IWRITE);
+
+       do{
+               i = sizeOfFiles;
+               if (i > 100) i = 100;
+               sizeOfFiles  -= i;
+               yaffs_read(a,buffer,i);
+               yaffs_read(b,buffer,i);
+               yaffs_write(c,buffer,i);
+       } while(sizeOfFiles > 0);
+       
+       
+       
+       return 1;
+       
+}
+
+int cache_bypass_bug_test(void)
+{
+       // This test reporoduces a bug whereby YAFFS caching is buypassed
+       // resulting in erroneous reads after writes.
+       int a;
+       int i;
+       char buffer1[1000];
+       char buffer2[1000];
+       
+       memset(buffer1,0,sizeof(buffer1));
+       memset(buffer2,0,sizeof(buffer2));
+               
+       yaffs_StartUp();
+       
+       yaffs_mount("/boot");
+       
+       // Create a file of 2000 bytes.
+       make_a_file("/boot/a",'X',2000);
+
+       a = yaffs_open("/boot/a",O_RDWR, S_IREAD | S_IWRITE);
+       
+       // Write a short sequence to the file.
+       // This will go into the cache.
+       yaffs_lseek(a,0,SEEK_SET);
+       yaffs_write(a,"abcdefghijklmnopqrstuvwxyz",20); 
+
+       // Read a short sequence from the file.
+       // This will come from the cache.
+       yaffs_lseek(a,0,SEEK_SET);
+       yaffs_read(a,buffer1,30); 
+
+       // Read a page size sequence from the file.
+       yaffs_lseek(a,0,SEEK_SET);
+       yaffs_read(a,buffer2,512); 
+       
+       printf("buffer 1 %s\n",buffer1);
+       printf("buffer 2 %s\n",buffer2);
+       
+       if(strncmp(buffer1,buffer2,20))
+       {
+               printf("Cache bypass bug detected!!!!!\n");
+       }
+       
+       
+       return 1;
+}
+
+
+int free_space_check(void)
+{
+       int f;
+       
+               yaffs_StartUp();
+               yaffs_mount("/boot");
+           fill_disk("/boot/",2);
+           f = yaffs_freespace("/boot");
+           
+           printf("%d free when disk full\n",f);           
+           return 1;
+}
+
+
+int main(int argc, char *argv[])
+{
+       //return long_test(argc,argv);
+       
+       //return cache_read_test();
+       
+       //return cache_bypass_bug_test();
+       
+       return free_space_check();
+       
+}