| Index: content/browser/fileapi/copy_or_move_file_validator_unittest.cc
 | 
| diff --git a/content/browser/fileapi/copy_or_move_file_validator_unittest.cc b/content/browser/fileapi/copy_or_move_file_validator_unittest.cc
 | 
| deleted file mode 100644
 | 
| index 5efd37bae2802e2a7ac21d975cd4d18fa74166c1..0000000000000000000000000000000000000000
 | 
| --- a/content/browser/fileapi/copy_or_move_file_validator_unittest.cc
 | 
| +++ /dev/null
 | 
| @@ -1,336 +0,0 @@
 | 
| -// Copyright 2013 The Chromium Authors. All rights reserved.
 | 
| -// Use of this source code is governed by a BSD-style license that can be
 | 
| -// found in the LICENSE file.
 | 
| -
 | 
| -#include <stddef.h>
 | 
| -#include <stdint.h>
 | 
| -#include <utility>
 | 
| -
 | 
| -#include "base/bind.h"
 | 
| -#include "base/files/file_path.h"
 | 
| -#include "base/files/scoped_temp_dir.h"
 | 
| -#include "base/location.h"
 | 
| -#include "base/macros.h"
 | 
| -#include "base/run_loop.h"
 | 
| -#include "base/single_thread_task_runner.h"
 | 
| -#include "base/threading/thread_task_runner_handle.h"
 | 
| -#include "content/public/test/async_file_test_helper.h"
 | 
| -#include "content/public/test/mock_special_storage_policy.h"
 | 
| -#include "content/public/test/test_file_system_backend.h"
 | 
| -#include "content/public/test/test_file_system_context.h"
 | 
| -#include "storage/browser/blob/shareable_file_reference.h"
 | 
| -#include "storage/browser/fileapi/copy_or_move_file_validator.h"
 | 
| -#include "storage/browser/fileapi/external_mount_points.h"
 | 
| -#include "storage/browser/fileapi/file_system_backend.h"
 | 
| -#include "storage/browser/fileapi/file_system_context.h"
 | 
| -#include "storage/browser/fileapi/file_system_url.h"
 | 
| -#include "storage/browser/fileapi/isolated_context.h"
 | 
| -#include "storage/common/fileapi/file_system_util.h"
 | 
| -#include "testing/gtest/include/gtest/gtest.h"
 | 
| -
 | 
| -using content::AsyncFileTestHelper;
 | 
| -using storage::CopyOrMoveFileValidator;
 | 
| -using storage::CopyOrMoveFileValidatorFactory;
 | 
| -using storage::FileSystemURL;
 | 
| -
 | 
