Index: base/file_util_unittest.cc |
diff --git a/base/file_util_unittest.cc b/base/file_util_unittest.cc |
index 04de367ec0f6433b5f80b655819a21013b992e59..8bee6a8066b1d126a6d57e7798dca9e9409e041b 100644 |
--- a/base/file_util_unittest.cc |
+++ b/base/file_util_unittest.cc |
@@ -21,6 +21,7 @@ |
#include "base/file_util.h" |
#include "base/path_service.h" |
#include "base/scoped_temp_dir.h" |
+#include "base/test/test_file_util.h" |
#include "base/threading/platform_thread.h" |
#include "base/utf_string_conversions.h" |
#include "testing/gtest/include/gtest/gtest.h" |
@@ -626,6 +627,56 @@ TEST_F(FileUtilTest, GetPlatformFileInfoForDirectory) { |
EXPECT_EQ(0, info.size); |
} |
+TEST_F(FileUtilTest, CreateTemporaryFileInDirLongPathTest) { |
+ // Test that CreateTemporaryFileInDir() creates a path and returns a long path |
+ // if it is available. This test requires that: |
+ // - the filesystem at |temp_dir_| supports long filenames. |
+ // - the account has FILE_LIST_DIRECTORY permission for all ancestor |
+ // directories of |temp_dir_|. |
+ const FilePath::CharType kLongDirName[] = FPL("A long path"); |
+ const FilePath::CharType kTestSubDirName[] = FPL("test"); |
+ FilePath long_test_dir = temp_dir_.path().Append(kLongDirName); |
+ ASSERT_TRUE(file_util::CreateDirectory(long_test_dir)); |
+ |
+ // kLongDirName is not a 8.3 component. So GetShortName() should give us a |
+ // different short name. |
+ WCHAR path_buffer[MAX_PATH]; |
+ DWORD path_buffer_length = GetShortPathName(long_test_dir.value().c_str(), |
+ path_buffer, MAX_PATH); |
+ ASSERT_LT(path_buffer_length, DWORD(MAX_PATH)); |
+ ASSERT_NE(DWORD(0), path_buffer_length); |
+ FilePath short_test_dir(path_buffer); |
+ ASSERT_STRNE(kLongDirName, short_test_dir.BaseName().value().c_str()); |
+ |
+ FilePath temp_file; |
+ ASSERT_TRUE(file_util::CreateTemporaryFileInDir(short_test_dir, &temp_file)); |
+ EXPECT_STREQ(kLongDirName, temp_file.DirName().BaseName().value().c_str()); |
+ EXPECT_TRUE(file_util::PathExists(temp_file)); |
+ |
+ // Create a subdirectory of |long_test_dir| and make |long_test_dir| |
+ // unreadable. We should still be able to create a temp file in the |
+ // subdirectory, but we won't be able to determine the long path for it. This |
+ // mimics the environment that some users run where their user profiles reside |
+ // in a location where the don't have full access to the higher level |
+ // directories. (Note that this assumption is true for NTFS, but not for some |
+ // network file systems. E.g. AFS). |
+ FilePath access_test_dir = long_test_dir.Append(kTestSubDirName); |
+ ASSERT_TRUE(file_util::CreateDirectory(access_test_dir)); |
+ file_util::PermissionRestorer long_test_dir_restorer(long_test_dir); |
+ ASSERT_TRUE(file_util::MakeFileUnreadable(long_test_dir)); |
+ |
+ // Use the short form of the directory to create a temporary filename. |
+ ASSERT_TRUE(file_util::CreateTemporaryFileInDir( |
+ short_test_dir.Append(kTestSubDirName), &temp_file)); |
+ EXPECT_TRUE(file_util::PathExists(temp_file)); |
+ EXPECT_TRUE(short_test_dir.IsParent(temp_file.DirName())); |
+ |
+ // Check that the long path can't be determined for |temp_file|. |
+ path_buffer_length = GetLongPathName(temp_file.value().c_str(), |
+ path_buffer, MAX_PATH); |
+ EXPECT_EQ(DWORD(0), path_buffer_length); |
+} |
+ |
#endif // defined(OS_WIN) |
#if defined(OS_POSIX) |