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