X-Git-Url: http://www.aleph1.co.uk/gitweb/?a=blobdiff_plain;ds=sidebyside;f=direct%2Fdtest.c;h=9051c234fbb4c2820ef8380c6dfdacc875ef53d9;hb=64a12f248950e23dd994ff29fd090480e0921930;hp=7360584906bccd30a3511a7aa47221da98308dda;hpb=4ea0578f8af411adf56fdc1eb4af08f4e36c7eec;p=yaffs%2F.git diff --git a/direct/dtest.c b/direct/dtest.c index 7360584..9051c23 100644 --- a/direct/dtest.c +++ b/direct/dtest.c @@ -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(); + +}