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

Side by Side Diff: components/offline_pages/background/request_picker_unittest.cc

Issue 2178723002: Add more unit tests for RequestPicker (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: CR feedback per FGorski and DougArnett Created 4 years, 4 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
« no previous file with comments | « components/offline_pages/background/offliner_policy.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "components/offline_pages/background/request_picker.h" 5 #include "components/offline_pages/background/request_picker.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/test/test_simple_task_runner.h" 8 #include "base/test/test_simple_task_runner.h"
9 #include "base/threading/thread_task_runner_handle.h" 9 #include "base/threading/thread_task_runner_handle.h"
10 #include "base/time/time.h" 10 #include "base/time/time.h"
11 #include "components/offline_pages/background/device_conditions.h" 11 #include "components/offline_pages/background/device_conditions.h"
12 #include "components/offline_pages/background/request_queue.h" 12 #include "components/offline_pages/background/request_queue.h"
13 #include "components/offline_pages/background/request_queue_in_memory_store.h" 13 #include "components/offline_pages/background/request_queue_in_memory_store.h"
14 #include "components/offline_pages/background/save_page_request.h" 14 #include "components/offline_pages/background/save_page_request.h"
15 #include "components/offline_pages/offline_page_item.h" 15 #include "components/offline_pages/offline_page_item.h"
16 #include "testing/gtest/include/gtest/gtest.h" 16 #include "testing/gtest/include/gtest/gtest.h"
17 17
18 namespace offline_pages { 18 namespace offline_pages {
19 19
20 namespace { 20 namespace {
21 // Data for request 1. 21 // Data for request 1.
22 const int64_t kRequestId1 = 17; 22 const int64_t kRequestId1 = 17;
23 const GURL kUrl1("https://google.com"); 23 const GURL kUrl1("https://google.com");
24 const ClientId kClientId1("bookmark", "1234"); 24 const ClientId kClientId1("bookmark", "1234");
25 // Data for request 2. 25 // Data for request 2.
26 const int64_t kRequestId2 = 42; 26 const int64_t kRequestId2 = 42;
27 const GURL kUrl2("http://nytimes.com"); 27 const GURL kUrl2("http://nytimes.com");
28 const ClientId kClientId2("bookmark", "5678"); 28 const ClientId kClientId2("bookmark", "5678");
29 const bool kUserRequested = true; 29 const bool kUserRequested = true;
30 const int kAttemptCount = 1;
31
32 // Constants for policy values - These settings represent the default values.
33 const bool kPreferUntried = false;
34 const bool kPreferEarlier = true;
35 const bool kPreferRetryCount = true;
30 } // namespace 36 } // namespace
31 37
32 class RequestPickerTest : public testing::Test { 38 class RequestPickerTest : public testing::Test {
33 public: 39 public:
34 RequestPickerTest(); 40 RequestPickerTest();
35 41
36 ~RequestPickerTest() override; 42 ~RequestPickerTest() override;
37 43
38 void SetUp() override; 44 void SetUp() override;
39 45
40 void PumpLoop(); 46 void PumpLoop();
41 47
42 void AddRequestDone(RequestQueue::AddRequestResult result, 48 void AddRequestDone(RequestQueue::AddRequestResult result,
43 const SavePageRequest& request); 49 const SavePageRequest& request);
44 50
45 void RequestPicked(const SavePageRequest& request); 51 void RequestPicked(const SavePageRequest& request);
46 52
47 void RequestQueueEmpty(); 53 void RequestQueueEmpty();
48 54
55 void AddRequestsAndChooseOne(const SavePageRequest& request1,
56 const SavePageRequest& request2);
57
49 protected: 58 protected:
50 // The request queue is simple enough we will use a real queue with a memory 59 // The request queue is simple enough we will use a real queue with a memory
51 // store instead of a stub. 60 // store instead of a stub.
52 std::unique_ptr<RequestQueue> queue_; 61 std::unique_ptr<RequestQueue> queue_;
53 std::unique_ptr<RequestPicker> picker_; 62 std::unique_ptr<RequestPicker> picker_;
54 std::unique_ptr<SavePageRequest> last_picked_; 63 std::unique_ptr<SavePageRequest> last_picked_;
55 std::unique_ptr<OfflinerPolicy> policy_; 64 std::unique_ptr<OfflinerPolicy> policy_;
56 bool request_queue_empty_called_; 65 bool request_queue_empty_called_;
57 66
58 private: 67 private:
(...skipping 24 matching lines...) Expand all
83 const SavePageRequest& request) {} 92 const SavePageRequest& request) {}
84 93
85 void RequestPickerTest::RequestPicked(const SavePageRequest& request) { 94 void RequestPickerTest::RequestPicked(const SavePageRequest& request) {
86 last_picked_.reset(new SavePageRequest(request)); 95 last_picked_.reset(new SavePageRequest(request));
87 } 96 }
88 97
89 void RequestPickerTest::RequestQueueEmpty() { 98 void RequestPickerTest::RequestQueueEmpty() {
90 request_queue_empty_called_ = true; 99 request_queue_empty_called_ = true;
91 } 100 }
92 101
93 TEST_F(RequestPickerTest, ChooseNextRequest) { 102 // Test helper method do so the boilerplate operations for most tests.
dougarnett 2016/07/26 16:01:43 More descriptive of "what" it does rather than "wh
Pete Williamson 2016/07/26 19:31:22 Done.
94 base::Time creation_time = base::Time::Now(); 103 void RequestPickerTest::AddRequestsAndChooseOne(
dougarnett 2016/07/26 16:01:43 QueueAndChoose()? but not sure
fgorski 2016/07/26 16:39:14 Neat refactoring btw.
Pete Williamson 2016/07/26 19:31:22 Done.
104 const SavePageRequest& request1, const SavePageRequest& request2) {
95 DeviceConditions conditions; 105 DeviceConditions conditions;
96 SavePageRequest request1( 106 // Add test requests on the Queue.
97 kRequestId1, kUrl1, kClientId1, creation_time, kUserRequested);
98 SavePageRequest request2(
99 kRequestId2, kUrl2, kClientId2, creation_time, kUserRequested);
100 // Put some test requests on the Queue.
101 queue_->AddRequest(request1, base::Bind(&RequestPickerTest::AddRequestDone, 107 queue_->AddRequest(request1, base::Bind(&RequestPickerTest::AddRequestDone,
102 base::Unretained(this))); 108 base::Unretained(this)));
103 queue_->AddRequest(request2, base::Bind(&RequestPickerTest::AddRequestDone, 109 queue_->AddRequest(request2, base::Bind(&RequestPickerTest::AddRequestDone,
104 base::Unretained(this))); 110 base::Unretained(this)));
105 111
106 // Pump the loop to give the async queue the opportunity to do the adds. 112 // Pump the loop to give the async queue the opportunity to do the adds.
107 PumpLoop(); 113 PumpLoop();
108 114
115 // Call the method under test.
109 picker_->ChooseNextRequest( 116 picker_->ChooseNextRequest(
110 base::Bind(&RequestPickerTest::RequestPicked, base::Unretained(this)), 117 base::Bind(&RequestPickerTest::RequestPicked, base::Unretained(this)),
111 base::Bind(&RequestPickerTest::RequestQueueEmpty, base::Unretained(this)), 118 base::Bind(&RequestPickerTest::RequestQueueEmpty, base::Unretained(this)),
112 &conditions); 119 &conditions);
113 120
114 // Pump the loop again to give the async queue the opportunity to return 121 // Pump the loop again to give the async queue the opportunity to return
115 // results from the Get operation, and for the picker to call the "picked" 122 // results from the Get operation, and for the picker to call the "picked"
116 // callback. 123 // callback.
117 PumpLoop(); 124 PumpLoop();
118
119 EXPECT_EQ(kRequestId2, last_picked_->request_id());
120 EXPECT_FALSE(request_queue_empty_called_);
121 } 125 }
122 126
123 TEST_F(RequestPickerTest, PickFromEmptyQueue) { 127 TEST_F(RequestPickerTest, PickFromEmptyQueue) {
124 DeviceConditions conditions; 128 DeviceConditions conditions;
125 picker_->ChooseNextRequest( 129 picker_->ChooseNextRequest(
126 base::Bind(&RequestPickerTest::RequestPicked, base::Unretained(this)), 130 base::Bind(&RequestPickerTest::RequestPicked, base::Unretained(this)),
127 base::Bind(&RequestPickerTest::RequestQueueEmpty, base::Unretained(this)), 131 base::Bind(&RequestPickerTest::RequestQueueEmpty, base::Unretained(this)),
128 &conditions); 132 &conditions);
129 133
130 // Pump the loop again to give the async queue the opportunity to return 134 // Pump the loop again to give the async queue the opportunity to return
131 // results from the Get operation, and for the picker to call the "QueueEmpty" 135 // results from the Get operation, and for the picker to call the "QueueEmpty"
132 // callback. 136 // callback.
133 PumpLoop(); 137 PumpLoop();
134 138
135 EXPECT_TRUE(request_queue_empty_called_); 139 EXPECT_TRUE(request_queue_empty_called_);
136 } 140 }
137 141
142 TEST_F(RequestPickerTest, ChooseRequestWithHigherRetryCount) {
143 base::Time creation_time = base::Time::Now();
144 SavePageRequest request1(
145 kRequestId1, kUrl1, kClientId1, creation_time, kUserRequested);
146 SavePageRequest request2(
147 kRequestId2, kUrl2, kClientId2, creation_time, kUserRequested);
148 request2.set_attempt_count(kAttemptCount);
149
150 AddRequestsAndChooseOne(request1, request2);
151
152 EXPECT_EQ(kRequestId2, last_picked_->request_id());
153 EXPECT_FALSE(request_queue_empty_called_);
154 }
155
156 TEST_F(RequestPickerTest, ChooseRequestWithSameRetryCountButEarlier) {
157 base::Time creation_time1 =
158 base::Time::Now() - base::TimeDelta::FromSeconds(10);
159 base::Time creation_time2 = base::Time::Now();
160 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1,
161 kUserRequested);
162 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2,
163 kUserRequested);
164
165 AddRequestsAndChooseOne(request1, request2);
166
167 EXPECT_EQ(kRequestId1, last_picked_->request_id());
168 EXPECT_FALSE(request_queue_empty_called_);
169 }
170
171 TEST_F(RequestPickerTest, ChooseEarlierRequest) {
172 // We need a custom policy object prefering recency to retry count.
173 policy_.reset(
174 new OfflinerPolicy(kPreferUntried, kPreferEarlier, !kPreferRetryCount));
175 picker_.reset(new RequestPicker(queue_.get(), policy_.get()));
176
177 base::Time creation_time1 =
178 base::Time::Now() - base::TimeDelta::FromSeconds(10);
179 base::Time creation_time2 = base::Time::Now();
180 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1,
181 kUserRequested);
182 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2,
183 kUserRequested);
184 request2.set_attempt_count(kAttemptCount);
185
186 AddRequestsAndChooseOne(request1, request2);
187
188 EXPECT_EQ(kRequestId1, last_picked_->request_id());
189 EXPECT_FALSE(request_queue_empty_called_);
190 }
191
192 TEST_F(RequestPickerTest, ChooseSameTimeRequestWithHigherRetryCount) {
193 // We need a custom policy object preferring recency to retry count.
194 policy_.reset(
195 new OfflinerPolicy(kPreferUntried, kPreferEarlier, !kPreferRetryCount));
196 picker_.reset(new RequestPicker(queue_.get(), policy_.get()));
197
198 base::Time creation_time = base::Time::Now();
199 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time,
200 kUserRequested);
201 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time,
202 kUserRequested);
203 request2.set_attempt_count(kAttemptCount);
204
205 AddRequestsAndChooseOne(request1, request2);
206
207 EXPECT_EQ(kRequestId2, last_picked_->request_id());
208 EXPECT_FALSE(request_queue_empty_called_);
209 }
210
211 TEST_F(RequestPickerTest, ChooseRequestWithLowerRetryCount) {
212 // We need a custom policy object preferring lower retry count.
213 policy_.reset(
214 new OfflinerPolicy(!kPreferUntried, kPreferEarlier, kPreferRetryCount));
215 picker_.reset(new RequestPicker(queue_.get(), policy_.get()));
216
217 base::Time creation_time = base::Time::Now();
218 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time,
219 kUserRequested);
220 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time,
221 kUserRequested);
222 request2.set_attempt_count(kAttemptCount);
223
224 AddRequestsAndChooseOne(request1, request2);
225
226 EXPECT_EQ(kRequestId1, last_picked_->request_id());
227 EXPECT_FALSE(request_queue_empty_called_);
228 }
229
230 TEST_F(RequestPickerTest, ChooseLaterRequest) {
231 // We need a custom policy preferring recency over retry, and later requests.
232 policy_.reset(
233 new OfflinerPolicy(kPreferUntried, !kPreferEarlier, !kPreferRetryCount));
234 picker_.reset(new RequestPicker(queue_.get(), policy_.get()));
235
236 base::Time creation_time1 =
237 base::Time::Now() - base::TimeDelta::FromSeconds(10);
238 base::Time creation_time2 = base::Time::Now();
239 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time1,
240 kUserRequested);
241 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time2,
242 kUserRequested);
243
244 AddRequestsAndChooseOne(request1, request2);
245
246 EXPECT_EQ(kRequestId2, last_picked_->request_id());
247 EXPECT_FALSE(request_queue_empty_called_);
248 }
249
138 } // namespace offline_pages 250 } // namespace offline_pages
OLDNEW
« no previous file with comments | « components/offline_pages/background/offliner_policy.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698