blob: 69dd60ad62508883c4eb525371542be9e749a70c [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/developer/debug/zxdb/common/file_util.h"
#include <gtest/gtest.h>
#include "src/developer/debug/zxdb/common/scoped_temp_file.h"
namespace zxdb {
TEST(FileUtil, ExtractLastFileComponent) {
EXPECT_EQ("", ExtractLastFileComponent(""));
EXPECT_EQ("", ExtractLastFileComponent("foo/"));
EXPECT_EQ("foo.cpp", ExtractLastFileComponent("foo.cpp"));
EXPECT_EQ("foo.cpp", ExtractLastFileComponent("bar/foo.cpp"));
EXPECT_EQ("foo.cpp", ExtractLastFileComponent("baz/bar/foo.cpp"));
}
TEST(FileUtil, IsPathAbsolute) {
EXPECT_FALSE(IsPathAbsolute(""));
EXPECT_TRUE(IsPathAbsolute("/"));
EXPECT_TRUE(IsPathAbsolute("/foo/bar"));
EXPECT_FALSE(IsPathAbsolute("foo/bar"));
EXPECT_FALSE(IsPathAbsolute("./foo/bar"));
}
TEST(FileUtil, PathEndsWith) {
EXPECT_TRUE(PathEndsWith("", ""));
EXPECT_TRUE(PathEndsWith("foo.cc", "foo.cc"));
EXPECT_TRUE(PathEndsWith("/foo.cc", "foo.cc"));
EXPECT_TRUE(PathEndsWith("bar/foo.cc", "foo.cc"));
EXPECT_TRUE(PathEndsWith("bar/foo.cc", "bar/foo.cc"));
EXPECT_FALSE(PathEndsWith("bar/foo.cc", "FOO.CC"));
EXPECT_FALSE(PathEndsWith("bar/foo.cc", "o.cc"));
EXPECT_FALSE(PathEndsWith("bar/foo.cc", "r/foo.cc"));
}
TEST(FileUtil, CatPathComponents) {
EXPECT_EQ("", CatPathComponents("", ""));
EXPECT_EQ("a", CatPathComponents("", "a"));
EXPECT_EQ("a", CatPathComponents("a", ""));
EXPECT_EQ("a/b", CatPathComponents("a", "b"));
EXPECT_EQ("a/b", CatPathComponents("a/", "b"));
EXPECT_EQ("a/b/", CatPathComponents("a/", "b/"));
}
TEST(FileUtil, NormalizePath) {
EXPECT_EQ("", NormalizePath(""));
EXPECT_EQ("foo/bar.txt", NormalizePath("foo/bar.txt"));
EXPECT_EQ(".", NormalizePath("."));
EXPECT_EQ("foo/bar", NormalizePath("foo//bar"));
EXPECT_EQ("/foo", NormalizePath("//foo"));
EXPECT_EQ("bar", NormalizePath("foo/..//bar"));
EXPECT_EQ("../bar", NormalizePath("foo/../../bar"));
EXPECT_EQ("/foo", NormalizePath("/../foo")); // Don't go above the root dir.
EXPECT_EQ("/foo", NormalizePath("/../foo")); // Don't go above the root dir.
EXPECT_EQ("../foo", NormalizePath("../foo"));
EXPECT_EQ("..", NormalizePath(".."));
EXPECT_EQ(".", NormalizePath("./././."));
EXPECT_EQ("../../..", NormalizePath("../../.."));
// The implementation of this is std::filesystem which isn't consistent here about whether
// trailing slashes are preserved. It would be nice if the "../" case preserved the trailing
// slash for consistency, but this behavior should be fine for our needs.
EXPECT_EQ("..", NormalizePath("../"));
EXPECT_EQ("/foo/bar/", NormalizePath("/foo/bar/"));
}
TEST(FileUtil, GetFileModificationTime) {
ScopedTempFile temp_file;
time_t modification_time = GetFileModificationTime(temp_file.name());
time_t now = time(nullptr);
// EXPECT_NEAR accepts double rather than int.
EXPECT_GT(modification_time, now - 10);
EXPECT_LT(modification_time, now + 10);
}
TEST(FileUtil, PathStartsWith) {
EXPECT_TRUE(PathStartsWith("/abc", "/abc"));
EXPECT_TRUE(PathStartsWith("/abc", "/"));
EXPECT_TRUE(PathStartsWith("/abc/def", "/abc"));
EXPECT_FALSE(PathStartsWith("/abc", "/a"));
EXPECT_FALSE(PathStartsWith("/", ""));
EXPECT_FALSE(PathStartsWith("", ""));
}
TEST(FileUtil, PathRelativeTo) {
EXPECT_EQ("", PathRelativeTo("/abc/def", "/abc/def"));
EXPECT_EQ("def", PathRelativeTo("/abc/def", "/abc"));
EXPECT_EQ("..", PathRelativeTo("/abc", "/abc/def"));
EXPECT_EQ("../def", PathRelativeTo("/abc/def", "/abc/ghi"));
}
} // namespace zxdb