diff --git a/include/direntry.h b/include/direntry.h index be06514..62bd623 100644 --- a/include/direntry.h +++ b/include/direntry.h @@ -35,7 +35,8 @@ typedef struct treeNode { /*for root*/ TreeNode *fischl_init_entry(int new_inode_number, const char *fileName, INode *new_inode); -/*root directory have its own initialization, so parent wont be NULL*/ +/*the to be added file in add_entry should be parent-child relationship with treenode, otherwise will wrong */ +/*see Add_FindFiletest in dir_API.cpp*/ int fischl_add_entry(TreeNode *parent, int new_inode_number, const char *fileName, INode *new_inode); /*if want to use dir mode use the subdirectory treeNode pointer */ //e.g. FileNode *Dirnode = fischl_find_entry(); can see file inside with Dirnode->subdirectory diff --git a/lib/direntry.cpp b/lib/direntry.cpp index 0d11546..83df23d 100644 --- a/lib/direntry.cpp +++ b/lib/direntry.cpp @@ -64,7 +64,7 @@ TreeNode *find_parentPath(TreeNode *root, const char *path) { file = lookupHash(current->contents, segment); if (file != NULL && file->subdirectory == NULL) { free(pathCopy); - printf("status current directory %s\n",current->dirName); + //printf("status current directory %s\n",current->dirName); return current; //File found } current = file ? file->subdirectory : NULL; @@ -107,7 +107,7 @@ void freeTree(TreeNode *node) { freeTree(temp->subdirectory); } // Free the FileNode if it's not a directory - printf("free who %s\n",temp->name); + // printf("free who %s\n",temp->name); free(temp->name); free(temp); } diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 82ccfd4..95628fe 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -25,6 +25,7 @@ add_executable(${TARGET_DIR_API} # Link Google Test to your test executables target_link_libraries(${TARGET_LAYER0} gtest gtest_main) target_link_libraries(${TARGET_LAYER1_API} gtest gtest_main) +target_link_libraries(${TARGET_DIR_API} gtest gtest_main) # add test to activate ctest -VV add_test(NAME ${TARGET_LAYER0} COMMAND sudo ./${TARGET_LAYER0} ${DIR_PLACE}) diff --git a/test/dir_API.cpp b/test/dir_API.cpp index 2d2b2a4..2b124b8 100644 --- a/test/dir_API.cpp +++ b/test/dir_API.cpp @@ -8,103 +8,94 @@ #include #include #include +#include #include "fs.h" #include "direntry.h" -int main() { +const char* d; + +TreeNode *root;//global can be taken + +TEST(DirTest, root_test) { //Init fake root directory INode inode_root; u_int64_t file_permissions = 0; inode_root.permissions = file_permissions | S_IFDIR; - TreeNode *root = fischl_init_entry(0, "/", &inode_root);//0 is inode number assigned by inode_allocate() - //add file or dir under fake root - INode inode_file1; - fischl_add_entry(root, 2, "file1",&inode_file1); - //I will put this function in create_new_inode function, there will inode number(2) when inode_allocate - INode inode_dir1; - //permission is necessary there to create treeNode or not + root = fischl_init_entry(0, "/", &inode_root);//0 is inode number assigned by inode_allocate() +} +TEST(DirTest, AddFile_test) { + //assume file and dir itself(content,metadata) same,but different name and inode number + INode inode_file; + INode inode_dir; + u_int64_t file_permissions = 0; file_permissions = 0; - inode_dir1.permissions = file_permissions | S_IFDIR; - fischl_add_entry(root, 3, "dir1",&inode_dir1); - //find dir file (from root directory view, root contains dir1/ subdirectory) - FileNode *get_dir1 = fischl_find_entry(root,"/dir1/"); - if(get_dir1 == NULL){ - printf("No dir1 under %s\n",root->dirName); - freeTree(root); - return -1; - }else{ - fprintf(stderr,"[%s ,%d]",__func__,__LINE__); - printf(" %s under %s\n",get_dir1->name,root->dirName); - } - //add file2 under dir1 - INode inode_file2; - if(get_dir1->subdirectory != NULL){ - //Treenode dir(you cannot find here), you only can get Filenode dir based on fischl_find_entry Function - //So use Filenode->subdirectory will point to the treenode dir, then can add files - fischl_add_entry(get_dir1->subdirectory, 4, "file2",&inode_file2); - printf("add file2 in dir1\n"); - } - /**********************************************************/ - //This is for debugging, and demonstate to you - TreeNode *get_dir1_tree = find_parentPath(root,"/dir1/file2"); - if(get_dir1_tree == get_dir1->subdirectory){ - fprintf(stderr,"[%s ,%d]",__func__,__LINE__); - printf(" [Treenode]get_dir1_tree->dirName (%s) same [Filenode]get_dir1->name (%s)\n",get_dir1_tree->dirName,get_dir1->name); - }else{ - printf("not same\n"); - } - /**********************************************************/ + inode_dir.permissions = file_permissions | S_IFDIR; + fischl_add_entry(root, 2, "file1",&inode_file); + fischl_add_entry(root, 3, "dir1",&inode_dir); +} +TEST(DirTest, FindFile_test) { + //find file + FileNode *get_file = fischl_find_entry(root,"/file1"); + EXPECT_TRUE(get_file != NULL); + EXPECT_STREQ(get_file->name,"file1"); + //find dir + FileNode *get_dir = fischl_find_entry(root,"/dir1/"); + EXPECT_TRUE(get_dir != NULL);//detect this should find success + EXPECT_STREQ(get_dir->name, "dir1"); + ASSERT_TRUE(get_dir->subdirectory != NULL);//secure it is directory + //check . function + get_dir = fischl_find_entry(root,"./"); + EXPECT_TRUE(get_dir != NULL);//detect this should find success + EXPECT_STREQ(get_dir->name, "/"); + ASSERT_TRUE(get_dir->subdirectory != NULL);//secure it is directory +} +TEST(DirTest, Add_FindFile_test) { + //add file and dir under subdirectory instead of root + INode inode_file; + INode inode_dir; + u_int64_t file_permissions = 0; + file_permissions = 0; + inode_dir.permissions = file_permissions | S_IFDIR; + + /*add with subdirectory*/ + //Treenode dir(you cannot find here), you only can get Filenode dir based on fischl_find_entry Function + //So use Filenode->subdirectory will point to the treenode dir, then can add files + FileNode *get_dir = fischl_find_entry(root,"/dir1/"); + fischl_add_entry(get_dir->subdirectory, 4, "file2",&inode_file); + + //verfication treeNode and Filenode relationship + TreeNode *get_dir_tree = find_parentPath(root,"/dir1/file2"); + ASSERT_TRUE(get_dir_tree == get_dir->subdirectory);//treeNode dir should be same as treeNode subdir in that Filenode + //two Ways to get File(include dir itself) information - FileNode *get_file2 =NULL; + FileNode *get_file = NULL; //1. absolute path, the root(treeNode) will always exist when initialize - get_file2 = fischl_find_entry(root,"/dir1/file2"); - if(get_file2 == NULL){ - printf("No dir1 under dir1\n"); - freeTree(root); - return -1; - }else{ - fprintf(stderr,"[%s ,%d]",__func__,__LINE__); - printf(" %s under %sdir1/\n",get_file2->name,root->dirName); - } + get_file = fischl_find_entry(root,"/dir1/file2"); + EXPECT_TRUE(get_file != NULL); + EXPECT_STREQ(get_file->name,"file2"); //2. relative path, the get_dir1(FileNode)->subdirectory(treeNode), use treeNode(dir) to find - get_file2 = fischl_find_entry(get_dir1->subdirectory,"/file2"); - if(get_file2 == NULL){ - printf("No dir1 under %s\n",get_dir1->subdirectory->dirName); - freeTree(root); - return -1; - }else{ - fprintf(stderr,"[%s ,%d]",__func__,__LINE__); - printf(" %s under %s\n",get_file2->name,get_dir1->subdirectory->dirName); - } + get_file = fischl_find_entry(get_dir->subdirectory,"/file2"); + EXPECT_TRUE(get_file != NULL); + EXPECT_STREQ(get_file->name,"file2"); /**********************************************************/ //add one more file under dir1 - INode inode_file3; - if(get_dir1->subdirectory != NULL){ - fischl_add_entry(get_dir1_tree, 5, "file3",&inode_file3); - printf("add file3 in dir1\n"); - } - FileNode *get_file3 =NULL; - //fischl_find_entry(get_dir1->subdirectory,"/file3"); are equivalent - get_file3 = fischl_find_entry(get_dir1_tree,"/file3"); - if(get_file3 == NULL){ - printf("No dir1 under %s\n",get_dir1_tree->dirName); - freeTree(root); - return -1; - }else{ - printf(" %s under %s\n",get_file3->name,get_dir1_tree->dirName); - } - FileNode *get_file1 = NULL;//under root - //use .. to find - get_file1 = fischl_find_entry(get_dir1_tree,"../file1"); - if(get_file1 == NULL){ - printf("No file1\n"); - freeTree(root); - return -1; - }else{ - printf(" %s under root(..)\n",get_file1->name); - } + fischl_add_entry(get_dir->subdirectory, 5, "file3",&inode_file); + //find + get_file = fischl_find_entry(get_dir_tree,"./file3"); + EXPECT_TRUE(get_file != NULL); + EXPECT_STREQ(get_file->name,"file3"); + //use .. from dir1 to find file1 + get_file = fischl_find_entry(get_dir_tree,"../file1"); + EXPECT_TRUE(get_file != NULL); + EXPECT_STREQ(get_file->name,"file1"); + +} + +int main(int argc, char **argv) { + d = (argc < 2) ? "/dev/vdc" : argv[1];//how to do with this? + ::testing::InitGoogleTest(&argc, argv); + int result = RUN_ALL_TESTS(); // Cleanup freeTree(root); - - return 0; + return result; } \ No newline at end of file