From a4d0ea406e8622e305fc3253075cfee60da3d3d2 Mon Sep 17 00:00:00 2001 From: Laszlo Csomor Date: Mon, 19 Dec 2016 14:30:52 +0000 Subject: Bazel client: SplitPath works with Windows paths This allows correct behavior of Dirname and Basename on Windows. See https://github.com/bazelbuild/bazel/issues/2107 -- PiperOrigin-RevId: 142441234 MOS_MIGRATED_REVID=142441234 --- src/test/cpp/util/BUILD | 5 +++ src/test/cpp/util/file_posix_test.cc | 47 +++++++++++++++++++++++ src/test/cpp/util/file_windows_test.cc | 68 ++++++++++++++++++++++++++++++++++ 3 files changed, 120 insertions(+) create mode 100644 src/test/cpp/util/file_windows_test.cc (limited to 'src/test/cpp/util') diff --git a/src/test/cpp/util/BUILD b/src/test/cpp/util/BUILD index e16f14f4ce..80e69b7267 100644 --- a/src/test/cpp/util/BUILD +++ b/src/test/cpp/util/BUILD @@ -21,7 +21,12 @@ cc_test( cc_test( name = "file_test", srcs = ["file_test.cc"] + select({ + "//src:windows": [ + "file_posix_test.cc", + "file_windows_test.cc", + ], "//src:windows_msvc": [ + "file_windows_test.cc", ], "//conditions:default": [ "file_posix_test.cc", diff --git a/src/test/cpp/util/file_posix_test.cc b/src/test/cpp/util/file_posix_test.cc index bd91343672..0acd392bf6 100644 --- a/src/test/cpp/util/file_posix_test.cc +++ b/src/test/cpp/util/file_posix_test.cc @@ -44,6 +44,53 @@ static bool CreateEmptyFile(const string& path) { return close(fd) == 0; } +TEST(FileTest, TestDirname) { + // The Posix version of SplitPath (thus Dirname too, which is implemented on + // top of it) is not aware of Windows paths. + ASSERT_EQ("", Dirname("")); + ASSERT_EQ("/", Dirname("/")); + ASSERT_EQ("", Dirname("foo")); + ASSERT_EQ("/", Dirname("/foo")); + ASSERT_EQ("/foo", Dirname("/foo/")); + ASSERT_EQ("foo", Dirname("foo/bar")); + ASSERT_EQ("foo/bar", Dirname("foo/bar/baz")); + ASSERT_EQ("", Dirname("\\foo")); + ASSERT_EQ("", Dirname("\\foo\\")); + ASSERT_EQ("", Dirname("foo\\bar")); + ASSERT_EQ("", Dirname("foo\\bar\\baz")); + ASSERT_EQ("foo\\bar", Dirname("foo\\bar/baz\\qux")); + ASSERT_EQ("c:", Dirname("c:/")); + ASSERT_EQ("", Dirname("c:\\")); + ASSERT_EQ("c:", Dirname("c:/foo")); + ASSERT_EQ("", Dirname("c:\\foo")); + ASSERT_EQ("", Dirname("\\\\?\\c:\\")); + ASSERT_EQ("", Dirname("\\\\?\\c:\\foo")); +} + +TEST(FileTest, TestBasename) { + // The Posix version of SplitPath (thus Basename too, which is implemented on + // top of it) is not aware of Windows paths. + ASSERT_EQ("", Basename("")); + ASSERT_EQ("", Basename("/")); + ASSERT_EQ("foo", Basename("foo")); + ASSERT_EQ("foo", Basename("/foo")); + ASSERT_EQ("", Basename("/foo/")); + ASSERT_EQ("bar", Basename("foo/bar")); + ASSERT_EQ("baz", Basename("foo/bar/baz")); + ASSERT_EQ("\\foo", Basename("\\foo")); + ASSERT_EQ("\\foo\\", Basename("\\foo\\")); + ASSERT_EQ("foo\\bar", Basename("foo\\bar")); + ASSERT_EQ("foo\\bar\\baz", Basename("foo\\bar\\baz")); + ASSERT_EQ("baz\\qux", Basename("foo\\bar/baz\\qux")); + ASSERT_EQ("qux", Basename("qux")); + ASSERT_EQ("", Basename("c:/")); + ASSERT_EQ("c:\\", Basename("c:\\")); + ASSERT_EQ("foo", Basename("c:/foo")); + ASSERT_EQ("c:\\foo", Basename("c:\\foo")); + ASSERT_EQ("\\\\?\\c:\\", Basename("\\\\?\\c:\\")); + ASSERT_EQ("\\\\?\\c:\\foo", Basename("\\\\?\\c:\\foo")); +} + TEST(FileTest, JoinPath) { std::string path = JoinPath("", ""); ASSERT_EQ("", path); diff --git a/src/test/cpp/util/file_windows_test.cc b/src/test/cpp/util/file_windows_test.cc new file mode 100644 index 0000000000..85cc7a491e --- /dev/null +++ b/src/test/cpp/util/file_windows_test.cc @@ -0,0 +1,68 @@ +// Copyright 2016 The Bazel Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +#include + +#include "src/main/cpp/util/file.h" +#include "src/main/cpp/util/file_platform.h" +#include "gtest/gtest.h" + +#if !defined(COMPILER_MSVC) && !defined(__CYGWIN__) +#error("This test should only be run on Windows") +#endif // !defined(COMPILER_MSVC) && !defined(__CYGWIN__) + +namespace blaze_util { + +TEST(FileTest, TestDirname) { + ASSERT_EQ("", Dirname("")); + ASSERT_EQ("/", Dirname("/")); + ASSERT_EQ("", Dirname("foo")); + ASSERT_EQ("/", Dirname("/foo")); + ASSERT_EQ("/foo", Dirname("/foo/")); + ASSERT_EQ("foo", Dirname("foo/bar")); + ASSERT_EQ("foo/bar", Dirname("foo/bar/baz")); + ASSERT_EQ("\\", Dirname("\\foo")); + ASSERT_EQ("\\foo", Dirname("\\foo\\")); + ASSERT_EQ("foo", Dirname("foo\\bar")); + ASSERT_EQ("foo\\bar", Dirname("foo\\bar\\baz")); + ASSERT_EQ("foo\\bar/baz", Dirname("foo\\bar/baz\\qux")); + ASSERT_EQ("c:/", Dirname("c:/")); + ASSERT_EQ("c:\\", Dirname("c:\\")); + ASSERT_EQ("c:/", Dirname("c:/foo")); + ASSERT_EQ("c:\\", Dirname("c:\\foo")); + ASSERT_EQ("\\\\?\\c:\\", Dirname("\\\\?\\c:\\")); + ASSERT_EQ("\\\\?\\c:\\", Dirname("\\\\?\\c:\\foo")); +} + +TEST(FileTest, TestBasename) { + ASSERT_EQ("", Basename("")); + ASSERT_EQ("", Basename("/")); + ASSERT_EQ("foo", Basename("foo")); + ASSERT_EQ("foo", Basename("/foo")); + ASSERT_EQ("", Basename("/foo/")); + ASSERT_EQ("bar", Basename("foo/bar")); + ASSERT_EQ("baz", Basename("foo/bar/baz")); + ASSERT_EQ("foo", Basename("\\foo")); + ASSERT_EQ("", Basename("\\foo\\")); + ASSERT_EQ("bar", Basename("foo\\bar")); + ASSERT_EQ("baz", Basename("foo\\bar\\baz")); + ASSERT_EQ("qux", Basename("foo\\bar/baz\\qux")); + ASSERT_EQ("", Basename("c:/")); + ASSERT_EQ("", Basename("c:\\")); + ASSERT_EQ("foo", Basename("c:/foo")); + ASSERT_EQ("foo", Basename("c:\\foo")); + ASSERT_EQ("", Basename("\\\\?\\c:\\")); + ASSERT_EQ("foo", Basename("\\\\?\\c:\\foo")); +} + +} // namespace blaze_util -- cgit v1.2.3