Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "components/download/internal/download_store.h" | |
| 6 | |
| 7 #include <algorithm> | |
| 8 | |
| 9 #include "base/bind.h" | |
| 10 #include "base/callback.h" | |
| 11 #include "base/guid.h" | |
| 12 #include "base/memory/ptr_util.h" | |
| 13 #include "components/download/internal/entry.h" | |
| 14 #include "components/download/internal/proto/request.pb.h" | |
| 15 #include "components/download/internal/proto_conversions.h" | |
| 16 #include "components/download/internal/test/entry_utils.h" | |
| 17 #include "components/leveldb_proto/testing/fake_db.h" | |
| 18 #include "testing/gmock/include/gmock/gmock.h" | |
| 19 #include "testing/gtest/include/gtest/gtest.h" | |
| 20 | |
| 21 using testing::_; | |
| 22 | |
| 23 namespace download { | |
| 24 | |
| 25 class DownloadStoreTest : public testing::Test { | |
| 26 public: | |
| 27 DownloadStoreTest() : db_(nullptr) {} | |
| 28 | |
| 29 ~DownloadStoreTest() override {} | |
|
David Trainor- moved to gerrit
2017/05/18 19:41:00
= default?
shaktisahu
2017/05/19 04:54:56
Done.
| |
| 30 | |
| 31 void CreateDatabase() { | |
| 32 auto db = base::MakeUnique<leveldb_proto::test::FakeDB<protodb::Entry>>( | |
| 33 &db_entries_); | |
| 34 db_ = db.get(); | |
| 35 store_.reset(new DownloadStore( | |
| 36 base::FilePath(FILE_PATH_LITERAL("/test/db/fakepath")), std::move(db))); | |
| 37 } | |
| 38 | |
| 39 void InitCallback(std::vector<Entry>* loaded_entries, | |
|
David Trainor- moved to gerrit
2017/05/18 19:41:00
Do you need both of these?
shaktisahu
2017/05/19 04:54:56
I need two functions for two different purposes. O
| |
| 40 bool success, | |
| 41 std::unique_ptr<std::vector<Entry>> entries) { | |
| 42 // ASSERT_TRUE(success); | |
|
David Trainor- moved to gerrit
2017/05/18 19:41:00
?
shaktisahu
2017/05/19 04:54:56
Done.
| |
| 43 loaded_entries->swap(*entries); | |
| 44 } | |
| 45 | |
| 46 void LoadCallback(std::vector<protodb::Entry>* loaded_entries, | |
| 47 bool success, | |
| 48 std::unique_ptr<std::vector<protodb::Entry>> entries) { | |
| 49 // ASSERT_TRUE(success); | |
|
David Trainor- moved to gerrit
2017/05/18 19:41:00
?
shaktisahu
2017/05/19 04:54:56
Done.
| |
| 50 loaded_entries->swap(*entries); | |
| 51 } | |
| 52 | |
| 53 MOCK_METHOD1(StoreCallback, void(bool)); | |
| 54 | |
| 55 void PrepopulateSampleEntries() { | |
| 56 Entry item1 = test::BuildEntry(DownloadClient::TEST, base::GenerateGUID()); | |
| 57 Entry item2 = test::BuildEntry(DownloadClient::TEST, base::GenerateGUID()); | |
| 58 db_entries_.insert( | |
| 59 std::make_pair(item1.guid, ProtoConversions::EntryToProto(item1))); | |
| 60 db_entries_.insert( | |
| 61 std::make_pair(item2.guid, ProtoConversions::EntryToProto(item2))); | |
| 62 } | |
| 63 | |
| 64 protected: | |
| 65 std::map<std::string, protodb::Entry> db_entries_; | |
| 66 leveldb_proto::test::FakeDB<protodb::Entry>* db_; | |
| 67 std::unique_ptr<DownloadStore> store_; | |
| 68 | |
| 69 DISALLOW_COPY_AND_ASSIGN(DownloadStoreTest); | |
| 70 }; | |
| 71 | |
| 72 TEST_F(DownloadStoreTest, Initialize) { | |
| 73 PrepopulateSampleEntries(); | |
| 74 CreateDatabase(); | |
| 75 ASSERT_FALSE(store_->IsInitialized()); | |
| 76 | |
| 77 std::vector<Entry> preloaded_entries; | |
| 78 store_->Initialize(base::Bind(&DownloadStoreTest::InitCallback, | |
| 79 base::Unretained(this), &preloaded_entries)); | |
| 80 db_->InitCallback(true); | |
| 81 db_->LoadCallback(true); | |
| 82 | |
| 83 ASSERT_TRUE(store_->IsInitialized()); | |
| 84 ASSERT_EQ(2u, preloaded_entries.size()); | |
| 85 } | |
| 86 | |
| 87 TEST_F(DownloadStoreTest, Update) { | |
| 88 PrepopulateSampleEntries(); | |
| 89 CreateDatabase(); | |
| 90 | |
| 91 std::vector<Entry> preloaded_entries; | |
| 92 store_->Initialize(base::Bind(&DownloadStoreTest::InitCallback, | |
| 93 base::Unretained(this), &preloaded_entries)); | |
| 94 db_->InitCallback(true); | |
| 95 db_->LoadCallback(true); | |
| 96 ASSERT_TRUE(store_->IsInitialized()); | |
| 97 ASSERT_EQ(2u, preloaded_entries.size()); | |
| 98 | |
| 99 Entry item1 = test::BuildEntry(DownloadClient::TEST, base::GenerateGUID()); | |
| 100 Entry item2 = test::BuildEntry(DownloadClient::TEST, base::GenerateGUID()); | |
| 101 EXPECT_CALL(*this, StoreCallback(true)).Times(2); | |
| 102 store_->Update(item1, base::Bind(&DownloadStoreTest::StoreCallback, | |
| 103 base::Unretained(this))); | |
| 104 db_->UpdateCallback(true); | |
| 105 store_->Update(item2, base::Bind(&DownloadStoreTest::StoreCallback, | |
| 106 base::Unretained(this))); | |
| 107 db_->UpdateCallback(true); | |
| 108 | |
| 109 // Query the database directly and check for the entry. | |
| 110 auto protos = base::MakeUnique<std::vector<protodb::Entry>>(); | |
| 111 db_->LoadEntries(base::Bind(&DownloadStoreTest::LoadCallback, | |
| 112 base::Unretained(this), protos.get())); | |
| 113 db_->LoadCallback(true); | |
| 114 ASSERT_EQ(4u, protos->size()); | |
| 115 ASSERT_TRUE(test::CompareEntryList( | |
| 116 {preloaded_entries[0], preloaded_entries[1], item1, item2}, | |
| 117 *ProtoConversions::EntryVectorFromProto(std::move(protos)))); | |
| 118 } | |
| 119 | |
| 120 TEST_F(DownloadStoreTest, Remove) { | |
| 121 PrepopulateSampleEntries(); | |
| 122 CreateDatabase(); | |
| 123 | |
| 124 std::vector<Entry> preloaded_entries; | |
| 125 store_->Initialize(base::Bind(&DownloadStoreTest::InitCallback, | |
| 126 base::Unretained(this), &preloaded_entries)); | |
| 127 db_->InitCallback(true); | |
| 128 db_->LoadCallback(true); | |
| 129 ASSERT_EQ(2u, preloaded_entries.size()); | |
| 130 | |
| 131 // Remove the entry. | |
| 132 EXPECT_CALL(*this, StoreCallback(true)).Times(1); | |
| 133 store_->Remove( | |
| 134 preloaded_entries[0].guid, | |
| 135 base::Bind(&DownloadStoreTest::StoreCallback, base::Unretained(this))); | |
| 136 db_->UpdateCallback(true); | |
| 137 | |
| 138 // Query the database directly and check for the entry removed. | |
| 139 auto protos = base::MakeUnique<std::vector<protodb::Entry>>(); | |
| 140 db_->LoadEntries(base::Bind(&DownloadStoreTest::LoadCallback, | |
| 141 base::Unretained(this), protos.get())); | |
| 142 db_->LoadCallback(true); | |
| 143 ASSERT_EQ(1u, protos->size()); | |
| 144 ASSERT_TRUE(test::CompareEntryList( | |
| 145 {preloaded_entries[1]}, | |
| 146 *ProtoConversions::EntryVectorFromProto(std::move(protos)))); | |
| 147 } | |
| 148 | |
| 149 TEST_F(DownloadStoreTest, InitializeFailed) { | |
| 150 PrepopulateSampleEntries(); | |
| 151 CreateDatabase(); | |
| 152 | |
| 153 std::vector<Entry> preloaded_entries; | |
| 154 store_->Initialize(base::Bind(&DownloadStoreTest::InitCallback, | |
| 155 base::Unretained(this), &preloaded_entries)); | |
| 156 db_->InitCallback(false); | |
| 157 ASSERT_FALSE(store_->IsInitialized()); | |
| 158 ASSERT_TRUE(preloaded_entries.empty()); | |
| 159 } | |
| 160 | |
| 161 TEST_F(DownloadStoreTest, InitialLoadFailed) { | |
| 162 PrepopulateSampleEntries(); | |
| 163 CreateDatabase(); | |
| 164 | |
| 165 std::vector<Entry> preloaded_entries; | |
| 166 store_->Initialize(base::Bind(&DownloadStoreTest::InitCallback, | |
| 167 base::Unretained(this), &preloaded_entries)); | |
| 168 db_->InitCallback(true); | |
| 169 db_->LoadCallback(false); | |
| 170 ASSERT_FALSE(store_->IsInitialized()); | |
| 171 ASSERT_TRUE(preloaded_entries.empty()); | |
| 172 } | |
| 173 | |
| 174 TEST_F(DownloadStoreTest, UnsuccessfulUpdateOrRemove) { | |
| 175 Entry item1 = test::BuildEntry(DownloadClient::TEST, base::GenerateGUID()); | |
| 176 CreateDatabase(); | |
| 177 | |
| 178 std::vector<Entry> entries; | |
| 179 store_->Initialize(base::Bind(&DownloadStoreTest::InitCallback, | |
| 180 base::Unretained(this), &entries)); | |
| 181 db_->InitCallback(true); | |
| 182 db_->LoadCallback(true); | |
| 183 ASSERT_TRUE(store_->IsInitialized()); | |
| 184 ASSERT_TRUE(entries.empty()); | |
| 185 | |
| 186 // Update failed. | |
| 187 EXPECT_CALL(*this, StoreCallback(false)).Times(1); | |
| 188 store_->Update(item1, base::Bind(&DownloadStoreTest::StoreCallback, | |
| 189 base::Unretained(this))); | |
| 190 db_->UpdateCallback(false); | |
| 191 | |
| 192 // Remove failed. | |
| 193 EXPECT_CALL(*this, StoreCallback(false)).Times(1); | |
| 194 store_->Remove(item1.guid, base::Bind(&DownloadStoreTest::StoreCallback, | |
| 195 base::Unretained(this))); | |
| 196 db_->UpdateCallback(false); | |
| 197 } | |
| 198 | |
| 199 TEST_F(DownloadStoreTest, AddThenRemove) { | |
| 200 CreateDatabase(); | |
| 201 | |
| 202 std::vector<Entry> entries; | |
| 203 store_->Initialize(base::Bind(&DownloadStoreTest::InitCallback, | |
| 204 base::Unretained(this), &entries)); | |
| 205 db_->InitCallback(true); | |
| 206 db_->LoadCallback(true); | |
| 207 ASSERT_TRUE(entries.empty()); | |
| 208 | |
| 209 Entry item1 = test::BuildEntry(DownloadClient::TEST, base::GenerateGUID()); | |
| 210 Entry item2 = test::BuildEntry(DownloadClient::TEST, base::GenerateGUID()); | |
| 211 EXPECT_CALL(*this, StoreCallback(true)).Times(2); | |
| 212 store_->Update(item1, base::Bind(&DownloadStoreTest::StoreCallback, | |
| 213 base::Unretained(this))); | |
| 214 db_->UpdateCallback(true); | |
| 215 store_->Update(item2, base::Bind(&DownloadStoreTest::StoreCallback, | |
| 216 base::Unretained(this))); | |
| 217 db_->UpdateCallback(true); | |
| 218 | |
| 219 // Query the database directly and check for the entry. | |
| 220 auto protos = base::MakeUnique<std::vector<protodb::Entry>>(); | |
| 221 db_->LoadEntries(base::Bind(&DownloadStoreTest::LoadCallback, | |
| 222 base::Unretained(this), protos.get())); | |
| 223 db_->LoadCallback(true); | |
| 224 ASSERT_EQ(2u, protos->size()); | |
| 225 | |
| 226 // Remove the entry. | |
| 227 EXPECT_CALL(*this, StoreCallback(true)).Times(1); | |
| 228 store_->Remove(item1.guid, base::Bind(&DownloadStoreTest::StoreCallback, | |
| 229 base::Unretained(this))); | |
| 230 db_->UpdateCallback(true); | |
| 231 | |
| 232 // Query the database directly and check for the entry removed. | |
| 233 protos->clear(); | |
| 234 db_->LoadEntries(base::Bind(&DownloadStoreTest::LoadCallback, | |
| 235 base::Unretained(this), protos.get())); | |
| 236 db_->LoadCallback(true); | |
| 237 ASSERT_EQ(1u, protos->size()); | |
| 238 ASSERT_TRUE(test::CompareEntryList( | |
| 239 {item2}, *ProtoConversions::EntryVectorFromProto(std::move(protos)))); | |
| 240 } | |
| 241 | |
| 242 TEST_F(DownloadStoreTest, Destroy) { | |
| 243 CreateDatabase(); | |
| 244 ASSERT_FALSE(store_->IsInitialized()); | |
| 245 | |
| 246 std::vector<Entry> entries; | |
| 247 store_->Initialize(base::Bind(&DownloadStoreTest::InitCallback, | |
| 248 base::Unretained(this), &entries)); | |
| 249 db_->InitCallback(true); | |
| 250 db_->LoadCallback(true); | |
| 251 ASSERT_TRUE(store_->IsInitialized()); | |
| 252 | |
| 253 store_->Destroy( | |
| 254 base::Bind(&DownloadStoreTest::StoreCallback, base::Unretained(this))); | |
| 255 ASSERT_FALSE(store_->IsInitialized()); | |
| 256 } | |
| 257 | |
| 258 } // namespace download | |
| OLD | NEW |