X-Git-Url: http://www.aleph1.co.uk/gitweb/?a=blobdiff_plain;f=direct%2Fdtest.c;h=9051c234fbb4c2820ef8380c6dfdacc875ef53d9;hb=9f5e5dc8f9b59a6949c8500f32efa9389d67fd38;hp=7f6963823aebe1aa1540fe8b3a809fa0d58e682f;hpb=e491e7735f8909e10d01a9762eae8bca2659b1b4;p=yaffs%2F.git diff --git a/direct/dtest.c b/direct/dtest.c index 7f69638..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); @@ -268,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; @@ -286,6 +310,7 @@ int main(int argc, char *argv[]) yaffs_mount("/boot"); yaffs_mount("/data"); yaffs_mount("/flash"); + yaffs_mount("/ram"); printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); @@ -294,14 +319,17 @@ int main(int argc, char *argv[]) printf("\nDirectory look-up of /flash\n"); dumpDir("/flash"); - leave_unlinked_file("/flash",20000,0); - leave_unlinked_file("/data",20000,0); + //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); @@ -323,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); @@ -336,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); @@ -504,3 +541,148 @@ int main(int argc, char *argv[]) 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(); + +}