Home | History | Annotate | Download | only in fileapi
      1 // Copyright 2013 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/basictypes.h"
      6 #include "base/files/file_path.h"
      7 #include "base/files/file_util.h"
      8 #include "base/files/scoped_temp_dir.h"
      9 #include "base/memory/scoped_ptr.h"
     10 #include "base/run_loop.h"
     11 #include "content/public/test/test_file_system_context.h"
     12 #include "storage/browser/fileapi/file_system_context.h"
     13 #include "storage/browser/fileapi/file_system_operation_context.h"
     14 #include "storage/browser/fileapi/isolated_context.h"
     15 #include "storage/browser/fileapi/transient_file_util.h"
     16 #include "storage/common/blob/scoped_file.h"
     17 #include "testing/gtest/include/gtest/gtest.h"
     18 
     19 using storage::FileSystemURL;
     20 
     21 namespace content {
     22 
     23 class TransientFileUtilTest : public testing::Test {
     24  public:
     25   TransientFileUtilTest() {}
     26   virtual ~TransientFileUtilTest() {}
     27 
     28   virtual void SetUp() OVERRIDE {
     29     file_system_context_ = CreateFileSystemContextForTesting(
     30         NULL, base::FilePath(FILE_PATH_LITERAL("dummy")));
     31     transient_file_util_.reset(new storage::TransientFileUtil);
     32 
     33     ASSERT_TRUE(data_dir_.CreateUniqueTempDir());
     34   }
     35 
     36   virtual void TearDown() OVERRIDE {
     37     file_system_context_ = NULL;
     38     base::RunLoop().RunUntilIdle();
     39   }
     40 
     41   void CreateAndRegisterTemporaryFile(
     42       FileSystemURL* file_url,
     43       base::FilePath* file_path) {
     44     EXPECT_TRUE(base::CreateTemporaryFileInDir(data_dir_.path(), file_path));
     45     storage::IsolatedContext* isolated_context =
     46         storage::IsolatedContext::GetInstance();
     47     std::string name = "tmp";
     48     std::string fsid = isolated_context->RegisterFileSystemForPath(
     49         storage::kFileSystemTypeForTransientFile,
     50         std::string(),
     51         *file_path,
     52         &name);
     53     ASSERT_TRUE(!fsid.empty());
     54     base::FilePath virtual_path = isolated_context->CreateVirtualRootPath(
     55         fsid).AppendASCII(name);
     56     *file_url = file_system_context_->CreateCrackedFileSystemURL(
     57         GURL("http://foo"), storage::kFileSystemTypeIsolated, virtual_path);
     58   }
     59 
     60   scoped_ptr<storage::FileSystemOperationContext> NewOperationContext() {
     61     return make_scoped_ptr(
     62         new storage::FileSystemOperationContext(file_system_context_.get()));
     63   }
     64 
     65   storage::FileSystemFileUtil* file_util() {
     66     return transient_file_util_.get();
     67   }
     68 
     69  private:
     70   base::MessageLoop message_loop_;
     71   base::ScopedTempDir data_dir_;
     72   scoped_refptr<storage::FileSystemContext> file_system_context_;
     73   scoped_ptr<storage::TransientFileUtil> transient_file_util_;
     74 
     75   DISALLOW_COPY_AND_ASSIGN(TransientFileUtilTest);
     76 };
     77 
     78 TEST_F(TransientFileUtilTest, TransientFile) {
     79   FileSystemURL temp_url;
     80   base::FilePath temp_path;
     81 
     82   CreateAndRegisterTemporaryFile(&temp_url, &temp_path);
     83 
     84   base::File::Error error;
     85   base::File::Info file_info;
     86   base::FilePath path;
     87 
     88   // Make sure the file is there.
     89   ASSERT_TRUE(temp_url.is_valid());
     90   ASSERT_TRUE(base::PathExists(temp_path));
     91   ASSERT_FALSE(base::DirectoryExists(temp_path));
     92 
     93   // Create a snapshot file.
     94   {
     95     storage::ScopedFile scoped_file = file_util()->CreateSnapshotFile(
     96         NewOperationContext().get(), temp_url, &error, &file_info, &path);
     97     ASSERT_EQ(base::File::FILE_OK, error);
     98     ASSERT_EQ(temp_path, path);
     99     ASSERT_FALSE(file_info.is_directory);
    100 
    101     // The file should be still there.
    102     ASSERT_TRUE(base::PathExists(temp_path));
    103     ASSERT_EQ(base::File::FILE_OK,
    104               file_util()->GetFileInfo(NewOperationContext().get(),
    105                                        temp_url, &file_info, &path));
    106     ASSERT_EQ(temp_path, path);
    107     ASSERT_FALSE(file_info.is_directory);
    108   }
    109 
    110   // The file's now scoped out.
    111   base::RunLoop().RunUntilIdle();
    112 
    113   // Now the temporary file and the transient filesystem must be gone too.
    114   ASSERT_FALSE(base::PathExists(temp_path));
    115   ASSERT_EQ(base::File::FILE_ERROR_NOT_FOUND,
    116             file_util()->GetFileInfo(NewOperationContext().get(),
    117                                      temp_url, &file_info, &path));
    118 }
    119 
    120 }  // namespace content
    121