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