| // 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/files/file.h" |
| #include "base/files/file_util.h" |
| #include "base/files/scoped_temp_dir.h" |
| #include "build/build_config.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace base { |
| |
| TEST(ScopedTempDir, FullPath) { |
| FilePath test_path; |
| base::CreateNewTempDirectory(FILE_PATH_LITERAL("scoped_temp_dir"), |
| &test_path); |
| |
| // Against an existing dir, it should get destroyed when leaving scope. |
| EXPECT_TRUE(DirectoryExists(test_path)); |
| { |
| ScopedTempDir dir; |
| EXPECT_TRUE(dir.Set(test_path)); |
| EXPECT_TRUE(dir.IsValid()); |
| } |
| EXPECT_FALSE(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(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(DirectoryExists(test_path)); |
| |
| // Clean up. |
| { |
| ScopedTempDir dir; |
| EXPECT_TRUE(dir.Set(test_path)); |
| } |
| EXPECT_FALSE(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.GetPath(); |
| EXPECT_TRUE(DirectoryExists(test_path)); |
| FilePath tmp_dir; |
| EXPECT_TRUE(base::GetTempDir(&tmp_dir)); |
| EXPECT_TRUE(test_path.value().find(tmp_dir.value()) != std::string::npos); |
| } |
| EXPECT_FALSE(DirectoryExists(test_path)); |
| } |
| |
| TEST(ScopedTempDir, UniqueTempDirUnderPath) { |
| // Create a path which will contain a unique temp path. |
| FilePath base_path; |
| ASSERT_TRUE(base::CreateNewTempDirectory(FILE_PATH_LITERAL("base_dir"), |
| &base_path)); |
| |
| FilePath test_path; |
| { |
| ScopedTempDir dir; |
| EXPECT_TRUE(dir.CreateUniqueTempDirUnderPath(base_path)); |
| test_path = dir.GetPath(); |
| EXPECT_TRUE(DirectoryExists(test_path)); |
| EXPECT_TRUE(base_path.IsParent(test_path)); |
| EXPECT_TRUE(test_path.value().find(base_path.value()) != std::string::npos); |
| } |
| EXPECT_FALSE(DirectoryExists(test_path)); |
| base::DeleteFile(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()); |
| base::File file(dir.GetPath().Append(FILE_PATH_LITERAL("temp")), |
| base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE); |
| EXPECT_TRUE(file.IsValid()); |
| EXPECT_EQ(base::File::FILE_OK, file.error_details()); |
| EXPECT_FALSE(dir.Delete()); // We should not be able to delete. |
| EXPECT_FALSE(dir.GetPath().empty()); // We should still have a valid path. |
| file.Close(); |
| // Now, we should be able to delete. |
| EXPECT_TRUE(dir.Delete()); |
| } |
| #endif // defined(OS_WIN) |
| |
| } // namespace base |