OLD | NEW |
| (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_test_store.h" | |
6 | |
7 #include <map> | |
8 | |
9 #include "base/bind.h" | |
10 #include "base/location.h" | |
11 #include "testing/gtest/include/gtest/gtest.h" | |
12 | |
13 namespace offline_pages { | |
14 | |
15 OfflinePageTestStore::OfflinePageTestStore( | |
16 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner) | |
17 : task_runner_(task_runner), | |
18 scenario_(TestScenario::SUCCESSFUL), | |
19 store_state_(StoreState::NOT_LOADED) {} | |
20 | |
21 OfflinePageTestStore::OfflinePageTestStore( | |
22 const OfflinePageTestStore& other_store) | |
23 : task_runner_(other_store.task_runner_), | |
24 scenario_(other_store.scenario_), | |
25 offline_pages_(other_store.offline_pages_) {} | |
26 | |
27 OfflinePageTestStore::~OfflinePageTestStore() {} | |
28 | |
29 void OfflinePageTestStore::Initialize(const InitializeCallback& callback) { | |
30 if (scenario_ == TestScenario::LOAD_FAILED_RESET_FAILED || | |
31 scenario_ == TestScenario::LOAD_FAILED_RESET_SUCCESS) { | |
32 store_state_ = StoreState::FAILED_LOADING; | |
33 offline_pages_.clear(); | |
34 } else { | |
35 store_state_ = StoreState::LOADED; | |
36 } | |
37 task_runner_->PostTask( | |
38 FROM_HERE, base::Bind(callback, store_state_ == StoreState::LOADED)); | |
39 } | |
40 | |
41 void OfflinePageTestStore::GetOfflinePages(const LoadCallback& callback) { | |
42 task_runner_->PostTask(FROM_HERE, base::Bind(callback, GetAllPages())); | |
43 } | |
44 | |
45 void OfflinePageTestStore::AddOfflinePage(const OfflinePageItem& offline_page, | |
46 const AddCallback& callback) { | |
47 // TODO(fgorski): Add and cover scenario with existing item. | |
48 ItemActionStatus result; | |
49 if (store_state_ == StoreState::LOADED && | |
50 scenario_ != TestScenario::WRITE_FAILED) { | |
51 offline_pages_[offline_page.offline_id] = offline_page; | |
52 last_saved_page_ = offline_page; | |
53 result = ItemActionStatus::SUCCESS; | |
54 } else { | |
55 result = ItemActionStatus::STORE_ERROR; | |
56 } | |
57 if (!callback.is_null()) | |
58 task_runner_->PostTask(FROM_HERE, base::Bind(callback, result)); | |
59 } | |
60 | |
61 void OfflinePageTestStore::UpdateOfflinePages( | |
62 const std::vector<OfflinePageItem>& pages, | |
63 const UpdateCallback& callback) { | |
64 // TODO(fgorski): Cover scenario where new items are being created while they | |
65 // shouldn't. | |
66 std::unique_ptr<OfflinePagesUpdateResult> result( | |
67 new OfflinePagesUpdateResult(StoreState::LOADED)); | |
68 if (scenario_ == TestScenario::WRITE_FAILED) { | |
69 for (const auto& page : pages) { | |
70 result->item_statuses.push_back( | |
71 std::make_pair(page.offline_id, ItemActionStatus::STORE_ERROR)); | |
72 } | |
73 } else { | |
74 for (const auto& page : pages) { | |
75 offline_pages_[page.offline_id] = page; | |
76 last_saved_page_ = page; | |
77 result->item_statuses.push_back( | |
78 std::make_pair(page.offline_id, ItemActionStatus::SUCCESS)); | |
79 } | |
80 result->updated_items.insert(result->updated_items.begin(), pages.begin(), | |
81 pages.end()); | |
82 } | |
83 if (!callback.is_null()) | |
84 task_runner_->PostTask(FROM_HERE, | |
85 base::Bind(callback, base::Passed(&result))); | |
86 } | |
87 | |
88 void OfflinePageTestStore::RemoveOfflinePages( | |
89 const std::vector<int64_t>& offline_ids, | |
90 const UpdateCallback& callback) { | |
91 std::unique_ptr<OfflinePagesUpdateResult> result( | |
92 new OfflinePagesUpdateResult(StoreState::LOADED)); | |
93 | |
94 ASSERT_FALSE(offline_ids.empty()); | |
95 if (scenario_ == TestScenario::REMOVE_FAILED) { | |
96 for (const auto& offline_id : offline_ids) { | |
97 result->item_statuses.push_back( | |
98 std::make_pair(offline_id, ItemActionStatus::STORE_ERROR)); | |
99 } | |
100 // Anything different that LOADED is good here. | |
101 result->store_state = StoreState::FAILED_LOADING; | |
102 } else { | |
103 for (const auto& offline_id : offline_ids) { | |
104 auto iter = offline_pages_.find(offline_id); | |
105 ItemActionStatus status; | |
106 if (iter != offline_pages_.end()) { | |
107 result->updated_items.push_back(iter->second); | |
108 status = ItemActionStatus::SUCCESS; | |
109 offline_pages_.erase(iter); | |
110 } else { | |
111 status = ItemActionStatus::NOT_FOUND; | |
112 } | |
113 result->item_statuses.push_back(std::make_pair(offline_id, status)); | |
114 } | |
115 } | |
116 | |
117 task_runner_->PostTask(FROM_HERE, | |
118 base::Bind(callback, base::Passed(&result))); | |
119 } | |
120 | |
121 void OfflinePageTestStore::Reset(const ResetCallback& callback) { | |
122 if (scenario_ == TestScenario::LOAD_FAILED_RESET_FAILED) { | |
123 store_state_ = StoreState::FAILED_RESET; | |
124 } else { | |
125 store_state_ = StoreState::NOT_LOADED; | |
126 // Scenario is flipped to successful here, as the reset succeeds. | |
127 if (scenario_ == TestScenario::LOAD_FAILED_RESET_SUCCESS) | |
128 scenario_ = TestScenario::SUCCESSFUL; | |
129 } | |
130 | |
131 offline_pages_.clear(); | |
132 task_runner_->PostTask( | |
133 FROM_HERE, base::Bind(callback, store_state_ == StoreState::NOT_LOADED)); | |
134 } | |
135 | |
136 StoreState OfflinePageTestStore::state() const { | |
137 return store_state_; | |
138 } | |
139 | |
140 void OfflinePageTestStore::UpdateLastAccessTime( | |
141 int64_t offline_id, | |
142 const base::Time& last_access_time) { | |
143 auto iter = offline_pages_.find(offline_id); | |
144 if (iter == offline_pages_.end()) | |
145 return; | |
146 iter->second.last_access_time = last_access_time; | |
147 } | |
148 | |
149 std::vector<OfflinePageItem> OfflinePageTestStore::GetAllPages() const { | |
150 std::vector<OfflinePageItem> offline_pages; | |
151 for (const auto& id_page_pair : offline_pages_) | |
152 offline_pages.push_back(id_page_pair.second); | |
153 return offline_pages; | |
154 } | |
155 | |
156 void OfflinePageTestStore::ClearAllPages() { | |
157 offline_pages_.clear(); | |
158 } | |
159 | |
160 } // namespace offline_pages | |
OLD | NEW |