aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/test/cpp/util/file_windows_test.cc
diff options
context:
space:
mode:
authorGravatar Laszlo Csomor <laszlocsomor@google.com>2017-01-12 15:15:16 +0000
committerGravatar Marcel Hlopko <hlopko@google.com>2017-01-12 16:55:52 +0000
commit326a6a588e5c25a707697bf153bbef36071096ff (patch)
tree84dac8f3ee808f1c05e7e68ea85ed3ca7e852629 /src/test/cpp/util/file_windows_test.cc
parent117197000692fd7391962ef968228a31bf97399a (diff)
Bazel client, Windows: implement CanAccess methods
See https://github.com/bazelbuild/bazel/issues/2107 -- PiperOrigin-RevId: 144321891 MOS_MIGRATED_REVID=144321891
Diffstat (limited to 'src/test/cpp/util/file_windows_test.cc')
-rw-r--r--src/test/cpp/util/file_windows_test.cc73
1 files changed, 61 insertions, 12 deletions
diff --git a/src/test/cpp/util/file_windows_test.cc b/src/test/cpp/util/file_windows_test.cc
index 5ed7a77d3d..5d9f0092cc 100644
--- a/src/test/cpp/util/file_windows_test.cc
+++ b/src/test/cpp/util/file_windows_test.cc
@@ -32,10 +32,11 @@ using std::wstring;
void ResetMsysRootForTesting();
string NormalizeWindowsPath(string path);
-static string GetTestTmpDir() {
+static void GetTestTmpDir(string* result) {
char buf[MAX_PATH] = {0};
DWORD len = GetEnvironmentVariableA("TEST_TMPDIR", buf, MAX_PATH);
- return string(buf);
+ result->assign(buf);
+ ASSERT_LT(0, result->size());
}
TEST(FileTest, TestNormalizeWindowsPath) {
@@ -192,9 +193,8 @@ TEST(FileTest, TestAsShortWindowsPath) {
ASSERT_TRUE(AsShortWindowsPath("nul", &actual));
ASSERT_EQ(string("NUL"), actual);
- string tmpdir(GetTestTmpDir());
- ASSERT_LT(0, tmpdir.size());
-
+ string tmpdir;
+ GetTestTmpDir(&tmpdir);
string short_tmpdir;
ASSERT_TRUE(AsShortWindowsPath(tmpdir, &short_tmpdir));
ASSERT_LT(0, short_tmpdir.size());
@@ -266,8 +266,8 @@ TEST(FileTest, TestPathExistsWindows) {
ASSERT_TRUE(PathExists("/dev/null"));
ASSERT_TRUE(PathExists("Nul"));
- string tmpdir(GetTestTmpDir());
- ASSERT_LT(0, tmpdir.size());
+ string tmpdir;
+ GetTestTmpDir(&tmpdir);
ASSERT_TRUE(PathExists(tmpdir));
// Create a fake msys root. We'll also use it as a junction target.
@@ -309,8 +309,8 @@ TEST(FileTest, TestIsDirectory) {
ASSERT_FALSE(IsDirectory("/dev/null"));
ASSERT_FALSE(IsDirectory("Nul"));
- string tmpdir(GetTestTmpDir());
- ASSERT_LT(0, tmpdir.size());
+ string tmpdir;
+ GetTestTmpDir(&tmpdir);
ASSERT_TRUE(IsDirectory(tmpdir));
ASSERT_TRUE(IsDirectory("C:\\"));
ASSERT_TRUE(IsDirectory("C:/"));
@@ -346,9 +346,8 @@ TEST(FileTest, TestUnlinkPath) {
ASSERT_FALSE(UnlinkPath("/dev/null"));
ASSERT_FALSE(UnlinkPath("Nul"));
- string tmpdir(GetTestTmpDir());
- ASSERT_LT(0, tmpdir.size());
- ASSERT_TRUE(PathExists(tmpdir));
+ string tmpdir;
+ GetTestTmpDir(&tmpdir);
// Create a directory under `tempdir`, a file inside it, and a junction
// pointing to it.
@@ -408,4 +407,54 @@ TEST(FileTest, TestMakeDirectories) {
ASSERT_EQ(0, rmdir(JoinPath(tmpdir, "dir4").c_str()));
}
+TEST(FileTest, CanAccess) {
+ ASSERT_FALSE(CanReadFile("C:/windows/this/should/not/exist/mkay"));
+ ASSERT_FALSE(CanExecuteFile("C:/this/should/not/exist/mkay"));
+ ASSERT_FALSE(CanAccessDirectory("C:/this/should/not/exist/mkay"));
+
+ ASSERT_FALSE(CanReadFile("non.existent"));
+ ASSERT_FALSE(CanExecuteFile("non.existent"));
+ ASSERT_FALSE(CanAccessDirectory("non.existent"));
+
+ string tmpdir;
+ GetTestTmpDir(&tmpdir);
+ string dir(JoinPath(tmpdir, "canaccesstest"));
+ ASSERT_EQ(0, mkdir(dir.c_str()));
+
+ ASSERT_FALSE(CanReadFile(dir));
+ ASSERT_FALSE(CanExecuteFile(dir));
+ ASSERT_TRUE(CanAccessDirectory(dir));
+
+ string junc(JoinPath(tmpdir, "junc1"));
+ RunCommand(string("cmd.exe /C mklink /J \"") + junc + "\" \"" + dir +
+ "\" >NUL 2>NUL");
+ ASSERT_FALSE(CanReadFile(junc));
+ ASSERT_FALSE(CanExecuteFile(junc));
+ ASSERT_TRUE(CanAccessDirectory(junc));
+
+ string file(JoinPath(dir, "foo.txt"));
+ FILE* fh = fopen(file.c_str(), "wt");
+ ASSERT_NE(nullptr, fh);
+ ASSERT_LT(0, fprintf(fh, "hello"));
+ fclose(fh);
+
+ ASSERT_TRUE(CanReadFile(file));
+ ASSERT_FALSE(CanExecuteFile(file));
+ ASSERT_FALSE(CanAccessDirectory(file));
+
+ ASSERT_TRUE(CanReadFile(JoinPath(junc, "foo.txt")));
+ ASSERT_FALSE(CanExecuteFile(JoinPath(junc, "foo.txt")));
+ ASSERT_FALSE(CanAccessDirectory(JoinPath(junc, "foo.txt")));
+
+ string file2(JoinPath(dir, "foo.exe"));
+ ASSERT_EQ(0, rename(file.c_str(), file2.c_str()));
+ ASSERT_TRUE(CanReadFile(file2));
+ ASSERT_TRUE(CanExecuteFile(file2));
+ ASSERT_FALSE(CanAccessDirectory(file2));
+
+ ASSERT_EQ(0, unlink(file2.c_str()));
+ ASSERT_EQ(0, rmdir(junc.c_str()));
+ ASSERT_EQ(0, rmdir(dir.c_str()));
+}
+
} // namespace blaze_util