14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/files/file.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
15d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/run_loop.h"
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/browser/fileapi/mock_file_change_observer.h"
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/test/async_file_test_helper.h"
185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/public/test/mock_special_storage_policy.h"
194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/public/test/sandbox_file_system_test_helper.h"
204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/public/test/test_file_system_context.h"
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/test/fileapi_test_file_set.h"
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/external_mount_points.h"
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_backend.h"
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_context.h"
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_operation_context.h"
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_usage_cache.h"
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/obfuscated_file_util.h"
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/sandbox_directory_database.h"
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/sandbox_file_system_backend_delegate.h"
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/sandbox_isolated_origin_database.h"
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/sandbox_origin_database.h"
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/quota/quota_manager.h"
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/common/database/database_identifier.h"
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/common/quota/quota_types.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using content::AsyncFileTestHelper;
3803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::FileSystemContext;
3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::FileSystemOperation;
4003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::FileSystemOperationContext;
4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::FileSystemURL;
4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::ObfuscatedFileUtil;
4303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::SandboxDirectoryDatabase;
4403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::SandboxIsolatedOriginDatabase;
4503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::kFileSystemTypeTemporary;
4603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::kFileSystemTypePersistent;
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace content {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool FileExists(const base::FilePath& path) {
537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return base::PathExists(path) && !base::DirectoryExists(path);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int64 GetSize(const base::FilePath& path) {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 size;
58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_TRUE(base::GetFileSize(path, &size));
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return size;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// After a move, the dest exists and the source doesn't.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// After a copy, both source and dest exist.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct CopyMoveTestCaseRecord {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_copy_not_move;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char source_path[64];
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char dest_path[64];
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool cause_overwrite;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const CopyMoveTestCaseRecord kCopyMoveTestCases[] = {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is the combinatoric set of:
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //  rename vs. same-name
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //  different directory vs. same directory
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //  overwrite vs. no-overwrite
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //  copy vs. move
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //  We can never be called with source and destination paths identical, so
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //  those cases are omitted.
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {true, "dir0/file0", "dir0/file1", false},
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {false, "dir0/file0", "dir0/file1", false},
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {true, "dir0/file0", "dir0/file1", true},
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {false, "dir0/file0", "dir0/file1", true},
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {true, "dir0/file0", "dir1/file0", false},
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {false, "dir0/file0", "dir1/file0", false},
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {true, "dir0/file0", "dir1/file0", true},
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {false, "dir0/file0", "dir1/file0", true},
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {true, "dir0/file0", "dir1/file1", false},
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {false, "dir0/file0", "dir1/file1", false},
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {true, "dir0/file0", "dir1/file1", true},
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {false, "dir0/file0", "dir1/file1", true},
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct OriginEnumerationTestRecord {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string origin_url;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool has_temporary;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool has_persistent;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const OriginEnumerationTestRecord kOriginEnumerationTestRecords[] = {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://example.com", false, true},
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://example1.com", true, false},
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"https://example1.com", true, true},
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"file://", false, true},
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"http://example.com:8000", false, true},
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)FileSystemURL FileSystemURLAppend(
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const FileSystemURL& url, const base::FilePath::StringType& child) {
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return FileSystemURL::CreateForTest(
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      url.origin(), url.mount_type(), url.virtual_path().Append(child));
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)FileSystemURL FileSystemURLAppendUTF8(
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const FileSystemURL& url, const std::string& child) {
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return FileSystemURL::CreateForTest(
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      url.origin(),
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      url.mount_type(),
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      url.virtual_path().Append(base::FilePath::FromUTF8Unsafe(child)));
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)FileSystemURL FileSystemURLDirName(const FileSystemURL& url) {
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return FileSystemURL::CreateForTest(
12403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      url.origin(),
12503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      url.mount_type(),
12603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      storage::VirtualPath::DirName(url.virtual_path()));
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)std::string GetTypeString(storage::FileSystemType type) {
13003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return storage::SandboxFileSystemBackendDelegate::GetTypeString(type);
1318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
1328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)bool HasFileSystemType(ObfuscatedFileUtil::AbstractOriginEnumerator* enumerator,
13403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                       storage::FileSystemType type) {
1358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  return enumerator->HasTypeDirectory(GetTypeString(type));
1368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
1378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}  // namespace
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(ericu): The vast majority of this and the other FSFU subclass tests
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// could theoretically be shared.  It would basically be a FSFU interface
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// compliance test, and only the subclass-specific bits that look into the
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// implementation would need to be written per-subclass.
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ObfuscatedFileUtilTest : public testing::Test {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ObfuscatedFileUtilTest()
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : origin_(GURL("http://www.example.com")),
14803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        type_(storage::kFileSystemTypeTemporary),
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        weak_factory_(this),
15090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        sandbox_file_system_(origin_, type_),
15103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        quota_status_(storage::kQuotaStatusUnknown),
15203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        usage_(-1) {}
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp() {
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(data_dir_.CreateUniqueTempDir());
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    storage_policy_ = new MockSpecialStoragePolicy();
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    quota_manager_ =
16003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        new storage::QuotaManager(false /* is_incognito */,
16103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                  data_dir_.path(),
16203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                  base::MessageLoopProxy::current().get(),
16303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                  base::MessageLoopProxy::current().get(),
16403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                  storage_policy_.get());
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Every time we create a new sandbox_file_system helper,
16790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // it creates another context, which creates another path manager,
16858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch    // another sandbox_backend, and another OFU.
16958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch    // We need to pass in the context to skip all that.
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    file_system_context_ = CreateFileSystemContextForTesting(
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        quota_manager_->proxy(),
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        data_dir_.path());
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    sandbox_file_system_.SetUp(file_system_context_.get());
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    change_observers_ =
17703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        storage::MockFileChangeObserver::CreateList(&change_observer_);
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TearDown() {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager_ = NULL;
18290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    sandbox_file_system_.TearDown();
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FileSystemOperationContext> LimitedContext(
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int64 allowed_bytes_growth) {
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<FileSystemOperationContext> context(
18890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        sandbox_file_system_.NewOperationContext());
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context->set_allowed_bytes_growth(allowed_bytes_growth);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return context.Pass();
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FileSystemOperationContext> UnlimitedContext() {
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return LimitedContext(kint64max);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FileSystemOperationContext* NewContext(
19890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      SandboxFileSystemTestHelper* file_system) {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    change_observer()->ResetCount();
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FileSystemOperationContext* context;
20190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (file_system)
20290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      context = file_system->NewOperationContext();
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
20490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      context = sandbox_file_system_.NewOperationContext();
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Setting allowed_bytes_growth big enough for all tests.
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context->set_allowed_bytes_growth(1024 * 1024);
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context->set_change_observers(change_observers());
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return context;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const storage::ChangeObserverList& change_observers() const {
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return change_observers_;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  storage::MockFileChangeObserver* change_observer() {
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return &change_observer_;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This can only be used after SetUp has run and created file_system_context_
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and obfuscated_file_util_.
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Use this for tests which need to run in multiple origins; we need a test
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // helper per origin.
22303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  SandboxFileSystemTestHelper* NewFileSystem(const GURL& origin,
22403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                             storage::FileSystemType type) {
22590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    SandboxFileSystemTestHelper* file_system =
22690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        new SandboxFileSystemTestHelper(origin, type);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    file_system->SetUp(file_system_context_.get());
22990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return file_system;
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<ObfuscatedFileUtil> CreateObfuscatedFileUtil(
23303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      storage::SpecialStoragePolicy* storage_policy) {
2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return scoped_ptr<ObfuscatedFileUtil>(
2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ObfuscatedFileUtil::CreateForTesting(
2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          storage_policy, data_dir_path(), NULL,
2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          base::MessageLoopProxy::current().get()));
2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ObfuscatedFileUtil* ofu() {
24190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return static_cast<ObfuscatedFileUtil*>(sandbox_file_system_.file_util());
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath& test_directory() const {
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return data_dir_.path();
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL& origin() const {
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return origin_;
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  storage::FileSystemType type() const { return type_; }
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  std::string type_string() const {
2558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return GetTypeString(type_);
2568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 ComputeTotalFileSize() {
25990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return sandbox_file_system_.ComputeCurrentOriginUsage() -
26090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        sandbox_file_system_.ComputeCurrentDirectoryDatabaseUsage();
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetUsageFromQuotaManager() {
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int64 quota = -1;
265868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    quota_status_ =
266868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        AsyncFileTestHelper::GetUsageAndQuota(quota_manager_.get(),
267868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                              origin(),
268868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                              sandbox_file_system_.type(),
269868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                              &usage_,
270868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                              &quota);
27103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    EXPECT_EQ(storage::kQuotaStatusOk, quota_status_);
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RevokeUsageCache() {
27590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    quota_manager_->ResetUsageTracker(sandbox_file_system_.storage_type());
27690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    usage_cache()->Delete(sandbox_file_system_.GetUsageCachePath());
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 SizeByQuotaUtil() {
28090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return sandbox_file_system_.GetCachedOriginUsage();
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 SizeInUsageFile() {
284d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    base::RunLoop().RunUntilIdle();
285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int64 usage = 0;
28690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return usage_cache()->GetUsage(
28790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        sandbox_file_system_.GetUsageCachePath(), &usage) ? usage : -1;
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool PathExists(const FileSystemURL& url) {
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<FileSystemOperationContext> context(NewContext(NULL));
2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::File::Info file_info;
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath platform_path;
2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::File::Error error = ofu()->GetFileInfo(
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        context.get(), url, &file_info, &platform_path);
2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return error == base::File::FILE_OK;
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool DirectoryExists(const FileSystemURL& url) {
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return AsyncFileTestHelper::DirectoryExists(file_system_context(), url);
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 usage() const { return usage_; }
30403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  storage::FileSystemUsageCache* usage_cache() {
30590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return sandbox_file_system_.usage_cache();
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FileSystemURL CreateURLFromUTF8(const std::string& path) {
30990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return sandbox_file_system_.CreateURLFromUTF8(path);
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 PathCost(const FileSystemURL& url) {
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ObfuscatedFileUtil::ComputeFilePathCost(url.path());
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FileSystemURL CreateURL(const base::FilePath& path) {
31790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return sandbox_file_system_.CreateURL(path);
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
320cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void CheckFileAndCloseHandle(const FileSystemURL& url, base::File file) {
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<FileSystemOperationContext> context(NewContext(NULL));
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath local_path;
3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::File::FILE_OK,
3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              ofu()->GetLocalFilePath(context.get(), url, &local_path));
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::File::Info file_info0;
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath data_path;
3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::File::FILE_OK,
3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              ofu()->GetFileInfo(context.get(), url, &file_info0, &data_path));
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(data_path, local_path);
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(FileExists(data_path));
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, GetSize(data_path));
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char data[] = "test data";
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const int length = arraysize(data) - 1;
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
337cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (!file.IsValid()) {
338cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      file.Initialize(data_path,
3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      base::File::FLAG_OPEN | base::File::FLAG_WRITE);
3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ASSERT_TRUE(file.IsValid());
3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_FALSE(file.created());
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
343cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ASSERT_EQ(length, file.Write(0, data, length));
344cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    file.Close();
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::File::Info file_info1;
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(length, GetSize(data_path));
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context.reset(NewContext(NULL));
3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::File::FILE_OK,
3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              ofu()->GetFileInfo(context.get(), url, &file_info1, &data_path));
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(data_path, local_path);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(file_info0.is_directory);
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(file_info1.is_directory);
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(file_info0.is_symbolic_link);
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(file_info1.is_symbolic_link);
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, file_info0.size);
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(length, file_info1.size);
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_LE(file_info0.last_modified, file_info1.last_modified);
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context.reset(NewContext(NULL));
3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::File::FILE_OK,
3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              ofu()->Truncate(context.get(), url, length * 2));
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(length * 2, GetSize(data_path));
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context.reset(NewContext(NULL));
3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::File::FILE_OK,
3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              ofu()->Truncate(context.get(), url, 0));
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, GetSize(data_path));
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ValidateTestDirectory(
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const FileSystemURL& root_url,
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::set<base::FilePath::StringType>& files,
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::set<base::FilePath::StringType>& directories) {
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<FileSystemOperationContext> context;
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::set<base::FilePath::StringType>::const_iterator iter;
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (iter = files.begin(); iter != files.end(); ++iter) {
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool created = true;
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      context.reset(NewContext(NULL));
3815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ASSERT_EQ(base::File::FILE_OK,
3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                ofu()->EnsureFileExists(context.get(),
3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        FileSystemURLAppend(root_url, *iter),
3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        &created));
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_FALSE(created);
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (iter = directories.begin(); iter != directories.end(); ++iter) {
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      context.reset(NewContext(NULL));
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(DirectoryExists(
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          FileSystemURLAppend(root_url, *iter)));
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class UsageVerifyHelper {
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UsageVerifyHelper(scoped_ptr<FileSystemOperationContext> context,
39790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                      SandboxFileSystemTestHelper* file_system,
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      int64 expected_usage)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        : context_(context.Pass()),
40090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          sandbox_file_system_(file_system),
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          expected_usage_(expected_usage) {}
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~UsageVerifyHelper() {
404d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      base::RunLoop().RunUntilIdle();
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Check();
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FileSystemOperationContext* context() {
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return context_.get();
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void Check() {
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_EQ(expected_usage_,
41590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                sandbox_file_system_->GetCachedOriginUsage());
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<FileSystemOperationContext> context_;
41990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    SandboxFileSystemTestHelper* sandbox_file_system_;
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 expected_usage_;
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<UsageVerifyHelper> AllowUsageIncrease(int64 requested_growth) {
42490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    int64 usage = sandbox_file_system_.GetCachedOriginUsage();
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return scoped_ptr<UsageVerifyHelper>(new UsageVerifyHelper(
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        LimitedContext(requested_growth),
42790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        &sandbox_file_system_, usage + requested_growth));
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<UsageVerifyHelper> DisallowUsageIncrease(int64 requested_growth) {
43190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    int64 usage = sandbox_file_system_.GetCachedOriginUsage();
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return scoped_ptr<UsageVerifyHelper>(new UsageVerifyHelper(
43390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        LimitedContext(requested_growth - 1), &sandbox_file_system_, usage));
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FillTestDirectory(
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const FileSystemURL& root_url,
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::set<base::FilePath::StringType>* files,
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::set<base::FilePath::StringType>* directories) {
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<FileSystemOperationContext> context;
44103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    std::vector<storage::DirectoryEntry> entries;
4425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::File::FILE_OK,
4435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              AsyncFileTestHelper::ReadDirectory(file_system_context(),
4445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                 root_url, &entries));
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0UL, entries.size());
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    files->clear();
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    files->insert(FILE_PATH_LITERAL("first"));
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    files->insert(FILE_PATH_LITERAL("second"));
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    files->insert(FILE_PATH_LITERAL("third"));
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    directories->clear();
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    directories->insert(FILE_PATH_LITERAL("fourth"));
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    directories->insert(FILE_PATH_LITERAL("fifth"));
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    directories->insert(FILE_PATH_LITERAL("sixth"));
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::set<base::FilePath::StringType>::iterator iter;
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (iter = files->begin(); iter != files->end(); ++iter) {
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool created = false;
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      context.reset(NewContext(NULL));
4595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ASSERT_EQ(base::File::FILE_OK,
4605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                ofu()->EnsureFileExists(context.get(),
4615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        FileSystemURLAppend(root_url, *iter),
4625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        &created));
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_TRUE(created);
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (iter = directories->begin(); iter != directories->end(); ++iter) {
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool exclusive = true;
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool recursive = false;
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      context.reset(NewContext(NULL));
4695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_EQ(base::File::FILE_OK,
4705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                ofu()->CreateDirectory(context.get(),
4715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                       FileSystemURLAppend(root_url, *iter),
4725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                       exclusive, recursive));
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ValidateTestDirectory(root_url, *files, *directories);
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TestReadDirectoryHelper(const FileSystemURL& root_url) {
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::set<base::FilePath::StringType> files;
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::set<base::FilePath::StringType> directories;
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FillTestDirectory(root_url, &files, &directories);
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<FileSystemOperationContext> context;
48303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    std::vector<storage::DirectoryEntry> entries;
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context.reset(NewContext(NULL));
4855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::File::FILE_OK,
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              AsyncFileTestHelper::ReadDirectory(
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  file_system_context(), root_url, &entries));
48803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    std::vector<storage::DirectoryEntry>::iterator entry_iter;
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(files.size() + directories.size(), entries.size());
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(change_observer()->HasNoChange());
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (entry_iter = entries.begin(); entry_iter != entries.end();
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ++entry_iter) {
49303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      const storage::DirectoryEntry& entry = *entry_iter;
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::set<base::FilePath::StringType>::iterator iter =
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          files.find(entry.name);
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (iter != files.end()) {
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_FALSE(entry.is_directory);
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        files.erase(iter);
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        continue;
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      iter = directories.find(entry.name);
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_FALSE(directories.end() == iter);
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(entry.is_directory);
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      directories.erase(iter);
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TestTouchHelper(const FileSystemURL& url, bool is_file) {
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::Time last_access_time = base::Time::Now();
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::Time last_modified_time = base::Time::Now();
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<FileSystemOperationContext> context(NewContext(NULL));
5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::File::FILE_OK,
5145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              ofu()->Touch(context.get(), url, last_access_time,
5155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           last_modified_time));
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Currently we fire no change notifications for Touch.
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(change_observer()->HasNoChange());
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath local_path;
5195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::File::Info file_info;
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context.reset(NewContext(NULL));
5215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::File::FILE_OK, ofu()->GetFileInfo(
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        context.get(), url, &file_info, &local_path));
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We compare as time_t here to lower our resolution, to avoid false
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // negatives caused by conversion to the local filesystem's native
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // representation and back.
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(file_info.last_modified.ToTimeT(), last_modified_time.ToTimeT());
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context.reset(NewContext(NULL));
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_modified_time += base::TimeDelta::FromHours(1);
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_access_time += base::TimeDelta::FromHours(14);
5315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::File::FILE_OK,
5325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              ofu()->Touch(context.get(), url, last_access_time,
5335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           last_modified_time));
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(change_observer()->HasNoChange());
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context.reset(NewContext(NULL));
5365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::File::FILE_OK,
5375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              ofu()->GetFileInfo(context.get(), url, &file_info, &local_path));
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(file_info.last_modified.ToTimeT(), last_modified_time.ToTimeT());
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (is_file)  // Directories in OFU don't support atime.
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(file_info.last_accessed.ToTimeT(), last_access_time.ToTimeT());
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TestCopyInForeignFileHelper(bool overwrite) {
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::ScopedTempDir source_dir;
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(source_dir.CreateUniqueTempDir());
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath root_file_path = source_dir.path();
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath src_file_path = root_file_path.AppendASCII("file_name");
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FileSystemURL dest_url = CreateURLFromUTF8("new file");
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 src_file_length = 87;
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::File file(src_file_path,
5525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    base::File::FLAG_CREATE | base::File::FLAG_WRITE);
5535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASSERT_TRUE(file.IsValid());
5545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(file.created());
5555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASSERT_TRUE(file.SetLength(src_file_length));
5565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    file.Close();
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<FileSystemOperationContext> context;
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (overwrite) {
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      context.reset(NewContext(NULL));
5625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      bool created = false;
5635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_EQ(base::File::FILE_OK,
5645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                ofu()->EnsureFileExists(context.get(), dest_url, &created));
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(created);
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // We must have observed one (and only one) create_file_count.
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(1, change_observer()->get_and_reset_create_file_count());
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(change_observer()->HasNoChange());
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const int64 path_cost =
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ObfuscatedFileUtil::ComputeFilePathCost(dest_url.path());
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!overwrite) {
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Verify that file creation requires sufficient quota for the path.
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      context.reset(NewContext(NULL));
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      context->set_allowed_bytes_growth(path_cost + src_file_length - 1);
5785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_EQ(base::File::FILE_ERROR_NO_SPACE,
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ofu()->CopyInForeignFile(context.get(),
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         src_file_path, dest_url));
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context.reset(NewContext(NULL));
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context->set_allowed_bytes_growth(path_cost + src_file_length);
5855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::File::FILE_OK,
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              ofu()->CopyInForeignFile(context.get(),
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       src_file_path, dest_url));
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(PathExists(dest_url));
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(DirectoryExists(dest_url));
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context.reset(NewContext(NULL));
5935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::File::Info file_info;
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath data_path;
5955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::File::FILE_OK,
5965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              ofu()->GetFileInfo(context.get(), dest_url, &file_info,
5975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 &data_path));
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(data_path, src_file_path);
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(FileExists(data_path));
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(src_file_length, GetSize(data_path));
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::File::FILE_OK,
6035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              ofu()->DeleteFile(context.get(), dest_url));
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ClearTimestamp(const FileSystemURL& url) {
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<FileSystemOperationContext> context(NewContext(NULL));
6085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::File::FILE_OK,
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              ofu()->Touch(context.get(), url, base::Time(), base::Time()));
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(base::Time(), GetModifiedTime(url));
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time GetModifiedTime(const FileSystemURL& url) {
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<FileSystemOperationContext> context(NewContext(NULL));
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath data_path;
6165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::File::Info file_info;
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context.reset(NewContext(NULL));
6185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::File::FILE_OK,
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              ofu()->GetFileInfo(context.get(), url, &file_info, &data_path));
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(change_observer()->HasNoChange());
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return file_info.last_modified;
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TestDirectoryTimestampHelper(const FileSystemURL& base_dir,
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    bool copy,
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    bool overwrite) {
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<FileSystemOperationContext> context;
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const FileSystemURL src_dir_url(
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        FileSystemURLAppendUTF8(base_dir, "foo_dir"));
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const FileSystemURL dest_dir_url(
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        FileSystemURLAppendUTF8(base_dir, "bar_dir"));
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const FileSystemURL src_file_url(
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        FileSystemURLAppendUTF8(src_dir_url, "hoge"));
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const FileSystemURL dest_file_url(
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        FileSystemURLAppendUTF8(dest_dir_url, "fuga"));
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context.reset(NewContext(NULL));
6395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::File::FILE_OK,
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              ofu()->CreateDirectory(context.get(), src_dir_url, true, true));
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context.reset(NewContext(NULL));
6425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::File::FILE_OK,
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              ofu()->CreateDirectory(context.get(), dest_dir_url, true, true));
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool created = false;
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context.reset(NewContext(NULL));
6475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::File::FILE_OK,
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              ofu()->EnsureFileExists(context.get(), src_file_url, &created));
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (overwrite) {
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      context.reset(NewContext(NULL));
6515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_EQ(base::File::FILE_OK,
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ofu()->EnsureFileExists(context.get(),
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        dest_file_url, &created));
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClearTimestamp(src_dir_url);
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClearTimestamp(dest_dir_url);
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context.reset(NewContext(NULL));
6595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::File::FILE_OK,
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              ofu()->CopyOrMoveFile(context.get(),
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    src_file_url, dest_file_url,
66268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                    FileSystemOperation::OPTION_NONE,
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    copy));
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (copy)
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(base::Time(), GetModifiedTime(src_dir_url));
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_NE(base::Time(), GetModifiedTime(src_dir_url));
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(base::Time(), GetModifiedTime(dest_dir_url));
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void MaybeDropDatabasesAliveCaseTestBody() {
6725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_ptr<ObfuscatedFileUtil> file_util = CreateObfuscatedFileUtil(NULL);
6735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    file_util->InitOriginDatabase(GURL(), true /*create*/);
6745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASSERT_TRUE(file_util->origin_database_ != NULL);
6755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Callback to Drop DB is called while ObfuscatedFileUtilTest is
6775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // still alive.
6785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    file_util->db_flush_delay_seconds_ = 0;
6795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    file_util->MarkUsed();
6805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::RunLoop().RunUntilIdle();
6815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASSERT_TRUE(file_util->origin_database_ == NULL);
6835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
6845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void MaybeDropDatabasesAlreadyDeletedCaseTestBody() {
6865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Run message loop after OFU is already deleted to make sure callback
6875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // doesn't cause a crash for use after free.
6885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    {
6895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      scoped_ptr<ObfuscatedFileUtil> file_util = CreateObfuscatedFileUtil(NULL);
6905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      file_util->InitOriginDatabase(GURL(), true /*create*/);
6915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      file_util->db_flush_delay_seconds_ = 0;
6925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      file_util->MarkUsed();
6935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
6945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // At this point the callback is still in the message queue but OFU is gone.
6965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::RunLoop().RunUntilIdle();
6975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
6985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void DestroyDirectoryDatabase_IsolatedTestBody() {
7005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    storage_policy_->AddIsolated(origin_);
7015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_ptr<ObfuscatedFileUtil> file_util = CreateObfuscatedFileUtil(
7025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        storage_policy_.get());
7035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const FileSystemURL url = FileSystemURL::CreateForTest(
7045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        origin_, kFileSystemTypePersistent, base::FilePath());
7055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Create DirectoryDatabase for isolated origin.
7075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SandboxDirectoryDatabase* db =
7085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        file_util->GetDirectoryDatabase(url, true /* create */);
7095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASSERT_TRUE(db != NULL);
7105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Destory it.
7125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASSERT_TRUE(file_util->DestroyDirectoryDatabase(
7135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        url.origin(), GetTypeString(url.type())));
7145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASSERT_TRUE(file_util->directories_.empty());
7155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
7165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void GetDirectoryDatabase_IsolatedTestBody() {
7185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    storage_policy_->AddIsolated(origin_);
7195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_ptr<ObfuscatedFileUtil> file_util = CreateObfuscatedFileUtil(
7205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        storage_policy_.get());
7215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const FileSystemURL url = FileSystemURL::CreateForTest(
7225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        origin_, kFileSystemTypePersistent, base::FilePath());
7235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Create DirectoryDatabase for isolated origin.
7255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SandboxDirectoryDatabase* db =
7265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        file_util->GetDirectoryDatabase(url, true /* create */);
7275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASSERT_TRUE(db != NULL);
7285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASSERT_EQ(1U, file_util->directories_.size());
7295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Remove isolated.
7315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    storage_policy_->RemoveIsolated(url.origin());
7325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // This should still get the same database.
7345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SandboxDirectoryDatabase* db2 =
7355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        file_util->GetDirectoryDatabase(url, false /* create */);
7365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASSERT_EQ(db, db2);
7375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
7385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void MigrationBackFromIsolatedTestBody() {
7405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    std::string kFakeDirectoryData("0123456789");
7415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::FilePath old_directory_db_path;
7425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Initialize the directory with one origin using
7445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // SandboxIsolatedOriginDatabase.
7455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    {
74603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      std::string origin_string = storage::GetIdentifierFromOrigin(origin_);
7475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      SandboxIsolatedOriginDatabase database_old(
7485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          origin_string, data_dir_path(),
7495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          base::FilePath(
7505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              SandboxIsolatedOriginDatabase::kObsoleteOriginDirectory));
7515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::FilePath path;
7525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_TRUE(database_old.GetPathForOrigin(origin_string, &path));
7535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_FALSE(path.empty());
7545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      // Populate the origin directory with some fake data.
7565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      old_directory_db_path = data_dir_path().Append(path);
7575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ASSERT_TRUE(base::CreateDirectory(old_directory_db_path));
7585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_EQ(static_cast<int>(kFakeDirectoryData.size()),
759a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                base::WriteFile(old_directory_db_path.AppendASCII("dummy"),
760a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                kFakeDirectoryData.data(),
761a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                kFakeDirectoryData.size()));
7625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
7635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    storage_policy_->AddIsolated(origin_);
7655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_ptr<ObfuscatedFileUtil> file_util = CreateObfuscatedFileUtil(
7665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        storage_policy_.get());
7675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::File::Error error = base::File::FILE_ERROR_FAILED;
7685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::FilePath origin_directory = file_util->GetDirectoryForOrigin(
7695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        origin_, true /* create */, &error);
7705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::File::FILE_OK, error);
7715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // The database is migrated from the old one.
7735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(base::DirectoryExists(origin_directory));
7745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FALSE(base::DirectoryExists(old_directory_db_path));
7755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Check we see the same contents in the new origin directory.
7775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    std::string origin_db_data;
7785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(base::PathExists(origin_directory.AppendASCII("dummy")));
7795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(base::ReadFileToString(
7805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            origin_directory.AppendASCII("dummy"), &origin_db_data));
7815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(kFakeDirectoryData, origin_db_data);
7825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
7835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 ComputeCurrentUsage() {
78590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return sandbox_file_system_.ComputeCurrentOriginUsage() -
78690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        sandbox_file_system_.ComputeCurrentDirectoryDatabaseUsage();
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FileSystemContext* file_system_context() {
79090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return sandbox_file_system_.file_system_context();
7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const base::FilePath& data_dir_path() const {
7947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return data_dir_.path();
7957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
7967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
797eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch protected:
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir data_dir_;
7991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::MessageLoopForIO message_loop_;
8005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  scoped_refptr<MockSpecialStoragePolicy> storage_policy_;
80103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_refptr<storage::QuotaManager> quota_manager_;
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<FileSystemContext> file_system_context_;
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL origin_;
80403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  storage::FileSystemType type_;
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtrFactory<ObfuscatedFileUtilTest> weak_factory_;
80690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SandboxFileSystemTestHelper sandbox_file_system_;
80703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  storage::QuotaStatusCode quota_status_;
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 usage_;
80903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  storage::MockFileChangeObserver change_observer_;
81003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  storage::ChangeObserverList change_observers_;
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private:
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ObfuscatedFileUtilTest);
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ObfuscatedFileUtilTest, TestCreateAndDeleteFile) {
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FileSystemURL url = CreateURLFromUTF8("fake/file");
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FileSystemOperationContext> context(NewContext(NULL));
819cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int file_flags = base::File::FLAG_CREATE | base::File::FLAG_WRITE;
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
821cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::File file = ofu()->CreateOrOpen(context.get(), url, file_flags);
822cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_FALSE(file.IsValid());
823cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND, file.error_details());
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
8265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND,
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->DeleteFile(context.get(), url));
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url = CreateURLFromUTF8("test file");
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(change_observer()->HasNoChange());
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that file creation requires sufficient quota for the path.
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context->set_allowed_bytes_growth(
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ObfuscatedFileUtil::ComputeFilePathCost(url.path()) - 1);
837cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  file = ofu()->CreateOrOpen(context.get(), url, file_flags);
838cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_FALSE(file.IsValid());
839cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_ERROR_NO_SPACE, file.error_details());
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context->set_allowed_bytes_growth(
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ObfuscatedFileUtil::ComputeFilePathCost(url.path()));
844cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  file = ofu()->CreateOrOpen(context.get(), url, file_flags);
845cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(file.IsValid());
846cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(file.created());
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, change_observer()->get_and_reset_create_file_count());
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
849cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CheckFileAndCloseHandle(url, file.Pass());
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath local_path;
8535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
8545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->GetLocalFilePath(context.get(), url, &local_path));
8557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::PathExists(local_path));
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that deleting a file isn't stopped by zero quota, and that it frees
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // up quote from its path.
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context->set_allowed_bytes_growth(0);
8615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK, ofu()->DeleteFile(context.get(), url));
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, change_observer()->get_and_reset_remove_file_count());
8637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FALSE(base::PathExists(local_path));
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ObfuscatedFileUtil::ComputeFilePathCost(url.path()),
8655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            context->allowed_bytes_growth());
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool exclusive = true;
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool recursive = true;
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FileSystemURL directory_url = CreateURLFromUTF8(
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "series/of/directories");
8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  url = FileSystemURLAppendUTF8(directory_url, "file name");
8735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
8745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->CreateDirectory(context.get(), directory_url, exclusive,
8755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   recursive));
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The oepration created 3 directories recursively.
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3, change_observer()->get_and_reset_create_directory_count());
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
880cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  file = ofu()->CreateOrOpen(context.get(), url, file_flags);
881cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(file.IsValid());
882cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(file.created());
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, change_observer()->get_and_reset_create_file_count());
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CheckFileAndCloseHandle(url, file.Pass());
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
8885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
8895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->GetLocalFilePath(context.get(), url, &local_path));
8907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::PathExists(local_path));
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
8935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK, ofu()->DeleteFile(context.get(), url));
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, change_observer()->get_and_reset_remove_file_count());
8957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FALSE(base::PathExists(local_path));
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure we have no unexpected changes.
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(change_observer()->HasNoChange());
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ObfuscatedFileUtilTest, TestTruncate) {
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool created = false;
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FileSystemURL url = CreateURLFromUTF8("file");
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FileSystemOperationContext> context(NewContext(NULL));
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND,
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->Truncate(context.get(), url, 4));
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
9105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
9115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->EnsureFileExists(context.get(), url, &created));
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(created);
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, change_observer()->get_and_reset_create_file_count());
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath local_path;
9175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
9185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->GetLocalFilePath(context.get(), url, &local_path));
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, GetSize(local_path));
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
9225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK, ofu()->Truncate(context.get(), url, 10));
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, change_observer()->get_and_reset_modify_file_count());
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(10, GetSize(local_path));
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
9275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK, ofu()->Truncate(context.get(), url, 1));
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, GetSize(local_path));
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, change_observer()->get_and_reset_modify_file_count());
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(DirectoryExists(url));
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(PathExists(url));
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure we have no unexpected changes.
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(change_observer()->HasNoChange());
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ObfuscatedFileUtilTest, TestQuotaOnTruncation) {
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool created = false;
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FileSystemURL url = CreateURLFromUTF8("file");
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->EnsureFileExists(
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                AllowUsageIncrease(PathCost(url))->context(),
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                url, &created));
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(created);
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, ComputeTotalFileSize());
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
9505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->Truncate(AllowUsageIncrease(1020)->context(), url, 1020));
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1020, ComputeTotalFileSize());
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
9545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->Truncate(AllowUsageIncrease(-1020)->context(), url, 0));
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, ComputeTotalFileSize());
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_ERROR_NO_SPACE,
9585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->Truncate(DisallowUsageIncrease(1021)->context(),
9595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            url, 1021));
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, ComputeTotalFileSize());
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
9635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->Truncate(AllowUsageIncrease(1020)->context(), url, 1020));
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1020, ComputeTotalFileSize());
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
9675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->Truncate(AllowUsageIncrease(0)->context(), url, 1020));
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1020, ComputeTotalFileSize());
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // quota exceeded
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<UsageVerifyHelper> helper = AllowUsageIncrease(-1);
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper->context()->set_allowed_bytes_growth(
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        helper->context()->allowed_bytes_growth() - 1);
9755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::File::FILE_OK,
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              ofu()->Truncate(helper->context(), url, 1019));
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(1019, ComputeTotalFileSize());
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Delete backing file to make following truncation fail.
9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath local_path;
9825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
9835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->GetLocalFilePath(UnlimitedContext().get(), url,
9845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                    &local_path));
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(local_path.empty());
9867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::DeleteFile(local_path, false));
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND,
9895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->Truncate(LimitedContext(1234).get(), url, 1234));
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, ComputeTotalFileSize());
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ObfuscatedFileUtilTest, TestEnsureFileExists) {
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FileSystemURL url = CreateURLFromUTF8("fake/file");
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool created = false;
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FileSystemOperationContext> context(NewContext(NULL));
9975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND,
9985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->EnsureFileExists(context.get(), url, &created));
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(change_observer()->HasNoChange());
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that file creation requires sufficient quota for the path.
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url = CreateURLFromUTF8("test file");
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  created = false;
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context->set_allowed_bytes_growth(
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ObfuscatedFileUtil::ComputeFilePathCost(url.path()) - 1);
10075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_ERROR_NO_SPACE,
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->EnsureFileExists(context.get(), url, &created));
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(created);
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(change_observer()->HasNoChange());
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context->set_allowed_bytes_growth(
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ObfuscatedFileUtil::ComputeFilePathCost(url.path()));
10155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->EnsureFileExists(context.get(), url, &created));
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(created);
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, change_observer()->get_and_reset_create_file_count());
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1020cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CheckFileAndCloseHandle(url, base::File());
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
10235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->EnsureFileExists(context.get(), url, &created));
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(created);
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(change_observer()->HasNoChange());
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Also test in a subdirectory.
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url = CreateURLFromUTF8("path/to/file.txt");
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool exclusive = true;
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool recursive = true;
10335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
10345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->CreateDirectory(context.get(), FileSystemURLDirName(url),
10355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   exclusive, recursive));
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 2 directories: path/ and path/to.
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, change_observer()->get_and_reset_create_directory_count());
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
10405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->EnsureFileExists(context.get(), url, &created));
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(created);
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(DirectoryExists(url));
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(PathExists(url));
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(change_observer()->HasNoChange());
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ObfuscatedFileUtilTest, TestDirectoryOps) {
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FileSystemOperationContext> context(NewContext(NULL));
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool exclusive = false;
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool recursive = false;
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FileSystemURL url = CreateURLFromUTF8("foo/bar");
10545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND,
10555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->CreateDirectory(context.get(), url, exclusive, recursive));
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
10585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND,
10595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->DeleteDirectory(context.get(), url));
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1061c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FileSystemURL root = CreateURLFromUTF8(std::string());
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(DirectoryExists(url));
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(PathExists(url));
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ofu()->IsDirectoryEmpty(context.get(), root));
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exclusive = false;
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  recursive = true;
10705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
10715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->CreateDirectory(context.get(), url, exclusive, recursive));
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, change_observer()->get_and_reset_create_directory_count());
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(DirectoryExists(url));
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(PathExists(url));
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(ofu()->IsDirectoryEmpty(context.get(), root));
10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(DirectoryExists(FileSystemURLDirName(url)));
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(ofu()->IsDirectoryEmpty(context.get(),
10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       FileSystemURLDirName(url)));
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Can't remove a non-empty directory.
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
10875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_ERROR_NOT_EMPTY,
10885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->DeleteDirectory(context.get(),
10895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   FileSystemURLDirName(url)));
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(change_observer()->HasNoChange());
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::File::Info file_info;
10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath local_path;
10945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
10955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->GetFileInfo(context.get(), url, &file_info, &local_path));
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(local_path.empty());
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_info.is_directory);
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(file_info.is_symbolic_link);
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Same create again should succeed, since exclusive is false.
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
11025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
11035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->CreateDirectory(context.get(), url, exclusive, recursive));
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(change_observer()->HasNoChange());
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exclusive = true;
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  recursive = true;
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
11095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_ERROR_EXISTS,
11105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->CreateDirectory(context.get(), url, exclusive, recursive));
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(change_observer()->HasNoChange());
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that deleting a directory isn't stopped by zero quota, and that it
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // frees up quota from its path.
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context->set_allowed_bytes_growth(0);
11175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK, ofu()->DeleteDirectory(context.get(), url));
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, change_observer()->get_and_reset_remove_directory_count());
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ObfuscatedFileUtil::ComputeFilePathCost(url.path()),
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      context->allowed_bytes_growth());
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url = CreateURLFromUTF8("foo/bop");
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(DirectoryExists(url));
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(PathExists(url));
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ofu()->IsDirectoryEmpty(context.get(), url));
11295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND,
11305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->GetFileInfo(context.get(), url, &file_info, &local_path));
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that file creation requires sufficient quota for the path.
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exclusive = true;
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  recursive = false;
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context->set_allowed_bytes_growth(
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ObfuscatedFileUtil::ComputeFilePathCost(url.path()) - 1);
11385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_ERROR_NO_SPACE,
11395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->CreateDirectory(context.get(), url, exclusive, recursive));
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(change_observer()->HasNoChange());
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context->set_allowed_bytes_growth(
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ObfuscatedFileUtil::ComputeFilePathCost(url.path()));
11455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
11465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->CreateDirectory(context.get(), url, exclusive, recursive));
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, change_observer()->get_and_reset_create_directory_count());
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(DirectoryExists(url));
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(PathExists(url));
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exclusive = true;
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  recursive = false;
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
11555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_ERROR_EXISTS,
11565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->CreateDirectory(context.get(), url, exclusive, recursive));
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(change_observer()->HasNoChange());
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exclusive = true;
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  recursive = false;
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url = CreateURLFromUTF8("foo");
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
11635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_ERROR_EXISTS,
11645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->CreateDirectory(context.get(), url, exclusive, recursive));
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(change_observer()->HasNoChange());
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url = CreateURLFromUTF8("blah");
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(DirectoryExists(url));
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(PathExists(url));
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exclusive = true;
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  recursive = false;
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
11755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
11765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->CreateDirectory(context.get(), url, exclusive, recursive));
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, change_observer()->get_and_reset_create_directory_count());
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(DirectoryExists(url));
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(PathExists(url));
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exclusive = true;
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  recursive = false;
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
11855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_ERROR_EXISTS,
11865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->CreateDirectory(context.get(), url, exclusive, recursive));
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(change_observer()->HasNoChange());
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ObfuscatedFileUtilTest, TestReadDirectory) {
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FileSystemOperationContext> context(NewContext(NULL));
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool exclusive = true;
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool recursive = true;
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FileSystemURL url = CreateURLFromUTF8("directory/to/use");
11955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
11965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->CreateDirectory(context.get(), url, exclusive, recursive));
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestReadDirectoryHelper(url);
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ObfuscatedFileUtilTest, TestReadRootWithSlash) {
1201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestReadDirectoryHelper(CreateURLFromUTF8(std::string()));
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ObfuscatedFileUtilTest, TestReadRootWithEmptyString) {
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestReadDirectoryHelper(CreateURLFromUTF8("/"));
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ObfuscatedFileUtilTest, TestReadDirectoryOnFile) {
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FileSystemURL url = CreateURLFromUTF8("file");
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FileSystemOperationContext> context(NewContext(NULL));
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool created = false;
12135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
12145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->EnsureFileExists(context.get(), url, &created));
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(created);
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
121703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::vector<storage::DirectoryEntry> entries;
12185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_ERROR_NOT_A_DIRECTORY,
12195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            AsyncFileTestHelper::ReadDirectory(file_system_context(), url,
12205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                               &entries));
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ofu()->IsDirectoryEmpty(context.get(), url));
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ObfuscatedFileUtilTest, TestTouch) {
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FileSystemURL url = CreateURLFromUTF8("file");
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FileSystemOperationContext> context(NewContext(NULL));
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time last_access_time = base::Time::Now();
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time last_modified_time = base::Time::Now();
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // It's not there yet.
12335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND,
12345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->Touch(context.get(), url, last_access_time,
12355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                         last_modified_time));
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // OK, now create it.
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool created = false;
12405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->EnsureFileExists(context.get(), url, &created));
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(created);
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestTouchHelper(url, true);
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now test a directory:
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool exclusive = true;
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool recursive = false;
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url = CreateURLFromUTF8("dir");
12505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
12515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->CreateDirectory(context.get(), url, exclusive, recursive));
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestTouchHelper(url, false);
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ObfuscatedFileUtilTest, TestPathQuotas) {
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FileSystemURL url = CreateURLFromUTF8("fake/file");
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FileSystemOperationContext> context(NewContext(NULL));
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url = CreateURLFromUTF8("file name");
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context->set_allowed_bytes_growth(5);
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool created = false;
12625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_ERROR_NO_SPACE,
12635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->EnsureFileExists(context.get(), url, &created));
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(created);
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context->set_allowed_bytes_growth(1024);
12665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
12675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->EnsureFileExists(context.get(), url, &created));
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(created);
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 path_cost = ObfuscatedFileUtil::ComputeFilePathCost(url.path());
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1024 - path_cost, context->allowed_bytes_growth());
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context->set_allowed_bytes_growth(1024);
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool exclusive = true;
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool recursive = true;
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url = CreateURLFromUTF8("directory/to/use");
12762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<base::FilePath::StringType> components;
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url.path().GetComponents(&components);
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path_cost = 0;
12792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef std::vector<base::FilePath::StringType>::iterator iterator;
12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (iterator iter = components.begin();
12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       iter != components.end(); ++iter) {
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    path_cost += ObfuscatedFileUtil::ComputeFilePathCost(
12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::FilePath(*iter));
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context->set_allowed_bytes_growth(1024);
12875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
12885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->CreateDirectory(context.get(), url, exclusive, recursive));
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1024 - path_cost, context->allowed_bytes_growth());
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ObfuscatedFileUtilTest, TestCopyOrMoveFileNotFound) {
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FileSystemURL source_url = CreateURLFromUTF8("path0.txt");
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FileSystemURL dest_url = CreateURLFromUTF8("path1.txt");
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FileSystemOperationContext> context(NewContext(NULL));
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_copy_not_move = false;
12985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND,
12995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->CopyOrMoveFile(context.get(), source_url, dest_url,
13005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  FileSystemOperation::OPTION_NONE,
13015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  is_copy_not_move));
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(change_observer()->HasNoChange());
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_copy_not_move = true;
13055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND,
13065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->CopyOrMoveFile(context.get(), source_url, dest_url,
13075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  FileSystemOperation::OPTION_NONE,
13085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  is_copy_not_move));
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(change_observer()->HasNoChange());
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  source_url = CreateURLFromUTF8("dir/dir/file");
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool exclusive = true;
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool recursive = true;
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
13145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
13155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->CreateDirectory(context.get(),
13165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                FileSystemURLDirName(source_url),
13175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                exclusive, recursive));
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, change_observer()->get_and_reset_create_directory_count());
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_copy_not_move = false;
13205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND,
13215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->CopyOrMoveFile(context.get(), source_url, dest_url,
13225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  FileSystemOperation::OPTION_NONE,
13235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  is_copy_not_move));
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(change_observer()->HasNoChange());
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_copy_not_move = true;
13275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND,
13285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->CopyOrMoveFile(context.get(), source_url, dest_url,
13295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  FileSystemOperation::OPTION_NONE,
13305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  is_copy_not_move));
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(change_observer()->HasNoChange());
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ObfuscatedFileUtilTest, TestCopyOrMoveFileSuccess) {
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int64 kSourceLength = 5;
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int64 kDestLength = 50;
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < arraysize(kCopyMoveTestCases); ++i) {
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE(testing::Message() << "kCopyMoveTestCase " << i);
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const CopyMoveTestCaseRecord& test_case = kCopyMoveTestCases[i];
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE(testing::Message() << "\t is_copy_not_move " <<
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_case.is_copy_not_move);
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE(testing::Message() << "\t source_path " <<
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_case.source_path);
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE(testing::Message() << "\t dest_path " <<
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_case.dest_path);
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE(testing::Message() << "\t cause_overwrite " <<
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_case.cause_overwrite);
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<FileSystemOperationContext> context(NewContext(NULL));
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool exclusive = false;
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool recursive = true;
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FileSystemURL source_url = CreateURLFromUTF8(test_case.source_path);
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FileSystemURL dest_url = CreateURLFromUTF8(test_case.dest_path);
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context.reset(NewContext(NULL));
13575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASSERT_EQ(base::File::FILE_OK,
13585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              ofu()->CreateDirectory(context.get(),
13595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     FileSystemURLDirName(source_url),
13605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     exclusive, recursive));
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context.reset(NewContext(NULL));
13625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASSERT_EQ(base::File::FILE_OK,
13635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              ofu()->CreateDirectory(context.get(),
13645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     FileSystemURLDirName(dest_url),
13655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     exclusive, recursive));
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool created = false;
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context.reset(NewContext(NULL));
13695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASSERT_EQ(base::File::FILE_OK,
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              ofu()->EnsureFileExists(context.get(), source_url, &created));
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(created);
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context.reset(NewContext(NULL));
13735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASSERT_EQ(base::File::FILE_OK,
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              ofu()->Truncate(context.get(), source_url, kSourceLength));
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (test_case.cause_overwrite) {
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      context.reset(NewContext(NULL));
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      created = false;
13795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ASSERT_EQ(base::File::FILE_OK,
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ofu()->EnsureFileExists(context.get(), dest_url, &created));
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_TRUE(created);
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      context.reset(NewContext(NULL));
13835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ASSERT_EQ(base::File::FILE_OK,
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ofu()->Truncate(context.get(), dest_url, kDestLength));
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context.reset(NewContext(NULL));
13885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::File::FILE_OK,
13895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              ofu()->CopyOrMoveFile(context.get(), source_url, dest_url,
13905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                    FileSystemOperation::OPTION_NONE,
13915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                    test_case.is_copy_not_move));
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (test_case.is_copy_not_move) {
13945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::File::Info file_info;
13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath local_path;
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      context.reset(NewContext(NULL));
13975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_EQ(base::File::FILE_OK,
13985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                ofu()->GetFileInfo(context.get(), source_url, &file_info,
13995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   &local_path));
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(kSourceLength, file_info.size);
14015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_EQ(base::File::FILE_OK,
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ofu()->DeleteFile(context.get(), source_url));
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
14045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::File::Info file_info;
14052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath local_path;
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      context.reset(NewContext(NULL));
14075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND,
14085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                ofu()->GetFileInfo(context.get(), source_url, &file_info,
14095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   &local_path));
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
14115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::File::Info file_info;
14122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath local_path;
14135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::File::FILE_OK,
14145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              ofu()->GetFileInfo(context.get(), dest_url, &file_info,
14155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 &local_path));
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kSourceLength, file_info.size);
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::File::FILE_OK,
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              ofu()->DeleteFile(context.get(), dest_url));
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ObfuscatedFileUtilTest, TestCopyPathQuotas) {
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FileSystemURL src_url = CreateURLFromUTF8("src path");
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FileSystemURL dest_url = CreateURLFromUTF8("destination path");
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FileSystemOperationContext> context(NewContext(NULL));
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool created = false;
14285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
14295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->EnsureFileExists(context.get(), src_url, &created));
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_copy = true;
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Copy, no overwrite.
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context->set_allowed_bytes_growth(
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ObfuscatedFileUtil::ComputeFilePathCost(dest_url.path()) - 1);
14355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_ERROR_NO_SPACE,
14365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->CopyOrMoveFile(context.get(), src_url, dest_url,
14375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  FileSystemOperation::OPTION_NONE, is_copy));
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context->set_allowed_bytes_growth(
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ObfuscatedFileUtil::ComputeFilePathCost(dest_url.path()));
14415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
14425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->CopyOrMoveFile(context.get(), src_url, dest_url,
14435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  FileSystemOperation::OPTION_NONE, is_copy));
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Copy, with overwrite.
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context->set_allowed_bytes_growth(0);
14485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
14495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->CopyOrMoveFile(context.get(), src_url, dest_url,
14505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  FileSystemOperation::OPTION_NONE, is_copy));
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ObfuscatedFileUtilTest, TestMovePathQuotasWithRename) {
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FileSystemURL src_url = CreateURLFromUTF8("src path");
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FileSystemURL dest_url = CreateURLFromUTF8("destination path");
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FileSystemOperationContext> context(NewContext(NULL));
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool created = false;
14585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
14595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->EnsureFileExists(context.get(), src_url, &created));
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_copy = false;
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move, rename, no overwrite.
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context->set_allowed_bytes_growth(
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ObfuscatedFileUtil::ComputeFilePathCost(dest_url.path()) -
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ObfuscatedFileUtil::ComputeFilePathCost(src_url.path()) - 1);
14675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_ERROR_NO_SPACE,
14685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->CopyOrMoveFile(context.get(), src_url, dest_url,
14695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  FileSystemOperation::OPTION_NONE, is_copy));
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context->set_allowed_bytes_growth(
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ObfuscatedFileUtil::ComputeFilePathCost(dest_url.path()) -
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ObfuscatedFileUtil::ComputeFilePathCost(src_url.path()));
14745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
14755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->CopyOrMoveFile(context.get(), src_url, dest_url,
14765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  FileSystemOperation::OPTION_NONE, is_copy));
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
14795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
14805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->EnsureFileExists(context.get(), src_url, &created));
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move, rename, with overwrite.
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context->set_allowed_bytes_growth(0);
14855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
14865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->CopyOrMoveFile(context.get(), src_url, dest_url,
14875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  FileSystemOperation::OPTION_NONE, is_copy));
14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ObfuscatedFileUtilTest, TestMovePathQuotasWithoutRename) {
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FileSystemURL src_url = CreateURLFromUTF8("src path");
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FileSystemOperationContext> context(NewContext(NULL));
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool created = false;
14945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
14955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->EnsureFileExists(context.get(), src_url, &created));
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool exclusive = true;
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool recursive = false;
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FileSystemURL dir_url = CreateURLFromUTF8("directory path");
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
15015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
15025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->CreateDirectory(context.get(), dir_url, exclusive,
15035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   recursive));
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FileSystemURL dest_url = FileSystemURLAppend(
15062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      dir_url, src_url.path().value());
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_copy = false;
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 allowed_bytes_growth = -1000;  // Over quota, this should still work.
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move, no rename, no overwrite.
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context->set_allowed_bytes_growth(allowed_bytes_growth);
15135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
15145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->CopyOrMoveFile(context.get(), src_url, dest_url,
15155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  FileSystemOperation::OPTION_NONE, is_copy));
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(allowed_bytes_growth, context->allowed_bytes_growth());
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move, no rename, with overwrite.
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
15205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
15215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->EnsureFileExists(context.get(), src_url, &created));
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context->set_allowed_bytes_growth(allowed_bytes_growth);
15245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
15255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->CopyOrMoveFile(context.get(), src_url, dest_url,
15265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  FileSystemOperation::OPTION_NONE, is_copy));
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      allowed_bytes_growth +
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ObfuscatedFileUtil::ComputeFilePathCost(src_url.path()),
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      context->allowed_bytes_growth());
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ObfuscatedFileUtilTest, TestCopyInForeignFile) {
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestCopyInForeignFileHelper(false /* overwrite */);
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestCopyInForeignFileHelper(true /* overwrite */);
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ObfuscatedFileUtilTest, TestEnumerator) {
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FileSystemOperationContext> context(NewContext(NULL));
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FileSystemURL src_url = CreateURLFromUTF8("source dir");
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool exclusive = true;
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool recursive = false;
15435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
15445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ofu()->CreateDirectory(context.get(), src_url, exclusive,
15455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   recursive));
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::set<base::FilePath::StringType> files;
15482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::set<base::FilePath::StringType> directories;
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FillTestDirectory(src_url, &files, &directories);
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FileSystemURL dest_url = CreateURLFromUTF8("destination dir");
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(DirectoryExists(dest_url));
15545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
15552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            AsyncFileTestHelper::Copy(
155690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                file_system_context(), src_url, dest_url));
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValidateTestDirectory(dest_url, files, directories);
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(DirectoryExists(src_url));
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(DirectoryExists(dest_url));
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  recursive = true;
15625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
15632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            AsyncFileTestHelper::Remove(
15642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                file_system_context(), dest_url, recursive));
15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(DirectoryExists(dest_url));
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ObfuscatedFileUtilTest, TestOriginEnumerator) {
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ObfuscatedFileUtil::AbstractOriginEnumerator>
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      enumerator(ofu()->CreateOriginEnumerator());
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The test helper starts out with a single filesystem.
15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(enumerator.get());
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(origin(), enumerator->Next());
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(type() == kFileSystemTypeTemporary);
15758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_TRUE(HasFileSystemType(enumerator.get(), kFileSystemTypeTemporary));
15768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_FALSE(HasFileSystemType(enumerator.get(), kFileSystemTypePersistent));
15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GURL(), enumerator->Next());
15788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_FALSE(HasFileSystemType(enumerator.get(), kFileSystemTypeTemporary));
15798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_FALSE(HasFileSystemType(enumerator.get(), kFileSystemTypePersistent));
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<GURL> origins_expected;
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  origins_expected.insert(origin());
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < arraysize(kOriginEnumerationTestRecords); ++i) {
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE(testing::Message() <<
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "Validating kOriginEnumerationTestRecords " << i);
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const OriginEnumerationTestRecord& record =
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kOriginEnumerationTestRecords[i];
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL origin_url(record.origin_url);
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    origins_expected.insert(origin_url);
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (record.has_temporary) {
159290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      scoped_ptr<SandboxFileSystemTestHelper> file_system(
159390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          NewFileSystem(origin_url, kFileSystemTypeTemporary));
159490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      scoped_ptr<FileSystemOperationContext> context(
159590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          NewContext(file_system.get()));
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool created = false;
15975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ASSERT_EQ(base::File::FILE_OK,
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ofu()->EnsureFileExists(
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    context.get(),
160090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                    file_system->CreateURLFromUTF8("file"),
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    &created));
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(created);
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (record.has_persistent) {
160590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      scoped_ptr<SandboxFileSystemTestHelper> file_system(
160690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          NewFileSystem(origin_url, kFileSystemTypePersistent));
160790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      scoped_ptr<FileSystemOperationContext> context(
160890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          NewContext(file_system.get()));
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool created = false;
16105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ASSERT_EQ(base::File::FILE_OK,
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ofu()->EnsureFileExists(
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    context.get(),
161390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                    file_system->CreateURLFromUTF8("file"),
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    &created));
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(created);
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enumerator.reset(ofu()->CreateOriginEnumerator());
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(enumerator.get());
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<GURL> origins_found;
16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL origin_url;
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (!(origin_url = enumerator->Next()).is_empty()) {
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    origins_found.insert(origin_url);
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE(testing::Message() << "Handling " << origin_url.spec());
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool found = false;
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; !found && i < arraysize(kOriginEnumerationTestRecords);
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ++i) {
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const OriginEnumerationTestRecord& record =
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          kOriginEnumerationTestRecords[i];
16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (GURL(record.origin_url) != origin_url)
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        continue;
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      found = true;
16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(record.has_temporary,
16348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)          HasFileSystemType(enumerator.get(), kFileSystemTypeTemporary));
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(record.has_persistent,
16368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)          HasFileSystemType(enumerator.get(), kFileSystemTypePersistent));
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Deal with the default filesystem created by the test helper.
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!found && origin_url == origin()) {
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_TRUE(type() == kFileSystemTypeTemporary);
16418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      EXPECT_TRUE(HasFileSystemType(enumerator.get(),
16428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                    kFileSystemTypeTemporary));
16438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      EXPECT_FALSE(HasFileSystemType(enumerator.get(),
16448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                     kFileSystemTypePersistent));
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      found = true;
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(found);
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<GURL> diff;
16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set_symmetric_difference(origins_expected.begin(),
16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      origins_expected.end(), origins_found.begin(), origins_found.end(),
16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      inserter(diff, diff.begin()));
16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(diff.empty());
16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ObfuscatedFileUtilTest, TestRevokeUsageCache) {
16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FileSystemOperationContext> context(NewContext(NULL));
16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 expected_quota = 0;
16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1662a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  for (size_t i = 0; i < kRegularFileSystemTestCaseSize; ++i) {
16632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SCOPED_TRACE(testing::Message() << "Creating kRegularTestCase " << i);
1664a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const FileSystemTestCaseRecord& test_case =
1665a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        kRegularFileSystemTestCases[i];
16662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath file_path(test_case.path);
16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected_quota += ObfuscatedFileUtil::ComputeFilePathCost(file_path);
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (test_case.is_directory) {
16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool exclusive = true;
16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool recursive = false;
16715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ASSERT_EQ(base::File::FILE_OK,
16725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                ofu()->CreateDirectory(context.get(), CreateURL(file_path),
16735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                       exclusive, recursive));
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool created = false;
16765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ASSERT_EQ(base::File::FILE_OK,
16775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                ofu()->EnsureFileExists(context.get(), CreateURL(file_path),
16785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        &created));
16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_TRUE(created);
16805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ASSERT_EQ(base::File::FILE_OK,
16815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                ofu()->Truncate(context.get(), CreateURL(file_path),
16825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                test_case.data_file_size));
16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      expected_quota += test_case.data_file_size;
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Usually raw size in usage cache and the usage returned by QuotaUtil
16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // should be same.
16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_quota, SizeInUsageFile());
16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_quota, SizeByQuotaUtil());
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RevokeUsageCache();
16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(-1, SizeInUsageFile());
16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_quota, SizeByQuotaUtil());
16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This should reconstruct the cache.
16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetUsageFromQuotaManager();
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_quota, SizeInUsageFile());
16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_quota, SizeByQuotaUtil());
17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_quota, usage());
17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ObfuscatedFileUtilTest, TestInconsistency) {
17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FileSystemURL kPath1 = CreateURLFromUTF8("hoge");
17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FileSystemURL kPath2 = CreateURLFromUTF8("fuga");
17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FileSystemOperationContext> context;
17085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::File::Info file_info;
17092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath data_path;
17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool created = false;
17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a non-empty file.
17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
17145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->EnsureFileExists(context.get(), kPath1, &created));
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(created);
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
17185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->Truncate(context.get(), kPath1, 10));
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
17215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->GetFileInfo(
17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                context.get(), kPath1, &file_info, &data_path));
17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(10, file_info.size);
17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Destroy database to make inconsistency between database and filesystem.
17278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ofu()->DestroyDirectoryDatabase(origin(), type_string());
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try to get file info of broken file.
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(PathExists(kPath1));
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
17325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->EnsureFileExists(context.get(), kPath1, &created));
17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(created);
17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
17365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->GetFileInfo(
17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                context.get(), kPath1, &file_info, &data_path));
17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, file_info.size);
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make another broken file to |kPath2|.
17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
17435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->EnsureFileExists(context.get(), kPath2, &created));
17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(created);
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Destroy again.
17488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ofu()->DestroyDirectoryDatabase(origin(), type_string());
17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Repair broken |kPath1|.
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
17525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND,
17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->Touch(context.get(), kPath1, base::Time::Now(),
17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           base::Time::Now()));
17555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->EnsureFileExists(context.get(), kPath1, &created));
17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(created);
17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Copy from sound |kPath1| to broken |kPath2|.
17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
17615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->CopyOrMoveFile(context.get(), kPath1, kPath2,
176368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                  FileSystemOperation::OPTION_NONE,
17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  true /* copy */));
17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ofu()->DestroyDirectoryDatabase(origin(), type_string());
17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
1768cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::File file =
1769cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      ofu()->CreateOrOpen(context.get(), kPath1,
1770cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                          base::File::FLAG_READ | base::File::FLAG_CREATE);
1771cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(file.IsValid());
1772cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(file.created());
17735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1774cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(file.GetInfo(&file_info));
17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, file_info.size);
17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ObfuscatedFileUtilTest, TestIncompleteDirectoryReading) {
17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FileSystemURL kPath[] = {
17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CreateURLFromUTF8("foo"),
17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CreateURLFromUTF8("bar"),
17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CreateURLFromUTF8("baz")
17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
17842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const FileSystemURL empty_path = CreateURL(base::FilePath());
17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FileSystemOperationContext> context;
17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kPath); ++i) {
17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool created = false;
17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context.reset(NewContext(NULL));
17905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::File::FILE_OK,
17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              ofu()->EnsureFileExists(context.get(), kPath[i], &created));
17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(created);
17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
179503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::vector<storage::DirectoryEntry> entries;
17965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
17972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            AsyncFileTestHelper::ReadDirectory(
17982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                file_system_context(), empty_path, &entries));
17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3u, entries.size());
18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath local_path;
18025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->GetLocalFilePath(context.get(), kPath[0], &local_path));
18047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::DeleteFile(local_path, false));
18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entries.clear();
18075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
18082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            AsyncFileTestHelper::ReadDirectory(
18092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                file_system_context(), empty_path, &entries));
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ARRAYSIZE_UNSAFE(kPath) - 1, entries.size());
18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ObfuscatedFileUtilTest, TestDirectoryTimestampForCreation) {
18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FileSystemOperationContext> context(NewContext(NULL));
18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FileSystemURL dir_url = CreateURLFromUTF8("foo_dir");
18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create working directory.
18185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->CreateDirectory(context.get(), dir_url, false, false));
18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // EnsureFileExists, create case.
1822cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  FileSystemURL url(FileSystemURLAppendUTF8(dir_url, "EnsureFileExists_file"));
18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool created = false;
18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearTimestamp(dir_url);
18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
18265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->EnsureFileExists(context.get(), url, &created));
18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(created);
18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(base::Time(), GetModifiedTime(dir_url));
18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // non create case.
18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  created = true;
18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearTimestamp(dir_url);
18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
18355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->EnsureFileExists(context.get(), url, &created));
18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(created);
18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(base::Time(), GetModifiedTime(dir_url));
18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // fail case.
18412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  url = FileSystemURLAppendUTF8(dir_url, "EnsureFileExists_dir");
18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
18435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->CreateDirectory(context.get(), url, false, false));
18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearTimestamp(dir_url);
18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
18485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_ERROR_NOT_A_FILE,
18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->EnsureFileExists(context.get(), url, &created));
18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(base::Time(), GetModifiedTime(dir_url));
18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // CreateOrOpen, create case.
18532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  url = FileSystemURLAppendUTF8(dir_url, "CreateOrOpen_file");
18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearTimestamp(dir_url);
18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
1856cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::File file =
1857cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      ofu()->CreateOrOpen(context.get(), url,
1858cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                          base::File::FLAG_CREATE | base::File::FLAG_WRITE);
1859cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1860cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(file.IsValid());
1861cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(file.created());
1862cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  file.Close();
18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(base::Time(), GetModifiedTime(dir_url));
18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // open case.
18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearTimestamp(dir_url);
18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
1868cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  file = ofu()->CreateOrOpen(context.get(), url,
1869cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                             base::File::FLAG_OPEN | base::File::FLAG_WRITE);
1870cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(file.IsValid());
1871cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_FALSE(file.created());
1872cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  file.Close();
18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(base::Time(), GetModifiedTime(dir_url));
18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // fail case
18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearTimestamp(dir_url);
18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
1878cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  file = ofu()->CreateOrOpen(context.get(), url,
1879cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                             base::File::FLAG_CREATE | base::File::FLAG_WRITE);
1880cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_FALSE(file.IsValid());
1881cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_ERROR_EXISTS, file.error_details());
18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(base::Time(), GetModifiedTime(dir_url));
18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // CreateDirectory, create case.
18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creating CreateDirectory_dir and CreateDirectory_dir/subdir.
18862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  url = FileSystemURLAppendUTF8(dir_url, "CreateDirectory_dir");
18872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FileSystemURL subdir_url(FileSystemURLAppendUTF8(url, "subdir"));
18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearTimestamp(dir_url);
18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
18905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->CreateDirectory(context.get(), subdir_url,
18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   true /* exclusive */, true /* recursive */));
18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(base::Time(), GetModifiedTime(dir_url));
18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // create subdir case.
18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creating CreateDirectory_dir/subdir2.
18972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  subdir_url = FileSystemURLAppendUTF8(url, "subdir2");
18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearTimestamp(dir_url);
18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearTimestamp(url);
19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
19015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->CreateDirectory(context.get(), subdir_url,
19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   true /* exclusive */, true /* recursive */));
19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(base::Time(), GetModifiedTime(dir_url));
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(base::Time(), GetModifiedTime(url));
19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // fail case.
19082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  url = FileSystemURLAppendUTF8(dir_url, "CreateDirectory_dir");
19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearTimestamp(dir_url);
19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
19115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_ERROR_EXISTS,
19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->CreateDirectory(context.get(), url,
19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   true /* exclusive */, true /* recursive */));
19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(base::Time(), GetModifiedTime(dir_url));
19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // CopyInForeignFile, create case.
19172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  url = FileSystemURLAppendUTF8(dir_url, "CopyInForeignFile_file");
19182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FileSystemURL src_path = FileSystemURLAppendUTF8(
19192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      dir_url, "CopyInForeignFile_src_file");
19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
19215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->EnsureFileExists(context.get(), src_path, &created));
19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(created);
19242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath src_local_path;
19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
19265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->GetLocalFilePath(context.get(), src_path, &src_local_path));
19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearTimestamp(dir_url);
19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
19315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->CopyInForeignFile(context.get(),
19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     src_local_path,
19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     url));
19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(base::Time(), GetModifiedTime(dir_url));
19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ObfuscatedFileUtilTest, TestDirectoryTimestampForDeletion) {
19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FileSystemOperationContext> context(NewContext(NULL));
19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FileSystemURL dir_url = CreateURLFromUTF8("foo_dir");
19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create working directory.
19435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->CreateDirectory(context.get(), dir_url, false, false));
19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DeleteFile, delete case.
19472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FileSystemURL url = FileSystemURLAppendUTF8(
19482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      dir_url, "DeleteFile_file");
19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool created = false;
19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
19515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->EnsureFileExists(context.get(), url, &created));
19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(created);
19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearTimestamp(dir_url);
19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
19575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->DeleteFile(context.get(), url));
19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(base::Time(), GetModifiedTime(dir_url));
19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // fail case.
19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearTimestamp(dir_url);
19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
19645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND,
19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->DeleteFile(context.get(), url));
19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(base::Time(), GetModifiedTime(dir_url));
19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // DeleteDirectory, fail case.
19692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  url = FileSystemURLAppendUTF8(dir_url, "DeleteDirectory_dir");
19702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FileSystemURL file_path(FileSystemURLAppendUTF8(url, "pakeratta"));
19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
19725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->CreateDirectory(context.get(), url, true, true));
19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  created = false;
19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
19765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->EnsureFileExists(context.get(), file_path, &created));
19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(created);
19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearTimestamp(dir_url);
19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
19825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_ERROR_NOT_EMPTY,
19832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ofu()->DeleteDirectory(context.get(), url));
19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(base::Time(), GetModifiedTime(dir_url));
19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // delete case.
19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
19885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->DeleteFile(context.get(), file_path));
19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearTimestamp(dir_url);
19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
19935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK, ofu()->DeleteDirectory(context.get(), url));
19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(base::Time(), GetModifiedTime(dir_url));
19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ObfuscatedFileUtilTest, TestDirectoryTimestampForCopyAndMove) {
19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDirectoryTimestampHelper(
19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CreateURLFromUTF8("copy overwrite"), true, true);
20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDirectoryTimestampHelper(
20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CreateURLFromUTF8("copy non-overwrite"), true, false);
20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDirectoryTimestampHelper(
20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CreateURLFromUTF8("move overwrite"), false, true);
20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDirectoryTimestampHelper(
20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CreateURLFromUTF8("move non-overwrite"), false, false);
20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ObfuscatedFileUtilTest, TestFileEnumeratorTimestamp) {
20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FileSystemURL dir = CreateURLFromUTF8("foo");
20102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FileSystemURL url1 = FileSystemURLAppendUTF8(dir, "bar");
20112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FileSystemURL url2 = FileSystemURLAppendUTF8(dir, "baz");
20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FileSystemOperationContext> context(NewContext(NULL));
20145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->CreateDirectory(context.get(), dir, false, false));
20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool created = false;
20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
20195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->EnsureFileExists(context.get(), url1, &created));
20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(created);
20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
20245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->CreateDirectory(context.get(), url2, false, false));
20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath file_path;
20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
20295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->GetLocalFilePath(context.get(), url1, &file_path));
20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(file_path.empty());
20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
20345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK,
20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->Touch(context.get(), url1,
20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         base::Time::Now() + base::TimeDelta::FromHours(1),
20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         base::Time()));
20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset(NewContext(NULL));
204003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_ptr<storage::FileSystemFileUtil::AbstractFileEnumerator> file_enum(
20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ofu()->CreateFileEnumerator(context.get(), dir, false));
20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int count = 0;
20442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath file_path_each;
20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (!(file_path_each = file_enum->Next()).empty()) {
20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context.reset(NewContext(NULL));
20475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::File::Info file_info;
20482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath file_path;
20495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::File::FILE_OK,
20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              ofu()->GetFileInfo(context.get(),
20512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 FileSystemURL::CreateForTest(
20522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     dir.origin(),
20532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     dir.mount_type(),
20542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     file_path_each),
20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 &file_info, &file_path));
20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(file_info.is_directory, file_enum->IsDirectory());
20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(file_info.last_modified, file_enum->LastModifiedTime());
20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(file_info.size, file_enum->Size());
20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++count;
20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, count);
20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// crbug.com/176470
20652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) || defined(OS_ANDROID)
20662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_TestQuotaOnCopyFile DISABLED_TestQuotaOnCopyFile
20672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
20682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_TestQuotaOnCopyFile TestQuotaOnCopyFile
20692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
20702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ObfuscatedFileUtilTest, MAYBE_TestQuotaOnCopyFile) {
20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FileSystemURL from_file(CreateURLFromUTF8("fromfile"));
20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FileSystemURL obstacle_file(CreateURLFromUTF8("obstaclefile"));
20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FileSystemURL to_file1(CreateURLFromUTF8("tofile1"));
20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FileSystemURL to_file2(CreateURLFromUTF8("tofile2"));
20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool created;
20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 expected_total_file_size = 0;
20785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->EnsureFileExists(
20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                AllowUsageIncrease(PathCost(from_file))->context(),
20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                from_file, &created));
20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(created);
20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(expected_total_file_size, ComputeTotalFileSize());
20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->EnsureFileExists(
20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                AllowUsageIncrease(PathCost(obstacle_file))->context(),
20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                obstacle_file, &created));
20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(created);
20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(expected_total_file_size, ComputeTotalFileSize());
20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 from_file_size = 1020;
20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_total_file_size += from_file_size;
20945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->Truncate(
20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                AllowUsageIncrease(from_file_size)->context(),
20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                from_file, from_file_size));
20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(expected_total_file_size, ComputeTotalFileSize());
20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 obstacle_file_size = 1;
21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_total_file_size += obstacle_file_size;
21025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->Truncate(
21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                AllowUsageIncrease(obstacle_file_size)->context(),
21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                obstacle_file, obstacle_file_size));
21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(expected_total_file_size, ComputeTotalFileSize());
21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 to_file1_size = from_file_size;
21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_total_file_size += to_file1_size;
21105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->CopyOrMoveFile(
21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                AllowUsageIncrease(
21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    PathCost(to_file1) + to_file1_size)->context(),
211468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                from_file, to_file1,
211568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                FileSystemOperation::OPTION_NONE,
211668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                true /* copy */));
21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(expected_total_file_size, ComputeTotalFileSize());
21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_ERROR_NO_SPACE,
21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->CopyOrMoveFile(
21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                DisallowUsageIncrease(
21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    PathCost(to_file2) + from_file_size)->context(),
212368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                from_file, to_file2, FileSystemOperation::OPTION_NONE,
212468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                true /* copy */));
21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(expected_total_file_size, ComputeTotalFileSize());
21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 old_obstacle_file_size = obstacle_file_size;
21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  obstacle_file_size = from_file_size;
21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_total_file_size += obstacle_file_size - old_obstacle_file_size;
21305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->CopyOrMoveFile(
21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                AllowUsageIncrease(
21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    obstacle_file_size - old_obstacle_file_size)->context(),
213468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                from_file, obstacle_file,
213568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                FileSystemOperation::OPTION_NONE,
213668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                true /* copy */));
21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(expected_total_file_size, ComputeTotalFileSize());
21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 old_from_file_size = from_file_size;
21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  from_file_size = old_from_file_size - 1;
21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_total_file_size += from_file_size - old_from_file_size;
21425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->Truncate(
21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                AllowUsageIncrease(
21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    from_file_size - old_from_file_size)->context(),
21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                from_file, from_file_size));
21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(expected_total_file_size, ComputeTotalFileSize());
21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // quota exceeded
21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    old_obstacle_file_size = obstacle_file_size;
21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    obstacle_file_size = from_file_size;
21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected_total_file_size += obstacle_file_size - old_obstacle_file_size;
21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<UsageVerifyHelper> helper = AllowUsageIncrease(
21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        obstacle_file_size - old_obstacle_file_size);
21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper->context()->set_allowed_bytes_growth(
21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        helper->context()->allowed_bytes_growth() - 1);
21585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASSERT_EQ(base::File::FILE_OK,
21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              ofu()->CopyOrMoveFile(
21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  helper->context(),
216168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                  from_file, obstacle_file,
216268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                  FileSystemOperation::OPTION_NONE,
216368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                  true /* copy */));
21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(expected_total_file_size, ComputeTotalFileSize());
21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ObfuscatedFileUtilTest, TestQuotaOnMoveFile) {
21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FileSystemURL from_file(CreateURLFromUTF8("fromfile"));
21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FileSystemURL obstacle_file(CreateURLFromUTF8("obstaclefile"));
21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FileSystemURL to_file(CreateURLFromUTF8("tofile"));
21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool created;
21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 expected_total_file_size = 0;
21755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->EnsureFileExists(
21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                AllowUsageIncrease(PathCost(from_file))->context(),
21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                from_file, &created));
21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(created);
21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(expected_total_file_size, ComputeTotalFileSize());
21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 from_file_size = 1020;
21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_total_file_size += from_file_size;
21845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->Truncate(
21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                AllowUsageIncrease(from_file_size)->context(),
21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                from_file, from_file_size));
21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(expected_total_file_size, ComputeTotalFileSize());
21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 to_file_size ALLOW_UNUSED = from_file_size;
21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  from_file_size = 0;
21925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->CopyOrMoveFile(
21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                AllowUsageIncrease(-PathCost(from_file) +
21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   PathCost(to_file))->context(),
219668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                from_file, to_file,
219768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                FileSystemOperation::OPTION_NONE,
219868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                false /* move */));
21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(expected_total_file_size, ComputeTotalFileSize());
22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->EnsureFileExists(
22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                AllowUsageIncrease(PathCost(from_file))->context(),
22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                from_file, &created));
22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(created);
22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(expected_total_file_size, ComputeTotalFileSize());
22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->EnsureFileExists(
22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                AllowUsageIncrease(PathCost(obstacle_file))->context(),
22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                obstacle_file, &created));
22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(created);
22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(expected_total_file_size, ComputeTotalFileSize());
22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  from_file_size = 1020;
22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_total_file_size += from_file_size;
22175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->Truncate(
22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                AllowUsageIncrease(from_file_size)->context(),
22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                from_file, from_file_size));
22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(expected_total_file_size, ComputeTotalFileSize());
22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 obstacle_file_size = 1;
22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_total_file_size += obstacle_file_size;
22255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->Truncate(
22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                AllowUsageIncrease(1)->context(),
22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                obstacle_file, obstacle_file_size));
22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(expected_total_file_size, ComputeTotalFileSize());
22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 old_obstacle_file_size = obstacle_file_size;
22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  obstacle_file_size = from_file_size;
22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  from_file_size = 0;
22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_total_file_size -= old_obstacle_file_size;
22355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->CopyOrMoveFile(
22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                AllowUsageIncrease(
22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    -old_obstacle_file_size - PathCost(from_file))->context(),
22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                from_file, obstacle_file,
224068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                FileSystemOperation::OPTION_NONE,
22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                false /* move */));
22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(expected_total_file_size, ComputeTotalFileSize());
22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->EnsureFileExists(
22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                AllowUsageIncrease(PathCost(from_file))->context(),
22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                from_file, &created));
22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(created);
22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(expected_total_file_size, ComputeTotalFileSize());
22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  from_file_size = 10;
22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_total_file_size += from_file_size;
22535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->Truncate(
22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                AllowUsageIncrease(from_file_size)->context(),
22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                from_file, from_file_size));
22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(expected_total_file_size, ComputeTotalFileSize());
22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // quota exceeded even after operation
22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  old_obstacle_file_size = obstacle_file_size;
22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  obstacle_file_size = from_file_size;
22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  from_file_size = 0;
22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_total_file_size -= old_obstacle_file_size;
22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FileSystemOperationContext> context =
22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LimitedContext(-old_obstacle_file_size - PathCost(from_file) - 1);
22665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->CopyOrMoveFile(
226868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                context.get(), from_file, obstacle_file,
226968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                FileSystemOperation::OPTION_NONE,
227068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                false /* move */));
22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(expected_total_file_size, ComputeTotalFileSize());
22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.reset();
22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ObfuscatedFileUtilTest, TestQuotaOnRemove) {
22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FileSystemURL dir(CreateURLFromUTF8("dir"));
22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FileSystemURL file(CreateURLFromUTF8("file"));
22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FileSystemURL dfile1(CreateURLFromUTF8("dir/dfile1"));
22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FileSystemURL dfile2(CreateURLFromUTF8("dir/dfile2"));
22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool created;
22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->EnsureFileExists(
22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                AllowUsageIncrease(PathCost(file))->context(),
22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                file, &created));
22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(created);
22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, ComputeTotalFileSize());
22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->CreateDirectory(
22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                AllowUsageIncrease(PathCost(dir))->context(),
22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                dir, false, false));
22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, ComputeTotalFileSize());
22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->EnsureFileExists(
22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                AllowUsageIncrease(PathCost(dfile1))->context(),
22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                dfile1, &created));
22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(created);
23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, ComputeTotalFileSize());
23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->EnsureFileExists(
23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                AllowUsageIncrease(PathCost(dfile2))->context(),
23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                dfile2, &created));
23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(created);
23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, ComputeTotalFileSize());
23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->Truncate(
23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                AllowUsageIncrease(340)->context(),
23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                file, 340));
23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(340, ComputeTotalFileSize());
23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->Truncate(
23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                AllowUsageIncrease(1020)->context(),
23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                dfile1, 1020));
23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1360, ComputeTotalFileSize());
23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->Truncate(
23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                AllowUsageIncrease(120)->context(),
23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                dfile2, 120));
23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1480, ComputeTotalFileSize());
23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->DeleteFile(
23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                AllowUsageIncrease(-PathCost(file) - 340)->context(),
23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                file));
23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1140, ComputeTotalFileSize());
23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
23342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            AsyncFileTestHelper::Remove(
23352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                file_system_context(), dir, true /* recursive */));
23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, ComputeTotalFileSize());
23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ObfuscatedFileUtilTest, TestQuotaOnOpen) {
2340cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  FileSystemURL url(CreateURLFromUTF8("file"));
23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2342cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool created;
23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creating a file.
23445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->EnsureFileExists(
2346cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                AllowUsageIncrease(PathCost(url))->context(),
2347cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                url, &created));
23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(created);
23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, ComputeTotalFileSize());
23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Opening it, which shouldn't change the usage.
2352cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::File file =
2353cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      ofu()->CreateOrOpen(AllowUsageIncrease(0)->context(), url,
2354cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                          base::File::FLAG_OPEN | base::File::FLAG_WRITE);
2355cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(file.IsValid());
23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, ComputeTotalFileSize());
2357cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  file.Close();
23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int length = 33;
23605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->Truncate(
2362cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                AllowUsageIncrease(length)->context(), url, length));
23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(length, ComputeTotalFileSize());
23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Opening it with CREATE_ALWAYS flag, which should truncate the file size.
2366cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  file = ofu()->CreateOrOpen(
2367cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)             AllowUsageIncrease(-length)->context(), url,
2368cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)             base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE);
2369cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(file.IsValid());
23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, ComputeTotalFileSize());
2371cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  file.Close();
23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extending the file again.
23745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ofu()->Truncate(
2376cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                AllowUsageIncrease(length)->context(), url, length));
23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(length, ComputeTotalFileSize());
23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Opening it with TRUNCATED flag, which should truncate the file size.
2380cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  file = ofu()->CreateOrOpen(
2381cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)             AllowUsageIncrease(-length)->context(), url,
2382cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)             base::File::FLAG_OPEN_TRUNCATED | base::File::FLAG_WRITE);
2383cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(file.IsValid());
23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, ComputeTotalFileSize());
2385cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  file.Close();
23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2388868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(ObfuscatedFileUtilTest, MaybeDropDatabasesAliveCase) {
23895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MaybeDropDatabasesAliveCaseTestBody();
2390868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
2391868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2392868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(ObfuscatedFileUtilTest, MaybeDropDatabasesAlreadyDeletedCase) {
23935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MaybeDropDatabasesAlreadyDeletedCaseTestBody();
2394868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
2395868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2396eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(ObfuscatedFileUtilTest, DestroyDirectoryDatabase_Isolated) {
23975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DestroyDirectoryDatabase_IsolatedTestBody();
2398eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
2399eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2400eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(ObfuscatedFileUtilTest, GetDirectoryDatabase_Isolated) {
24015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GetDirectoryDatabase_IsolatedTestBody();
2402eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
2403eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2404558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochTEST_F(ObfuscatedFileUtilTest, MigrationBackFromIsolated) {
24055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MigrationBackFromIsolatedTestBody();
2406558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
2407558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
2408d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)TEST_F(ObfuscatedFileUtilTest, OpenPathInNonDirectory) {
2409cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  FileSystemURL url(CreateURLFromUTF8("file"));
2410d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  FileSystemURL path_in_file(CreateURLFromUTF8("file/file"));
2411d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  bool created;
2412d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
24135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
2414cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            ofu()->EnsureFileExists(UnlimitedContext().get(), url, &created));
2415d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ASSERT_TRUE(created);
2416d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
2417cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int file_flags = base::File::FLAG_CREATE | base::File::FLAG_WRITE;
2418cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::File file =
2419cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      ofu()->CreateOrOpen(UnlimitedContext().get(), path_in_file, file_flags);
2420cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_FALSE(file.IsValid());
2421cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_ERROR_NOT_A_DIRECTORY, file.error_details());
2422d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
24235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_ERROR_NOT_A_DIRECTORY,
2424d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            ofu()->CreateDirectory(UnlimitedContext().get(),
2425d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                   path_in_file,
2426d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                   false /* exclusive */,
2427d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                   false /* recursive */));
2428d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
2429d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
2430f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(ObfuscatedFileUtilTest, CreateDirectory_NotADirectoryInRecursive) {
2431f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  FileSystemURL file(CreateURLFromUTF8("file"));
2432f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  FileSystemURL path_in_file(CreateURLFromUTF8("file/child"));
2433f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  FileSystemURL path_in_file_in_file(
2434f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      CreateURLFromUTF8("file/child/grandchild"));
2435f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool created;
2436f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
24375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_OK,
2438f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            ofu()->EnsureFileExists(UnlimitedContext().get(), file, &created));
2439f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_TRUE(created);
2440f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
24415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_ERROR_NOT_A_DIRECTORY,
2442f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            ofu()->CreateDirectory(UnlimitedContext().get(),
2443f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                   path_in_file,
2444f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                   false /* exclusive */,
2445f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                   true /* recursive */));
24465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(base::File::FILE_ERROR_NOT_A_DIRECTORY,
2447f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            ofu()->CreateDirectory(UnlimitedContext().get(),
2448f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                   path_in_file_in_file,
2449f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                   false /* exclusive */,
2450f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                   true /* recursive */));
2451f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
2452f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
24535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace content
2454