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
10TEST(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
44TEST(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
60TEST(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
78TEST(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)
93TEST(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