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