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

Side by Side Diff: components/offline_pages/offline_page_metadata_store_impl_unittest.cc

Issue 1160283003: [Offline] Creates metadata store interface for offline pages (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@offline-pages-1
Patch Set: Adding BUILD.gn updates Created 5 years, 6 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 2015 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/offline_pages/offline_page_metadata_store_impl.h"
6
7 #include "base/bind.h"
8 #include "base/files/file_path.h"
9 #include "base/files/scoped_temp_dir.h"
10 #include "base/memory/scoped_ptr.h"
11 #include "base/message_loop/message_loop.h"
12 #include "base/run_loop.h"
13 #include "components/offline_pages/offline_page_item.h"
14 #include "testing/gtest/include/gtest/gtest.h"
15
16 namespace offline_pages {
17
18 namespace {
19
20 const char kURL1[] = "https://example.com";
21 const char kTitle1[] = "Exmample site title";
22 const char kFilePath1[] = "/offline_pages/exmaple_com.mhtml";
23 int64 kFileSize1 = 234567;
24
25 class OfflinePageMetadataStoreImplTest : public testing::Test {
26 public:
27 enum CalledCallback { NONE, LOAD, ADD, REMOVE, DESTROY };
28
29 OfflinePageMetadataStoreImplTest();
30 ~OfflinePageMetadataStoreImplTest() override;
31
32 scoped_ptr<OfflinePageMetadataStoreImpl> BuildStore();
33 void PumpLoop();
34
35 void LoadCallback(OfflinePageMetadataStore::Status status,
36 const std::vector<OfflinePageItem>& offline_pages);
37 void UpdateCallback(CalledCallback called_callback,
38 OfflinePageMetadataStore::Status status);
39
40 void ClearResults();
41
42 protected:
43 CalledCallback last_called_callback_;
44 OfflinePageMetadataStore::Status last_status_;
45 std::vector<OfflinePageItem> offline_pages_;
46
47 base::ScopedTempDir temp_directory_;
48 base::MessageLoop message_loop_;
49 scoped_ptr<base::RunLoop> run_loop_;
50 };
51
52 OfflinePageMetadataStoreImplTest::OfflinePageMetadataStoreImplTest()
53 : last_called_callback_(NONE),
54 last_status_(OfflinePageMetadataStore::STATUS_COUNT) {
55 EXPECT_TRUE(temp_directory_.CreateUniqueTempDir());
56 run_loop_.reset(new base::RunLoop());
57 }
58
59 OfflinePageMetadataStoreImplTest::~OfflinePageMetadataStoreImplTest() {
60 }
61
62 void OfflinePageMetadataStoreImplTest::PumpLoop() {
63 message_loop_.RunUntilIdle();
64 }
65
66 scoped_ptr<OfflinePageMetadataStoreImpl>
67 OfflinePageMetadataStoreImplTest::BuildStore() {
68 return scoped_ptr<OfflinePageMetadataStoreImpl>(
69 new OfflinePageMetadataStoreImpl(temp_directory_.path(),
70 message_loop_.message_loop_proxy()));
71 }
72
73 void OfflinePageMetadataStoreImplTest::LoadCallback(
74 OfflinePageMetadataStore::Status status,
75 const std::vector<OfflinePageItem>& offline_pages) {
76 last_called_callback_ = LOAD;
77 last_status_ = status;
78 offline_pages_.swap(const_cast<std::vector<OfflinePageItem>&>(offline_pages));
79 run_loop_->Quit();
80 run_loop_.reset(new base::RunLoop());
81 }
82
83 void OfflinePageMetadataStoreImplTest::UpdateCallback(
84 CalledCallback called_callback,
85 OfflinePageMetadataStore::Status status) {
86 last_called_callback_ = called_callback;
87 last_status_ = status;
88 run_loop_->Quit();
89 run_loop_.reset(new base::RunLoop());
90 }
91
92 void OfflinePageMetadataStoreImplTest::ClearResults() {
93 last_called_callback_ = NONE;
94 last_status_ = OfflinePageMetadataStore::STATUS_COUNT;
95 offline_pages_.clear();
96 }
97
98 // Loads empty store and makes sure that there are no offline pages stored in
99 // it.
100 TEST_F(OfflinePageMetadataStoreImplTest, LoadEmptyStore) {
101 scoped_ptr<OfflinePageMetadataStoreImpl> store(BuildStore());
102 store->Load(base::Bind(&OfflinePageMetadataStoreImplTest::LoadCallback,
103 base::Unretained(this)));
104 PumpLoop();
105
106 EXPECT_EQ(LOAD, last_called_callback_);
107 EXPECT_EQ(OfflinePageMetadataStore::SUCCESS, last_status_);
108 EXPECT_EQ(0U, offline_pages_.size());
109 }
110
111 // Adds metadata of an offline page into a store and then loads from the
112 // store to make sure the metadata is preserved.
113 TEST_F(OfflinePageMetadataStoreImplTest, AddOfflinePageThenLoad) {
114 scoped_ptr<OfflinePageMetadataStoreImpl> store(BuildStore());
115
116 OfflinePageItem offline_page(GURL(kURL1), kTitle1, base::FilePath(kFilePath1),
117 kFileSize1);
118 store->AddOfflinePage(
119 offline_page,
120 base::Bind(&OfflinePageMetadataStoreImplTest::UpdateCallback,
121 base::Unretained(this), ADD));
122 PumpLoop();
123 EXPECT_EQ(ADD, last_called_callback_);
124 EXPECT_EQ(OfflinePageMetadataStore::SUCCESS, last_status_);
125
126 ClearResults();
127 store->Load(base::Bind(&OfflinePageMetadataStoreImplTest::LoadCallback,
128 base::Unretained(this)));
129 PumpLoop();
130
131 EXPECT_EQ(LOAD, last_called_callback_);
132 EXPECT_EQ(OfflinePageMetadataStore::SUCCESS, last_status_);
133 EXPECT_EQ(1U, offline_pages_.size());
134 EXPECT_EQ(offline_page.url, offline_pages_[0].url);
135 EXPECT_EQ(offline_page.title, offline_pages_[0].title);
136 EXPECT_EQ(offline_page.version, offline_pages_[0].version);
137 EXPECT_EQ(offline_page.file_path, offline_pages_[0].file_path);
138 EXPECT_EQ(offline_page.file_size, offline_pages_[0].file_size);
139 EXPECT_EQ(offline_page.creation_time, offline_pages_[0].creation_time);
140 EXPECT_EQ(offline_page.last_access_time, offline_pages_[0].last_access_time);
141 }
142
143 // Adds metadata of an offline page into a store and then opens the store
144 // again to make sure that stored metadata survives store restarts.
145 TEST_F(OfflinePageMetadataStoreImplTest, AddOfflinePageRestartLoad) {
146 scoped_ptr<OfflinePageMetadataStoreImpl> store(BuildStore());
147
148 OfflinePageItem offline_page(GURL(kURL1), kTitle1, base::FilePath(kFilePath1),
149 kFileSize1);
150 store->AddOfflinePage(
151 offline_page,
152 base::Bind(&OfflinePageMetadataStoreImplTest::UpdateCallback,
153 base::Unretained(this), ADD));
154 PumpLoop();
155 EXPECT_EQ(ADD, last_called_callback_);
156 EXPECT_EQ(OfflinePageMetadataStore::SUCCESS, last_status_);
157
158 // Restart the store.
159 ClearResults();
160 store = BuildStore().Pass();
161 store->Load(base::Bind(&OfflinePageMetadataStoreImplTest::LoadCallback,
162 base::Unretained(this)));
163 PumpLoop();
164
165 EXPECT_EQ(LOAD, last_called_callback_);
166 EXPECT_EQ(OfflinePageMetadataStore::SUCCESS, last_status_);
167 EXPECT_EQ(1U, offline_pages_.size());
168 EXPECT_EQ(offline_page.url, offline_pages_[0].url);
169 EXPECT_EQ(offline_page.title, offline_pages_[0].title);
170 EXPECT_EQ(offline_page.version, offline_pages_[0].version);
171 EXPECT_EQ(offline_page.file_path, offline_pages_[0].file_path);
172 EXPECT_EQ(offline_page.file_size, offline_pages_[0].file_size);
173 EXPECT_EQ(offline_page.creation_time, offline_pages_[0].creation_time);
174 EXPECT_EQ(offline_page.last_access_time, offline_pages_[0].last_access_time);
175 }
176
177 // Adds metadata of an offline page into a store and then opens the store
178 // again to make sure that stored metadata survives store restarts.
179 TEST_F(OfflinePageMetadataStoreImplTest, AddOfflinePageCloseLoad) {
180 scoped_ptr<OfflinePageMetadataStoreImpl> store(BuildStore());
181
182 OfflinePageItem offline_page(GURL(kURL1), kTitle1, base::FilePath(kFilePath1),
183 kFileSize1);
184 store->AddOfflinePage(
185 offline_page,
186 base::Bind(&OfflinePageMetadataStoreImplTest::UpdateCallback,
187 base::Unretained(this), ADD));
188 PumpLoop();
189 EXPECT_EQ(ADD, last_called_callback_);
190 EXPECT_EQ(OfflinePageMetadataStore::SUCCESS, last_status_);
191
192 ClearResults();
193 store->Close();
194 store->Load(base::Bind(&OfflinePageMetadataStoreImplTest::LoadCallback,
195 base::Unretained(this)));
196 PumpLoop();
197
198 EXPECT_EQ(LOAD, last_called_callback_);
199 EXPECT_EQ(OfflinePageMetadataStore::SUCCESS, last_status_);
200 EXPECT_EQ(1U, offline_pages_.size());
201 EXPECT_EQ(offline_page.url, offline_pages_[0].url);
202 EXPECT_EQ(offline_page.title, offline_pages_[0].title);
203 EXPECT_EQ(offline_page.version, offline_pages_[0].version);
204 EXPECT_EQ(offline_page.file_path, offline_pages_[0].file_path);
205 EXPECT_EQ(offline_page.file_size, offline_pages_[0].file_size);
206 EXPECT_EQ(offline_page.creation_time, offline_pages_[0].creation_time);
207 EXPECT_EQ(offline_page.last_access_time, offline_pages_[0].last_access_time);
208 }
209
210 // Tests removing offline page metadata from the store, for which it first adds
211 // metadata of an offline page.
212 TEST_F(OfflinePageMetadataStoreImplTest, RemoveOfflinePage) {
213 scoped_ptr<OfflinePageMetadataStoreImpl> store(BuildStore());
214
215 OfflinePageItem offline_page(GURL(kURL1), kTitle1, base::FilePath(kFilePath1),
216 kFileSize1);
217 store->AddOfflinePage(
218 offline_page,
219 base::Bind(&OfflinePageMetadataStoreImplTest::UpdateCallback,
220 base::Unretained(this), ADD));
221 PumpLoop();
222 EXPECT_EQ(ADD, last_called_callback_);
223 EXPECT_EQ(OfflinePageMetadataStore::SUCCESS, last_status_);
224
225 ClearResults();
226 store->RemoveOfflinePage(
227 offline_page.url,
228 base::Bind(&OfflinePageMetadataStoreImplTest::UpdateCallback,
229 base::Unretained(this), REMOVE));
230 PumpLoop();
231 EXPECT_EQ(REMOVE, last_called_callback_);
232 EXPECT_EQ(OfflinePageMetadataStore::SUCCESS, last_status_);
233
234 ClearResults();
235 store->Close();
236 store->Load(base::Bind(&OfflinePageMetadataStoreImplTest::LoadCallback,
237 base::Unretained(this)));
238 PumpLoop();
239 EXPECT_EQ(LOAD, last_called_callback_);
240 EXPECT_EQ(OfflinePageMetadataStore::SUCCESS, last_status_);
241 EXPECT_EQ(0U, offline_pages_.size());
242 }
243
244 // Adds metadata of multiple offline pages into a store and removes some.
245 TEST_F(OfflinePageMetadataStoreImplTest, AddRemoveMultipleOfflinePages) {
246 scoped_ptr<OfflinePageMetadataStoreImpl> store(BuildStore());
247
248 OfflinePageItem offline_page_1(GURL(kURL1), kTitle1,
249 base::FilePath(kFilePath1), kFileSize1);
250 OfflinePageItem offline_page_2(GURL("https://other.page.com"), "Other page",
251 base::FilePath("//other.page.com.mhtml"),
252 12345, base::Time::Now());
253 store->AddOfflinePage(
254 offline_page_1,
255 base::Bind(&OfflinePageMetadataStoreImplTest::UpdateCallback,
256 base::Unretained(this), ADD));
257 PumpLoop();
258 EXPECT_EQ(ADD, last_called_callback_);
259 EXPECT_EQ(OfflinePageMetadataStore::SUCCESS, last_status_);
260
261 ClearResults();
262 store->AddOfflinePage(
263 offline_page_2,
264 base::Bind(&OfflinePageMetadataStoreImplTest::UpdateCallback,
265 base::Unretained(this), ADD));
266 PumpLoop();
267 EXPECT_EQ(ADD, last_called_callback_);
268 EXPECT_EQ(OfflinePageMetadataStore::SUCCESS, last_status_);
269
270 ClearResults();
271 store->Load(base::Bind(&OfflinePageMetadataStoreImplTest::LoadCallback,
272 base::Unretained(this)));
273 PumpLoop();
274
275 EXPECT_EQ(LOAD, last_called_callback_);
276 EXPECT_EQ(OfflinePageMetadataStore::SUCCESS, last_status_);
277 EXPECT_EQ(2U, offline_pages_.size());
278
279 store->RemoveOfflinePage(
280 offline_page_1.url,
281 base::Bind(&OfflinePageMetadataStoreImplTest::UpdateCallback,
282 base::Unretained(this), REMOVE));
283 PumpLoop();
284 EXPECT_EQ(REMOVE, last_called_callback_);
285 EXPECT_EQ(OfflinePageMetadataStore::SUCCESS, last_status_);
286
287 ClearResults();
288 store->Close();
289 store->Load(base::Bind(&OfflinePageMetadataStoreImplTest::LoadCallback,
290 base::Unretained(this)));
291 PumpLoop();
292
293 EXPECT_EQ(LOAD, last_called_callback_);
294 EXPECT_EQ(OfflinePageMetadataStore::SUCCESS, last_status_);
295 EXPECT_EQ(1U, offline_pages_.size());
296 EXPECT_EQ(offline_page_2.url, offline_pages_[0].url);
297 EXPECT_EQ(offline_page_2.title, offline_pages_[0].title);
298 EXPECT_EQ(offline_page_2.version, offline_pages_[0].version);
299 EXPECT_EQ(offline_page_2.file_path, offline_pages_[0].file_path);
300 EXPECT_EQ(offline_page_2.file_size, offline_pages_[0].file_size);
301 EXPECT_EQ(offline_page_2.creation_time, offline_pages_[0].creation_time);
302 EXPECT_EQ(offline_page_2.last_access_time,
303 offline_pages_[0].last_access_time);
304 }
305
306 // Adds metadata of multiple offline pages into a store and removes some.
307 TEST_F(OfflinePageMetadataStoreImplTest, DestroyStore) {
308 scoped_ptr<OfflinePageMetadataStoreImpl> store(BuildStore());
309
310 OfflinePageItem offline_page_1(GURL(kURL1), kTitle1,
311 base::FilePath(kFilePath1), kFileSize1);
312 OfflinePageItem offline_page_2(GURL("https://other.page.com"), "Other page",
313 base::FilePath("//other.page.com.mhtml"),
314 12345, base::Time::Now());
315 store->AddOfflinePage(
316 offline_page_1,
317 base::Bind(&OfflinePageMetadataStoreImplTest::UpdateCallback,
318 base::Unretained(this), ADD));
319 PumpLoop();
320 store->AddOfflinePage(
321 offline_page_2,
322 base::Bind(&OfflinePageMetadataStoreImplTest::UpdateCallback,
323 base::Unretained(this), ADD));
324 PumpLoop();
325
326 ClearResults();
327 store->Destroy(base::Bind(&OfflinePageMetadataStoreImplTest::UpdateCallback,
328 base::Unretained(this), DESTROY));
329 PumpLoop();
330 EXPECT_EQ(DESTROY, last_called_callback_);
331 EXPECT_EQ(OfflinePageMetadataStore::SUCCESS, last_status_);
332
333 ClearResults();
334 store->Load(base::Bind(&OfflinePageMetadataStoreImplTest::LoadCallback,
335 base::Unretained(this)));
336 PumpLoop();
337
338 EXPECT_EQ(LOAD, last_called_callback_);
339 EXPECT_EQ(OfflinePageMetadataStore::SUCCESS, last_status_);
340 EXPECT_TRUE(offline_pages_.empty());
341 }
342
343 } // namespace
344
345 } // namespace offline_pages
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698