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