blob: 39401e62e358e630dc2e9b987b9538a53522e11a [file]
// Copyright 2019 The IREE Authors
//
// Licensed under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#include "iree/base/internal/path.h"
#include <string>
#include "iree/base/target_platform.h"
#include "iree/testing/gtest.h"
static bool operator==(const iree_string_pair_t& lhs,
const iree_string_pair_t& rhs) noexcept {
return iree_string_view_equal(lhs.key, rhs.key) &&
iree_string_view_equal(lhs.value, rhs.value);
}
static std::ostream& operator<<(std::ostream& os,
const iree_string_pair_t& pair) {
return os << std::string(pair.key.data, pair.key.size) << "="
<< std::string(pair.value.data, pair.value.size);
}
namespace {
using ::testing::ElementsAreArray;
using ::testing::Eq;
using ::testing::IsEmpty;
#define _SV(str) iree_make_cstring_view(str)
#define EXPECT_SV_EQ(actual, expected) \
EXPECT_TRUE(iree_string_view_equal(actual, expected))
TEST(FilePathTest, Canonicalize) {
auto canonicalize = [](std::string value) {
value.resize(
iree_file_path_canonicalize((char*)value.data(), value.size()));
return value;
};
EXPECT_EQ(canonicalize(""), "");
EXPECT_EQ(canonicalize("a"), "a");
EXPECT_EQ(canonicalize("ab"), "ab");
#if defined(IREE_PLATFORM_WINDOWS)
EXPECT_EQ(canonicalize("/"), "\\");
EXPECT_EQ(canonicalize("\\"), "\\");
EXPECT_EQ(canonicalize("a/b"), "a\\b");
EXPECT_EQ(canonicalize("a//b"), "a\\b");
EXPECT_EQ(canonicalize("a////b"), "a\\b");
EXPECT_EQ(canonicalize("a\\//b"), "a\\b");
EXPECT_EQ(canonicalize("a\\\\b"), "a\\b");
EXPECT_EQ(canonicalize("\\a"), "\\a");
EXPECT_EQ(canonicalize("/a"), "\\a");
EXPECT_EQ(canonicalize("//a"), "\\a");
EXPECT_EQ(canonicalize("a/"), "a\\");
EXPECT_EQ(canonicalize("a//"), "a\\");
#else
EXPECT_EQ(canonicalize("/"), "/");
EXPECT_EQ(canonicalize("a/b"), "a/b");
EXPECT_EQ(canonicalize("a//b"), "a/b");
EXPECT_EQ(canonicalize("a////b"), "a/b");
EXPECT_EQ(canonicalize("/a"), "/a");
EXPECT_EQ(canonicalize("//a"), "/a");
EXPECT_EQ(canonicalize("a/"), "a/");
EXPECT_EQ(canonicalize("a//"), "a/");
#endif // IREE_PLATFORM_WINDOWS
}
static std::string JoinPaths(std::string lhs, std::string rhs) {
char* result_str = NULL;
IREE_IGNORE_ERROR(
iree_file_path_join(iree_make_string_view(lhs.data(), lhs.size()),
iree_make_string_view(rhs.data(), rhs.size()),
iree_allocator_system(), &result_str));
std::string result;
result.resize(strlen(result_str));
memcpy((char*)result.data(), result_str, result.size());
iree_allocator_free(iree_allocator_system(), result_str);
return result;
}
TEST(FilePathTest, JoinPathsEmpty) {
EXPECT_EQ(JoinPaths("", ""), "");
EXPECT_EQ(JoinPaths("", "bar"), "bar");
EXPECT_EQ(JoinPaths("foo", ""), "foo");
}
TEST(FilePathTest, JoinPathsSlash) {
EXPECT_EQ(JoinPaths("foo", "bar"), "foo/bar");
EXPECT_EQ(JoinPaths("foo", "bar/"), "foo/bar/");
EXPECT_EQ(JoinPaths("foo", "/bar"), "foo/bar");
EXPECT_EQ(JoinPaths("foo", "/bar/"), "foo/bar/");
EXPECT_EQ(JoinPaths("foo/", "bar"), "foo/bar");
EXPECT_EQ(JoinPaths("foo/", "bar/"), "foo/bar/");
EXPECT_EQ(JoinPaths("foo/", "/bar"), "foo/bar");
EXPECT_EQ(JoinPaths("foo/", "/bar/"), "foo/bar/");
EXPECT_EQ(JoinPaths("/foo", "bar"), "/foo/bar");
EXPECT_EQ(JoinPaths("/foo", "bar/"), "/foo/bar/");
EXPECT_EQ(JoinPaths("/foo", "/bar"), "/foo/bar");
EXPECT_EQ(JoinPaths("/foo", "/bar/"), "/foo/bar/");
EXPECT_EQ(JoinPaths("/foo/", "bar"), "/foo/bar");
EXPECT_EQ(JoinPaths("/foo/", "bar/"), "/foo/bar/");
EXPECT_EQ(JoinPaths("/foo/", "/bar"), "/foo/bar");
EXPECT_EQ(JoinPaths("/foo/", "/bar/"), "/foo/bar/");
}
TEST(FilePathTest, JoinPathsDoubleSlash) {
EXPECT_EQ(JoinPaths("foo//", "bar"), "foo//bar");
EXPECT_EQ(JoinPaths("foo", "//bar"), "foo//bar");
}
TEST(FilePathTest, DirnameEmpty) {
EXPECT_SV_EQ(iree_file_path_dirname(_SV("")), _SV(""));
}
TEST(FilePathTest, DirnameAbsolute) {
EXPECT_SV_EQ(iree_file_path_dirname(_SV("/")), _SV("/"));
EXPECT_SV_EQ(iree_file_path_dirname(_SV("/foo")), _SV("/"));
EXPECT_SV_EQ(iree_file_path_dirname(_SV("/foo/")), _SV("/foo"));
EXPECT_SV_EQ(iree_file_path_dirname(_SV("/foo/bar")), _SV("/foo"));
EXPECT_SV_EQ(iree_file_path_dirname(_SV("/foo/bar/")), _SV("/foo/bar"));
}
TEST(FilePathTest, DirnameRelative) {
EXPECT_SV_EQ(iree_file_path_dirname(_SV("foo")), _SV(""));
EXPECT_SV_EQ(iree_file_path_dirname(_SV("foo/")), _SV("foo"));
EXPECT_SV_EQ(iree_file_path_dirname(_SV("foo/bar")), _SV("foo"));
EXPECT_SV_EQ(iree_file_path_dirname(_SV("foo/bar/")), _SV("foo/bar"));
}
TEST(FilePathTest, DirnameDoubleSlash) {
EXPECT_SV_EQ(iree_file_path_dirname(_SV("foo//")), _SV("foo/"));
}
TEST(FilePathTest, BasenameEmpty) {
EXPECT_SV_EQ(iree_file_path_basename(_SV("")), _SV(""));
}
TEST(FilePathTest, BasenameAbsolute) {
EXPECT_SV_EQ(iree_file_path_basename(_SV("/")), _SV(""));
EXPECT_SV_EQ(iree_file_path_basename(_SV("/foo")), _SV("foo"));
EXPECT_SV_EQ(iree_file_path_basename(_SV("/foo/")), _SV(""));
EXPECT_SV_EQ(iree_file_path_basename(_SV("/foo/bar")), _SV("bar"));
EXPECT_SV_EQ(iree_file_path_basename(_SV("/foo/bar/")), _SV(""));
}
TEST(FilePathTest, BasenameRelative) {
EXPECT_SV_EQ(iree_file_path_basename(_SV("foo")), _SV("foo"));
EXPECT_SV_EQ(iree_file_path_basename(_SV("foo/")), _SV(""));
EXPECT_SV_EQ(iree_file_path_basename(_SV("foo/bar")), _SV("bar"));
EXPECT_SV_EQ(iree_file_path_basename(_SV("foo/bar/")), _SV(""));
}
TEST(FilePathTest, BasenameDoubleSlash) {
EXPECT_SV_EQ(iree_file_path_basename(_SV("foo//")), _SV(""));
}
TEST(FilePathTest, Stem) {
EXPECT_SV_EQ(iree_file_path_stem(_SV("")), _SV(""));
EXPECT_SV_EQ(iree_file_path_stem(_SV("foo")), _SV("foo"));
EXPECT_SV_EQ(iree_file_path_stem(_SV("foo.")), _SV("foo"));
EXPECT_SV_EQ(iree_file_path_stem(_SV("foo.bar")), _SV("foo"));
EXPECT_SV_EQ(iree_file_path_stem(_SV("foo..")), _SV("foo."));
EXPECT_SV_EQ(iree_file_path_stem(_SV("foo..bar")), _SV("foo."));
EXPECT_SV_EQ(iree_file_path_stem(_SV(".bar")), _SV(""));
EXPECT_SV_EQ(iree_file_path_stem(_SV("..bar")), _SV("."));
}
TEST(FilePathTest, Extension) {
EXPECT_SV_EQ(iree_file_path_extension(_SV("")), _SV(""));
EXPECT_SV_EQ(iree_file_path_extension(_SV("foo")), _SV(""));
EXPECT_SV_EQ(iree_file_path_extension(_SV("foo.")), _SV(""));
EXPECT_SV_EQ(iree_file_path_extension(_SV("foo.bar")), _SV("bar"));
EXPECT_SV_EQ(iree_file_path_extension(_SV("foo..")), _SV(""));
EXPECT_SV_EQ(iree_file_path_extension(_SV("foo..bar")), _SV("bar"));
EXPECT_SV_EQ(iree_file_path_extension(_SV(".bar")), _SV("bar"));
EXPECT_SV_EQ(iree_file_path_extension(_SV("..bar")), _SV("bar"));
}
// NOTE: these URI methods are all implemented using the same iree_uri_split and
// we test each independently because it's easier.
TEST(URITest, Schema) {
EXPECT_SV_EQ(iree_uri_schema(_SV("")), _SV(""));
EXPECT_SV_EQ(iree_uri_schema(_SV("s")), _SV("s"));
EXPECT_SV_EQ(iree_uri_schema(_SV("schema")), _SV("schema"));
EXPECT_SV_EQ(iree_uri_schema(_SV("schema:")), _SV("schema"));
EXPECT_SV_EQ(iree_uri_schema(_SV("schema:path")), _SV("schema"));
EXPECT_SV_EQ(iree_uri_schema(_SV("schema:/")), _SV("schema"));
EXPECT_SV_EQ(iree_uri_schema(_SV("schema://")), _SV("schema"));
EXPECT_SV_EQ(iree_uri_schema(_SV("schema:///")), _SV("schema"));
EXPECT_SV_EQ(iree_uri_schema(_SV("schema:///path")), _SV("schema"));
EXPECT_SV_EQ(iree_uri_schema(_SV("schema://path")), _SV("schema"));
EXPECT_SV_EQ(iree_uri_schema(_SV("schema://path/")), _SV("schema"));
EXPECT_SV_EQ(iree_uri_schema(_SV("schema://path/sub")), _SV("schema"));
EXPECT_SV_EQ(iree_uri_schema(_SV("schema://path?")), _SV("schema"));
EXPECT_SV_EQ(iree_uri_schema(_SV("schema://path?p")), _SV("schema"));
EXPECT_SV_EQ(iree_uri_schema(_SV("schema://path?params")), _SV("schema"));
EXPECT_SV_EQ(iree_uri_schema(_SV("schema://path?params??")), _SV("schema"));
}
TEST(URITest, Path) {
EXPECT_SV_EQ(iree_uri_path(_SV("")), _SV(""));
EXPECT_SV_EQ(iree_uri_path(_SV("s")), _SV(""));
EXPECT_SV_EQ(iree_uri_path(_SV("schema")), _SV(""));
EXPECT_SV_EQ(iree_uri_path(_SV("schema:")), _SV(""));
EXPECT_SV_EQ(iree_uri_path(_SV("schema:path")), _SV("path"));
EXPECT_SV_EQ(iree_uri_path(_SV("schema:/")), _SV(""));
EXPECT_SV_EQ(iree_uri_path(_SV("schema://")), _SV(""));
EXPECT_SV_EQ(iree_uri_path(_SV("schema:///")), _SV("/"));
EXPECT_SV_EQ(iree_uri_path(_SV("schema:///path")), _SV("/path"));
EXPECT_SV_EQ(iree_uri_path(_SV("schema://path")), _SV("path"));
EXPECT_SV_EQ(iree_uri_path(_SV("schema://path/")), _SV("path/"));
EXPECT_SV_EQ(iree_uri_path(_SV("schema://path/sub")), _SV("path/sub"));
EXPECT_SV_EQ(iree_uri_path(_SV("schema://path?")), _SV("path"));
EXPECT_SV_EQ(iree_uri_path(_SV("schema://path?p")), _SV("path"));
EXPECT_SV_EQ(iree_uri_path(_SV("schema://path?params")), _SV("path"));
EXPECT_SV_EQ(iree_uri_path(_SV("schema://path?params??")), _SV("path"));
}
TEST(URITest, Params) {
EXPECT_SV_EQ(iree_uri_params(_SV("s")), _SV(""));
EXPECT_SV_EQ(iree_uri_params(_SV("")), _SV(""));
EXPECT_SV_EQ(iree_uri_params(_SV("schema")), _SV(""));
EXPECT_SV_EQ(iree_uri_params(_SV("schema:")), _SV(""));
EXPECT_SV_EQ(iree_uri_params(_SV("schema:path")), _SV(""));
EXPECT_SV_EQ(iree_uri_params(_SV("schema:/")), _SV(""));
EXPECT_SV_EQ(iree_uri_params(_SV("schema://")), _SV(""));
EXPECT_SV_EQ(iree_uri_params(_SV("schema:///")), _SV(""));
EXPECT_SV_EQ(iree_uri_params(_SV("schema:///path")), _SV(""));
EXPECT_SV_EQ(iree_uri_params(_SV("schema://path")), _SV(""));
EXPECT_SV_EQ(iree_uri_params(_SV("schema://path/")), _SV(""));
EXPECT_SV_EQ(iree_uri_params(_SV("schema://path/sub")), _SV(""));
EXPECT_SV_EQ(iree_uri_params(_SV("schema://path?")), _SV(""));
EXPECT_SV_EQ(iree_uri_params(_SV("schema://path?p")), _SV("p"));
EXPECT_SV_EQ(iree_uri_params(_SV("schema://path?params")), _SV("params"));
EXPECT_SV_EQ(iree_uri_params(_SV("schema://path?params??")), _SV("params??"));
}
using StringPairs = std::vector<iree_string_pair_t>;
static StringPairs SplitParams(iree_string_view_t params) {
StringPairs storage;
iree_host_size_t count = 0;
while (
!iree_uri_split_params(params, storage.size(), &count, storage.data())) {
storage.resize(count);
}
return storage;
}
#define StringPair iree_make_cstring_pair
TEST(URITest, SplitParams) {
EXPECT_THAT(SplitParams(_SV("")), IsEmpty());
EXPECT_THAT(SplitParams(_SV("&")), IsEmpty());
EXPECT_THAT(SplitParams(_SV("a")), ElementsAreArray({StringPair("a", "")}));
EXPECT_THAT(SplitParams(_SV("&a")), ElementsAreArray({StringPair("a", "")}));
EXPECT_THAT(SplitParams(_SV("a&")), ElementsAreArray({StringPair("a", "")}));
EXPECT_THAT(SplitParams(_SV("&a&")), ElementsAreArray({StringPair("a", "")}));
EXPECT_THAT(SplitParams(_SV("a=")), ElementsAreArray({StringPair("a", "")}));
EXPECT_THAT(SplitParams(_SV("a=b")),
ElementsAreArray({StringPair("a", "b")}));
EXPECT_THAT(SplitParams(_SV("a=b&c")), ElementsAreArray({
StringPair("a", "b"),
StringPair("c", ""),
}));
EXPECT_THAT(SplitParams(_SV("a=b&c=")), ElementsAreArray({
StringPair("a", "b"),
StringPair("c", ""),
}));
EXPECT_THAT(SplitParams(_SV("a=b&c=d")), ElementsAreArray({
StringPair("a", "b"),
StringPair("c", "d"),
}));
EXPECT_THAT(SplitParams(_SV("a=b&c=d&e&f&g=h")), ElementsAreArray({
StringPair("a", "b"),
StringPair("c", "d"),
StringPair("e", ""),
StringPair("f", ""),
StringPair("g", "h"),
}));
}
} // namespace