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

Side by Side Diff: components/download/internal/download_store_unittest.cc

Issue 2881173003: Download Service : Added leveldb proto layer (Closed)
Patch Set: More unittests Created 3 years, 7 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
OLDNEW
(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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698