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) "a); 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