| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "content/browser/dom_storage/local_storage_context_mojo.h" | 5 #include "content/browser/dom_storage/local_storage_context_mojo.h" |
| 6 | 6 |
| 7 #include "base/files/file_enumerator.h" | 7 #include "base/files/file_enumerator.h" |
| 8 #include "base/files/scoped_temp_dir.h" | 8 #include "base/files/scoped_temp_dir.h" |
| 9 #include "base/run_loop.h" | 9 #include "base/run_loop.h" |
| 10 #include "base/strings/utf_string_conversions.h" | 10 #include "base/strings/utf_string_conversions.h" |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 #include "content/test/mock_leveldb_database.h" | 21 #include "content/test/mock_leveldb_database.h" |
| 22 #include "mojo/public/cpp/bindings/associated_binding.h" | 22 #include "mojo/public/cpp/bindings/associated_binding.h" |
| 23 #include "mojo/public/cpp/bindings/binding.h" | 23 #include "mojo/public/cpp/bindings/binding.h" |
| 24 #include "mojo/public/cpp/bindings/binding_set.h" | 24 #include "mojo/public/cpp/bindings/binding_set.h" |
| 25 #include "services/file/file_service.h" | 25 #include "services/file/file_service.h" |
| 26 #include "services/file/public/interfaces/constants.mojom.h" | 26 #include "services/file/public/interfaces/constants.mojom.h" |
| 27 #include "services/file/user_id_map.h" | 27 #include "services/file/user_id_map.h" |
| 28 #include "services/service_manager/public/cpp/service_context.h" | 28 #include "services/service_manager/public/cpp/service_context.h" |
| 29 #include "services/service_manager/public/cpp/service_test.h" | 29 #include "services/service_manager/public/cpp/service_test.h" |
| 30 #include "services/service_manager/public/interfaces/service_factory.mojom.h" | 30 #include "services/service_manager/public/interfaces/service_factory.mojom.h" |
| 31 #include "storage/browser/test/mock_special_storage_policy.h" |
| 31 #include "testing/gtest/include/gtest/gtest.h" | 32 #include "testing/gtest/include/gtest/gtest.h" |
| 32 #include "third_party/leveldatabase/env_chromium.h" | 33 #include "third_party/leveldatabase/env_chromium.h" |
| 33 #include "third_party/leveldatabase/src/include/leveldb/db.h" | 34 #include "third_party/leveldatabase/src/include/leveldb/db.h" |
| 34 | 35 |
| 35 using leveldb::StdStringToUint8Vector; | 36 using leveldb::StdStringToUint8Vector; |
| 36 using leveldb::Uint8VectorToStdString; | 37 using leveldb::Uint8VectorToStdString; |
| 37 | 38 |
| 38 namespace content { | 39 namespace content { |
| 39 | 40 |
| 40 namespace { | 41 namespace { |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 110 }; | 111 }; |
| 111 | 112 |
| 112 } // namespace | 113 } // namespace |
| 113 | 114 |
| 114 class LocalStorageContextMojoTest : public testing::Test { | 115 class LocalStorageContextMojoTest : public testing::Test { |
| 115 public: | 116 public: |
| 116 LocalStorageContextMojoTest() | 117 LocalStorageContextMojoTest() |
| 117 : db_(&mock_data_), | 118 : db_(&mock_data_), |
| 118 db_binding_(&db_), | 119 db_binding_(&db_), |
| 119 task_runner_(new MockDOMStorageTaskRunner( | 120 task_runner_(new MockDOMStorageTaskRunner( |
| 120 base::ThreadTaskRunnerHandle::Get().get())) { | 121 base::ThreadTaskRunnerHandle::Get().get())), |
| 122 mock_special_storage_policy_(new MockSpecialStoragePolicy()) { |
| 121 EXPECT_TRUE(temp_path_.CreateUniqueTempDir()); | 123 EXPECT_TRUE(temp_path_.CreateUniqueTempDir()); |
| 122 dom_storage_context_ = new DOMStorageContextImpl( | 124 dom_storage_context_ = new DOMStorageContextImpl( |
| 123 temp_path_.GetPath(), base::FilePath(), nullptr, task_runner_); | 125 temp_path_.GetPath(), base::FilePath(), nullptr, task_runner_); |
| 124 } | 126 } |
| 125 | 127 |
| 126 ~LocalStorageContextMojoTest() override { | 128 ~LocalStorageContextMojoTest() override { |
| 127 if (dom_storage_context_) | 129 if (dom_storage_context_) |
| 128 dom_storage_context_->Shutdown(); | 130 dom_storage_context_->Shutdown(); |
| 131 if (context_) |
| 132 ShutdownContext(); |
| 129 } | 133 } |
| 130 | 134 |
| 131 LocalStorageContextMojo* context() { | 135 LocalStorageContextMojo* context() { |
| 132 if (!context_) { | 136 if (!context_) { |
| 133 context_ = base::MakeUnique<LocalStorageContextMojo>( | 137 context_ = new LocalStorageContextMojo( |
| 134 nullptr, task_runner_, temp_path_.GetPath(), | 138 nullptr, task_runner_, temp_path_.GetPath(), |
| 135 base::FilePath(FILE_PATH_LITERAL("leveldb"))); | 139 base::FilePath(FILE_PATH_LITERAL("leveldb")), |
| 140 special_storage_policy()); |
| 136 db_binding_.Bind(context_->DatabaseRequestForTesting()); | 141 db_binding_.Bind(context_->DatabaseRequestForTesting()); |
| 137 } | 142 } |
| 138 return context_.get(); | 143 return context_; |
| 144 } |
| 145 |
| 146 void ShutdownContext() { |
| 147 context_->ShutdownAndDelete(); |
| 148 context_ = nullptr; |
| 149 base::RunLoop().RunUntilIdle(); |
| 139 } | 150 } |
| 140 | 151 |
| 141 DOMStorageNamespace* local_storage_namespace() { | 152 DOMStorageNamespace* local_storage_namespace() { |
| 142 return dom_storage_context_->GetStorageNamespace(kLocalStorageNamespaceId); | 153 return dom_storage_context_->GetStorageNamespace(kLocalStorageNamespaceId); |
| 143 } | 154 } |
| 144 | 155 |
| 156 MockSpecialStoragePolicy* special_storage_policy() { |
| 157 return mock_special_storage_policy_.get(); |
| 158 } |
| 159 |
| 145 void FlushAndPurgeDOMStorageMemory() { | 160 void FlushAndPurgeDOMStorageMemory() { |
| 146 dom_storage_context_->Flush(); | 161 dom_storage_context_->Flush(); |
| 147 base::RunLoop().RunUntilIdle(); | 162 base::RunLoop().RunUntilIdle(); |
| 148 dom_storage_context_->PurgeMemory(DOMStorageContextImpl::PURGE_AGGRESSIVE); | 163 dom_storage_context_->PurgeMemory(DOMStorageContextImpl::PURGE_AGGRESSIVE); |
| 149 } | 164 } |
| 150 | 165 |
| 151 const std::map<std::vector<uint8_t>, std::vector<uint8_t>>& mock_data() { | 166 const std::map<std::vector<uint8_t>, std::vector<uint8_t>>& mock_data() { |
| 152 return mock_data_; | 167 return mock_data_; |
| 153 } | 168 } |
| 154 | 169 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 168 private: | 183 private: |
| 169 TestBrowserThreadBundle thread_bundle_; | 184 TestBrowserThreadBundle thread_bundle_; |
| 170 base::ScopedTempDir temp_path_; | 185 base::ScopedTempDir temp_path_; |
| 171 std::map<std::vector<uint8_t>, std::vector<uint8_t>> mock_data_; | 186 std::map<std::vector<uint8_t>, std::vector<uint8_t>> mock_data_; |
| 172 MockLevelDBDatabase db_; | 187 MockLevelDBDatabase db_; |
| 173 mojo::AssociatedBinding<leveldb::mojom::LevelDBDatabase> db_binding_; | 188 mojo::AssociatedBinding<leveldb::mojom::LevelDBDatabase> db_binding_; |
| 174 | 189 |
| 175 scoped_refptr<MockDOMStorageTaskRunner> task_runner_; | 190 scoped_refptr<MockDOMStorageTaskRunner> task_runner_; |
| 176 scoped_refptr<DOMStorageContextImpl> dom_storage_context_; | 191 scoped_refptr<DOMStorageContextImpl> dom_storage_context_; |
| 177 | 192 |
| 178 std::unique_ptr<LocalStorageContextMojo> context_; | 193 LocalStorageContextMojo* context_ = nullptr; |
| 194 |
| 195 scoped_refptr<MockSpecialStoragePolicy> mock_special_storage_policy_; |
| 179 | 196 |
| 180 DISALLOW_COPY_AND_ASSIGN(LocalStorageContextMojoTest); | 197 DISALLOW_COPY_AND_ASSIGN(LocalStorageContextMojoTest); |
| 181 }; | 198 }; |
| 182 | 199 |
| 183 TEST_F(LocalStorageContextMojoTest, Basic) { | 200 TEST_F(LocalStorageContextMojoTest, Basic) { |
| 184 auto key = StdStringToUint8Vector("key"); | 201 auto key = StdStringToUint8Vector("key"); |
| 185 auto value = StdStringToUint8Vector("value"); | 202 auto value = StdStringToUint8Vector("value"); |
| 186 | 203 |
| 187 mojom::LevelDBWrapperPtr wrapper; | 204 mojom::LevelDBWrapperPtr wrapper; |
| 188 context()->OpenLocalStorage(url::Origin(GURL("http://foobar.com")), | 205 context()->OpenLocalStorage(url::Origin(GURL("http://foobar.com")), |
| (...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 600 run_loop.Run(); | 617 run_loop.Run(); |
| 601 EXPECT_TRUE(success); | 618 EXPECT_TRUE(success); |
| 602 EXPECT_EQ(LocalStorageContextMojo::MigrateString(value), result); | 619 EXPECT_EQ(LocalStorageContextMojo::MigrateString(value), result); |
| 603 | 620 |
| 604 // Origin1 should no longer exist in old storage. | 621 // Origin1 should no longer exist in old storage. |
| 605 area = local->OpenStorageArea(origin1.GetURL()); | 622 area = local->OpenStorageArea(origin1.GetURL()); |
| 606 ASSERT_EQ(0u, area->Length()); | 623 ASSERT_EQ(0u, area->Length()); |
| 607 local->CloseStorageArea(area); | 624 local->CloseStorageArea(area); |
| 608 } | 625 } |
| 609 | 626 |
| 627 TEST_F(LocalStorageContextMojoTest, ShutdownClearsData) { |
| 628 url::Origin origin1(GURL("http://foobar.com")); |
| 629 url::Origin origin2(GURL("http://example.com")); |
| 630 auto key1 = StdStringToUint8Vector("key1"); |
| 631 auto key2 = StdStringToUint8Vector("key"); |
| 632 auto value = StdStringToUint8Vector("value"); |
| 633 |
| 634 mojom::LevelDBWrapperPtr wrapper; |
| 635 context()->OpenLocalStorage(origin1, MakeRequest(&wrapper)); |
| 636 wrapper->Put(key1, value, "source", base::Bind(&NoOpSuccess)); |
| 637 wrapper->Put(key2, value, "source", base::Bind(&NoOpSuccess)); |
| 638 wrapper.reset(); |
| 639 |
| 640 context()->OpenLocalStorage(origin2, MakeRequest(&wrapper)); |
| 641 wrapper->Put(key2, value, "source", base::Bind(&NoOpSuccess)); |
| 642 wrapper.reset(); |
| 643 |
| 644 // Make sure all data gets committed to the DB. |
| 645 base::RunLoop().RunUntilIdle(); |
| 646 |
| 647 special_storage_policy()->AddSessionOnly(origin1.GetURL()); |
| 648 ShutdownContext(); |
| 649 |
| 650 // Data from origin2 should exist, including meta-data, but nothing should |
| 651 // exist for origin1. |
| 652 EXPECT_EQ(3u, mock_data().size()); |
| 653 for (const auto& it : mock_data()) { |
| 654 if (Uint8VectorToStdString(it.first) == "VERSION") |
| 655 continue; |
| 656 EXPECT_EQ(std::string::npos, |
| 657 Uint8VectorToStdString(it.first).find(origin1.Serialize())); |
| 658 EXPECT_NE(std::string::npos, |
| 659 Uint8VectorToStdString(it.first).find(origin2.Serialize())); |
| 660 } |
| 661 } |
| 662 |
| 610 namespace { | 663 namespace { |
| 611 | 664 |
| 612 class ServiceTestClient : public service_manager::test::ServiceTestClient, | 665 class ServiceTestClient : public service_manager::test::ServiceTestClient, |
| 613 public service_manager::mojom::ServiceFactory { | 666 public service_manager::mojom::ServiceFactory { |
| 614 public: | 667 public: |
| 615 explicit ServiceTestClient(service_manager::test::ServiceTest* test) | 668 explicit ServiceTestClient(service_manager::test::ServiceTest* test) |
| 616 : service_manager::test::ServiceTestClient(test) { | 669 : service_manager::test::ServiceTestClient(test) { |
| 617 registry_.AddInterface<service_manager::mojom::ServiceFactory>(base::Bind( | 670 registry_.AddInterface<service_manager::mojom::ServiceFactory>(base::Bind( |
| 618 &ServiceTestClient::BindServiceFactoryRequest, base::Unretained(this))); | 671 &ServiceTestClient::BindServiceFactoryRequest, base::Unretained(this))); |
| 619 } | 672 } |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 712 } | 765 } |
| 713 | 766 |
| 714 private: | 767 private: |
| 715 TestBrowserThreadBundle thread_bundle_; | 768 TestBrowserThreadBundle thread_bundle_; |
| 716 base::ScopedTempDir temp_path_; | 769 base::ScopedTempDir temp_path_; |
| 717 | 770 |
| 718 DISALLOW_COPY_AND_ASSIGN(LocalStorageContextMojoTestWithService); | 771 DISALLOW_COPY_AND_ASSIGN(LocalStorageContextMojoTestWithService); |
| 719 }; | 772 }; |
| 720 | 773 |
| 721 TEST_F(LocalStorageContextMojoTestWithService, InMemory) { | 774 TEST_F(LocalStorageContextMojoTestWithService, InMemory) { |
| 722 auto context = base::MakeUnique<LocalStorageContextMojo>( | 775 auto* context = new LocalStorageContextMojo( |
| 723 connector(), nullptr, base::FilePath(), base::FilePath()); | 776 connector(), nullptr, base::FilePath(), base::FilePath(), nullptr); |
| 724 auto key = StdStringToUint8Vector("key"); | 777 auto key = StdStringToUint8Vector("key"); |
| 725 auto value = StdStringToUint8Vector("value"); | 778 auto value = StdStringToUint8Vector("value"); |
| 726 | 779 |
| 727 mojom::LevelDBWrapperPtr wrapper; | 780 mojom::LevelDBWrapperPtr wrapper; |
| 728 context->OpenLocalStorage(url::Origin(GURL("http://foobar.com")), | 781 context->OpenLocalStorage(url::Origin(GURL("http://foobar.com")), |
| 729 MakeRequest(&wrapper)); | 782 MakeRequest(&wrapper)); |
| 730 | 783 |
| 731 DoTestPut(context.get(), key, value); | 784 DoTestPut(context, key, value); |
| 732 std::vector<uint8_t> result; | 785 std::vector<uint8_t> result; |
| 733 EXPECT_TRUE(DoTestGet(context.get(), key, &result)); | 786 EXPECT_TRUE(DoTestGet(context, key, &result)); |
| 734 EXPECT_EQ(value, result); | 787 EXPECT_EQ(value, result); |
| 735 | 788 |
| 736 context.reset(); | 789 context->ShutdownAndDelete(); |
| 790 context = nullptr; |
| 737 base::RunLoop().RunUntilIdle(); | 791 base::RunLoop().RunUntilIdle(); |
| 738 | 792 |
| 739 // Should not have created any files. | 793 // Should not have created any files. |
| 740 EXPECT_TRUE(FirstEntryInDir().empty()); | 794 EXPECT_TRUE(FirstEntryInDir().empty()); |
| 741 | 795 |
| 742 // Re-opening should get fresh data. | 796 // Re-opening should get fresh data. |
| 743 context = base::MakeUnique<LocalStorageContextMojo>( | 797 context = new LocalStorageContextMojo(connector(), nullptr, base::FilePath(), |
| 744 connector(), nullptr, base::FilePath(), base::FilePath()); | 798 base::FilePath(), nullptr); |
| 745 EXPECT_FALSE(DoTestGet(context.get(), key, &result)); | 799 EXPECT_FALSE(DoTestGet(context, key, &result)); |
| 800 context->ShutdownAndDelete(); |
| 746 } | 801 } |
| 747 | 802 |
| 748 TEST_F(LocalStorageContextMojoTestWithService, InMemoryInvalidPath) { | 803 TEST_F(LocalStorageContextMojoTestWithService, InMemoryInvalidPath) { |
| 749 auto context = base::MakeUnique<LocalStorageContextMojo>( | 804 auto* context = new LocalStorageContextMojo( |
| 750 connector(), nullptr, base::FilePath(), | 805 connector(), nullptr, base::FilePath(), |
| 751 base::FilePath(FILE_PATH_LITERAL("../../"))); | 806 base::FilePath(FILE_PATH_LITERAL("../../")), nullptr); |
| 752 auto key = StdStringToUint8Vector("key"); | 807 auto key = StdStringToUint8Vector("key"); |
| 753 auto value = StdStringToUint8Vector("value"); | 808 auto value = StdStringToUint8Vector("value"); |
| 754 | 809 |
| 755 mojom::LevelDBWrapperPtr wrapper; | 810 mojom::LevelDBWrapperPtr wrapper; |
| 756 context->OpenLocalStorage(url::Origin(GURL("http://foobar.com")), | 811 context->OpenLocalStorage(url::Origin(GURL("http://foobar.com")), |
| 757 MakeRequest(&wrapper)); | 812 MakeRequest(&wrapper)); |
| 758 | 813 |
| 759 DoTestPut(context.get(), key, value); | 814 DoTestPut(context, key, value); |
| 760 std::vector<uint8_t> result; | 815 std::vector<uint8_t> result; |
| 761 EXPECT_TRUE(DoTestGet(context.get(), key, &result)); | 816 EXPECT_TRUE(DoTestGet(context, key, &result)); |
| 762 EXPECT_EQ(value, result); | 817 EXPECT_EQ(value, result); |
| 763 | 818 |
| 764 context.reset(); | 819 context->ShutdownAndDelete(); |
| 820 context = nullptr; |
| 765 base::RunLoop().RunUntilIdle(); | 821 base::RunLoop().RunUntilIdle(); |
| 766 | 822 |
| 767 // Should not have created any files. | 823 // Should not have created any files. |
| 768 EXPECT_TRUE(FirstEntryInDir().empty()); | 824 EXPECT_TRUE(FirstEntryInDir().empty()); |
| 769 } | 825 } |
| 770 | 826 |
| 771 TEST_F(LocalStorageContextMojoTestWithService, OnDisk) { | 827 TEST_F(LocalStorageContextMojoTestWithService, OnDisk) { |
| 772 base::FilePath test_path(FILE_PATH_LITERAL("test_path")); | 828 base::FilePath test_path(FILE_PATH_LITERAL("test_path")); |
| 773 auto context = base::MakeUnique<LocalStorageContextMojo>( | 829 auto* context = new LocalStorageContextMojo( |
| 774 connector(), nullptr, base::FilePath(), test_path); | 830 connector(), nullptr, base::FilePath(), test_path, nullptr); |
| 775 auto key = StdStringToUint8Vector("key"); | 831 auto key = StdStringToUint8Vector("key"); |
| 776 auto value = StdStringToUint8Vector("value"); | 832 auto value = StdStringToUint8Vector("value"); |
| 777 | 833 |
| 778 DoTestPut(context.get(), key, value); | 834 DoTestPut(context, key, value); |
| 779 std::vector<uint8_t> result; | 835 std::vector<uint8_t> result; |
| 780 EXPECT_TRUE(DoTestGet(context.get(), key, &result)); | 836 EXPECT_TRUE(DoTestGet(context, key, &result)); |
| 781 EXPECT_EQ(value, result); | 837 EXPECT_EQ(value, result); |
| 782 | 838 |
| 783 context.reset(); | 839 context->ShutdownAndDelete(); |
| 840 context = nullptr; |
| 784 base::RunLoop().RunUntilIdle(); | 841 base::RunLoop().RunUntilIdle(); |
| 785 | 842 |
| 786 // Should have created files. | 843 // Should have created files. |
| 787 EXPECT_EQ(test_path, FirstEntryInDir().BaseName()); | 844 EXPECT_EQ(test_path, FirstEntryInDir().BaseName()); |
| 788 | 845 |
| 789 // Should be able to re-open. | 846 // Should be able to re-open. |
| 790 context = base::MakeUnique<LocalStorageContextMojo>( | 847 context = new LocalStorageContextMojo(connector(), nullptr, base::FilePath(), |
| 791 connector(), nullptr, base::FilePath(), test_path); | 848 test_path, nullptr); |
| 792 EXPECT_TRUE(DoTestGet(context.get(), key, &result)); | 849 EXPECT_TRUE(DoTestGet(context, key, &result)); |
| 793 EXPECT_EQ(value, result); | 850 EXPECT_EQ(value, result); |
| 851 context->ShutdownAndDelete(); |
| 794 } | 852 } |
| 795 | 853 |
| 796 TEST_F(LocalStorageContextMojoTestWithService, InvalidVersionOnDisk) { | 854 TEST_F(LocalStorageContextMojoTestWithService, InvalidVersionOnDisk) { |
| 797 base::FilePath test_path(FILE_PATH_LITERAL("test_path")); | 855 base::FilePath test_path(FILE_PATH_LITERAL("test_path")); |
| 798 | 856 |
| 799 // Create context and add some data to it. | 857 // Create context and add some data to it. |
| 800 auto context = base::MakeUnique<LocalStorageContextMojo>( | 858 auto* context = new LocalStorageContextMojo( |
| 801 connector(), nullptr, base::FilePath(), test_path); | 859 connector(), nullptr, base::FilePath(), test_path, nullptr); |
| 802 auto key = StdStringToUint8Vector("key"); | 860 auto key = StdStringToUint8Vector("key"); |
| 803 auto value = StdStringToUint8Vector("value"); | 861 auto value = StdStringToUint8Vector("value"); |
| 804 | 862 |
| 805 DoTestPut(context.get(), key, value); | 863 DoTestPut(context, key, value); |
| 806 std::vector<uint8_t> result; | 864 std::vector<uint8_t> result; |
| 807 EXPECT_TRUE(DoTestGet(context.get(), key, &result)); | 865 EXPECT_TRUE(DoTestGet(context, key, &result)); |
| 808 EXPECT_EQ(value, result); | 866 EXPECT_EQ(value, result); |
| 809 | 867 |
| 810 context.reset(); | 868 context->ShutdownAndDelete(); |
| 869 context = nullptr; |
| 811 base::RunLoop().RunUntilIdle(); | 870 base::RunLoop().RunUntilIdle(); |
| 812 | 871 |
| 813 { | 872 { |
| 814 // Mess up version number in database. | 873 // Mess up version number in database. |
| 815 leveldb_env::ChromiumEnv env; | 874 leveldb_env::ChromiumEnv env; |
| 816 leveldb::DB* db = nullptr; | 875 leveldb::DB* db = nullptr; |
| 817 leveldb::Options options; | 876 leveldb::Options options; |
| 818 options.env = &env; | 877 options.env = &env; |
| 819 base::FilePath db_path = | 878 base::FilePath db_path = |
| 820 temp_path().Append(test_path).Append(FILE_PATH_LITERAL("leveldb")); | 879 temp_path().Append(test_path).Append(FILE_PATH_LITERAL("leveldb")); |
| 821 ASSERT_TRUE(leveldb::DB::Open(options, db_path.AsUTF8Unsafe(), &db).ok()); | 880 ASSERT_TRUE(leveldb::DB::Open(options, db_path.AsUTF8Unsafe(), &db).ok()); |
| 822 std::unique_ptr<leveldb::DB> db_owner(db); | 881 std::unique_ptr<leveldb::DB> db_owner(db); |
| 823 ASSERT_TRUE(db->Put(leveldb::WriteOptions(), "VERSION", "argh").ok()); | 882 ASSERT_TRUE(db->Put(leveldb::WriteOptions(), "VERSION", "argh").ok()); |
| 824 } | 883 } |
| 825 | 884 |
| 826 // Make sure data is gone. | 885 // Make sure data is gone. |
| 827 context = base::MakeUnique<LocalStorageContextMojo>( | 886 context = new LocalStorageContextMojo(connector(), nullptr, base::FilePath(), |
| 828 connector(), nullptr, base::FilePath(), test_path); | 887 test_path, nullptr); |
| 829 EXPECT_FALSE(DoTestGet(context.get(), key, &result)); | 888 EXPECT_FALSE(DoTestGet(context, key, &result)); |
| 830 | 889 |
| 831 // Write data again. | 890 // Write data again. |
| 832 DoTestPut(context.get(), key, value); | 891 DoTestPut(context, key, value); |
| 833 | 892 |
| 834 context.reset(); | 893 context->ShutdownAndDelete(); |
| 894 context = nullptr; |
| 835 base::RunLoop().RunUntilIdle(); | 895 base::RunLoop().RunUntilIdle(); |
| 836 | 896 |
| 837 // Data should have been preserved now. | 897 // Data should have been preserved now. |
| 838 context = base::MakeUnique<LocalStorageContextMojo>( | 898 context = new LocalStorageContextMojo(connector(), nullptr, base::FilePath(), |
| 839 connector(), nullptr, base::FilePath(), test_path); | 899 test_path, nullptr); |
| 840 EXPECT_TRUE(DoTestGet(context.get(), key, &result)); | 900 EXPECT_TRUE(DoTestGet(context, key, &result)); |
| 841 EXPECT_EQ(value, result); | 901 EXPECT_EQ(value, result); |
| 902 context->ShutdownAndDelete(); |
| 842 } | 903 } |
| 843 | 904 |
| 844 } // namespace content | 905 } // namespace content |
| OLD | NEW |