1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/basictypes.h" 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/bind.h" 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/files/file_path.h" 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/files/scoped_temp_dir.h" 9d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/run_loop.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/test/async_file_test_helper.h" 115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/public/test/mock_special_storage_policy.h" 124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/public/test/test_file_system_backend.h" 134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/public/test/test_file_system_context.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/copy_or_move_file_validator.h" 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/external_mount_points.h" 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_backend.h" 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_context.h" 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_url.h" 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/isolated_context.h" 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/common/blob/shareable_file_reference.h" 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/common/fileapi/file_system_util.h" 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using content::AsyncFileTestHelper; 2503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::CopyOrMoveFileValidator; 2603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::CopyOrMoveFileValidatorFactory; 2703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::FileSystemURL; 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace content { 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace { 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)const storage::FileSystemType kNoValidatorType = 3403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::kFileSystemTypeTemporary; 3503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)const storage::FileSystemType kWithValidatorType = storage::kFileSystemTypeTest; 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid ExpectOk(const GURL& origin_url, 387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const std::string& name, 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Error error) { 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(base::File::FILE_OK, error); 4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class CopyOrMoveFileValidatorTestHelper { 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) CopyOrMoveFileValidatorTestHelper(const GURL& origin, 4603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::FileSystemType src_type, 4703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::FileSystemType dest_type) 486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) : origin_(origin), src_type_(src_type), dest_type_(dest_type) {} 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ~CopyOrMoveFileValidatorTestHelper() { 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) file_system_context_ = NULL; 52d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::RunLoop().RunUntilIdle(); 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetUp() { 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(base_.CreateUniqueTempDir()); 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath base_dir = base_.path(); 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) file_system_context_ = CreateFileSystemContextForTesting(NULL, base_dir); 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Set up TestFileSystemBackend to require CopyOrMoveFileValidator. 6203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::FileSystemBackend* test_file_system_backend = 637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch file_system_context_->GetFileSystemBackend(kWithValidatorType); 647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch static_cast<TestFileSystemBackend*>(test_file_system_backend)-> 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) set_require_copy_or_move_validator(true); 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Sets up source. 6803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::FileSystemBackend* src_file_system_backend = 697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch file_system_context_->GetFileSystemBackend(src_type_); 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) src_file_system_backend->ResolveURL( 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FileSystemURL::CreateForTest(origin_, src_type_, base::FilePath()), 7203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::OPEN_FILE_SYSTEM_CREATE_IF_NONEXISTENT, 7390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Bind(&ExpectOk)); 74d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::RunLoop().RunUntilIdle(); 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(base::File::FILE_OK, CreateDirectory(SourceURL(""))); 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Sets up dest. 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK_EQ(kWithValidatorType, dest_type_); 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(base::File::FILE_OK, CreateDirectory(DestURL(""))); 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) copy_src_ = SourceURL("copy_src.jpg"); 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) move_src_ = SourceURL("move_src.jpg"); 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) copy_dest_ = DestURL("copy_dest.jpg"); 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) move_dest_ = DestURL("move_dest.jpg"); 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(base::File::FILE_OK, CreateFile(copy_src_, 10)); 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(base::File::FILE_OK, CreateFile(move_src_, 10)); 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(FileExists(copy_src_, 10)); 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(FileExists(move_src_, 10)); 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_FALSE(FileExists(copy_dest_, 10)); 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_FALSE(FileExists(move_dest_, 10)); 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetMediaCopyOrMoveFileValidatorFactory( 9603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_ptr<storage::CopyOrMoveFileValidatorFactory> factory) { 977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch TestFileSystemBackend* backend = static_cast<TestFileSystemBackend*>( 987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch file_system_context_->GetFileSystemBackend(kWithValidatorType)); 997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch backend->InitializeCopyOrMoveFileValidatorFactory(factory.Pass()); 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void CopyTest(base::File::Error expected) { 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(FileExists(copy_src_, 10)); 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_FALSE(FileExists(copy_dest_, 10)); 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(expected, 107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) AsyncFileTestHelper::Copy( 108868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) file_system_context_.get(), copy_src_, copy_dest_)); 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(FileExists(copy_src_, 10)); 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (expected == base::File::FILE_OK) 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(FileExists(copy_dest_, 10)); 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(FileExists(copy_dest_, 10)); 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void MoveTest(base::File::Error expected) { 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(FileExists(move_src_, 10)); 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_FALSE(FileExists(move_dest_, 10)); 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(expected, 122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) AsyncFileTestHelper::Move( 123868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) file_system_context_.get(), move_src_, move_dest_)); 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (expected == base::File::FILE_OK) { 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(FileExists(move_src_, 10)); 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(FileExists(move_dest_, 10)); 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(FileExists(move_src_, 10)); 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(FileExists(move_dest_, 10)); 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FileSystemURL SourceURL(const std::string& path) { 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return file_system_context_->CreateCrackedFileSystemURL( 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) origin_, src_type_, 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath().AppendASCII("src").AppendASCII(path)); 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FileSystemURL DestURL(const std::string& path) { 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return file_system_context_->CreateCrackedFileSystemURL( 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) origin_, dest_type_, 144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath().AppendASCII("dest").AppendASCII(path)); 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Error CreateFile(const FileSystemURL& url, size_t size) { 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Error result = 149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) AsyncFileTestHelper::CreateFile(file_system_context_.get(), url); 1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (result != base::File::FILE_OK) 151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return result; 152868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return AsyncFileTestHelper::TruncateFile( 153868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) file_system_context_.get(), url, size); 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Error CreateDirectory(const FileSystemURL& url) { 157868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return AsyncFileTestHelper::CreateDirectory(file_system_context_.get(), 158868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) url); 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool FileExists(const FileSystemURL& url, int64 expected_size) { 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return AsyncFileTestHelper::FileExists( 163868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) file_system_context_.get(), url, expected_size); 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::ScopedTempDir base_; 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const GURL origin_; 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 17003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const storage::FileSystemType src_type_; 17103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const storage::FileSystemType dest_type_; 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string src_fsid_; 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string dest_fsid_; 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 175b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::MessageLoop message_loop_; 17603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_refptr<storage::FileSystemContext> file_system_context_; 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FileSystemURL copy_src_; 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FileSystemURL copy_dest_; 180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FileSystemURL move_src_; 181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FileSystemURL move_dest_; 182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CopyOrMoveFileValidatorTestHelper); 184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 186a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// For TestCopyOrMoveFileValidatorFactory 187a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)enum Validity { 188a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) VALID, 189a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PRE_WRITE_INVALID, 190a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) POST_WRITE_INVALID 191a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}; 192a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class TestCopyOrMoveFileValidatorFactory 19403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) : public storage::CopyOrMoveFileValidatorFactory { 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // A factory that creates validators that accept everything or nothing. 197a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // TODO(gbillock): switch args to enum or something 198a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) explicit TestCopyOrMoveFileValidatorFactory(Validity validity) 199a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) : validity_(validity) {} 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~TestCopyOrMoveFileValidatorFactory() {} 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 20203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual storage::CopyOrMoveFileValidator* CreateCopyOrMoveFileValidator( 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const FileSystemURL& /*src_url*/, 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath& /*platform_path*/) OVERRIDE { 205a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return new TestCopyOrMoveFileValidator(validity_); 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) class TestCopyOrMoveFileValidator : public CopyOrMoveFileValidator { 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 211a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) explicit TestCopyOrMoveFileValidator(Validity validity) 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : result_(validity == VALID || validity == POST_WRITE_INVALID ? 2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::FILE_OK : 2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::FILE_ERROR_SECURITY), 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) write_result_(validity == VALID || validity == PRE_WRITE_INVALID ? 2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::FILE_OK : 2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::FILE_ERROR_SECURITY) { 218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~TestCopyOrMoveFileValidator() {} 220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 221a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch virtual void StartPreWriteValidation( 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const ResultCallback& result_callback) OVERRIDE { 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Post the result since a real validator must do work asynchronously. 224b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::MessageLoop::current()->PostTask( 225b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) FROM_HERE, base::Bind(result_callback, result_)); 226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 228a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch virtual void StartPostWriteValidation( 229a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch const base::FilePath& dest_platform_path, 230a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch const ResultCallback& result_callback) OVERRIDE { 231a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // Post the result since a real validator must do work asynchronously. 232a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::MessageLoop::current()->PostTask( 233a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch FROM_HERE, base::Bind(result_callback, write_result_)); 234a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch } 235a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Error result_; 2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Error write_result_; 239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestCopyOrMoveFileValidator); 241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 243a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) Validity validity_; 244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestCopyOrMoveFileValidatorFactory); 246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace 249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 250a3f7b4e666c476898878fa745f637129375cd889Ben MurdochTEST(CopyOrMoveFileValidatorTest, NoValidatorWithinSameFSType) { 251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Within a file system type, validation is not expected, so it should 252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // work for kWithValidatorType without a validator set. 253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CopyOrMoveFileValidatorTestHelper helper(GURL("http://foo"), 254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kWithValidatorType, 255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kWithValidatorType); 256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) helper.SetUp(); 2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) helper.CopyTest(base::File::FILE_OK); 2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) helper.MoveTest(base::File::FILE_OK); 259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(CopyOrMoveFileValidatorTest, MissingValidator) { 262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Copying or moving into a kWithValidatorType requires a file 263a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // validator. An error is expected if copy is attempted without a validator. 264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CopyOrMoveFileValidatorTestHelper helper(GURL("http://foo"), 265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kNoValidatorType, 266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kWithValidatorType); 267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) helper.SetUp(); 2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) helper.CopyTest(base::File::FILE_ERROR_SECURITY); 2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) helper.MoveTest(base::File::FILE_ERROR_SECURITY); 270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(CopyOrMoveFileValidatorTest, AcceptAll) { 273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CopyOrMoveFileValidatorTestHelper helper(GURL("http://foo"), 274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kNoValidatorType, 275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kWithValidatorType); 276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) helper.SetUp(); 277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<CopyOrMoveFileValidatorFactory> factory( 278a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) new TestCopyOrMoveFileValidatorFactory(VALID)); 279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) helper.SetMediaCopyOrMoveFileValidatorFactory(factory.Pass()); 280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) helper.CopyTest(base::File::FILE_OK); 2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) helper.MoveTest(base::File::FILE_OK); 283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(CopyOrMoveFileValidatorTest, AcceptNone) { 286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CopyOrMoveFileValidatorTestHelper helper(GURL("http://foo"), 287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kNoValidatorType, 288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kWithValidatorType); 289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) helper.SetUp(); 290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<CopyOrMoveFileValidatorFactory> factory( 291a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) new TestCopyOrMoveFileValidatorFactory(PRE_WRITE_INVALID)); 292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) helper.SetMediaCopyOrMoveFileValidatorFactory(factory.Pass()); 293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) helper.CopyTest(base::File::FILE_ERROR_SECURITY); 2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) helper.MoveTest(base::File::FILE_ERROR_SECURITY); 296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(CopyOrMoveFileValidatorTest, OverrideValidator) { 299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Once set, you can not override the validator. 300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CopyOrMoveFileValidatorTestHelper helper(GURL("http://foo"), 301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kNoValidatorType, 302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kWithValidatorType); 303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) helper.SetUp(); 304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<CopyOrMoveFileValidatorFactory> reject_factory( 305a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) new TestCopyOrMoveFileValidatorFactory(PRE_WRITE_INVALID)); 306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) helper.SetMediaCopyOrMoveFileValidatorFactory(reject_factory.Pass()); 307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<CopyOrMoveFileValidatorFactory> accept_factory( 309a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) new TestCopyOrMoveFileValidatorFactory(VALID)); 310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) helper.SetMediaCopyOrMoveFileValidatorFactory(accept_factory.Pass()); 311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) helper.CopyTest(base::File::FILE_ERROR_SECURITY); 3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) helper.MoveTest(base::File::FILE_ERROR_SECURITY); 314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 316a3f7b4e666c476898878fa745f637129375cd889Ben MurdochTEST(CopyOrMoveFileValidatorTest, RejectPostWrite) { 317a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch CopyOrMoveFileValidatorTestHelper helper(GURL("http://foo"), 318a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch kNoValidatorType, 319a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch kWithValidatorType); 320a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch helper.SetUp(); 321a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch scoped_ptr<CopyOrMoveFileValidatorFactory> factory( 322a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) new TestCopyOrMoveFileValidatorFactory(POST_WRITE_INVALID)); 323a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch helper.SetMediaCopyOrMoveFileValidatorFactory(factory.Pass()); 324a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) helper.CopyTest(base::File::FILE_ERROR_SECURITY); 3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) helper.MoveTest(base::File::FILE_ERROR_SECURITY); 327a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 328a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace content 330