Home | History | Annotate | Download | only in memory
      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