| -namespace content {
 | 
| -
 | 
| -namespace {
 | 
| -
 | 
| -const storage::FileSystemType kNoValidatorType =
 | 
| -    storage::kFileSystemTypeTemporary;
 | 
| -const storage::FileSystemType kWithValidatorType = storage::kFileSystemTypeTest;
 | 
| -
 | 
| -void ExpectOk(const GURL& origin_url,
 | 
| -              const std::string& name,
 | 
| -              base::File::Error error) {
 | 
| -  ASSERT_EQ(base::File::FILE_OK, error);
 | 
| -}
 | 
| -
 | 
| -class CopyOrMoveFileValidatorTestHelper {
 | 
| - public:
 | 
| -  CopyOrMoveFileValidatorTestHelper(const GURL& origin,
 | 
| -                                    storage::FileSystemType src_type,
 | 
| -                                    storage::FileSystemType dest_type)
 | 
| -      : origin_(origin), src_type_(src_type), dest_type_(dest_type) {}
 | 
| -
 | 
| -  ~CopyOrMoveFileValidatorTestHelper() {
 | 
| -    file_system_context_ = NULL;
 | 
| -    base::RunLoop().RunUntilIdle();
 | 
| -  }
 | 
| -
 | 
| -  void SetUp() {
 | 
| -    ASSERT_TRUE(base_.CreateUniqueTempDir());
 | 
| -    base::FilePath base_dir = base_.GetPath();
 | 
| -
 | 
| -    file_system_context_ = CreateFileSystemContextForTesting(NULL, base_dir);
 | 
| -
 | 
| -    // Set up TestFileSystemBackend to require CopyOrMoveFileValidator.
 | 
| -    storage::FileSystemBackend* test_file_system_backend =
 | 
| -        file_system_context_->GetFileSystemBackend(kWithValidatorType);
 | 
| -    static_cast<TestFileSystemBackend*>(test_file_system_backend)->
 | 
| -        set_require_copy_or_move_validator(true);
 | 
| -
 | 
| -    // Sets up source.
 | 
| -    storage::FileSystemBackend* src_file_system_backend =
 | 
| -        file_system_context_->GetFileSystemBackend(src_type_);
 | 
| -    src_file_system_backend->ResolveURL(
 | 
| -        FileSystemURL::CreateForTest(origin_, src_type_, base::FilePath()),
 | 
| -        storage::OPEN_FILE_SYSTEM_CREATE_IF_NONEXISTENT,
 | 
| -        base::Bind(&ExpectOk));
 | 
| -    base::RunLoop().RunUntilIdle();
 | 
| -    ASSERT_EQ(base::File::FILE_OK, CreateDirectory(SourceURL("")));
 | 
| -
 | 
| -    // Sets up dest.
 | 
| -    DCHECK_EQ(kWithValidatorType, dest_type_);
 | 
| -    ASSERT_EQ(base::File::FILE_OK, CreateDirectory(DestURL("")));
 | 
| -
 | 
| -    copy_src_ = SourceURL("copy_src.jpg");
 | 
| -    move_src_ = SourceURL("move_src.jpg");
 | 
| -    copy_dest_ = DestURL("copy_dest.jpg");
 | 
| -    move_dest_ = DestURL("move_dest.jpg");
 | 
| -
 | 
| -    ASSERT_EQ(base::File::FILE_OK, CreateFile(copy_src_, 10));
 | 
| -    ASSERT_EQ(base::File::FILE_OK, CreateFile(move_src_, 10));
 | 
| -
 | 
| -    ASSERT_TRUE(FileExists(copy_src_, 10));
 | 
| -    ASSERT_TRUE(FileExists(move_src_, 10));
 | 
| -    ASSERT_FALSE(FileExists(copy_dest_, 10));
 | 
| -    ASSERT_FALSE(FileExists(move_dest_, 10));
 | 
| -  }
 | 
| -
 | 
| -  void SetMediaCopyOrMoveFileValidatorFactory(
 | 
| -      std::unique_ptr<storage::CopyOrMoveFileValidatorFactory> factory) {
 | 
| -    TestFileSystemBackend* backend = static_cast<TestFileSystemBackend*>(
 | 
| -        file_system_context_->GetFileSystemBackend(kWithValidatorType));
 | 
| -    backend->InitializeCopyOrMoveFileValidatorFactory(std::move(factory));
 | 
| -  }
 | 
| -
 | 
| -  void CopyTest(base::File::Error expected) {
 | 
| -    ASSERT_TRUE(FileExists(copy_src_, 10));
 | 
| -    ASSERT_FALSE(FileExists(copy_dest_, 10));
 | 
| -
 | 
| -    EXPECT_EQ(expected,
 | 
| -              AsyncFileTestHelper::Copy(
 | 
| -                  file_system_context_.get(), copy_src_, copy_dest_));
 | 
| -
 | 
| -    EXPECT_TRUE(FileExists(copy_src_, 10));
 | 
| -    if (expected == base::File::FILE_OK)
 | 
| -      EXPECT_TRUE(FileExists(copy_dest_, 10));
 | 
| -    else
 | 
| -      EXPECT_FALSE(FileExists(copy_dest_, 10));
 | 
| -  };
 | 
| -
 | 
| -  void MoveTest(base::File::Error expected) {
 | 
| -    ASSERT_TRUE(FileExists(move_src_, 10));
 | 
| -    ASSERT_FALSE(FileExists(move_dest_, 10));
 | 
| -
 | 
| -    EXPECT_EQ(expected,
 | 
| -              AsyncFileTestHelper::Move(
 | 
| -                  file_system_context_.get(), move_src_, move_dest_));
 | 
| -
 | 
| -    if (expected == base::File::FILE_OK) {
 | 
| -      EXPECT_FALSE(FileExists(move_src_, 10));
 | 
| -      EXPECT_TRUE(FileExists(move_dest_, 10));
 | 
| -    } else {
 | 
| -      EXPECT_TRUE(FileExists(move_src_, 10));
 | 
| -      EXPECT_FALSE(FileExists(move_dest_, 10));
 | 
| -    }
 | 
| -  };
 | 
| -
 | 
| - private:
 | 
| -  FileSystemURL SourceURL(const std::string& path) {
 | 
| -    return file_system_context_->CreateCrackedFileSystemURL(
 | 
| -        origin_, src_type_,
 | 
| -        base::FilePath().AppendASCII("src").AppendASCII(path));
 | 
| -  }
 | 
| -
 | 
| -  FileSystemURL DestURL(const std::string& path) {
 | 
| -    return file_system_context_->CreateCrackedFileSystemURL(
 | 
| -        origin_, dest_type_,
 | 
| -        base::FilePath().AppendASCII("dest").AppendASCII(path));
 | 
| -  }
 | 
| -
 | 
| -  base::File::Error CreateFile(const FileSystemURL& url, size_t size) {
 | 
| -    base::File::Error result =
 | 
| -        AsyncFileTestHelper::CreateFile(file_system_context_.get(), url);
 | 
| -    if (result != base::File::FILE_OK)
 | 
| -      return result;
 | 
| -    return AsyncFileTestHelper::TruncateFile(
 | 
| -        file_system_context_.get(), url, size);
 | 
| -  }
 | 
| -
 | 
| -  base::File::Error CreateDirectory(const FileSystemURL& url) {
 | 
| -    return AsyncFileTestHelper::CreateDirectory(file_system_context_.get(),
 | 
| -                                                url);
 | 
| -  }
 | 
| -
 | 
| -  bool FileExists(const FileSystemURL& url, int64_t expected_size) {
 | 
| -    return AsyncFileTestHelper::FileExists(
 | 
| -        file_system_context_.get(), url, expected_size);
 | 
| -  }
 | 
| -
 | 
| -  base::ScopedTempDir base_;
 | 
| -
 | 
| -  const GURL origin_;
 | 
| -
 | 
| -  const storage::FileSystemType src_type_;
 | 
| -  const storage::FileSystemType dest_type_;
 | 
| -  std::string src_fsid_;
 | 
| -  std::string dest_fsid_;
 | 
| -
 | 
| -  base::MessageLoop message_loop_;
 | 
| -  scoped_refptr<storage::FileSystemContext> file_system_context_;
 | 
| -
 | 
| -  FileSystemURL copy_src_;
 | 
| -  FileSystemURL copy_dest_;
 | 
| -  FileSystemURL move_src_;
 | 
| -  FileSystemURL move_dest_;
 | 
| -
 | 
| -  DISALLOW_COPY_AND_ASSIGN(CopyOrMoveFileValidatorTestHelper);
 | 
| -};
 | 
| -
 | 
| -// For TestCopyOrMoveFileValidatorFactory
 | 
| -enum Validity {
 | 
| -  VALID,
 | 
| -  PRE_WRITE_INVALID,
 | 
| -  POST_WRITE_INVALID
 | 
| -};
 | 
| -
 | 
| -class TestCopyOrMoveFileValidatorFactory
 | 
| -    : public storage::CopyOrMoveFileValidatorFactory {
 | 
| - public:
 | 
| -  // A factory that creates validators that accept everything or nothing.
 | 
| -  // TODO(gbillock): switch args to enum or something
 | 
| -  explicit TestCopyOrMoveFileValidatorFactory(Validity validity)
 | 
| -      : validity_(validity) {}
 | 
| -  ~TestCopyOrMoveFileValidatorFactory() override {}
 | 
| -
 | 
| -  storage::CopyOrMoveFileValidator* CreateCopyOrMoveFileValidator(
 | 
| -      const FileSystemURL& /*src_url*/,
 | 
| -      const base::FilePath& /*platform_path*/) override {
 | 
| -    return new TestCopyOrMoveFileValidator(validity_);
 | 
| -  }
 | 
| -
 | 
| - private:
 | 
| -  class TestCopyOrMoveFileValidator : public CopyOrMoveFileValidator {
 | 
| -   public:
 | 
| -    explicit TestCopyOrMoveFileValidator(Validity validity)
 | 
| -        : result_(validity == VALID || validity == POST_WRITE_INVALID ?
 | 
| -                  base::File::FILE_OK :
 | 
| -                  base::File::FILE_ERROR_SECURITY),
 | 
| -          write_result_(validity == VALID || validity == PRE_WRITE_INVALID ?
 | 
| -                        base::File::FILE_OK :
 | 
| -                        base::File::FILE_ERROR_SECURITY) {
 | 
| -    }
 | 
| -    ~TestCopyOrMoveFileValidator() override {}
 | 
| -
 | 
| -    void StartPreWriteValidation(
 | 
| -        const ResultCallback& result_callback) override {
 | 
| -      // Post the result since a real validator must do work asynchronously.
 | 
| -      base::ThreadTaskRunnerHandle::Get()->PostTask(
 | 
| -          FROM_HERE, base::Bind(result_callback, result_));
 | 
| -    }
 | 
| -
 | 
| -    void StartPostWriteValidation(
 | 
| -        const base::FilePath& dest_platform_path,
 | 
| -        const ResultCallback& result_callback) override {
 | 
| -      // Post the result since a real validator must do work asynchronously.
 | 
| -      base::ThreadTaskRunnerHandle::Get()->PostTask(
 | 
| -          FROM_HERE, base::Bind(result_callback, write_result_));
 | 
| -    }
 | 
| -
 | 
| -   private:
 | 
| -    base::File::Error result_;
 | 
| -    base::File::Error write_result_;
 | 
| -
 | 
| -    DISALLOW_COPY_AND_ASSIGN(TestCopyOrMoveFileValidator);
 | 
| -  };
 | 
| -
 | 
| -  Validity validity_;
 | 
| -
 | 
| -  DISALLOW_COPY_AND_ASSIGN(TestCopyOrMoveFileValidatorFactory);
 | 
| -};
 | 
| -
 | 
| -}  // namespace
 | 
| -
 | 
| -TEST(CopyOrMoveFileValidatorTest, NoValidatorWithinSameFSType) {
 | 
| -  // Within a file system type, validation is not expected, so it should
 | 
| -  // work for kWithValidatorType without a validator set.
 | 
| -  CopyOrMoveFileValidatorTestHelper helper(GURL("http://foo"),
 | 
| -                                           kWithValidatorType,
 | 
| -                                           kWithValidatorType);
 | 
| -  helper.SetUp();
 | 
| -  helper.CopyTest(base::File::FILE_OK);
 | 
| -  helper.MoveTest(base::File::FILE_OK);
 | 
| -}
 | 
| -
 | 
| -TEST(CopyOrMoveFileValidatorTest, MissingValidator) {
 | 
| -  // Copying or moving into a kWithValidatorType requires a file
 | 
| -  // validator.  An error is expected if copy is attempted without a validator.
 | 
| -  CopyOrMoveFileValidatorTestHelper helper(GURL("http://foo"),
 | 
| -                                           kNoValidatorType,
 | 
| -                                           kWithValidatorType);
 | 
| -  helper.SetUp();
 | 
| -  helper.CopyTest(base::File::FILE_ERROR_SECURITY);
 | 
| -  helper.MoveTest(base::File::FILE_ERROR_SECURITY);
 | 
| -}
 | 
| -
 | 
| -TEST(CopyOrMoveFileValidatorTest, AcceptAll) {
 | 
| -  CopyOrMoveFileValidatorTestHelper helper(GURL("http://foo"),
 | 
| -                                           kNoValidatorType,
 | 
| -                                           kWithValidatorType);
 | 
| -  helper.SetUp();
 | 
| -  std::unique_ptr<CopyOrMoveFileValidatorFactory> factory(
 | 
| -      new TestCopyOrMoveFileValidatorFactory(VALID));
 | 
| -  helper.SetMediaCopyOrMoveFileValidatorFactory(std::move(factory));
 | 
| -
 | 
| -  helper.CopyTest(base::File::FILE_OK);
 | 
| -  helper.MoveTest(base::File::FILE_OK);
 | 
| -}
 | 
| -
 | 
| -TEST(CopyOrMoveFileValidatorTest, AcceptNone) {
 | 
| -  CopyOrMoveFileValidatorTestHelper helper(GURL("http://foo"),
 | 
| -                                           kNoValidatorType,
 | 
| -                                           kWithValidatorType);
 | 
| -  helper.SetUp();
 | 
| -  std::unique_ptr<CopyOrMoveFileValidatorFactory> factory(
 | 
| -      new TestCopyOrMoveFileValidatorFactory(PRE_WRITE_INVALID));
 | 
| -  helper.SetMediaCopyOrMoveFileValidatorFactory(std::move(factory));
 | 
| -
 | 
| -  helper.CopyTest(base::File::FILE_ERROR_SECURITY);
 | 
| -  helper.MoveTest(base::File::FILE_ERROR_SECURITY);
 | 
| -}
 | 
| -
 | 
| -TEST(CopyOrMoveFileValidatorTest, OverrideValidator) {
 | 
| -  // Once set, you can not override the validator.
 | 
| -  CopyOrMoveFileValidatorTestHelper helper(GURL("http://foo"),
 | 
| -                                           kNoValidatorType,
 | 
| -                                           kWithValidatorType);
 | 
| -  helper.SetUp();
 | 
| -  std::unique_ptr<CopyOrMoveFileValidatorFactory> reject_factory(
 | 
| -      new TestCopyOrMoveFileValidatorFactory(PRE_WRITE_INVALID));
 | 
| -  helper.SetMediaCopyOrMoveFileValidatorFactory(std::move(reject_factory));
 | 
| -
 | 
| -  std::unique_ptr<CopyOrMoveFileValidatorFactory> accept_factory(
 | 
| -      new TestCopyOrMoveFileValidatorFactory(VALID));
 | 
| -  helper.SetMediaCopyOrMoveFileValidatorFactory(std::move(accept_factory));
 | 
| -
 | 
| -  helper.CopyTest(base::File::FILE_ERROR_SECURITY);
 | 
| -  helper.MoveTest(base::File::FILE_ERROR_SECURITY);
 | 
| -}
 | 
| -
 | 
| -TEST(CopyOrMoveFileValidatorTest, RejectPostWrite) {
 | 
| -  CopyOrMoveFileValidatorTestHelper helper(GURL("http://foo"),
 | 
| -                                           kNoValidatorType,
 | 
| -                                           kWithValidatorType);
 | 
| -  helper.SetUp();
 | 
| -  std::unique_ptr<CopyOrMoveFileValidatorFactory> factory(
 | 
| -      new TestCopyOrMoveFileValidatorFactory(POST_WRITE_INVALID));
 | 
| -  helper.SetMediaCopyOrMoveFileValidatorFactory(std::move(factory));
 | 
| -
 | 
| -  helper.CopyTest(base::File::FILE_ERROR_SECURITY);
 | 
| -  helper.MoveTest(base::File::FILE_ERROR_SECURITY);
 | 
| -}
 | 
| -
 | 
| -}  // namespace content
 | 
| 
 |