iSulad/test/path/path_llt.cc
wujing f0b6c9619e using glibc library functions for unit test
Signed-off-by: wujing <wujing50@huawei.com>
2020-01-03 13:16:53 +08:00

376 lines
9.7 KiB
C++

/*
* Copyright (c) Huawei Technologies Co., Ltd. 2019. All rights reserved.
* iSulad licensed under the Mulan PSL v1.
* You can use this software according to the terms and conditions of the Mulan PSL v1.
* You may obtain a copy of Mulan PSL v1 at:
* http://license.coscl.org.cn/MulanPSL
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
* PURPOSE.
* See the Mulan PSL v1 for more details.
* Description: path llt
* Author: jikui
* Create: 2019-08-22
*/
#include <limits.h>
#include <unistd.h>
#include <sys/stat.h>
#include <gtest/gtest.h>
#include "mock.h"
#include "utils.h"
#include "utils_file.h"
#include "path.h"
#define PATH_LENGTH_TEST 100
#define FILE_PERMISSION_TEST 0755
extern "C" {
DECLARE_WRAPPER_V(getcwd, char *, (char *str, size_t size));
DEFINE_WRAPPER_V(getcwd, char *, (char *str, size_t size), (str, size));
DECLARE_WRAPPER_V(readlink, ssize_t, (const char *path, char *buf, size_t bufsize));
DEFINE_WRAPPER_V(readlink, ssize_t, (const char *path, char *buf, size_t bufsize), (path, buf, bufsize));
}
static char *getcwd_specify(char *str, size_t size)
{
const char *dst = "/home";
if (str == nullptr) {
return nullptr;
}
if (size <= strlen(dst)) {
return nullptr;
}
(void)strcpy(str, dst);
return str;
}
static int create_tmp_symbolic_link(const char *path,
const char *path_file,
const char *path_link)
{
if (path == nullptr || path_file == nullptr || path_link == nullptr) {
return -1;
}
if (util_mkdir_p(path, FILE_PERMISSION_TEST) != 0) {
return -1;
}
if (symlink(path_file, path_link) != 0) {
return -1;
}
return 0;
}
static ssize_t readlink_specify(const char *path, char *buf, size_t bufsize)
{
const char *linkpath = "./dir/test/../file";
size_t linkpath_length;
linkpath_length = strlen(linkpath);
if (path == nullptr || buf == nullptr) {
return -1;
}
if (bufsize <= linkpath_length) {
return -1;
}
(void)strcpy(buf, linkpath);
if (linkpath_length > bufsize) {
return bufsize;
}
return linkpath_length;
}
TEST(path_llt, test_cleanpath)
{
char *result = nullptr;
std::string str;
char realpath[PATH_MAX];
result = cleanpath(nullptr, realpath, sizeof(realpath));
ASSERT_STREQ(result, nullptr);
str = "";
result = cleanpath(str.c_str(), realpath, sizeof(realpath));
ASSERT_STREQ(result, nullptr);
str = "/home/dir/../file";
result = cleanpath(str.c_str(), realpath, sizeof(realpath));
ASSERT_STREQ(result, "/home/file");
str = "/home/dir/./file";
result = cleanpath(str.c_str(), realpath, sizeof(realpath));
ASSERT_STREQ(result, "/home/dir/file");
str = "./dir/file";
MOCK_SET_V(getcwd, getcwd_specify);
result = cleanpath(str.c_str(), realpath, sizeof(realpath));
ASSERT_STREQ(result, "/home/dir/file");
MOCK_CLEAR(getcwd);
str = "/home/file";
result = cleanpath(str.c_str(), realpath, PATH_LENGTH_TEST);
ASSERT_STREQ(result, nullptr);
str = "/home/file";
result = cleanpath(str.c_str(), nullptr, 0);
ASSERT_STREQ(result, nullptr);
}
TEST(path_llt, test_specify_current_dir)
{
ASSERT_FALSE(specify_current_dir(nullptr));
ASSERT_TRUE(specify_current_dir(""));
ASSERT_TRUE(specify_current_dir("/home/."));
ASSERT_TRUE(specify_current_dir("."));
ASSERT_FALSE(specify_current_dir("/home/file"));
ASSERT_FALSE(specify_current_dir("/home/.."));
ASSERT_FALSE(specify_current_dir("/home"));
ASSERT_FALSE(specify_current_dir("home"));
}
TEST(path_llt, test_follow_symlink_in_scope)
{
std::string fullpath, rootpath;
char *res = nullptr;
res = follow_symlink_in_scope(nullptr, nullptr);
ASSERT_STREQ(res, nullptr);
free(res);
res = nullptr;
fullpath = "";
rootpath = "";
res = follow_symlink_in_scope(fullpath.c_str(), rootpath.c_str());
ASSERT_STREQ(res, nullptr);
free(res);
res = nullptr;
fullpath = "/home/dir/file";
rootpath = "/home";
res = follow_symlink_in_scope(fullpath.c_str(), rootpath.c_str());
ASSERT_STREQ(res, "/home/dir/file");
free(res);
res = nullptr;
fullpath = "/home/dir/file";
rootpath = "/home/dir/../file";
res = follow_symlink_in_scope(fullpath.c_str(), rootpath.c_str());
ASSERT_STREQ(res, nullptr);
free(res);
res = nullptr;
fullpath = "/home/dir/file";
rootpath = "/home/dir/../";
res = follow_symlink_in_scope(fullpath.c_str(), rootpath.c_str());
ASSERT_STREQ(res, "/home/dir/file");
free(res);
res = nullptr;
fullpath = "/tmp/just_for_llt/link";
rootpath = "/tmp";
const char *path = "/tmp/just_for_llt";
const char *path_file = "./testdir/test/../file";
const char *path_link = "/tmp/just_for_llt/link";
ASSERT_EQ(create_tmp_symbolic_link(path, path_file, path_link), 0);
MOCK_SET_V(readlink, readlink_specify);
res = follow_symlink_in_scope(fullpath.c_str(), rootpath.c_str());
ASSERT_STREQ(res, "/tmp/just_for_llt/dir/file");
MOCK_CLEAR(readlink);
ASSERT_EQ(util_recursive_rmdir("/tmp/just_for_llt", 0), 0);
free(res);
res = nullptr;
}
TEST(path_llt, test_split_dir_and_base_name)
{
char *dir = nullptr;
char *base = nullptr;
ASSERT_EQ(split_dir_and_base_name(nullptr, &dir, &base), -1);
free(dir);
dir = nullptr;
free(base);
base = nullptr;
ASSERT_EQ(split_dir_and_base_name("", &dir, &base), 0);
free(dir);
dir = nullptr;
free(base);
base = nullptr;
ASSERT_EQ(split_dir_and_base_name("/home/file", &dir, &base), 0);
free(dir);
dir = nullptr;
free(base);
base = nullptr;
ASSERT_EQ(split_dir_and_base_name("/home/file", nullptr, nullptr), 0);
free(dir);
dir = nullptr;
free(base);
base = nullptr;
split_dir_and_base_name("/home/file", &dir, &base);
ASSERT_STREQ(dir, "/home");
ASSERT_STREQ(base, "file");
free(dir);
dir = nullptr;
free(base);
base = nullptr;
}
TEST(path_llt, test_filepath_split)
{
char *dir = nullptr;
char *base = nullptr;
ASSERT_EQ(filepath_split(nullptr, &dir, &base), -1);
free(dir);
dir = nullptr;
free(base);
base = nullptr;
ASSERT_EQ(filepath_split("", &dir, &base), 0);
free(dir);
dir = nullptr;
free(base);
base = nullptr;
ASSERT_EQ(filepath_split("/home/file", &dir, &base), 0);
free(dir);
dir = nullptr;
free(base);
base = nullptr;
ASSERT_EQ(filepath_split("/home/file", nullptr, nullptr), 0);
free(dir);
dir = nullptr;
free(base);
base = nullptr;
filepath_split("/home/file", &dir, &base);
ASSERT_STREQ(dir, "/home/");
ASSERT_STREQ(base, "file");
free(dir);
dir = nullptr;
free(base);
base = nullptr;
filepath_split("/home/", &dir, &base);
ASSERT_STREQ(dir, "/home/");
ASSERT_STREQ(base, "");
free(dir);
dir = nullptr;
free(base);
base = nullptr;
}
TEST(path_llt, test_get_resource_path)
{
char *res = nullptr;
res = get_resource_path(nullptr, "./test");
ASSERT_STREQ(res, nullptr);
free(res);
res = nullptr;
res = get_resource_path("", "");
ASSERT_STREQ(res, nullptr);
free(res);
res = nullptr;
res = get_resource_path("/home", "./test");
ASSERT_STREQ(res, "/home/test");
free(res);
res = nullptr;
res = get_resource_path("/home/dir", "tmp/.././test");
ASSERT_STREQ(res, "/home/dir/test");
free(res);
res = nullptr;
res = get_resource_path("/home/dir", ".././test");
ASSERT_STREQ(res, nullptr);
free(res);
res = nullptr;
res = get_resource_path("/home////dir", ".///./././test/file");
ASSERT_STREQ(res, "/home/dir/test/file");
free(res);
res = nullptr;
}
TEST(path_llt, test_resolve_path)
{
std::string rootpath, path;
char *resolvedpath = nullptr;
char *abspath = nullptr;
ASSERT_EQ(resolve_path(nullptr, nullptr, &resolvedpath, &abspath), -1);
free(resolvedpath);
resolvedpath = nullptr;
free(abspath);
abspath = nullptr;
rootpath = "";
path = "";
ASSERT_EQ(resolve_path(rootpath.c_str(), path.c_str(), &resolvedpath, &abspath), -1);
free(resolvedpath);
resolvedpath = nullptr;
free(abspath);
abspath = nullptr;
rootpath = "/home";
path = "/home/dir/test";
ASSERT_EQ(resolve_path(rootpath.c_str(), path.c_str(), &resolvedpath, &abspath), 0);
free(resolvedpath);
resolvedpath = nullptr;
free(abspath);
abspath = nullptr;
}
TEST(path_llt, test_has_trailing_path_separator)
{
ASSERT_FALSE(has_trailing_path_separator(nullptr));
ASSERT_FALSE(has_trailing_path_separator(""));
ASSERT_TRUE(has_trailing_path_separator("/home/"));
ASSERT_FALSE(has_trailing_path_separator("/home"));
}
TEST(path_llt, test_preserve_trailing_dot_or_separator)
{
std::string cleanedpath, originalpath;
char *res = nullptr;
res = preserve_trailing_dot_or_separator(nullptr, nullptr);
ASSERT_STREQ(res, nullptr);
free(res);
res = nullptr;
res = preserve_trailing_dot_or_separator("", "");
ASSERT_STREQ(res, nullptr);
free(res);
res = nullptr;
cleanedpath = "/home/test";
originalpath = "/home/test/.";
res = preserve_trailing_dot_or_separator(cleanedpath.c_str(), originalpath.c_str());
ASSERT_STREQ(res, "/home/test/.");
free(res);
res = nullptr;
cleanedpath = "/home/test";
originalpath = "/home/test/";
res = preserve_trailing_dot_or_separator(cleanedpath.c_str(), originalpath.c_str());
ASSERT_STREQ(res, "/home/test/");
free(res);
res = nullptr;
}