| // 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 |