X-Git-Url: http://www.aleph1.co.uk/gitweb/?a=blobdiff_plain;f=direct%2Ftest-framework%2Ftimothy_tests%2Flinux_tests%2Flinux_test.c;fp=direct%2Ftest-framework%2Ftimothy_tests%2Flinux_tests%2Flinux_test.c;h=e450236560b92cb03ae3617e662f691d307780ae;hb=e5daa72b0083831ab762a650860687fe7d25d6b3;hp=0000000000000000000000000000000000000000;hpb=a78bce6f4a7042fa153ab32d2bb263ecf7d27b66;p=yaffs2.git diff --git a/direct/test-framework/timothy_tests/linux_tests/linux_test.c b/direct/test-framework/timothy_tests/linux_tests/linux_test.c new file mode 100644 index 0000000..e450236 --- /dev/null +++ b/direct/test-framework/timothy_tests/linux_tests/linux_test.c @@ -0,0 +1,319 @@ +/* + * YAFFS: Yet another FFS. A NAND-flash specific file system. + * + * Copyright (C) 2002-2010 Aleph One Ltd. + * for Toby Churchill Ltd and Brightstar Engineering + * + * Created by Timothy Manning + * + * 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 "linux_test.h" + +int random_seed; +int simulate_power_failure = 1; + +char message[400]; //this is used for storing print messages. + + + +const struct option long_options[]={ + {"help", 0,NULL,'h'}, + + + {"print_level", 1,NULL,'p'}, + {"quiet", 0,NULL,'q'}, + + {"seed", 1,NULL,'s'}, + + {"verbose", 0,NULL,'v'} +}; + +const char short_options[]="hp:qs:v"; + + +void init(int argc, char *argv[]) +{ + char dir[200]; + dir[0]='\0'; + int x=-1; + char message[100]; + int new_option; + + x=(unsigned)time(NULL); + sprintf(message,"seeding srand with: %d\n",x); + print_message(2,message); + srand(x); + + + + do { + new_option=getopt_long(argc,argv,short_options,long_options,NULL); + if (new_option=='h'){ + printf("mirror_tests help\n"); + printf("arguments:\n"); + printf("\t-p [NUMBER] //sets the print level for mirror_tests.\n"); + printf("\t-v //verbose mode everything is printed\n"); + printf("\t-q //quiet mode nothing is printed.\n"); + printf("\t-s [number] //seeds rand with the number\n"); + + exit(0); + + } else if (new_option=='p'){ + set_print_level(atoi(optarg)); + } else if (new_option=='v'){ + set_print_level(5); + } else if (new_option=='q'){ + set_print_level(-1); + } else if (new_option=='s'){ + srand(atoi(argv[x+1])); + + } else if (new_option==-1){ + + } else if (new_option=='?') { + printf("bad argument\n"); + exit(0); + } + }while(new_option!=-1); +} + +int main(int argc, char *argv[]) +{ + dir_struct *scanned_dir=NULL; + int output=0; + int break_bool=0; + int x=5; + + init(argc,argv); + while( 1){ + while (break_bool!=1){ + //printf("x %d\n",x); + x--; + if (x<0 &&(break_bool!=1)){ + output=mkdir_test(); + break_bool=1; + } + x--; + if (x<0 &&(break_bool!=1)){ + output=rmdir_test(); + break_bool=1; + } + x--; + if (x<0 &&(break_bool!=1)){ + output=mknod_test(); + break_bool=1; + } + x--; + if (x<0 &&(break_bool!=1)){ + output=symlink_test(); + break_bool=1; + } + x--; + if (x<0 &&(break_bool!=1)){ + output=link_test(); + break_bool=1; + } + x--; + if (x<0 &&(break_bool!=1)){ + output=rename_test(); + break_bool=1; + } + x--; + if (x<0 &&(break_bool!=1)){ + scanned_dir=scan_dir(); + + output=remount_test(); + check_dir(scanned_dir); + scanned_dir=NULL; //the scanned dir has been freed in check_dir. + break_bool=1; + } + } + //printf("resetting x\n"); + check_function(output); + break_bool=0; + x=(rand()% 99); + } + return 0; +} + +dir_struct * scan_dir(void) +{ + struct dirent *dir_data; + dir_struct *dir=NULL; + dir=malloc(sizeof(dir_struct)); + memset(dir, 0, sizeof(dir_struct)); + DIR *open_dir=NULL; + + + open_dir=opendir(ROOT_PATH); + if (open_dir < 0){ + sprintf(message,"failed to find the directory: %s",ROOT_PATH); + print_message(1,message); + } + dir_data=readdir(open_dir); + while(dir_data){ + dir->path_list=linked_list_add_node(HEAD,dir->path_list); + dir->path_list->string=malloc(strlen(dir_data->d_name)+1); + strcpy(dir->path_list->string,dir_data->d_name); + sprintf(message,"opened file: %s\n",dir->path_list->string); + print_message(5,message); + dir_data=readdir(open_dir); + } + closedir(open_dir); + //node_print_pointers(dir->path_list); + return dir; +} + +int check_dir(dir_struct *old_dir) +{ + print_message(3,"scanning new dir\n"); + dir_struct *new_dir=scan_dir(); + node *new_list=new_dir->path_list; + node *old_list=old_dir->path_list; + int exit_loop=0,error=0; + print_message(3,"checking dir\n"); + for (;old_list!= NULL;old_list=old_list->next){ + //sprintf(message,"new_list=!NULL= %d, exit_loop !=1 = %d\n",(new_list!=NULL),(exit_loop !=1)); + //print_message(3,message); + for (;(new_list!=NULL) && (exit_loop !=1);new_list=new_list->next){ + //sprintf(message,"comparing %s and %s\n",old_list->string,new_list->string); + //print_message(3,message); + if (strcmp( new_list->string ,old_list->string)==0){ + //files match -now compare the modes and contents of the files. + //and set the paths to NULL. + exit_loop=1; + } + /*if (new_list->next==NULL){ + print_message(3,"next is null\n"); + + }*/ + } + if (exit_loop !=1){ + //failed to find a matching file + sprintf(message,"a file has disappeared: %s\n",old_list->string); + print_message(3,message); + error=1; + + } + new_list=new_dir->path_list; + exit_loop=0; + } + //now check if there are any old unmatched files + + //free both data structs + delete_linked_list(old_dir->path_list); + delete_linked_list(new_dir->path_list); + new_dir->path_list=NULL; + old_dir->path_list=NULL; + free(old_dir); + free(new_dir); + if (error ==1){ + print_message(3,"checking dir failed\n"); + if (get_exit_on_error()==1){ + print_message(3,"exiting_program\n"); + exit(0); + } + } + + else if (error !=1){ + print_message(3,"checking dir passed\n"); + } + return error; +} + +int remount_test(void) +{ + int output; + print_message(3,"\nunmounting\n"); + output=umount2("/mnt/y",1); + check_function(output); + print_message(3,"mounting\n"); + mount("/dev/mtdblock0","/mnt/y","yaffs2",0,NULL); + check_function(output); + return output; +} + +int mkdir_test(void) +{ + + char string[FILE_NAME_LENGTH+strlen(ROOT_PATH)]; + int mode=0,output=0; + strcpy(string,ROOT_PATH); + strcat(string,generate_random_string(FILE_NAME_LENGTH)); + mode = ((S_IREAD|S_IWRITE)&random_int()); + sprintf(message,"\nmaking directory: %s, with mode %d\n",string,mode); + print_message(3,message); + output= mkdir(string,mode); + return output; +} + +int rmdir_test(void) +{ + char string[FILE_NAME_LENGTH+strlen(ROOT_PATH)]; + int output=0; + strcpy(string,ROOT_PATH); + strcat(string,generate_random_string(FILE_NAME_LENGTH)); + + sprintf(message,"\nremoving directory: %s\n",string); + print_message(3,message); + output= rmdir(string); + return output; +} +int symlink_test(void) +{ + char string[FILE_NAME_LENGTH+strlen(ROOT_PATH)]; + char string2[FILE_NAME_LENGTH+strlen(ROOT_PATH)]; + int output; + strcpy(string,ROOT_PATH); + strcat(string,generate_random_string(FILE_NAME_LENGTH)); + strcpy(string2,ROOT_PATH); + strcat(string2,generate_random_string(FILE_NAME_LENGTH)); + sprintf(message,"\nsymlink from: %s, to %s\n",string,string2); + print_message(3,message); + output= symlink(string,string2); + return output; +} +int rename_test(void) +{ + char string[FILE_NAME_LENGTH+strlen(ROOT_PATH)]; + char string2[FILE_NAME_LENGTH+strlen(ROOT_PATH)]; + int output; + strcpy(string,ROOT_PATH); + strcat(string,generate_random_string(FILE_NAME_LENGTH)); + strcpy(string2,ROOT_PATH); + strcat(string2,generate_random_string(FILE_NAME_LENGTH)); + sprintf(message,"\nrenaming from: %s, to %s\n",string,string2); + print_message(3,message); + output= rename(string,string2); + return output; +} +int link_test(void) +{ + char string[FILE_NAME_LENGTH+strlen(ROOT_PATH)]; + char string2[FILE_NAME_LENGTH+strlen(ROOT_PATH)]; + int output=0; + strcpy(string,ROOT_PATH); + strcat(string,generate_random_string(FILE_NAME_LENGTH)); + strcpy(string2,ROOT_PATH); + strcat(string2,generate_random_string(FILE_NAME_LENGTH)); + sprintf(message,"\nlink from: %s, to %s\n",string,string2); + print_message(3,message); + output= link(string,string2); + return output; +} +int mknod_test(void) +{ + char string[FILE_NAME_LENGTH+strlen(ROOT_PATH)]; + int mode=0,dev=0,output=0; + strcpy(string,ROOT_PATH); + strcat(string,generate_random_string(FILE_NAME_LENGTH)); + mode = ((S_IREAD|S_IWRITE)&random_int()); + dev = random_int(); + sprintf(message,"\nmaking node: %s, with mode %d, dev %d\n",string,mode,dev); + print_message(3,message); + output= mknod(string,mode,dev); + return output; +}