| // Copyright (c) 2011 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 <string> |
| |
| #include "base/file_util.h" |
| #include "base/files/scoped_temp_dir.h" |
| #include "base/platform_file.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace base { |
| |
| TEST(ScopedTempDir, FullPath) { |
| FilePath test_path; |
| file_util::CreateNewTempDirectory(FILE_PATH_LITERAL("scoped_temp_dir"), |
| &test_path); |
| |
| // Against an existing dir, it should get destroyed when leaving scope. |
| EXPECT_TRUE(file_util::DirectoryExists(test_path)); |
| { |
| ScopedTempDir dir; |
| EXPECT_TRUE(dir.Set(test_path)); |
| EXPECT_TRUE(dir.IsValid()); |
| } |
| EXPECT_FALSE(file_util::DirectoryExists(test_path)); |
| |
| { |
| ScopedTempDir dir; |
| EXPECT_TRUE(dir.Set(test_path)); |
| // Now the dir doesn't exist, so ensure that it gets created. |
| EXPECT_TRUE(file_util::DirectoryExists(test_path)); |
| // When we call Release(), it shouldn't get destroyed when leaving scope. |
| FilePath path = dir.Take(); |
| EXPECT_EQ(path.value(), test_path.value()); |
| EXPECT_FALSE(dir.IsValid()); |
| } |
| EXPECT_TRUE(file_util::DirectoryExists(test_path)); |
| |
| // Clean up. |
| { |
| ScopedTempDir dir; |
| EXPECT_TRUE(dir.Set(test_path)); |
| } |
| EXPECT_FALSE(file_util::DirectoryExists(test_path)); |
| } |
| |
| TEST(ScopedTempDir, TempDir) { |
| // In this case, just verify that a directory was created and that it's a |
| // child of TempDir. |
| FilePath test_path; |
| { |
| ScopedTempDir dir; |
| EXPECT_TRUE(dir.CreateUniqueTempDir()); |
| test_path = dir.path(); |
| EXPECT_TRUE(file_util::DirectoryExists(test_path)); |
| FilePath tmp_dir; |
| EXPECT_TRUE(file_util::GetTempDir(&tmp_dir)); |
| EXPECT_TRUE(test_path.value().find(tmp_dir.value()) != std::string::npos); |
| } |
| EXPECT_FALSE(file_util::DirectoryExists(test_path)); |
| } |
| |
| TEST(ScopedTempDir, UniqueTempDirUnderPath) { |
| // Create a path which will contain a unique temp path. |
| FilePath base_path; |
| ASSERT_TRUE(file_util::CreateNewTempDirectory(FILE_PATH_LITERAL("base_dir"), |
| &base_path)); |
| |
| FilePath test_path; |
| { |
| ScopedTempDir dir; |
| EXPECT_TRUE(dir.CreateUniqueTempDirUnderPath(base_path)); |
| test_path = dir.path(); |
| EXPECT_TRUE(file_util::DirectoryExists(test_path)); |
| EXPECT_TRUE(base_path.IsParent(test_path)); |
| EXPECT_TRUE(test_path.value().find(base_path.value()) != std::string::npos); |
| } |
| EXPECT_FALSE(file_util::DirectoryExists(test_path)); |
| file_util::Delete(base_path, true); |
| } |
| |
| TEST(ScopedTempDir, MultipleInvocations) { |
| ScopedTempDir dir; |
| EXPECT_TRUE(dir.CreateUniqueTempDir()); |
| EXPECT_FALSE(dir.CreateUniqueTempDir()); |
| EXPECT_TRUE(dir.Delete()); |
| EXPECT_TRUE(dir.CreateUniqueTempDir()); |
| EXPECT_FALSE(dir.CreateUniqueTempDir()); |
| ScopedTempDir other_dir; |
| EXPECT_TRUE(other_dir.Set(dir.Take())); |
| EXPECT_TRUE(dir.CreateUniqueTempDir()); |
| EXPECT_FALSE(dir.CreateUniqueTempDir()); |
| EXPECT_FALSE(other_dir.CreateUniqueTempDir()); |
| } |
| |
| #if defined(OS_WIN) |
| TEST(ScopedTempDir, LockedTempDir) { |
| ScopedTempDir dir; |
| EXPECT_TRUE(dir.CreateUniqueTempDir()); |
| int file_flags = base::PLATFORM_FILE_CREATE_ALWAYS | |
| base::PLATFORM_FILE_WRITE; |
| base::PlatformFileError error_code = base::PLATFORM_FILE_OK; |
| FilePath file_path(dir.path().Append(FILE_PATH_LITERAL("temp"))); |
| base::PlatformFile file = base::CreatePlatformFile(file_path, file_flags, |
| NULL, &error_code); |
| EXPECT_NE(base::kInvalidPlatformFileValue, file); |
| EXPECT_EQ(base::PLATFORM_FILE_OK, error_code); |
| EXPECT_FALSE(dir.Delete()); // We should not be able to delete. |
| EXPECT_FALSE(dir.path().empty()); // We should still have a valid path. |
| EXPECT_TRUE(base::ClosePlatformFile(file)); |
| // Now, we should be able to delete. |
| EXPECT_TRUE(dir.Delete()); |
| } |
| #endif // defined(OS_WIN) |
| |
| } // namespace base |