www.pudn.com > yaffs2.zip > dtest.c
/* * Test code for the "direct" interface. */ #include#include #include #include #include "yaffsfs.h" void dumpDir(const char *dname); char xx[600]; void copy_in_a_file(char *yaffsName,char *inName) { int inh,outh; unsigned char buffer[100]; int ni,no; inh = open(inName,O_RDONLY); outh = yaffs_open(yaffsName, O_CREAT | O_RDWR | O_TRUNC, S_IREAD | S_IWRITE); while((ni = read(inh,buffer,100)) > 0) { no = yaffs_write(outh,buffer,ni); if(ni != no) { printf("problem writing yaffs file\n"); } } yaffs_close(outh); 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); } void make_pattern_file(char *fn,int size) { int outh; int marker; int i; outh = yaffs_open(fn, O_CREAT | O_RDWR | O_TRUNC, S_IREAD | S_IWRITE); yaffs_lseek(outh,size-1,SEEK_SET); yaffs_write(outh,"A",1); for(i = 0; i < size; i+=256) { marker = ~i; yaffs_lseek(outh,i,SEEK_SET); yaffs_write(outh,&marker,sizeof(marker)); } yaffs_close(outh); } int check_pattern_file(char *fn) { int h; int marker; int i; int size; int ok = 1; h = yaffs_open(fn, O_RDWR,0); size = yaffs_lseek(h,0,SEEK_END); for(i = 0; i < size && ok; i+=256) { yaffs_lseek(h,i,SEEK_SET); yaffs_read(h,&marker,sizeof(marker)); ok = (marker == ~i); if(!ok) { printf("pattern check failed on file %s, size %d at position %d. Got %x instead of %x\n", fn,size,i,marker,~i); } } yaffs_close(h); return ok; } void dump_file(const char *fn) { int i; int size; int h; h = yaffs_open(fn,O_RDONLY,0); if(h < 0) { printf("*****\nDump file %s does not exist\n",fn); } else { size = yaffs_lseek(h,0,SEEK_SET); printf("*****\nDump file %s size %d\n",fn,size); for(i = 0; i < size; i++) { } } } void short_scan_test(const char *path, int fsize, int niterations) { int i; char fn[100]; sprintf(fn,"%s/%s",path,"f1"); yaffs_StartUp(); for(i = 0; i < niterations; i++) { printf("\n*****************\nIteration %d\n",i); yaffs_mount(path); printf("\nmount: Directory look-up of %s\n",path); dumpDir(path); make_a_file(fn,1,fsize); yaffs_unmount(path); } } void scan_pattern_test(const char *path, int fsize, int niterations) { int i; int j; char fn[3][100]; int result; sprintf(fn[0],"%s/%s",path,"f0"); sprintf(fn[1],"%s/%s",path,"f1"); sprintf(fn[2],"%s/%s",path,"f2"); yaffs_StartUp(); for(i = 0; i < niterations; i++) { printf("\n*****************\nIteration %d\n",i); yaffs_mount(path); printf("\nmount: Directory look-up of %s\n",path); dumpDir(path); for(j = 0; j < 3; j++) { result = check_pattern_file(fn[j]); make_pattern_file(fn[j],fsize); result = check_pattern_file(fn[j]); } yaffs_unmount(path); } } void fill_disk(char *path,int nfiles) { int h; int n; int result; int f; char str[50]; for(n = 0; n < nfiles; n++) { sprintf(str,"%s/%d",path,n); h = yaffs_open(str, O_CREAT | O_RDWR | O_TRUNC, S_IREAD | S_IWRITE); printf("writing file %s handle %d ",str, h); while ((result = yaffs_write(h,xx,600)) == 600) { f = yaffs_freespace("/boot"); } result = yaffs_close(h); printf(" close %d\n",result); } } void fill_disk_and_delete(char *path, int nfiles, int ncycles) { int i,j; char str[50]; int result; for(i = 0; i < ncycles; i++) { printf("@@@@@@@@@@@@@@ cycle %d\n",i); fill_disk(path,nfiles); for(j = 0; j < nfiles; j++) { sprintf(str,"%s/%d",path,j); result = yaffs_unlink(str); printf("unlinking file %s, result %d\n",str,result); } } } 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; yaffs_dirent *de; struct yaffs_stat s; char str[100]; d = yaffs_opendir(dname); if(!d) { printf("opendir failed\n"); } else { while((de = yaffs_readdir(d)) != NULL) { sprintf(str,"%s/%s",dname,de->d_name); yaffs_stat(str,&s); printf("%s length %d mode %X ",de->d_name,(int)s.st_size,s.st_mode); switch(s.st_mode & S_IFMT) { case S_IFREG: printf("data file"); break; case S_IFDIR: printf("directory"); break; case S_IFLNK: printf("symlink -->"); if(yaffs_readlink(str,str,100) < 0) printf("no alias"); else printf("\"%s\"",str); break; default: printf("unknown"); break; } printf("\n"); } yaffs_closedir(d); } printf("\n"); printf("Free space in %s is %d\n\n",dname,(int)yaffs_freespace(dname)); } void dumpDir(const char *dname) { yaffs_DIR *d; yaffs_dirent *de; struct yaffs_stat s; char str[100]; d = yaffs_opendir(dname); if(!d) { printf("opendir failed\n"); } else { while((de = yaffs_readdir(d)) != NULL) { sprintf(str,"%s/%s",dname,de->d_name); yaffs_lstat(str,&s); printf("%s length %d mode %X ",de->d_name,(int)s.st_size,s.st_mode); switch(s.st_mode & S_IFMT) { case S_IFREG: printf("data file"); break; case S_IFDIR: printf("directory"); break; case S_IFLNK: printf("symlink -->"); if(yaffs_readlink(str,str,100) < 0) printf("no alias"); else printf("\"%s\"",str); break; default: printf("unknown"); break; } printf("\n"); } yaffs_closedir(d); } printf("\n"); printf("Free space in %s is %d\n\n",dname,(int)yaffs_freespace(dname)); } static void PermissionsCheck(const char *path, mode_t tmode, int tflags,int expectedResult) { int fd; if(yaffs_chmod(path,tmode)< 0) printf("chmod failed\n"); fd = yaffs_open(path,tflags,0); if((fd >= 0) != (expectedResult > 0)) { printf("Permissions check %x %x %d failed\n",tmode,tflags,expectedResult); } else { printf("Permissions check %x %x %d OK\n",tmode,tflags,expectedResult); } yaffs_close(fd); } int long_test(int argc, char *argv[]) { int f; int r; char buffer[20]; char str[100]; int h; mode_t temp_mode; struct yaffs_stat ystat; 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,S_IREAD | S_IWRITE); printf("open /boot/b1 O_CREAT, f=%d\n",f); r = yaffs_write(f,"hello",1); printf("write %d attempted to write to a read-only file\n",r); r = yaffs_close(f); printf("close %d\n",r); f = yaffs_open("/boot/b1", O_RDWR,0); printf("open /boot/b1 O_RDWR,f=%d\n",f); r = yaffs_write(f,"hello",2); printf("write %d attempted to write to a writeable file\n",r); r = yaffs_write(f,"world",3); printf("write %d attempted to write to a writeable file\n",r); 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,0,SEEK_SET); printf("seek set %d\n",r); memset(buffer,0,20); r = yaffs_read(f,buffer,10); printf("read %d \"%s\"\n",r,buffer); 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); printf("close %d\n",r); copy_in_a_file("/boot/yyfile","xxx"); // Create a file with a long name copy_in_a_file("/boot/file with a long name","xxx"); printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); // Check stat r = yaffs_stat("/boot/file with a long name",&ystat); // Check rename r = yaffs_rename("/boot/file with a long name","/boot/r1"); printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); // Check unlink r = yaffs_unlink("/boot/r1"); printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); // Check mkdir r = yaffs_mkdir("/boot/directory1",0); printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); printf("\nDirectory look-up of /boot/directory1\n"); dumpDir("/boot/directory1"); // add a file to the directory copy_in_a_file("/boot/directory1/file with a long name","xxx"); printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); printf("\nDirectory look-up of /boot/directory1\n"); dumpDir("/boot/directory1"); // Attempt to delete directory (should fail) r = yaffs_rmdir("/boot/directory1"); printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); printf("\nDirectory look-up of /boot/directory1\n"); dumpDir("/boot/directory1"); // Delete file first, then rmdir should work r = yaffs_unlink("/boot/directory1/file with a long name"); r = yaffs_rmdir("/boot/directory1"); printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); printf("\nDirectory look-up of /boot/directory1\n"); dumpDir("/boot/directory1"); #if 0 fill_disk_and_delete("/boot",20,20); printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); #endif yaffs_symlink("yyfile","/boot/slink"); yaffs_readlink("/boot/slink",str,100); printf("symlink alias is %s\n",str); printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); printf("\nDirectory look-up of /boot (using stat instead of lstat)\n"); dumpDirFollow("/boot"); printf("\nDirectory look-up of /boot/directory1\n"); dumpDir("/boot/directory1"); h = yaffs_open("/boot/slink",O_RDWR,0); printf("file length is %d\n",(int)yaffs_lseek(h,0,SEEK_END)); yaffs_close(h); yaffs_unlink("/boot/slink"); printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); // Check chmod yaffs_stat("/boot/yyfile",&ystat); temp_mode = ystat.st_mode; yaffs_chmod("/boot/yyfile",0x55555); printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); yaffs_chmod("/boot/yyfile",temp_mode); printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); // Permission checks... PermissionsCheck("/boot/yyfile",0, O_WRONLY,0); PermissionsCheck("/boot/yyfile",0, O_RDONLY,0); PermissionsCheck("/boot/yyfile",0, O_RDWR,0); PermissionsCheck("/boot/yyfile",S_IREAD, O_WRONLY,0); PermissionsCheck("/boot/yyfile",S_IREAD, O_RDONLY,1); PermissionsCheck("/boot/yyfile",S_IREAD, O_RDWR,0); PermissionsCheck("/boot/yyfile",S_IWRITE, O_WRONLY,1); PermissionsCheck("/boot/yyfile",S_IWRITE, O_RDONLY,0); PermissionsCheck("/boot/yyfile",S_IWRITE, O_RDWR,0); PermissionsCheck("/boot/yyfile",S_IREAD | S_IWRITE, O_WRONLY,1); PermissionsCheck("/boot/yyfile",S_IREAD | S_IWRITE, O_RDONLY,1); PermissionsCheck("/boot/yyfile",S_IREAD | S_IWRITE, O_RDWR,1); yaffs_chmod("/boot/yyfile",temp_mode); //create a zero-length file and unlink it (test for scan bug) h = yaffs_open("/boot/zlf",O_CREAT | O_TRUNC | O_RDWR,0); yaffs_close(h); yaffs_unlink("/boot/zlf"); yaffs_DumpDevStruct("/boot"); 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 long_test_on_path(char *path) { int f; int r; char buffer[20]; char str[100]; char name[100]; char name2[100]; int h; mode_t temp_mode; struct yaffs_stat ystat; yaffs_StartUp(); yaffs_mount(path); printf("\nDirectory look-up of %s\n",path); dumpDir(path); //leave_unlinked_file("/flash",20000,0); //leave_unlinked_file("/data",20000,0); leave_unlinked_file(path,20,0); sprintf(name,"%s/%s",path,"b1"); f = yaffs_open(name, O_RDONLY,0); printf("open %s readonly, f=%d\n",name,f); f = yaffs_open(name, O_CREAT,S_IREAD | S_IWRITE); printf("open %s O_CREAT, f=%d\n",name,f); r = yaffs_write(f,"hello",1); printf("write %d attempted to write to a read-only file\n",r); r = yaffs_close(f); printf("close %d\n",r); f = yaffs_open(name, O_RDWR,0); printf("open %s O_RDWR,f=%d\n",name,f); r = yaffs_write(f,"hello",2); printf("write %d attempted to write to a writeable file\n",r); r = yaffs_write(f,"world",3); printf("write %d attempted to write to a writeable file\n",r); 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,0,SEEK_SET); printf("seek set %d\n",r); memset(buffer,0,20); r = yaffs_read(f,buffer,10); printf("read %d \"%s\"\n",r,buffer); 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); printf("close %d\n",r); sprintf(name,"%s/%s",path,"yyfile"); copy_in_a_file(name,"xxx"); // Create a file with a long name sprintf(name,"%s/%s",path,"file with a long name"); copy_in_a_file(name,"xxx"); printf("\nDirectory look-up of %s\n",path); dumpDir(path); // Check stat r = yaffs_stat(name,&ystat); // Check rename sprintf(name2,"%s/%s",path,"r1"); r = yaffs_rename(name,name2); printf("\nDirectory look-up of %s\n",path); dumpDir(path); // Check unlink r = yaffs_unlink(name2); printf("\nDirectory look-up of %s\n",path); dumpDir(path); // Check mkdir sprintf(name,"%s/%s",path,"directory1"); r = yaffs_mkdir(name,0); printf("\nDirectory look-up of %s\n",path); dumpDir(path); printf("\nDirectory look-up of %s\n",name); dumpDir(name); // add a file to the directory sprintf(name2,"%s/%s",name,"/file in dir with a long name"); copy_in_a_file(name2,"xxx"); printf("\nDirectory look-up of %s\n",path); dumpDir(path); printf("\nDirectory look-up of %s\n",name); dumpDir(name); // Attempt to delete directory (should fail) r = yaffs_rmdir(name); printf("\nDirectory look-up of %s\n",path); dumpDir(path); printf("\nDirectory look-up of %s\n",name); dumpDir(name); yaffs_unmount(path); return 0; // Delete file first, then rmdir should work r = yaffs_unlink(name2); r = yaffs_rmdir(name); printf("\nDirectory look-up of %s\n",path); dumpDir(path); printf("\nDirectory look-up of %s\n",name); dumpDir(name); #if 0 fill_disk_and_delete(path,20,20); printf("\nDirectory look-up of %s\n",path); dumpDir(path); #endif yaffs_unmount(path); return 0; yaffs_symlink("yyfile","/boot/slink"); yaffs_readlink("/boot/slink",str,100); printf("symlink alias is %s\n",str); printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); printf("\nDirectory look-up of /boot (using stat instead of lstat)\n"); dumpDirFollow("/boot"); printf("\nDirectory look-up of /boot/directory1\n"); dumpDir("/boot/directory1"); h = yaffs_open("/boot/slink",O_RDWR,0); printf("file length is %d\n",yaffs_lseek(h,0,SEEK_END)); yaffs_close(h); yaffs_unlink("/boot/slink"); printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); // Check chmod yaffs_stat("/boot/yyfile",&ystat); temp_mode = ystat.st_mode; yaffs_chmod("/boot/yyfile",0x55555); printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); yaffs_chmod("/boot/yyfile",temp_mode); printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); // Permission checks... PermissionsCheck("/boot/yyfile",0, O_WRONLY,0); PermissionsCheck("/boot/yyfile",0, O_RDONLY,0); PermissionsCheck("/boot/yyfile",0, O_RDWR,0); PermissionsCheck("/boot/yyfile",S_IREAD, O_WRONLY,0); PermissionsCheck("/boot/yyfile",S_IREAD, O_RDONLY,1); PermissionsCheck("/boot/yyfile",S_IREAD, O_RDWR,0); PermissionsCheck("/boot/yyfile",S_IWRITE, O_WRONLY,1); PermissionsCheck("/boot/yyfile",S_IWRITE, O_RDONLY,0); PermissionsCheck("/boot/yyfile",S_IWRITE, O_RDWR,0); PermissionsCheck("/boot/yyfile",S_IREAD | S_IWRITE, O_WRONLY,1); PermissionsCheck("/boot/yyfile",S_IREAD | S_IWRITE, O_RDONLY,1); PermissionsCheck("/boot/yyfile",S_IREAD | S_IWRITE, O_RDWR,1); yaffs_chmod("/boot/yyfile",temp_mode); //create a zero-length file and unlink it (test for scan bug) h = yaffs_open("/boot/zlf",O_CREAT | O_TRUNC | O_RDWR,0); yaffs_close(h); yaffs_unlink("/boot/zlf"); yaffs_DumpDevStruct("/boot"); 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 yaffs_scan_test(const char *path) { } int resize_stress_test(const char *path) { int a,b,i,j; int x; int r; char aname[100]; char bname[100]; char abuffer[1000]; char bbuffer[1000]; yaffs_StartUp(); yaffs_mount(path); sprintf(aname,"%s%s",path,"/a"); sprintf(bname,"%s%s",path,"/b"); memset(abuffer,'a',1000); memset(bbuffer,'b',1000); a = yaffs_open(aname, O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); b = yaffs_open(bname, O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); printf(" %s %d %s %d\n",aname,a,bname,b); x = 0; for(j = 0; j < 100; j++) { yaffs_lseek(a,0,SEEK_END); for(i = 0; i <20000; i++) { //r = yaffs_lseek(b,i,SEEK_SET); //r = yaffs_write(b,bbuffer,1000); if(x & 0x16) { // shrink int syz = yaffs_lseek(a,0,SEEK_END); syz -= 500; if(syz < 0) syz = 0; yaffs_truncate(a,syz); } else { //expand r = yaffs_lseek(a,i * 500,SEEK_SET); r = yaffs_write(a,abuffer,1000); } x++; } } return 0; } int resize_stress_test_no_grow_complex(const char *path,int iters) { int a,b,i,j; int x; int r; char aname[100]; char bname[100]; char abuffer[1000]; char bbuffer[1000]; yaffs_StartUp(); yaffs_mount(path); sprintf(aname,"%s%s",path,"/a"); sprintf(bname,"%s%s",path,"/b"); memset(abuffer,'a',1000); memset(bbuffer,'b',1000); a = yaffs_open(aname, O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); b = yaffs_open(bname, O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); printf(" %s %d %s %d\n",aname,a,bname,b); x = 0; for(j = 0; j < iters; j++) { yaffs_lseek(a,0,SEEK_END); for(i = 0; i <20000; i++) { //r = yaffs_lseek(b,i,SEEK_SET); //r = yaffs_write(b,bbuffer,1000); if(!(x%20)) { // shrink int syz = yaffs_lseek(a,0,SEEK_END); while(syz > 4000) { syz -= 2050; if(syz < 0) syz = 0; yaffs_truncate(a,syz); syz = yaffs_lseek(a,0,SEEK_END); printf("shrink to %d\n",syz); } } else { //expand r = yaffs_lseek(a,500,SEEK_END); r = yaffs_write(a,abuffer,1000); } x++; } printf("file size is %d\n",yaffs_lseek(a,0,SEEK_END)); } return 0; } int resize_stress_test_no_grow(const char *path,int iters) { int a,b,i,j; int x; int r; char aname[100]; char bname[100]; char abuffer[1000]; char bbuffer[1000]; yaffs_StartUp(); yaffs_mount(path); sprintf(aname,"%s%s",path,"/a"); sprintf(bname,"%s%s",path,"/b"); memset(abuffer,'a',1000); memset(bbuffer,'b',1000); a = yaffs_open(aname, O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); b = yaffs_open(bname, O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); printf(" %s %d %s %d\n",aname,a,bname,b); x = 0; for(j = 0; j < iters; j++) { yaffs_lseek(a,0,SEEK_END); for(i = 0; i <20000; i++) { //r = yaffs_lseek(b,i,SEEK_SET); //r = yaffs_write(b,bbuffer,1000); if(!(x%20)) { // shrink int syz = yaffs_lseek(a,0,SEEK_END); while(syz > 4000) { syz -= 2050; if(syz < 0) syz = 0; yaffs_truncate(a,syz); syz = yaffs_lseek(a,0,SEEK_END); printf("shrink to %d\n",syz); } } else { //expand r = yaffs_lseek(a,-500,SEEK_END); r = yaffs_write(a,abuffer,1000); } x++; } printf("file size is %d\n",yaffs_lseek(a,0,SEEK_END)); } 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 *was* buypassed // resulting in erroneous reads after writes. // This bug has been fixed. 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 truncate_test(void) { int a; int r; int i; int l; char y[10]; yaffs_StartUp(); yaffs_mount("/boot"); yaffs_unlink("/boot/trunctest"); a = yaffs_open("/boot/trunctest", O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); yaffs_write(a,"abcdefghijklmnopqrstuvwzyz",26); yaffs_truncate(a,3); l= yaffs_lseek(a,0,SEEK_END); printf("truncated length is %d\n",l); yaffs_lseek(a,5,SEEK_SET); yaffs_write(a,"1",1); yaffs_lseek(a,0,SEEK_SET); r = yaffs_read(a,y,10); printf("read %d bytes:",r); for(i = 0; i < r; i++) printf("[%02X]",y[i]); printf("\n"); return 0; } int main(int argc, char *argv[]) { //return long_test(argc,argv); //return cache_read_test(); //return resize_stress_test_no_grow("/flash",2); scan_pattern_test("/boot",40000,10); //short_scan_test("/flash",40000,200); return 0; long_test_on_path("/flash"); long_test_on_path("/flash"); // cache_bypass_bug_test(); free_space_check(); return 0; }