X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs2.git;a=blobdiff_plain;f=direct%2Fbasic-test%2Fdtest.c;h=3cd13abe5593d7c9d6df12b9125e27c7f6342725;hp=fa48158d402b36afed578d9fcd47ab2ac48299f9;hb=d634851c1f36e7995726602d3af784478ccb472e;hpb=d7388fb75a13610d14d0afc397f826bd44c972e1 diff --git a/direct/basic-test/dtest.c b/direct/basic-test/dtest.c index fa48158..3cd13ab 100644 --- a/direct/basic-test/dtest.c +++ b/direct/basic-test/dtest.c @@ -9,12 +9,9 @@ * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. - * */ - - #include #include #include @@ -515,7 +512,7 @@ void leave_unlinked_file(const char *path,int maxIterations,int siz) void dumpDirFollow(const char *dname) { yaffs_DIR *d; - yaffs_dirent *de; + struct yaffs_dirent *de; struct yaffs_stat s; char str[100]; @@ -533,7 +530,7 @@ void dumpDirFollow(const char *dname) yaffs_lstat(str,&s); - printf("%s ino %d length %d mode %X ",de->d_name,(int)s.st_ino,(int)s.st_size,s.st_mode); + printf("%s ino %lld length %d mode %X ",de->d_name,(int)s.st_ino,s.st_size,s.st_mode); switch(s.st_mode & S_IFMT) { case S_IFREG: printf("data file"); break; @@ -562,7 +559,7 @@ void dumpDirFollow(const char *dname) void dump_directory_tree_worker(const char *dname,int recursive) { yaffs_DIR *d; - yaffs_dirent *de; + struct yaffs_dirent *de; struct yaffs_stat s; char str[1000]; @@ -580,7 +577,8 @@ void dump_directory_tree_worker(const char *dname,int recursive) yaffs_lstat(str,&s); - printf("%s inode %d obj %x length %d mode %X ",str,s.st_ino,de->d_dont_use,(int)s.st_size,s.st_mode); + printf("%s inode %d obj %x length %lld mode %X ", + str,s.st_ino,de->d_dont_use, s.st_size,s.st_mode); switch(s.st_mode & S_IFMT) { case S_IFREG: printf("data file"); break; @@ -897,7 +895,7 @@ int huge_directory_test_on_path(char *path) { yaffs_DIR *d; - yaffs_dirent *de; + struct yaffs_dirent *de; struct yaffs_stat s; int f; @@ -1546,7 +1544,7 @@ void lookup_test(const char *mountpt) yaffs_DIR *d; - yaffs_dirent *de; + struct yaffs_dirent *de; yaffs_start_up(); @@ -2755,6 +2753,425 @@ void link_follow_test(const char *mountpt) } +void max_files_test(const char *mountpt) +{ + char fn[100]; + char sn[100]; + char hn[100]; + int result; + int h; + int i; + + yaffs_trace_mask = 0; + + yaffs_start_up(); + + yaffs_mount(mountpt); + + for(i = 0; i < 5000; i++) { + sprintf(fn,"%s/file%d", mountpt, i); + yaffs_unlink(fn); + h = yaffs_open(fn,O_CREAT| O_RDWR, S_IREAD | S_IWRITE); + if(h < 0) + printf("File %s not created\n", fn); + yaffs_write(h,fn,100); + result = yaffs_close(h); + } + for(i = 0; i < 5; i++){ + sprintf(fn,"%s/file%d",mountpt, i); + yaffs_unlink(fn); + } + + for(i = 1000; i < 1010; i++){ + sprintf(fn,"%s/file%d",mountpt, i); + h = yaffs_open(fn,O_CREAT| O_RDWR, S_IREAD | S_IWRITE); + yaffs_write(h,fn,100); + if(h < 0) + printf("File %s not created\n", fn); + result = yaffs_close(h); + } + + yaffs_unmount(mountpt); + + //h =yaffs_open(hn,O_RDWR,0); + +} +void case_insensitive_test(const char *mountpt) +{ + char fn[100]; + char fn2[100]; + char buffer[100]; + int ret; + struct yaffs_stat s; + int h; + char *x; + + yaffs_trace_mask = 0; + + yaffs_start_up(); + + yaffs_mount(mountpt); + dump_directory_tree(mountpt); + + sprintf(fn,"%s/Abc.Txt",mountpt); + yaffs_unlink(fn); + h = yaffs_open(fn, O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); + + ret = yaffs_write(h,fn, strlen(fn) + 1); + + ret = yaffs_close(h); + + dump_directory_tree(mountpt); + + + strcpy(fn2, fn); + x = fn2; + while(*x) { + *x = toupper(*x); + x++; + } + + h = yaffs_open(fn2, O_RDONLY, 0); + ret = yaffs_read(h, buffer, 100); + + if (ret != strlen(fn) + 1 || memcmp(buffer, fn, ret)){ + printf("wrong file read\n"); + } else { + printf("File %s is the same as file %s\n", fn, fn2); + } + + ret = yaffs_stat(fn2, &s); + + printf("renaming\n"); + + ret = yaffs_rename(fn, fn2); + dump_directory_tree(mountpt); + +} + +void start_twice(const char *mountpt) +{ + printf("About to do first yaffs_start\n"); + yaffs_start_up(); + printf("started\n"); + printf("First mount returns %d\n", yaffs_mount(mountpt)); + printf("About to do second yaffs_start\n"); + yaffs_start_up(); + printf("started\n"); + printf("Second mount returns %d\n", yaffs_mount(mountpt)); +} + +#define N_WRITES 2000 +#define STRIDE 2000 + +#define BUFFER_N 1100 +unsigned xxbuffer[BUFFER_N]; + + +void set_buffer(int n) +{ + int i; + for(i = 0; i < BUFFER_N; i++) + xxbuffer[i] = i + n; +} + +void write_big_sparse_file(int h) +{ + int i; + loff_t offset = 0; + loff_t pos; + int n = sizeof(xxbuffer); + int wrote; + + for(i = 0; i < N_WRITES; i++) { + printf("writing at %lld\n", offset); + set_buffer(i); + pos = yaffs_lseek(h, offset, SEEK_SET); + if(pos != offset) { + printf("mismatched seek pos %lld offset %lld\n", + pos, offset); + perror("lseek64"); + exit(1); + } + wrote = yaffs_write(h, xxbuffer, n); + + if(wrote != n) { + printf("mismatched write wrote %d n %d\n", wrote, n); + exit(1); + } + + offset += (STRIDE * sizeof(xxbuffer)); + } + + yaffs_ftruncate(h, offset); + +} + + + + +void verify_big_sparse_file(int h) +{ + unsigned check_buffer[BUFFER_N]; + int i; + loff_t offset = 0; + loff_t pos; + int n = sizeof(check_buffer); + int result; + const char * check_type; + int checks_failed = 0; + int checks_passed = 0; + + for(i = 0; i < N_WRITES * STRIDE; i++) { + if(i % STRIDE) { + check_type = "zero"; + memset(xxbuffer,0, n); + } else { + check_type = "buffer"; + set_buffer(i/STRIDE); + } + //printf("%s checking %lld\n", check_type, offset); + pos = yaffs_lseek(h, offset, SEEK_SET); + if(pos != offset) { + printf("mismatched seek pos %lld offset %lld\n", + pos, offset); + perror("lseek64"); + exit(1); + } + result = yaffs_read(h, check_buffer, n); + + if(result != n) { + printf("mismatched read result %d n %d\n", result, n); + exit(1); + } + + + + + if(memcmp(xxbuffer, check_buffer, n)) { + int j; + + printf("buffer at %lld mismatches\n", pos); + printf("xxbuffer "); + for(j = 0; j < 20; j++) + printf(" %d",xxbuffer[j]); + printf("\n"); + printf("check_buffer "); + for(j = 0; j < 20; j++) + printf(" %d",check_buffer[j]); + printf("\n"); + + checks_failed++; + } else { + checks_passed++; + } + + offset += sizeof(xxbuffer); + } + + printf("%d checks passed, %d checks failed\n", checks_passed, checks_failed); + +} + + +void large_file_test(const char *mountpt) +{ + char xx_buffer[1000]; + int i; + int handle; + char fullname[100]; + loff_t file_end; + + yaffs_trace_mask = 0; + + yaffs_start_up(); + + yaffs_mount(mountpt); + printf("mounted\n"); + dumpDir(mountpt); + + sprintf(fullname, "%s/%s", mountpt, "big-test-file"); + + handle = yaffs_open(fullname, O_RDONLY, 0); + + handle = yaffs_open(fullname, O_CREAT | O_RDWR | O_TRUNC, S_IREAD | S_IWRITE); + + if(handle < 0) { + perror("opening file"); + exit(1); + } + + write_big_sparse_file(handle); + verify_big_sparse_file(handle); + + yaffs_close(handle); + + printf("Job done\n"); + yaffs_unmount(mountpt); + + yaffs_mount(mountpt); + printf("mounted again\n"); + dumpDir(mountpt); + handle = yaffs_open(fullname, O_RDONLY, 0); + verify_big_sparse_file(handle); + yaffs_unmount(mountpt); + + + yaffs_mount_common(mountpt, 0, 1); + printf("mounted with no checkpt\n"); + dumpDir(mountpt); + handle = yaffs_open(fullname, O_RDONLY, 0); + verify_big_sparse_file(handle); + yaffs_unmount(mountpt); + + /* Check resize by adding to the end, resizing back and verifying. */ + yaffs_mount_common(mountpt, 0, 1); + printf("checking resize\n"); + dumpDir(mountpt); + handle = yaffs_open(fullname, O_RDWR, 0); + + file_end = yaffs_lseek(handle, 0, SEEK_END); + printf("file_end %lld\n", file_end); + for(i = 0; i < 10000; i++) + yaffs_write(handle, xx_buffer, sizeof(xx_buffer)); + yaffs_ftruncate(handle, file_end); + + verify_big_sparse_file(handle); + yaffs_unmount(mountpt); + +} + + +int mk_dir(const char *mp, const char *name) +{ + char full_name[100]; + + sprintf(full_name, "%s/%s", mp, name); + + return yaffs_mkdir(full_name, S_IREAD| S_IWRITE); +} + +int mk_file(const char *mp, const char *name) +{ + char full_name[100]; + int h; + + sprintf(full_name, "%s/%s", mp, name); + + h = yaffs_open(full_name, O_RDWR | O_CREAT | O_TRUNC, S_IREAD| S_IWRITE); + + yaffs_write(h, name, strlen(name)); + + yaffs_close(h); + return 0; +} + +void xx_test(const char *mountpt) +{ + char xx_buffer[1000]; + + yaffs_start_up(); + + yaffs_format(mountpt,0,0,0); + + yaffs_mount(mountpt); + printf("mounted\n"); + dumpDir(mountpt); + + printf("create files\n"); + + mk_dir(mountpt, "foo"); + mk_file(mountpt, "foo/f1"); + mk_file(mountpt, "foo/f2"); + mk_file(mountpt, "foo/f3"); + mk_file(mountpt, "foo/f4"); + dump_directory_tree(mountpt); + + printf("unmount and remount\n"); + + /* Unmount/remount */ + yaffs_unmount(mountpt); + yaffs_mount(mountpt); + dump_directory_tree(mountpt); +} + +void yy_test(const char *mountpt) +{ + char xx_buffer[1000]; + + yaffs_start_up(); + + yaffs_mount(mountpt); + dump_directory_tree(mountpt); +} + + +void readdir_test(const char *mountpt) +{ + char xx_buffer[1000]; + int i; + int handle; + char fullname[100]; + + yaffs_DIR *dirs[100]; + + + yaffs_trace_mask = 0; + + yaffs_start_up(); + + yaffs_mount(mountpt); + + for(i = 0; i < 100; i++) { + dirs[i] = yaffs_opendir(mountpt); + printf("%2d %p,", i, dirs[i]); + } + + printf("\n"); + + for(i = 0; i < 100; i++) { + if(dirs[i]) + yaffs_closedir(dirs[i]); + } + + + for(i = 0; i < 100; i++) { + dirs[i] = yaffs_opendir(mountpt); + printf("%2d %p,", i, dirs[i]); + } + + yaffs_unmount(mountpt); + + +} + +void format_test(const char *mountpt) +{ + int ret; + + yaffs_start_up(); + + ret = yaffs_format(mountpt, 0, 0, 0); + printf("yaffs_format(...,0, 0, 0) of unmounted returned %d\n", ret); + + yaffs_mount(mountpt); + + ret = yaffs_format(mountpt, 0, 0, 0); + printf("yaffs_format(...,0, 0, 0) of mounted returned %d\n", ret); + + ret = yaffs_format(mountpt, 1, 0, 0); + printf("yaffs_format(...,1, 0, 0) of mounted returned %d\n", ret); + + ret = yaffs_mount(mountpt); + printf("mount should return 0 returned %d\n", ret); + + ret = yaffs_format(mountpt, 1, 0, 1); + printf("yaffs_format(...,1, 0, 1) of mounted returned %d\n", ret); + + ret = yaffs_mount(mountpt); + printf("mount should return -1 returned %d\n", ret); +} + int random_seed; int simulate_power_failure; @@ -2791,7 +3208,7 @@ int main(int argc, char *argv[]) //checkpoint_upgrade_test("/flash/flash",20); //small_overwrite_test("/flash/flash",1000); //checkpoint_fill_test("/flash/flash",20); - // random_small_file_test("/flash/flash",10000); + //random_small_file_test("/flash/flash",10000); // huge_array_test("/flash/flash",10); @@ -2820,7 +3237,23 @@ int main(int argc, char *argv[]) //test_flash_traffic("yaffs2"); // link_follow_test("/yaffs2"); - basic_utime_test("/yaffs2"); + //basic_utime_test("/yaffs2"); + + + //format_test("/yaffs2"); + + //max_files_test("/yaffs2"); + + //start_twice("/yaffs2"); + + //large_file_test("/yaffs2"); + //readdir_test("/yaffs2"); + + //basic_utime_test("/yaffs2"); + //case_insensitive_test("/yaffs2"); + + yy_test("/yaffs2"); + return 0;