|  | // 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) | 
|  | base::StringPiece source_root("C:/source/root"); | 
|  | #else | 
|  | base::StringPiece 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) | 
|  | base::StringPiece source_root("C:/source/root"); | 
|  | #else | 
|  | base::StringPiece 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 | 
|  | } |