*** empty log message ***
[yaffs/.git] / direct / dtest.c
index de1eaa2d66fb7776ca60bcf2e1220b6c799b0a38..921b066d2c1c15f24451ba1c49a5b65c84996f8d 100644 (file)
@@ -32,6 +32,30 @@ 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);
+
+}
+
 
 
 
@@ -40,6 +64,7 @@ void fill_disk(char *path,int nfiles)
        int h;
        int n;
        int result;
+       int f;
        
        char str[50];
        
@@ -53,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);
@@ -173,8 +198,8 @@ void dumpDirFollow(const char *dname)
                        
                        yaffs_stat(str,&s);
                        
-                       printf("%s length %d mode %X ",de->d_name,s.st_size,s.st_mode);
-                       switch(s.st_mode & S_IFMT)
+                       printf("%s length %d mode %X ",de->d_name,s.yst_size,s.yst_mode);
+                       switch(s.yst_mode & S_IFMT)
                        {
                                case S_IFREG: printf("data file"); break;
                                case S_IFDIR: printf("directory"); break;
@@ -218,8 +243,8 @@ void dumpDir(const char *dname)
                        
                        yaffs_lstat(str,&s);
                        
-                       printf("%s length %d mode %X ",de->d_name,s.st_size,s.st_mode);
-                       switch(s.st_mode & S_IFMT)
+                       printf("%s length %d mode %X ",de->d_name,s.yst_size,s.yst_mode);
+                       switch(s.yst_mode & S_IFMT)
                        {
                                case S_IFREG: printf("data file"); break;
                                case S_IFDIR: printf("directory"); break;
@@ -453,7 +478,7 @@ int long_test(int argc, char *argv[])
        // Check chmod
        
        yaffs_stat("/boot/yyfile",&ystat);
-       temp_mode = ystat.st_mode;
+       temp_mode = ystat.yst_mode;
        
        yaffs_chmod("/boot/yyfile",0x55555);
        printf("\nDirectory look-up of /boot\n");
@@ -555,10 +580,138 @@ int directory_rename_test(void)
        
 }
 
+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 BeatsTest(void)
+{
+       int h;
+       char b[2000];
+       int freeSpace;
+       int fsize;
+       yaffs_StartUp();
+       yaffs_mount("/ram");
+       
+       h = yaffs_open("/ram/f1", O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE);
+       
+       freeSpace = yaffs_freespace("/ram");
+       printf("start free space %d\n",freeSpace);
+       
+       while(yaffs_write(h,b,600) > 0) {
+               fsize = yaffs_lseek(h,0,SEEK_CUR);
+               freeSpace = yaffs_freespace("/ram");
+               printf(" %d  = %d + %d\n",fsize + freeSpace,fsize,freeSpace);
+       }
+       yaffs_close(h);
+       
+       freeSpace = yaffs_freespace("/ram");
+       
+       return 1;
+       
+}
+
 int main(int argc, char *argv[])
 {
        //return long_test(argc,argv);
        
-       return directory_rename_test();
+       //return cache_read_test();
+       
+       //return cache_bypass_bug_test();
+       
+       // return free_space_check();
+       
+       return BeatsTest();
        
 }