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