blob: 20c60b7bfcbe6ae3891e4c9719b6f140cecd7c16 [file] [log] [blame]
// Copyright (c) 2013 The Chromium 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 "tools/gn/source_dir.h"
#include "tools/gn/err.h"
#include "tools/gn/source_file.h"
#include "tools/gn/value.h"
#include "util/build_config.h"
#include "util/test/test.h"
TEST(SourceDir, ResolveRelativeFile) {
Err err;
SourceDir base("//base/");
#if defined(OS_WIN)
std::string_view source_root("C:/source/root");
#else
std::string_view source_root("/source/root");
#endif
// Empty input is an error.
EXPECT_TRUE(base.ResolveRelativeFile(Value(nullptr, std::string()), &err,
source_root) == SourceFile());
EXPECT_TRUE(err.has_error());
// These things are directories, so should be an error.
err = Err();
EXPECT_TRUE(base.ResolveRelativeFile(Value(nullptr, "//foo/bar/"), &err,
source_root) == SourceFile());
EXPECT_TRUE(err.has_error());
err = Err();
EXPECT_TRUE(base.ResolveRelativeFile(Value(nullptr, "bar/"), &err,
source_root) == SourceFile());
EXPECT_TRUE(err.has_error());
// Absolute paths should be passed unchanged.
err = Err();
EXPECT_TRUE(base.ResolveRelativeFile(Value(nullptr, "//foo"), &err,
source_root) == SourceFile("//foo"));
EXPECT_FALSE(err.has_error());
EXPECT_TRUE(base.ResolveRelativeFile(Value(nullptr, "/foo"), &err,
source_root) == SourceFile("/foo"));
EXPECT_FALSE(err.has_error());
// Basic relative stuff.
EXPECT_TRUE(
base.ResolveRelativeFile(Value(nullptr, "foo"), &err, source_root) ==
SourceFile("//base/foo"));
EXPECT_FALSE(err.has_error());
EXPECT_TRUE(
base.ResolveRelativeFile(Value(nullptr, "./foo"), &err, source_root) ==
SourceFile("//base/foo"));
EXPECT_FALSE(err.has_error());
EXPECT_TRUE(base.ResolveRelativeFile(Value(nullptr, "../foo"), &err,
source_root) == SourceFile("//foo"));
EXPECT_FALSE(err.has_error());
// If the given relative path points outside the source root, we
// expect an absolute path.
#if defined(OS_WIN)
EXPECT_TRUE(base.ResolveRelativeFile(Value(nullptr, "../../foo"), &err,
source_root) ==
SourceFile("/C:/source/foo"));
EXPECT_FALSE(err.has_error());
EXPECT_TRUE(
base.ResolveRelativeFile(Value(nullptr, "//../foo"), &err, source_root) ==
SourceFile("/C:/source/foo"));
EXPECT_FALSE(err.has_error());
EXPECT_TRUE(base.ResolveRelativeFile(Value(nullptr, "//../root/foo"), &err,
source_root) ==
SourceFile("/C:/source/root/foo"));
EXPECT_FALSE(err.has_error());
EXPECT_TRUE(base.ResolveRelativeFile(Value(nullptr, "//../../../foo/bar"),
&err,
source_root) == SourceFile("/foo/bar"));
EXPECT_FALSE(err.has_error());
#else
EXPECT_TRUE(base.ResolveRelativeFile(Value(nullptr, "../../foo"), &err,
source_root) ==
SourceFile("/source/foo"));
EXPECT_FALSE(err.has_error());
EXPECT_TRUE(
base.ResolveRelativeFile(Value(nullptr, "//../foo"), &err, source_root) ==
SourceFile("/source/foo"));
EXPECT_FALSE(err.has_error());
EXPECT_TRUE(base.ResolveRelativeFile(Value(nullptr, "//../root/foo"), &err,
source_root) ==
SourceFile("/source/root/foo"));
EXPECT_FALSE(err.has_error());
EXPECT_TRUE(base.ResolveRelativeFile(Value(nullptr, "//../../../foo/bar"),
&err,
source_root) == SourceFile("/foo/bar"));
EXPECT_FALSE(err.has_error());
#endif
#if defined(OS_WIN)
// Note that we don't canonicalize the backslashes to forward slashes.
// This could potentially be changed in the future which would mean we should
// just change the expected result.
EXPECT_TRUE(base.ResolveRelativeFile(Value(nullptr, "C:\\foo\\bar.txt"), &err,
source_root) ==
SourceFile("/C:/foo/bar.txt"));
EXPECT_FALSE(err.has_error());
#endif
}
TEST(SourceDir, ResolveRelativeDir) {
Err err;
SourceDir base("//base/");
#if defined(OS_WIN)
std::string_view source_root("C:/source/root");
#else
std::string_view source_root("/source/root");
#endif
// Empty input is an error.
EXPECT_TRUE(base.ResolveRelativeDir(Value(nullptr, std::string()), &err,
source_root) == SourceDir());
EXPECT_TRUE(err.has_error());
// Absolute paths should be passed unchanged.
err = Err();
EXPECT_TRUE(base.ResolveRelativeDir(Value(nullptr, "//foo"), &err,
source_root) == SourceDir("//foo/"));
EXPECT_FALSE(err.has_error());
EXPECT_TRUE(base.ResolveRelativeDir(Value(nullptr, "/foo"), &err,
source_root) == SourceDir("/foo/"));
EXPECT_FALSE(err.has_error());
// Basic relative stuff.
EXPECT_TRUE(base.ResolveRelativeDir(Value(nullptr, "foo"), &err,
source_root) == SourceDir("//base/foo/"));
EXPECT_FALSE(err.has_error());
EXPECT_TRUE(base.ResolveRelativeDir(Value(nullptr, "./foo"), &err,
source_root) == SourceDir("//base/foo/"));
EXPECT_FALSE(err.has_error());
EXPECT_TRUE(base.ResolveRelativeDir(Value(nullptr, "../foo"), &err,
source_root) == SourceDir("//foo/"));
EXPECT_FALSE(err.has_error());
// If the given relative path points outside the source root, we
// expect an absolute path.
#if defined(OS_WIN)
EXPECT_TRUE(
base.ResolveRelativeDir(Value(nullptr, "../../foo"), &err, source_root) ==
SourceDir("/C:/source/foo/"));
EXPECT_FALSE(err.has_error());
EXPECT_TRUE(
base.ResolveRelativeDir(Value(nullptr, "//../foo"), &err, source_root) ==
SourceDir("/C:/source/foo/"));
EXPECT_FALSE(err.has_error());
EXPECT_TRUE(base.ResolveRelativeDir(Value(nullptr, "//.."), &err,
source_root) == SourceDir("/C:/source/"));
EXPECT_FALSE(err.has_error());
#else
EXPECT_TRUE(
base.ResolveRelativeDir(Value(nullptr, "../../foo"), &err, source_root) ==
SourceDir("/source/foo/"));
EXPECT_FALSE(err.has_error());
EXPECT_TRUE(
base.ResolveRelativeDir(Value(nullptr, "//../foo"), &err, source_root) ==
SourceDir("/source/foo/"));
EXPECT_FALSE(err.has_error());
EXPECT_TRUE(base.ResolveRelativeDir(Value(nullptr, "//.."), &err,
source_root) == SourceDir("/source/"));
EXPECT_FALSE(err.has_error());
#endif
#if defined(OS_WIN)
// Canonicalize the existing backslashes to forward slashes and add a
// leading slash if necessary.
EXPECT_TRUE(base.ResolveRelativeDir(Value(nullptr, "\\C:\\foo"), &err) ==
SourceDir("/C:/foo/"));
EXPECT_FALSE(err.has_error());
EXPECT_TRUE(base.ResolveRelativeDir(Value(nullptr, "C:\\foo"), &err) ==
SourceDir("/C:/foo/"));
EXPECT_FALSE(err.has_error());
#endif
}
TEST(SourceDir, SourceWithNoTrailingSlash) {
Err err;
SourceDir base("//base/");
SourceDir base_no_slash("//base/");
EXPECT_EQ(base.SourceWithNoTrailingSlash(), "//base");
EXPECT_EQ(base_no_slash.SourceWithNoTrailingSlash(), "//base");
SourceDir relative_root("//");
EXPECT_EQ(relative_root.SourceWithNoTrailingSlash(), "//");
#if defined(OS_WIN)
SourceDir root("C:/");
SourceDir root_no_slash("C:");
EXPECT_EQ(root.SourceWithNoTrailingSlash(), "C:");
EXPECT_EQ(root_no_slash.SourceWithNoTrailingSlash(), "C:");
#else
SourceDir root("/");
EXPECT_EQ(root.SourceWithNoTrailingSlash(), "/");
#endif
}