| // 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 | 
 | } |