Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(76)

Side by Side Diff: content/browser/fileapi/obfuscated_file_util_unittest.cc

Issue 137923003: Change fileapi namespace to content for files that are moved under content/ (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: build fix Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <set> 5 #include <set>
6 #include <string> 6 #include <string>
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/file_util.h" 10 #include "base/file_util.h"
(...skipping 16 matching lines...) Expand all
27 #include "webkit/browser/fileapi/sandbox_directory_database.h" 27 #include "webkit/browser/fileapi/sandbox_directory_database.h"
28 #include "webkit/browser/fileapi/sandbox_file_system_backend_delegate.h" 28 #include "webkit/browser/fileapi/sandbox_file_system_backend_delegate.h"
29 #include "webkit/browser/fileapi/sandbox_isolated_origin_database.h" 29 #include "webkit/browser/fileapi/sandbox_isolated_origin_database.h"
30 #include "webkit/browser/fileapi/sandbox_origin_database.h" 30 #include "webkit/browser/fileapi/sandbox_origin_database.h"
31 #include "webkit/browser/fileapi/test_file_set.h" 31 #include "webkit/browser/fileapi/test_file_set.h"
32 #include "webkit/browser/quota/mock_special_storage_policy.h" 32 #include "webkit/browser/quota/mock_special_storage_policy.h"
33 #include "webkit/browser/quota/quota_manager.h" 33 #include "webkit/browser/quota/quota_manager.h"
34 #include "webkit/common/database/database_identifier.h" 34 #include "webkit/common/database/database_identifier.h"
35 #include "webkit/common/quota/quota_types.h" 35 #include "webkit/common/quota/quota_types.h"
36 36
37 namespace fileapi { 37 using fileapi::AsyncFileTestHelper;
38 using fileapi::FileSystemContext;
39 using fileapi::FileSystemOperation;
40 using fileapi::FileSystemOperationContext;
41 using fileapi::FileSystemType;
42 using fileapi::FileSystemURL;
43 using fileapi::ObfuscatedFileUtil;
44 using fileapi::SandboxDirectoryDatabase;
45 using fileapi::SandboxIsolatedOriginDatabase;
46 using fileapi::kFileSystemTypeTemporary;
47 using fileapi::kFileSystemTypePersistent;
48
49 namespace content {
38 50
39 namespace { 51 namespace {
40 52
41 bool FileExists(const base::FilePath& path) { 53 bool FileExists(const base::FilePath& path) {
42 return base::PathExists(path) && !base::DirectoryExists(path); 54 return base::PathExists(path) && !base::DirectoryExists(path);
43 } 55 }
44 56
45 int64 GetSize(const base::FilePath& path) { 57 int64 GetSize(const base::FilePath& path) {
46 int64 size; 58 int64 size;
47 EXPECT_TRUE(base::GetFileSize(path, &size)); 59 EXPECT_TRUE(base::GetFileSize(path, &size));
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
103 FileSystemURL FileSystemURLAppendUTF8( 115 FileSystemURL FileSystemURLAppendUTF8(
104 const FileSystemURL& url, const std::string& child) { 116 const FileSystemURL& url, const std::string& child) {
105 return FileSystemURL::CreateForTest( 117 return FileSystemURL::CreateForTest(
106 url.origin(), 118 url.origin(),
107 url.mount_type(), 119 url.mount_type(),
108 url.virtual_path().Append(base::FilePath::FromUTF8Unsafe(child))); 120 url.virtual_path().Append(base::FilePath::FromUTF8Unsafe(child)));
109 } 121 }
110 122
111 FileSystemURL FileSystemURLDirName(const FileSystemURL& url) { 123 FileSystemURL FileSystemURLDirName(const FileSystemURL& url) {
112 return FileSystemURL::CreateForTest( 124 return FileSystemURL::CreateForTest(
113 url.origin(), url.mount_type(), VirtualPath::DirName(url.virtual_path())); 125 url.origin(), url.mount_type(),
126 fileapi::VirtualPath::DirName(url.virtual_path()));
114 } 127 }
115 128
116 std::string GetTypeString(FileSystemType type) { 129 std::string GetTypeString(FileSystemType type) {
117 return SandboxFileSystemBackendDelegate::GetTypeString(type); 130 return fileapi::SandboxFileSystemBackendDelegate::GetTypeString(type);
118 } 131 }
119 132
120 bool HasFileSystemType( 133 bool HasFileSystemType(
121 ObfuscatedFileUtil::AbstractOriginEnumerator* enumerator, 134 ObfuscatedFileUtil::AbstractOriginEnumerator* enumerator,
122 FileSystemType type) { 135 FileSystemType type) {
123 return enumerator->HasTypeDirectory(GetTypeString(type)); 136 return enumerator->HasTypeDirectory(GetTypeString(type));
124 } 137 }
125 138
126 } // namespace 139 } // namespace
127 140
128 // TODO(ericu): The vast majority of this and the other FSFU subclass tests 141 // TODO(ericu): The vast majority of this and the other FSFU subclass tests
129 // could theoretically be shared. It would basically be a FSFU interface 142 // could theoretically be shared. It would basically be a FSFU interface
130 // compliance test, and only the subclass-specific bits that look into the 143 // compliance test, and only the subclass-specific bits that look into the
131 // implementation would need to be written per-subclass. 144 // implementation would need to be written per-subclass.
132 class ObfuscatedFileUtilTest : public testing::Test { 145 class ObfuscatedFileUtilTest : public testing::Test {
133 public: 146 public:
134 ObfuscatedFileUtilTest() 147 ObfuscatedFileUtilTest()
135 : origin_(GURL("http://www.example.com")), 148 : origin_(GURL("http://www.example.com")),
136 type_(kFileSystemTypeTemporary), 149 type_(fileapi::kFileSystemTypeTemporary),
137 weak_factory_(this), 150 weak_factory_(this),
138 sandbox_file_system_(origin_, type_), 151 sandbox_file_system_(origin_, type_),
139 quota_status_(quota::kQuotaStatusUnknown), 152 quota_status_(quota::kQuotaStatusUnknown),
140 usage_(-1) { 153 usage_(-1) {
141 } 154 }
142 155
143 virtual void SetUp() { 156 virtual void SetUp() {
144 ASSERT_TRUE(data_dir_.CreateUniqueTempDir()); 157 ASSERT_TRUE(data_dir_.CreateUniqueTempDir());
145 158
146 storage_policy_ = new quota::MockSpecialStoragePolicy(); 159 storage_policy_ = new quota::MockSpecialStoragePolicy();
147 160
148 quota_manager_ = 161 quota_manager_ =
149 new quota::QuotaManager(false /* is_incognito */, 162 new quota::QuotaManager(false /* is_incognito */,
150 data_dir_.path(), 163 data_dir_.path(),
151 base::MessageLoopProxy::current().get(), 164 base::MessageLoopProxy::current().get(),
152 base::MessageLoopProxy::current().get(), 165 base::MessageLoopProxy::current().get(),
153 storage_policy_.get()); 166 storage_policy_.get());
154 167
155 // Every time we create a new sandbox_file_system helper, 168 // Every time we create a new sandbox_file_system helper,
156 // it creates another context, which creates another path manager, 169 // it creates another context, which creates another path manager,
157 // another sandbox_backend, and another OFU. 170 // another sandbox_backend, and another OFU.
158 // We need to pass in the context to skip all that. 171 // We need to pass in the context to skip all that.
159 file_system_context_ = CreateFileSystemContextForTesting( 172 file_system_context_ = CreateFileSystemContextForTesting(
160 quota_manager_->proxy(), 173 quota_manager_->proxy(),
161 data_dir_.path()); 174 data_dir_.path());
162 175
163 sandbox_file_system_.SetUp(file_system_context_.get()); 176 sandbox_file_system_.SetUp(file_system_context_.get());
164 177
165 change_observers_ = MockFileChangeObserver::CreateList(&change_observer_); 178 change_observers_ = fileapi::MockFileChangeObserver::CreateList(
179 &change_observer_);
166 } 180 }
167 181
168 virtual void TearDown() { 182 virtual void TearDown() {
169 quota_manager_ = NULL; 183 quota_manager_ = NULL;
170 sandbox_file_system_.TearDown(); 184 sandbox_file_system_.TearDown();
171 } 185 }
172 186
173 scoped_ptr<FileSystemOperationContext> LimitedContext( 187 scoped_ptr<FileSystemOperationContext> LimitedContext(
174 int64 allowed_bytes_growth) { 188 int64 allowed_bytes_growth) {
175 scoped_ptr<FileSystemOperationContext> context( 189 scoped_ptr<FileSystemOperationContext> context(
(...skipping 13 matching lines...) Expand all
189 if (file_system) 203 if (file_system)
190 context = file_system->NewOperationContext(); 204 context = file_system->NewOperationContext();
191 else 205 else
192 context = sandbox_file_system_.NewOperationContext(); 206 context = sandbox_file_system_.NewOperationContext();
193 // Setting allowed_bytes_growth big enough for all tests. 207 // Setting allowed_bytes_growth big enough for all tests.
194 context->set_allowed_bytes_growth(1024 * 1024); 208 context->set_allowed_bytes_growth(1024 * 1024);
195 context->set_change_observers(change_observers()); 209 context->set_change_observers(change_observers());
196 return context; 210 return context;
197 } 211 }
198 212
199 const ChangeObserverList& change_observers() const { 213 const fileapi::ChangeObserverList& change_observers() const {
200 return change_observers_; 214 return change_observers_;
201 } 215 }
202 216
203 MockFileChangeObserver* change_observer() { 217 fileapi::MockFileChangeObserver* change_observer() {
204 return &change_observer_; 218 return &change_observer_;
205 } 219 }
206 220
207 // This can only be used after SetUp has run and created file_system_context_ 221 // This can only be used after SetUp has run and created file_system_context_
208 // and obfuscated_file_util_. 222 // and obfuscated_file_util_.
209 // Use this for tests which need to run in multiple origins; we need a test 223 // Use this for tests which need to run in multiple origins; we need a test
210 // helper per origin. 224 // helper per origin.
211 SandboxFileSystemTestHelper* NewFileSystem( 225 SandboxFileSystemTestHelper* NewFileSystem(
212 const GURL& origin, fileapi::FileSystemType type) { 226 const GURL& origin, fileapi::FileSystemType type) {
213 SandboxFileSystemTestHelper* file_system = 227 SandboxFileSystemTestHelper* file_system =
214 new SandboxFileSystemTestHelper(origin, type); 228 new SandboxFileSystemTestHelper(origin, type);
215 229
216 file_system->SetUp(file_system_context_.get()); 230 file_system->SetUp(file_system_context_.get());
217 return file_system; 231 return file_system;
218 } 232 }
219 233
234 scoped_ptr<ObfuscatedFileUtil> CreateObfuscatedFileUtil(
235 quota::SpecialStoragePolicy* storage_policy) {
236 return scoped_ptr<ObfuscatedFileUtil>(
237 ObfuscatedFileUtil::CreateForTesting(
238 storage_policy, data_dir_path(),
239 base::MessageLoopProxy::current().get()));
240 }
241
220 ObfuscatedFileUtil* ofu() { 242 ObfuscatedFileUtil* ofu() {
221 return static_cast<ObfuscatedFileUtil*>(sandbox_file_system_.file_util()); 243 return static_cast<ObfuscatedFileUtil*>(sandbox_file_system_.file_util());
222 } 244 }
223 245
224 const base::FilePath& test_directory() const { 246 const base::FilePath& test_directory() const {
225 return data_dir_.path(); 247 return data_dir_.path();
226 } 248 }
227 249
228 const GURL& origin() const { 250 const GURL& origin() const {
229 return origin_; 251 return origin_;
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
276 base::PlatformFileError error = ofu()->GetFileInfo( 298 base::PlatformFileError error = ofu()->GetFileInfo(
277 context.get(), url, &file_info, &platform_path); 299 context.get(), url, &file_info, &platform_path);
278 return error == base::PLATFORM_FILE_OK; 300 return error == base::PLATFORM_FILE_OK;
279 } 301 }
280 302
281 bool DirectoryExists(const FileSystemURL& url) { 303 bool DirectoryExists(const FileSystemURL& url) {
282 return AsyncFileTestHelper::DirectoryExists(file_system_context(), url); 304 return AsyncFileTestHelper::DirectoryExists(file_system_context(), url);
283 } 305 }
284 306
285 int64 usage() const { return usage_; } 307 int64 usage() const { return usage_; }
286 FileSystemUsageCache* usage_cache() { 308 fileapi::FileSystemUsageCache* usage_cache() {
287 return sandbox_file_system_.usage_cache(); 309 return sandbox_file_system_.usage_cache();
288 } 310 }
289 311
290 FileSystemURL CreateURLFromUTF8(const std::string& path) { 312 FileSystemURL CreateURLFromUTF8(const std::string& path) {
291 return sandbox_file_system_.CreateURLFromUTF8(path); 313 return sandbox_file_system_.CreateURLFromUTF8(path);
292 } 314 }
293 315
294 int64 PathCost(const FileSystemURL& url) { 316 int64 PathCost(const FileSystemURL& url) {
295 return ObfuscatedFileUtil::ComputeFilePathCost(url.path()); 317 return ObfuscatedFileUtil::ComputeFilePathCost(url.path());
296 } 318 }
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
420 int64 usage = sandbox_file_system_.GetCachedOriginUsage(); 442 int64 usage = sandbox_file_system_.GetCachedOriginUsage();
421 return scoped_ptr<UsageVerifyHelper>(new UsageVerifyHelper( 443 return scoped_ptr<UsageVerifyHelper>(new UsageVerifyHelper(
422 LimitedContext(requested_growth - 1), &sandbox_file_system_, usage)); 444 LimitedContext(requested_growth - 1), &sandbox_file_system_, usage));
423 } 445 }
424 446
425 void FillTestDirectory( 447 void FillTestDirectory(
426 const FileSystemURL& root_url, 448 const FileSystemURL& root_url,
427 std::set<base::FilePath::StringType>* files, 449 std::set<base::FilePath::StringType>* files,
428 std::set<base::FilePath::StringType>* directories) { 450 std::set<base::FilePath::StringType>* directories) {
429 scoped_ptr<FileSystemOperationContext> context; 451 scoped_ptr<FileSystemOperationContext> context;
430 std::vector<DirectoryEntry> entries; 452 std::vector<fileapi::DirectoryEntry> entries;
431 EXPECT_EQ(base::PLATFORM_FILE_OK, 453 EXPECT_EQ(base::PLATFORM_FILE_OK,
432 AsyncFileTestHelper::ReadDirectory( 454 AsyncFileTestHelper::ReadDirectory(
433 file_system_context(), root_url, &entries)); 455 file_system_context(), root_url, &entries));
434 EXPECT_EQ(0UL, entries.size()); 456 EXPECT_EQ(0UL, entries.size());
435 457
436 files->clear(); 458 files->clear();
437 files->insert(FILE_PATH_LITERAL("first")); 459 files->insert(FILE_PATH_LITERAL("first"));
438 files->insert(FILE_PATH_LITERAL("second")); 460 files->insert(FILE_PATH_LITERAL("second"));
439 files->insert(FILE_PATH_LITERAL("third")); 461 files->insert(FILE_PATH_LITERAL("third"));
440 directories->clear(); 462 directories->clear();
(...skipping 23 matching lines...) Expand all
464 } 486 }
465 ValidateTestDirectory(root_url, *files, *directories); 487 ValidateTestDirectory(root_url, *files, *directories);
466 } 488 }
467 489
468 void TestReadDirectoryHelper(const FileSystemURL& root_url) { 490 void TestReadDirectoryHelper(const FileSystemURL& root_url) {
469 std::set<base::FilePath::StringType> files; 491 std::set<base::FilePath::StringType> files;
470 std::set<base::FilePath::StringType> directories; 492 std::set<base::FilePath::StringType> directories;
471 FillTestDirectory(root_url, &files, &directories); 493 FillTestDirectory(root_url, &files, &directories);
472 494
473 scoped_ptr<FileSystemOperationContext> context; 495 scoped_ptr<FileSystemOperationContext> context;
474 std::vector<DirectoryEntry> entries; 496 std::vector<fileapi::DirectoryEntry> entries;
475 context.reset(NewContext(NULL)); 497 context.reset(NewContext(NULL));
476 EXPECT_EQ(base::PLATFORM_FILE_OK, 498 EXPECT_EQ(base::PLATFORM_FILE_OK,
477 AsyncFileTestHelper::ReadDirectory( 499 AsyncFileTestHelper::ReadDirectory(
478 file_system_context(), root_url, &entries)); 500 file_system_context(), root_url, &entries));
479 std::vector<DirectoryEntry>::iterator entry_iter; 501 std::vector<fileapi::DirectoryEntry>::iterator entry_iter;
480 EXPECT_EQ(files.size() + directories.size(), entries.size()); 502 EXPECT_EQ(files.size() + directories.size(), entries.size());
481 EXPECT_TRUE(change_observer()->HasNoChange()); 503 EXPECT_TRUE(change_observer()->HasNoChange());
482 for (entry_iter = entries.begin(); entry_iter != entries.end(); 504 for (entry_iter = entries.begin(); entry_iter != entries.end();
483 ++entry_iter) { 505 ++entry_iter) {
484 const DirectoryEntry& entry = *entry_iter; 506 const fileapi::DirectoryEntry& entry = *entry_iter;
485 std::set<base::FilePath::StringType>::iterator iter = 507 std::set<base::FilePath::StringType>::iterator iter =
486 files.find(entry.name); 508 files.find(entry.name);
487 if (iter != files.end()) { 509 if (iter != files.end()) {
488 EXPECT_FALSE(entry.is_directory); 510 EXPECT_FALSE(entry.is_directory);
489 files.erase(iter); 511 files.erase(iter);
490 continue; 512 continue;
491 } 513 }
492 iter = directories.find(entry.name); 514 iter = directories.find(entry.name);
493 EXPECT_FALSE(directories.end() == iter); 515 EXPECT_FALSE(directories.end() == iter);
494 EXPECT_TRUE(entry.is_directory); 516 EXPECT_TRUE(entry.is_directory);
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
655 src_file_url, dest_file_url, 677 src_file_url, dest_file_url,
656 FileSystemOperation::OPTION_NONE, 678 FileSystemOperation::OPTION_NONE,
657 copy)); 679 copy));
658 if (copy) 680 if (copy)
659 EXPECT_EQ(base::Time(), GetModifiedTime(src_dir_url)); 681 EXPECT_EQ(base::Time(), GetModifiedTime(src_dir_url));
660 else 682 else
661 EXPECT_NE(base::Time(), GetModifiedTime(src_dir_url)); 683 EXPECT_NE(base::Time(), GetModifiedTime(src_dir_url));
662 EXPECT_NE(base::Time(), GetModifiedTime(dest_dir_url)); 684 EXPECT_NE(base::Time(), GetModifiedTime(dest_dir_url));
663 } 685 }
664 686
687 void MaybeDropDatabasesAliveCaseTestBody() {
688 scoped_ptr<ObfuscatedFileUtil> file_util = CreateObfuscatedFileUtil(NULL);
689 file_util->InitOriginDatabase(GURL(), true /*create*/);
690 ASSERT_TRUE(file_util->origin_database_ != NULL);
691
692 // Callback to Drop DB is called while ObfuscatedFileUtilTest is
693 // still alive.
694 file_util->db_flush_delay_seconds_ = 0;
695 file_util->MarkUsed();
696 base::RunLoop().RunUntilIdle();
697
698 ASSERT_TRUE(file_util->origin_database_ == NULL);
699 }
700
701 void MaybeDropDatabasesAlreadyDeletedCaseTestBody() {
702 // Run message loop after OFU is already deleted to make sure callback
703 // doesn't cause a crash for use after free.
704 {
705 scoped_ptr<ObfuscatedFileUtil> file_util = CreateObfuscatedFileUtil(NULL);
706 file_util->InitOriginDatabase(GURL(), true /*create*/);
707 file_util->db_flush_delay_seconds_ = 0;
708 file_util->MarkUsed();
709 }
710
711 // At this point the callback is still in the message queue but OFU is gone.
712 base::RunLoop().RunUntilIdle();
713 }
714
715 void DestroyDirectoryDatabase_IsolatedTestBody() {
716 storage_policy_->AddIsolated(origin_);
717 scoped_ptr<ObfuscatedFileUtil> file_util = CreateObfuscatedFileUtil(
718 storage_policy_.get());
719 const FileSystemURL url = FileSystemURL::CreateForTest(
720 origin_, kFileSystemTypePersistent, base::FilePath());
721
722 // Create DirectoryDatabase for isolated origin.
723 SandboxDirectoryDatabase* db =
724 file_util->GetDirectoryDatabase(url, true /* create */);
725 ASSERT_TRUE(db != NULL);
726
727 // Destory it.
728 ASSERT_TRUE(file_util->DestroyDirectoryDatabase(
729 url.origin(), GetTypeString(url.type())));
730 ASSERT_TRUE(file_util->directories_.empty());
731 }
732
733 void GetDirectoryDatabase_IsolatedTestBody() {
734 storage_policy_->AddIsolated(origin_);
735 scoped_ptr<ObfuscatedFileUtil> file_util = CreateObfuscatedFileUtil(
736 storage_policy_.get());
737 const FileSystemURL url = FileSystemURL::CreateForTest(
738 origin_, kFileSystemTypePersistent, base::FilePath());
739
740 // Create DirectoryDatabase for isolated origin.
741 SandboxDirectoryDatabase* db =
742 file_util->GetDirectoryDatabase(url, true /* create */);
743 ASSERT_TRUE(db != NULL);
744 ASSERT_EQ(1U, file_util->directories_.size());
745
746 // Remove isolated.
747 storage_policy_->RemoveIsolated(url.origin());
748
749 // This should still get the same database.
750 SandboxDirectoryDatabase* db2 =
751 file_util->GetDirectoryDatabase(url, false /* create */);
752 ASSERT_EQ(db, db2);
753 }
754
755 void MigrationBackFromIsolatedTestBody() {
756 std::string kFakeDirectoryData("0123456789");
757 base::FilePath old_directory_db_path;
758
759 // Initialize the directory with one origin using
760 // SandboxIsolatedOriginDatabase.
761 {
762 std::string origin_string =
763 webkit_database::GetIdentifierFromOrigin(origin_);
764 SandboxIsolatedOriginDatabase database_old(
765 origin_string, data_dir_path(),
766 base::FilePath(
767 SandboxIsolatedOriginDatabase::kObsoleteOriginDirectory));
768 base::FilePath path;
769 EXPECT_TRUE(database_old.GetPathForOrigin(origin_string, &path));
770 EXPECT_FALSE(path.empty());
771
772 // Populate the origin directory with some fake data.
773 old_directory_db_path = data_dir_path().Append(path);
774 ASSERT_TRUE(base::CreateDirectory(old_directory_db_path));
775 EXPECT_EQ(static_cast<int>(kFakeDirectoryData.size()),
776 file_util::WriteFile(old_directory_db_path.AppendASCII("dummy"),
777 kFakeDirectoryData.data(),
778 kFakeDirectoryData.size()));
779 }
780
781 storage_policy_->AddIsolated(origin_);
782 scoped_ptr<ObfuscatedFileUtil> file_util = CreateObfuscatedFileUtil(
783 storage_policy_.get());
784 base::PlatformFileError error = base::PLATFORM_FILE_ERROR_FAILED;
785 base::FilePath origin_directory = file_util->GetDirectoryForOrigin(
786 origin_, true /* create */, &error);
787 EXPECT_EQ(base::PLATFORM_FILE_OK, error);
788
789 // The database is migrated from the old one.
790 EXPECT_TRUE(base::DirectoryExists(origin_directory));
791 EXPECT_FALSE(base::DirectoryExists(old_directory_db_path));
792
793 // Check we see the same contents in the new origin directory.
794 std::string origin_db_data;
795 EXPECT_TRUE(base::PathExists(origin_directory.AppendASCII("dummy")));
796 EXPECT_TRUE(base::ReadFileToString(
797 origin_directory.AppendASCII("dummy"), &origin_db_data));
798 EXPECT_EQ(kFakeDirectoryData, origin_db_data);
799 }
800
665 int64 ComputeCurrentUsage() { 801 int64 ComputeCurrentUsage() {
666 return sandbox_file_system_.ComputeCurrentOriginUsage() - 802 return sandbox_file_system_.ComputeCurrentOriginUsage() -
667 sandbox_file_system_.ComputeCurrentDirectoryDatabaseUsage(); 803 sandbox_file_system_.ComputeCurrentDirectoryDatabaseUsage();
668 } 804 }
669 805
670 FileSystemContext* file_system_context() { 806 FileSystemContext* file_system_context() {
671 return sandbox_file_system_.file_system_context(); 807 return sandbox_file_system_.file_system_context();
672 } 808 }
673 809
674 const base::FilePath& data_dir_path() const { 810 const base::FilePath& data_dir_path() const {
675 return data_dir_.path(); 811 return data_dir_.path();
676 } 812 }
677 813
678 protected: 814 protected:
679 base::ScopedTempDir data_dir_; 815 base::ScopedTempDir data_dir_;
680 base::MessageLoop message_loop_; 816 base::MessageLoop message_loop_;
681 scoped_refptr<quota::MockSpecialStoragePolicy> storage_policy_; 817 scoped_refptr<quota::MockSpecialStoragePolicy> storage_policy_;
682 scoped_refptr<quota::QuotaManager> quota_manager_; 818 scoped_refptr<quota::QuotaManager> quota_manager_;
683 scoped_refptr<FileSystemContext> file_system_context_; 819 scoped_refptr<FileSystemContext> file_system_context_;
684 GURL origin_; 820 GURL origin_;
685 fileapi::FileSystemType type_; 821 fileapi::FileSystemType type_;
686 base::WeakPtrFactory<ObfuscatedFileUtilTest> weak_factory_; 822 base::WeakPtrFactory<ObfuscatedFileUtilTest> weak_factory_;
687 SandboxFileSystemTestHelper sandbox_file_system_; 823 SandboxFileSystemTestHelper sandbox_file_system_;
688 quota::QuotaStatusCode quota_status_; 824 quota::QuotaStatusCode quota_status_;
689 int64 usage_; 825 int64 usage_;
690 MockFileChangeObserver change_observer_; 826 fileapi::MockFileChangeObserver change_observer_;
691 ChangeObserverList change_observers_; 827 fileapi::ChangeObserverList change_observers_;
692 828
693 private: 829 private:
694 DISALLOW_COPY_AND_ASSIGN(ObfuscatedFileUtilTest); 830 DISALLOW_COPY_AND_ASSIGN(ObfuscatedFileUtilTest);
695 }; 831 };
696 832
697 TEST_F(ObfuscatedFileUtilTest, TestCreateAndDeleteFile) { 833 TEST_F(ObfuscatedFileUtilTest, TestCreateAndDeleteFile) {
698 base::PlatformFile file_handle = base::kInvalidPlatformFileValue; 834 base::PlatformFile file_handle = base::kInvalidPlatformFileValue;
699 bool created; 835 bool created;
700 FileSystemURL url = CreateURLFromUTF8("fake/file"); 836 FileSystemURL url = CreateURLFromUTF8("fake/file");
701 scoped_ptr<FileSystemOperationContext> context(NewContext(NULL)); 837 scoped_ptr<FileSystemOperationContext> context(NewContext(NULL));
(...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after
1113 1249
1114 TEST_F(ObfuscatedFileUtilTest, TestReadDirectoryOnFile) { 1250 TEST_F(ObfuscatedFileUtilTest, TestReadDirectoryOnFile) {
1115 FileSystemURL url = CreateURLFromUTF8("file"); 1251 FileSystemURL url = CreateURLFromUTF8("file");
1116 scoped_ptr<FileSystemOperationContext> context(NewContext(NULL)); 1252 scoped_ptr<FileSystemOperationContext> context(NewContext(NULL));
1117 1253
1118 bool created = false; 1254 bool created = false;
1119 ASSERT_EQ(base::PLATFORM_FILE_OK, 1255 ASSERT_EQ(base::PLATFORM_FILE_OK,
1120 ofu()->EnsureFileExists(context.get(), url, &created)); 1256 ofu()->EnsureFileExists(context.get(), url, &created));
1121 ASSERT_TRUE(created); 1257 ASSERT_TRUE(created);
1122 1258
1123 std::vector<DirectoryEntry> entries; 1259 std::vector<fileapi::DirectoryEntry> entries;
1124 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_A_DIRECTORY, 1260 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_A_DIRECTORY,
1125 AsyncFileTestHelper::ReadDirectory( 1261 AsyncFileTestHelper::ReadDirectory(
1126 file_system_context(), url, &entries)); 1262 file_system_context(), url, &entries));
1127 1263
1128 EXPECT_TRUE(ofu()->IsDirectoryEmpty(context.get(), url)); 1264 EXPECT_TRUE(ofu()->IsDirectoryEmpty(context.get(), url));
1129 } 1265 }
1130 1266
1131 TEST_F(ObfuscatedFileUtilTest, TestTouch) { 1267 TEST_F(ObfuscatedFileUtilTest, TestTouch) {
1132 FileSystemURL url = CreateURLFromUTF8("file"); 1268 FileSystemURL url = CreateURLFromUTF8("file");
1133 scoped_ptr<FileSystemOperationContext> context(NewContext(NULL)); 1269 scoped_ptr<FileSystemOperationContext> context(NewContext(NULL));
(...skipping 426 matching lines...) Expand 10 before | Expand all | Expand 10 after
1560 origins_expected.end(), origins_found.begin(), origins_found.end(), 1696 origins_expected.end(), origins_found.begin(), origins_found.end(),
1561 inserter(diff, diff.begin())); 1697 inserter(diff, diff.begin()));
1562 EXPECT_TRUE(diff.empty()); 1698 EXPECT_TRUE(diff.empty());
1563 } 1699 }
1564 1700
1565 TEST_F(ObfuscatedFileUtilTest, TestRevokeUsageCache) { 1701 TEST_F(ObfuscatedFileUtilTest, TestRevokeUsageCache) {
1566 scoped_ptr<FileSystemOperationContext> context(NewContext(NULL)); 1702 scoped_ptr<FileSystemOperationContext> context(NewContext(NULL));
1567 1703
1568 int64 expected_quota = 0; 1704 int64 expected_quota = 0;
1569 1705
1570 for (size_t i = 0; i < test::kRegularTestCaseSize; ++i) { 1706 for (size_t i = 0; i < fileapi::test::kRegularTestCaseSize; ++i) {
1571 SCOPED_TRACE(testing::Message() << "Creating kRegularTestCase " << i); 1707 SCOPED_TRACE(testing::Message() << "Creating kRegularTestCase " << i);
1572 const test::TestCaseRecord& test_case = test::kRegularTestCases[i]; 1708 const fileapi::test::TestCaseRecord& test_case =
1709 fileapi::test::kRegularTestCases[i];
1573 base::FilePath file_path(test_case.path); 1710 base::FilePath file_path(test_case.path);
1574 expected_quota += ObfuscatedFileUtil::ComputeFilePathCost(file_path); 1711 expected_quota += ObfuscatedFileUtil::ComputeFilePathCost(file_path);
1575 if (test_case.is_directory) { 1712 if (test_case.is_directory) {
1576 bool exclusive = true; 1713 bool exclusive = true;
1577 bool recursive = false; 1714 bool recursive = false;
1578 ASSERT_EQ(base::PLATFORM_FILE_OK, 1715 ASSERT_EQ(base::PLATFORM_FILE_OK,
1579 ofu()->CreateDirectory(context.get(), CreateURL(file_path), 1716 ofu()->CreateDirectory(context.get(), CreateURL(file_path),
1580 exclusive, recursive)); 1717 exclusive, recursive));
1581 } else { 1718 } else {
1582 bool created = false; 1719 bool created = false;
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
1695 scoped_ptr<FileSystemOperationContext> context; 1832 scoped_ptr<FileSystemOperationContext> context;
1696 1833
1697 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kPath); ++i) { 1834 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kPath); ++i) {
1698 bool created = false; 1835 bool created = false;
1699 context.reset(NewContext(NULL)); 1836 context.reset(NewContext(NULL));
1700 EXPECT_EQ(base::PLATFORM_FILE_OK, 1837 EXPECT_EQ(base::PLATFORM_FILE_OK,
1701 ofu()->EnsureFileExists(context.get(), kPath[i], &created)); 1838 ofu()->EnsureFileExists(context.get(), kPath[i], &created));
1702 EXPECT_TRUE(created); 1839 EXPECT_TRUE(created);
1703 } 1840 }
1704 1841
1705 std::vector<DirectoryEntry> entries; 1842 std::vector<fileapi::DirectoryEntry> entries;
1706 EXPECT_EQ(base::PLATFORM_FILE_OK, 1843 EXPECT_EQ(base::PLATFORM_FILE_OK,
1707 AsyncFileTestHelper::ReadDirectory( 1844 AsyncFileTestHelper::ReadDirectory(
1708 file_system_context(), empty_path, &entries)); 1845 file_system_context(), empty_path, &entries));
1709 EXPECT_EQ(3u, entries.size()); 1846 EXPECT_EQ(3u, entries.size());
1710 1847
1711 base::FilePath local_path; 1848 base::FilePath local_path;
1712 EXPECT_EQ(base::PLATFORM_FILE_OK, 1849 EXPECT_EQ(base::PLATFORM_FILE_OK,
1713 ofu()->GetLocalFilePath(context.get(), kPath[0], &local_path)); 1850 ofu()->GetLocalFilePath(context.get(), kPath[0], &local_path));
1714 EXPECT_TRUE(base::DeleteFile(local_path, false)); 1851 EXPECT_TRUE(base::DeleteFile(local_path, false));
1715 1852
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after
1952 ofu()->GetLocalFilePath(context.get(), url1, &file_path)); 2089 ofu()->GetLocalFilePath(context.get(), url1, &file_path));
1953 EXPECT_FALSE(file_path.empty()); 2090 EXPECT_FALSE(file_path.empty());
1954 2091
1955 context.reset(NewContext(NULL)); 2092 context.reset(NewContext(NULL));
1956 EXPECT_EQ(base::PLATFORM_FILE_OK, 2093 EXPECT_EQ(base::PLATFORM_FILE_OK,
1957 ofu()->Touch(context.get(), url1, 2094 ofu()->Touch(context.get(), url1,
1958 base::Time::Now() + base::TimeDelta::FromHours(1), 2095 base::Time::Now() + base::TimeDelta::FromHours(1),
1959 base::Time())); 2096 base::Time()));
1960 2097
1961 context.reset(NewContext(NULL)); 2098 context.reset(NewContext(NULL));
1962 scoped_ptr<FileSystemFileUtil::AbstractFileEnumerator> file_enum( 2099 scoped_ptr<fileapi::FileSystemFileUtil::AbstractFileEnumerator> file_enum(
1963 ofu()->CreateFileEnumerator(context.get(), dir, false)); 2100 ofu()->CreateFileEnumerator(context.get(), dir, false));
1964 2101
1965 int count = 0; 2102 int count = 0;
1966 base::FilePath file_path_each; 2103 base::FilePath file_path_each;
1967 while (!(file_path_each = file_enum->Next()).empty()) { 2104 while (!(file_path_each = file_enum->Next()).empty()) {
1968 context.reset(NewContext(NULL)); 2105 context.reset(NewContext(NULL));
1969 base::PlatformFileInfo file_info; 2106 base::PlatformFileInfo file_info;
1970 base::FilePath file_path; 2107 base::FilePath file_path;
1971 EXPECT_EQ(base::PLATFORM_FILE_OK, 2108 EXPECT_EQ(base::PLATFORM_FILE_OK,
1972 ofu()->GetFileInfo(context.get(), 2109 ofu()->GetFileInfo(context.get(),
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after
2305 ASSERT_EQ(base::PLATFORM_FILE_OK, 2442 ASSERT_EQ(base::PLATFORM_FILE_OK,
2306 ofu()->CreateOrOpen( 2443 ofu()->CreateOrOpen(
2307 AllowUsageIncrease(-length)->context(), file, 2444 AllowUsageIncrease(-length)->context(), file,
2308 base::PLATFORM_FILE_OPEN_TRUNCATED | base::PLATFORM_FILE_WRITE, 2445 base::PLATFORM_FILE_OPEN_TRUNCATED | base::PLATFORM_FILE_WRITE,
2309 &file_handle, &created)); 2446 &file_handle, &created));
2310 ASSERT_EQ(0, ComputeTotalFileSize()); 2447 ASSERT_EQ(0, ComputeTotalFileSize());
2311 EXPECT_TRUE(base::ClosePlatformFile(file_handle)); 2448 EXPECT_TRUE(base::ClosePlatformFile(file_handle));
2312 } 2449 }
2313 2450
2314 TEST_F(ObfuscatedFileUtilTest, MaybeDropDatabasesAliveCase) { 2451 TEST_F(ObfuscatedFileUtilTest, MaybeDropDatabasesAliveCase) {
2315 scoped_ptr<ObfuscatedFileUtil> file_util( 2452 MaybeDropDatabasesAliveCaseTestBody();
2316 ObfuscatedFileUtil::CreateForTesting(
2317 NULL, data_dir_path(),
2318 base::MessageLoopProxy::current().get()));
2319 file_util->InitOriginDatabase(GURL(), true /*create*/);
2320 ASSERT_TRUE(file_util->origin_database_ != NULL);
2321
2322 // Callback to Drop DB is called while ObfuscatedFileUtilTest is still alive.
2323 file_util->db_flush_delay_seconds_ = 0;
2324 file_util->MarkUsed();
2325 base::RunLoop().RunUntilIdle();
2326
2327 ASSERT_TRUE(file_util->origin_database_ == NULL);
2328 } 2453 }
2329 2454
2330 TEST_F(ObfuscatedFileUtilTest, MaybeDropDatabasesAlreadyDeletedCase) { 2455 TEST_F(ObfuscatedFileUtilTest, MaybeDropDatabasesAlreadyDeletedCase) {
2331 // Run message loop after OFU is already deleted to make sure callback doesn't 2456 MaybeDropDatabasesAlreadyDeletedCaseTestBody();
2332 // cause a crash for use after free.
2333 {
2334 scoped_ptr<ObfuscatedFileUtil> file_util(
2335 ObfuscatedFileUtil::CreateForTesting(
2336 NULL, data_dir_path(),
2337 base::MessageLoopProxy::current().get()));
2338 file_util->InitOriginDatabase(GURL(), true /*create*/);
2339 file_util->db_flush_delay_seconds_ = 0;
2340 file_util->MarkUsed();
2341 }
2342
2343 // At this point the callback is still in the message queue but OFU is gone.
2344 base::RunLoop().RunUntilIdle();
2345 } 2457 }
2346 2458
2347 TEST_F(ObfuscatedFileUtilTest, DestroyDirectoryDatabase_Isolated) { 2459 TEST_F(ObfuscatedFileUtilTest, DestroyDirectoryDatabase_Isolated) {
2348 storage_policy_->AddIsolated(origin_); 2460 DestroyDirectoryDatabase_IsolatedTestBody();
2349 scoped_ptr<ObfuscatedFileUtil> file_util(
2350 ObfuscatedFileUtil::CreateForTesting(
2351 storage_policy_.get(), data_dir_path(),
2352 base::MessageLoopProxy::current().get()));
2353 const FileSystemURL url = FileSystemURL::CreateForTest(
2354 origin_, kFileSystemTypePersistent, base::FilePath());
2355
2356 // Create DirectoryDatabase for isolated origin.
2357 SandboxDirectoryDatabase* db =
2358 file_util->GetDirectoryDatabase(url, true /* create */);
2359 ASSERT_TRUE(db != NULL);
2360
2361 // Destory it.
2362 ASSERT_TRUE(file_util->DestroyDirectoryDatabase(
2363 url.origin(), GetTypeString(url.type())));
2364 ASSERT_TRUE(file_util->directories_.empty());
2365 } 2461 }
2366 2462
2367 TEST_F(ObfuscatedFileUtilTest, GetDirectoryDatabase_Isolated) { 2463 TEST_F(ObfuscatedFileUtilTest, GetDirectoryDatabase_Isolated) {
2368 storage_policy_->AddIsolated(origin_); 2464 GetDirectoryDatabase_IsolatedTestBody();
2369 scoped_ptr<ObfuscatedFileUtil> file_util(
2370 ObfuscatedFileUtil::CreateForTesting(
2371 storage_policy_.get(), data_dir_path(),
2372 base::MessageLoopProxy::current().get()));
2373 const FileSystemURL url = FileSystemURL::CreateForTest(
2374 origin_, kFileSystemTypePersistent, base::FilePath());
2375
2376 // Create DirectoryDatabase for isolated origin.
2377 SandboxDirectoryDatabase* db =
2378 file_util->GetDirectoryDatabase(url, true /* create */);
2379 ASSERT_TRUE(db != NULL);
2380 ASSERT_EQ(1U, file_util->directories_.size());
2381
2382 // Remove isolated.
2383 storage_policy_->RemoveIsolated(url.origin());
2384
2385 // This should still get the same database.
2386 SandboxDirectoryDatabase* db2 =
2387 file_util->GetDirectoryDatabase(url, false /* create */);
2388 ASSERT_EQ(db, db2);
2389 } 2465 }
2390 2466
2391 TEST_F(ObfuscatedFileUtilTest, MigrationBackFromIsolated) { 2467 TEST_F(ObfuscatedFileUtilTest, MigrationBackFromIsolated) {
2392 std::string kFakeDirectoryData("0123456789"); 2468 MigrationBackFromIsolatedTestBody();
2393 base::FilePath old_directory_db_path;
2394
2395 // Initialize the directory with one origin using
2396 // SandboxIsolatedOriginDatabase.
2397 {
2398 std::string origin_string =
2399 webkit_database::GetIdentifierFromOrigin(origin_);
2400 SandboxIsolatedOriginDatabase database_old(
2401 origin_string, data_dir_path(),
2402 base::FilePath(
2403 SandboxIsolatedOriginDatabase::kObsoleteOriginDirectory));
2404 base::FilePath path;
2405 EXPECT_TRUE(database_old.GetPathForOrigin(origin_string, &path));
2406 EXPECT_FALSE(path.empty());
2407
2408 // Populate the origin directory with some fake data.
2409 old_directory_db_path = data_dir_path().Append(path);
2410 ASSERT_TRUE(base::CreateDirectory(old_directory_db_path));
2411 EXPECT_EQ(static_cast<int>(kFakeDirectoryData.size()),
2412 file_util::WriteFile(old_directory_db_path.AppendASCII("dummy"),
2413 kFakeDirectoryData.data(),
2414 kFakeDirectoryData.size()));
2415 }
2416
2417 storage_policy_->AddIsolated(origin_);
2418 scoped_ptr<ObfuscatedFileUtil> file_util(
2419 ObfuscatedFileUtil::CreateForTesting(
2420 storage_policy_.get(), data_dir_path(),
2421 base::MessageLoopProxy::current().get()));
2422 base::PlatformFileError error = base::PLATFORM_FILE_ERROR_FAILED;
2423 base::FilePath origin_directory = file_util->GetDirectoryForOrigin(
2424 origin_, true /* create */, &error);
2425 EXPECT_EQ(base::PLATFORM_FILE_OK, error);
2426
2427 // The database is migrated from the old one.
2428 EXPECT_TRUE(base::DirectoryExists(origin_directory));
2429 EXPECT_FALSE(base::DirectoryExists(old_directory_db_path));
2430
2431 // Check we see the same contents in the new origin directory.
2432 std::string origin_db_data;
2433 EXPECT_TRUE(base::PathExists(origin_directory.AppendASCII("dummy")));
2434 EXPECT_TRUE(base::ReadFileToString(
2435 origin_directory.AppendASCII("dummy"), &origin_db_data));
2436 EXPECT_EQ(kFakeDirectoryData, origin_db_data);
2437 } 2469 }
2438 2470
2439 TEST_F(ObfuscatedFileUtilTest, OpenPathInNonDirectory) { 2471 TEST_F(ObfuscatedFileUtilTest, OpenPathInNonDirectory) {
2440 FileSystemURL file(CreateURLFromUTF8("file")); 2472 FileSystemURL file(CreateURLFromUTF8("file"));
2441 FileSystemURL path_in_file(CreateURLFromUTF8("file/file")); 2473 FileSystemURL path_in_file(CreateURLFromUTF8("file/file"));
2442 bool created; 2474 bool created;
2443 2475
2444 ASSERT_EQ(base::PLATFORM_FILE_OK, 2476 ASSERT_EQ(base::PLATFORM_FILE_OK,
2445 ofu()->EnsureFileExists(UnlimitedContext().get(), file, &created)); 2477 ofu()->EnsureFileExists(UnlimitedContext().get(), file, &created));
2446 ASSERT_TRUE(created); 2478 ASSERT_TRUE(created);
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
2480 path_in_file, 2512 path_in_file,
2481 false /* exclusive */, 2513 false /* exclusive */,
2482 true /* recursive */)); 2514 true /* recursive */));
2483 ASSERT_EQ(base::PLATFORM_FILE_ERROR_NOT_A_DIRECTORY, 2515 ASSERT_EQ(base::PLATFORM_FILE_ERROR_NOT_A_DIRECTORY,
2484 ofu()->CreateDirectory(UnlimitedContext().get(), 2516 ofu()->CreateDirectory(UnlimitedContext().get(),
2485 path_in_file_in_file, 2517 path_in_file_in_file,
2486 false /* exclusive */, 2518 false /* exclusive */,
2487 true /* recursive */)); 2519 true /* recursive */));
2488 } 2520 }
2489 2521
2490 } // namespace fileapi 2522 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698