1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "base/file_util.h" 6 #include "base/memory/scoped_temp_dir.h" 7 #include "base/platform_file.h" 8 #include "testing/gtest/include/gtest/gtest.h" 9 10 TEST(ScopedTempDir, FullPath) { 11 FilePath test_path; 12 file_util::CreateNewTempDirectory(FILE_PATH_LITERAL("scoped_temp_dir"), 13 &test_path); 14 15 // Against an existing dir, it should get destroyed when leaving scope. 16 EXPECT_TRUE(file_util::DirectoryExists(test_path)); 17 { 18 ScopedTempDir dir; 19 EXPECT_TRUE(dir.Set(test_path)); 20 EXPECT_TRUE(dir.IsValid()); 21 } 22 EXPECT_FALSE(file_util::DirectoryExists(test_path)); 23 24 { 25 ScopedTempDir dir; 26 EXPECT_TRUE(dir.Set(test_path)); 27 // Now the dir doesn't exist, so ensure that it gets created. 28 EXPECT_TRUE(file_util::DirectoryExists(test_path)); 29 // When we call Release(), it shouldn't get destroyed when leaving scope. 30 FilePath path = dir.Take(); 31 EXPECT_EQ(path.value(), test_path.value()); 32 EXPECT_FALSE(dir.IsValid()); 33 } 34 EXPECT_TRUE(file_util::DirectoryExists(test_path)); 35 36 // Clean up. 37 { 38 ScopedTempDir dir; 39 EXPECT_TRUE(dir.Set(test_path)); 40 } 41 EXPECT_FALSE(file_util::DirectoryExists(test_path)); 42 } 43 44 TEST(ScopedTempDir, TempDir) { 45 // In this case, just verify that a directory was created and that it's a 46 // child of TempDir. 47 FilePath test_path; 48 { 49 ScopedTempDir dir; 50 EXPECT_TRUE(dir.CreateUniqueTempDir()); 51 test_path = dir.path(); 52 EXPECT_TRUE(file_util::DirectoryExists(test_path)); 53 FilePath tmp_dir; 54 EXPECT_TRUE(file_util::GetTempDir(&tmp_dir)); 55 EXPECT_TRUE(test_path.value().find(tmp_dir.value()) != std::string::npos); 56 } 57 EXPECT_FALSE(file_util::DirectoryExists(test_path)); 58 } 59 60 TEST(ScopedTempDir, UniqueTempDirUnderPath) { 61 // Create a path which will contain a unique temp path. 62 FilePath base_path; 63 file_util::CreateNewTempDirectory(FILE_PATH_LITERAL("base_dir"), 64 &base_path); 65 66 FilePath test_path; 67 { 68 ScopedTempDir dir; 69 EXPECT_TRUE(dir.CreateUniqueTempDirUnderPath(base_path)); 70 test_path = dir.path(); 71 EXPECT_TRUE(file_util::DirectoryExists(test_path)); 72 EXPECT_TRUE(base_path.IsParent(test_path)); 73 EXPECT_TRUE(test_path.value().find(base_path.value()) != std::string::npos); 74 } 75 EXPECT_FALSE(file_util::DirectoryExists(test_path)); 76 } 77 78 TEST(ScopedTempDir, MultipleInvocations) { 79 ScopedTempDir dir; 80 EXPECT_TRUE(dir.CreateUniqueTempDir()); 81 EXPECT_FALSE(dir.CreateUniqueTempDir()); 82 EXPECT_TRUE(dir.Delete()); 83 EXPECT_TRUE(dir.CreateUniqueTempDir()); 84 EXPECT_FALSE(dir.CreateUniqueTempDir()); 85 ScopedTempDir other_dir; 86 EXPECT_TRUE(other_dir.Set(dir.Take())); 87 EXPECT_TRUE(dir.CreateUniqueTempDir()); 88 EXPECT_FALSE(dir.CreateUniqueTempDir()); 89 EXPECT_FALSE(other_dir.CreateUniqueTempDir()); 90 } 91 92 #if defined(OS_WIN) 93 TEST(ScopedTempDir, LockedTempDir) { 94 ScopedTempDir dir; 95 EXPECT_TRUE(dir.CreateUniqueTempDir()); 96 int file_flags = base::PLATFORM_FILE_CREATE_ALWAYS | 97 base::PLATFORM_FILE_WRITE; 98 base::PlatformFileError error_code = base::PLATFORM_FILE_OK; 99 FilePath file_path(dir.path().Append(FILE_PATH_LITERAL("temp"))); 100 base::PlatformFile file = base::CreatePlatformFile(file_path, file_flags, 101 NULL, &error_code); 102 EXPECT_NE(base::kInvalidPlatformFileValue, file); 103 EXPECT_EQ(base::PLATFORM_FILE_OK, error_code); 104 EXPECT_FALSE(dir.Delete()); // We should not be able to delete. 105 EXPECT_FALSE(dir.path().empty()); // We should still have a valid path. 106 EXPECT_TRUE(base::ClosePlatformFile(file)); 107 // Now, we should be able to delete. 108 EXPECT_TRUE(dir.Delete()); 109 } 110 #endif // defined(OS_WIN) 111