/* * Unit test for node.h */ #include "libisofs.h" #include "node.h" #include "error.h" #include "image.h" #include "test.h" #include "mocked_fsrc.h" #include static void test_iso_tree_add_new_dir() { int result; IsoDir *root; IsoDir *node1, *node2, *node3, *node4; IsoImage *image; result = iso_image_new("volume_id", &image); CU_ASSERT_EQUAL(result, 1); root = iso_image_get_root(image); CU_ASSERT_PTR_NOT_NULL(root); result = iso_tree_add_new_dir(root, "Dir1", &node1); CU_ASSERT_EQUAL(result, 1); CU_ASSERT_EQUAL(root->nchildren, 1); CU_ASSERT_PTR_EQUAL(root->children, node1); CU_ASSERT_PTR_NULL(node1->node.next); CU_ASSERT_PTR_EQUAL(node1->node.parent, root); CU_ASSERT_EQUAL(node1->node.type, LIBISO_DIR); CU_ASSERT_STRING_EQUAL(node1->node.name, "Dir1"); /* creation of a second dir, to be inserted before */ result = iso_tree_add_new_dir(root, "A node to be added first", &node2); CU_ASSERT_EQUAL(result, 2); CU_ASSERT_EQUAL(root->nchildren, 2); CU_ASSERT_PTR_EQUAL(root->children, node2); CU_ASSERT_PTR_EQUAL(node2->node.next, node1); CU_ASSERT_PTR_NULL(node1->node.next); CU_ASSERT_PTR_EQUAL(node2->node.parent, root); CU_ASSERT_EQUAL(node2->node.type, LIBISO_DIR); CU_ASSERT_STRING_EQUAL(node2->node.name, "A node to be added first"); /* creation of a 3rd node, to be inserted last */ result = iso_tree_add_new_dir(root, "This node will be inserted last", &node3); CU_ASSERT_EQUAL(result, 3); CU_ASSERT_EQUAL(root->nchildren, 3); CU_ASSERT_PTR_EQUAL(root->children, node2); CU_ASSERT_PTR_EQUAL(node2->node.next, node1); CU_ASSERT_PTR_EQUAL(node1->node.next, node3); CU_ASSERT_PTR_NULL(node3->node.next); CU_ASSERT_PTR_EQUAL(node3->node.parent, root); CU_ASSERT_EQUAL(node3->node.type, LIBISO_DIR); CU_ASSERT_STRING_EQUAL(node3->node.name, "This node will be inserted last"); /* force some failures */ result = iso_tree_add_new_dir(NULL, "dsadas", &node4); CU_ASSERT_EQUAL(result, ISO_NULL_POINTER); result = iso_tree_add_new_dir(root, NULL, &node4); CU_ASSERT_EQUAL(result, ISO_NULL_POINTER); /* try to insert a new dir with same name */ result = iso_tree_add_new_dir(root, "This node will be inserted last", &node4); CU_ASSERT_EQUAL(result, ISO_NODE_NAME_NOT_UNIQUE); CU_ASSERT_EQUAL(root->nchildren, 3); CU_ASSERT_PTR_EQUAL(root->children, node2); CU_ASSERT_PTR_EQUAL(node2->node.next, node1); CU_ASSERT_PTR_EQUAL(node1->node.next, node3); CU_ASSERT_PTR_NULL(node3->node.next); CU_ASSERT_PTR_NULL(node4); /* but pointer to new dir can be null */ result = iso_tree_add_new_dir(root, "Another node", NULL); CU_ASSERT_EQUAL(result, 4); CU_ASSERT_EQUAL(root->nchildren, 4); CU_ASSERT_PTR_EQUAL(node2->node.next->next, node1); CU_ASSERT_STRING_EQUAL(node2->node.next->name, "Another node"); iso_image_unref(image); } static void test_iso_tree_add_new_symlink() { int result; IsoDir *root; IsoSymlink *node1, *node2, *node3, *node4; IsoImage *image; result = iso_image_new("volume_id", &image); CU_ASSERT_EQUAL(result, 1); root = iso_image_get_root(image); CU_ASSERT_PTR_NOT_NULL(root); result = iso_tree_add_new_symlink(root, "Link1", "/path/to/dest", &node1); CU_ASSERT_EQUAL(result, 1); CU_ASSERT_EQUAL(root->nchildren, 1); CU_ASSERT_PTR_EQUAL(root->children, node1); CU_ASSERT_PTR_NULL(node1->node.next); CU_ASSERT_PTR_EQUAL(node1->node.parent, root); CU_ASSERT_EQUAL(node1->node.type, LIBISO_SYMLINK); CU_ASSERT_STRING_EQUAL(node1->node.name, "Link1"); CU_ASSERT_STRING_EQUAL(node1->dest, "/path/to/dest"); /* creation of a second link, to be inserted before */ result = iso_tree_add_new_symlink(root, "A node to be added first", "/home/me", &node2); CU_ASSERT_EQUAL(result, 2); CU_ASSERT_EQUAL(root->nchildren, 2); CU_ASSERT_PTR_EQUAL(root->children, node2); CU_ASSERT_PTR_EQUAL(node2->node.next, node1); CU_ASSERT_PTR_NULL(node1->node.next); CU_ASSERT_PTR_EQUAL(node2->node.parent, root); CU_ASSERT_EQUAL(node2->node.type, LIBISO_SYMLINK); CU_ASSERT_STRING_EQUAL(node2->node.name, "A node to be added first"); CU_ASSERT_STRING_EQUAL(node2->dest, "/home/me"); /* creation of a 3rd node, to be inserted last */ result = iso_tree_add_new_symlink(root, "This node will be inserted last", "/path/to/dest", &node3); CU_ASSERT_EQUAL(result, 3); CU_ASSERT_EQUAL(root->nchildren, 3); CU_ASSERT_PTR_EQUAL(root->children, node2); CU_ASSERT_PTR_EQUAL(node2->node.next, node1); CU_ASSERT_PTR_EQUAL(node1->node.next, node3); CU_ASSERT_PTR_NULL(node3->node.next); CU_ASSERT_PTR_EQUAL(node3->node.parent, root); CU_ASSERT_EQUAL(node3->node.type, LIBISO_SYMLINK); CU_ASSERT_STRING_EQUAL(node3->node.name, "This node will be inserted last"); CU_ASSERT_STRING_EQUAL(node3->dest, "/path/to/dest"); /* force some failures */ result = iso_tree_add_new_symlink(NULL, "dsadas", "/path/to/dest", &node4); CU_ASSERT_EQUAL(result, ISO_NULL_POINTER); result = iso_tree_add_new_symlink(root, NULL, "/path/to/dest", &node4); CU_ASSERT_EQUAL(result, ISO_NULL_POINTER); result = iso_tree_add_new_symlink(root, "dsadas", NULL, &node4); CU_ASSERT_EQUAL(result, ISO_NULL_POINTER); /* try to insert a new link with same name */ result = iso_tree_add_new_symlink(root, "This node will be inserted last", "/", &node4); CU_ASSERT_EQUAL(result, ISO_NODE_NAME_NOT_UNIQUE); CU_ASSERT_EQUAL(root->nchildren, 3); CU_ASSERT_PTR_EQUAL(root->children, node2); CU_ASSERT_PTR_EQUAL(node2->node.next, node1); CU_ASSERT_PTR_EQUAL(node1->node.next, node3); CU_ASSERT_PTR_NULL(node3->node.next); CU_ASSERT_PTR_NULL(node4); /* but pointer to new link can be null */ result = iso_tree_add_new_symlink(root, "Another node", ".", NULL); CU_ASSERT_EQUAL(result, 4); CU_ASSERT_EQUAL(root->nchildren, 4); CU_ASSERT_PTR_EQUAL(node2->node.next->next, node1); CU_ASSERT_EQUAL(node2->node.next->type, LIBISO_SYMLINK); CU_ASSERT_STRING_EQUAL(((IsoSymlink*)(node2->node.next))->dest, "."); CU_ASSERT_STRING_EQUAL(node2->node.next->name, "Another node"); iso_image_unref(image); } static void test_iso_tree_add_new_special() { int result; IsoDir *root; IsoSpecial *node1, *node2, *node3, *node4; IsoImage *image; result = iso_image_new("volume_id", &image); CU_ASSERT_EQUAL(result, 1); root = iso_image_get_root(image); CU_ASSERT_PTR_NOT_NULL(root); result = iso_tree_add_new_special(root, "Special1", S_IFSOCK | 0644, 0, &node1); CU_ASSERT_EQUAL(result, 1); CU_ASSERT_EQUAL(root->nchildren, 1); CU_ASSERT_PTR_EQUAL(root->children, node1); CU_ASSERT_PTR_NULL(node1->node.next); CU_ASSERT_PTR_EQUAL(node1->node.parent, root); CU_ASSERT_EQUAL(node1->node.type, LIBISO_SPECIAL); CU_ASSERT_STRING_EQUAL(node1->node.name, "Special1"); CU_ASSERT_EQUAL(node1->dev, 0); CU_ASSERT_EQUAL(node1->node.mode, S_IFSOCK | 0644); /* creation of a block dev, to be inserted before */ result = iso_tree_add_new_special(root, "A node to be added first", S_IFBLK | 0640, 34, &node2); CU_ASSERT_EQUAL(result, 2); CU_ASSERT_EQUAL(root->nchildren, 2); CU_ASSERT_PTR_EQUAL(root->children, node2); CU_ASSERT_PTR_EQUAL(node2->node.next, node1); CU_ASSERT_PTR_NULL(node1->node.next); CU_ASSERT_PTR_EQUAL(node2->node.parent, root); CU_ASSERT_EQUAL(node2->node.type, LIBISO_SPECIAL); CU_ASSERT_STRING_EQUAL(node2->node.name, "A node to be added first"); CU_ASSERT_EQUAL(node2->dev, 34); CU_ASSERT_EQUAL(node2->node.mode, S_IFBLK | 0640); /* creation of a 3rd node, to be inserted last */ result = iso_tree_add_new_special(root, "This node will be inserted last", S_IFCHR | 0440, 345, &node3); CU_ASSERT_EQUAL(result, 3); CU_ASSERT_EQUAL(root->nchildren, 3); CU_ASSERT_PTR_EQUAL(root->children, node2); CU_ASSERT_PTR_EQUAL(node2->node.next, node1); CU_ASSERT_PTR_EQUAL(node1->node.next, node3); CU_ASSERT_PTR_NULL(node3->node.next); CU_ASSERT_PTR_EQUAL(node3->node.parent, root); CU_ASSERT_EQUAL(node3->node.type, LIBISO_SPECIAL); CU_ASSERT_STRING_EQUAL(node3->node.name, "This node will be inserted last"); CU_ASSERT_EQUAL(node3->dev, 345); CU_ASSERT_EQUAL(node3->node.mode, S_IFCHR | 0440); /* force some failures */ result = iso_tree_add_new_special(NULL, "dsadas", S_IFBLK | 0440, 345, &node4); CU_ASSERT_EQUAL(result, ISO_NULL_POINTER); result = iso_tree_add_new_special(root, NULL, S_IFBLK | 0440, 345, &node4); CU_ASSERT_EQUAL(result, ISO_NULL_POINTER); result = iso_tree_add_new_special(root, "dsadas", S_IFDIR | 0666, 0, &node4); CU_ASSERT_EQUAL(result, ISO_WRONG_ARG_VALUE); result = iso_tree_add_new_special(root, "dsadas", S_IFREG | 0666, 0, &node4); CU_ASSERT_EQUAL(result, ISO_WRONG_ARG_VALUE); result = iso_tree_add_new_special(root, "dsadas", S_IFLNK | 0666, 0, &node4); CU_ASSERT_EQUAL(result, ISO_WRONG_ARG_VALUE); /* try to insert a new special file with same name */ result = iso_tree_add_new_special(root, "This node will be inserted last", S_IFIFO | 0666, 0, &node4); CU_ASSERT_EQUAL(result, ISO_NODE_NAME_NOT_UNIQUE); CU_ASSERT_EQUAL(root->nchildren, 3); CU_ASSERT_PTR_EQUAL(root->children, node2); CU_ASSERT_PTR_EQUAL(node2->node.next, node1); CU_ASSERT_PTR_EQUAL(node1->node.next, node3); CU_ASSERT_PTR_NULL(node3->node.next); CU_ASSERT_PTR_NULL(node4); /* but pointer to new special can be null */ result = iso_tree_add_new_special(root, "Another node", S_IFIFO | 0666, 0, NULL); CU_ASSERT_EQUAL(result, 4); CU_ASSERT_EQUAL(root->nchildren, 4); CU_ASSERT_PTR_EQUAL(node2->node.next->next, node1); CU_ASSERT_EQUAL(node2->node.next->type, LIBISO_SPECIAL); CU_ASSERT_EQUAL(((IsoSpecial*)(node2->node.next))->dev, 0); CU_ASSERT_EQUAL(node2->node.next->mode, S_IFIFO | 0666); CU_ASSERT_STRING_EQUAL(node2->node.next->name, "Another node"); iso_image_unref(image); } static void test_iso_tree_add_node_dir() { int result; IsoDir *root; IsoNode *node1, *node2, *node3, *node4; IsoImage *image; IsoFilesystem *fs; struct stat info; result = iso_image_new("volume_id", &image); CU_ASSERT_EQUAL(result, 1); root = iso_image_get_root(image); CU_ASSERT_PTR_NOT_NULL(root); /* replace image filesystem with out mockep one */ iso_filesystem_unref(image->fs); result = test_mocked_filesystem_new(&fs); CU_ASSERT_EQUAL(result, 1); image->fs = fs; /* add some files to the filesystem */ info.st_mode = S_IFDIR | 0550; info.st_uid = 20; info.st_gid = 21; info.st_atime = 234523; info.st_ctime = 23432432; info.st_mtime = 1111123; result = test_mocked_fs_add_dir(fs, "/dir", info); CU_ASSERT_EQUAL(result, 1); info.st_mode = S_IFDIR | 0555; info.st_uid = 30; info.st_gid = 31; info.st_atime = 3234523; info.st_ctime = 3234432; info.st_mtime = 3111123; result = test_mocked_fs_add_dir(fs, "/dir/a child node", info); CU_ASSERT_EQUAL(result, 1); /* and now insert those files to the image */ result = iso_tree_add_node(image, root, "/dir", &node1); CU_ASSERT_EQUAL(result, 1); CU_ASSERT_EQUAL(root->nchildren, 1); CU_ASSERT_PTR_EQUAL(root->children, node1); CU_ASSERT_PTR_NULL(node1->next); CU_ASSERT_PTR_EQUAL(node1->parent, root); CU_ASSERT_EQUAL(node1->type, LIBISO_DIR); CU_ASSERT_STRING_EQUAL(node1->name, "dir"); CU_ASSERT_EQUAL(node1->mode, S_IFDIR | 0550); CU_ASSERT_EQUAL(node1->uid, 20); CU_ASSERT_EQUAL(node1->gid, 21); CU_ASSERT_EQUAL(node1->atime, 234523); CU_ASSERT_EQUAL(node1->ctime, 23432432); CU_ASSERT_EQUAL(node1->mtime, 1111123); CU_ASSERT_PTR_NULL(((IsoDir*)node1)->children); CU_ASSERT_EQUAL(((IsoDir*)node1)->nchildren, 0); result = iso_tree_add_node(image, root, "/dir/a child node", &node2); CU_ASSERT_EQUAL(result, 2); CU_ASSERT_EQUAL(root->nchildren, 2); CU_ASSERT_PTR_EQUAL(root->children, node2); CU_ASSERT_PTR_EQUAL(node2->next, node1); CU_ASSERT_PTR_NULL(node1->next); CU_ASSERT_PTR_EQUAL(node1->parent, root); CU_ASSERT_PTR_EQUAL(node2->parent, root); CU_ASSERT_EQUAL(node2->type, LIBISO_DIR); CU_ASSERT_STRING_EQUAL(node2->name, "a child node"); CU_ASSERT_EQUAL(node2->mode, S_IFDIR | 0555); CU_ASSERT_EQUAL(node2->uid, 30); CU_ASSERT_EQUAL(node2->gid, 31); CU_ASSERT_EQUAL(node2->atime, 3234523); CU_ASSERT_EQUAL(node2->ctime, 3234432); CU_ASSERT_EQUAL(node2->mtime, 3111123); CU_ASSERT_PTR_NULL(((IsoDir*)node2)->children); CU_ASSERT_EQUAL(((IsoDir*)node2)->nchildren, 0); iso_image_unref(image); } void add_tree_suite() { CU_pSuite pSuite = CU_add_suite("Iso Tree Suite", NULL, NULL); CU_add_test(pSuite, "iso_tree_add_new_dir()", test_iso_tree_add_new_dir); CU_add_test(pSuite, "iso_tree_add_new_symlink()", test_iso_tree_add_new_symlink); CU_add_test(pSuite, "iso_tree_add_new_special()", test_iso_tree_add_new_special); CU_add_test(pSuite, "iso_tree_add_node() [1. dir]", test_iso_tree_add_node_dir); }