OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <string> | 5 #include <string> |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/file_path.h" | 8 #include "base/file_path.h" |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
126 // Syntactic sugar for an expression version of the switch-case statement. | 126 // Syntactic sugar for an expression version of the switch-case statement. |
127 // Cf. Lisp's |case| form. | 127 // Cf. Lisp's |case| form. |
128 #define SWITCH2(_index, _col1, _ret1, _default) \ | 128 #define SWITCH2(_index, _col1, _ret1, _default) \ |
129 ((_index == (_col1)) ? _ret1 : _default) | 129 ((_index == (_col1)) ? _ret1 : _default) |
130 #define SWITCH3(_index, _col1, _ret1, _col2, _ret2, _default) \ | 130 #define SWITCH3(_index, _col1, _ret1, _col2, _ret2, _default) \ |
131 SWITCH2(_index, _col1, _ret1, SWITCH2(_index, _col2, _ret2, _default)) | 131 SWITCH2(_index, _col1, _ret1, SWITCH2(_index, _col2, _ret2, _default)) |
132 #define SWITCH4(_index, _col1, _ret1, _col2, _ret2, _col3, _ret3, _default) \ | 132 #define SWITCH4(_index, _col1, _ret1, _col2, _ret2, _col3, _ret3, _default) \ |
133 SWITCH3(_index, _col1, _ret1, _col2, _ret2, \ | 133 SWITCH3(_index, _col1, _ret1, _col2, _ret2, \ |
134 SWITCH2(_index, _col3, _ret3, _default)) | 134 SWITCH2(_index, _col3, _ret3, _default)) |
135 | 135 |
136 TEST_F(DownloadQueryTest, DownloadQuery_QueryFilter) { | |
Randy Smith (Not in Mondays)
2012/09/12 18:20:57
Maybe switch Pawel's TODO over here? This is wher
benjhayden
2012/09/12 19:31:57
Done.
| |
137 FilePath match_filename(FILE_PATH_LITERAL("query")); | |
138 FilePath fail_filename(FILE_PATH_LITERAL("fail")); | |
139 GURL fail_url("http://example.com/fail"); | |
140 GURL match_url("http://query.com/query"); | |
141 scoped_ptr<base::Value> query_str(base::Value::CreateStringValue("query")); | |
142 static const size_t kNumItems = 4; | |
143 CreateMocks(kNumItems); | |
144 for (size_t i = 0; i < kNumItems; ++i) { | |
145 if (i != 0) | |
146 EXPECT_CALL(mock(i), GetId()).WillOnce(Return(i)); | |
147 EXPECT_CALL(mock(i), GetTargetFilePath()) | |
148 .WillRepeatedly(ReturnRef((i & 1) ? match_filename : fail_filename)); | |
149 EXPECT_CALL(mock(i), GetOriginalUrl()) | |
150 .WillRepeatedly(ReturnRef((i & 2) ? match_url : fail_url)); | |
151 EXPECT_CALL(mock(i), GetBrowserContext()).WillRepeatedly(Return( | |
152 static_cast<content::BrowserContext*>(NULL))); | |
153 } | |
154 query()->AddFilter(DownloadQuery::FILTER_QUERY, *query_str.get()); | |
155 Search(); | |
156 ASSERT_EQ(3U, results()->size()); | |
157 EXPECT_EQ(1, results()->at(0)->GetId()); | |
158 EXPECT_EQ(2, results()->at(1)->GetId()); | |
159 EXPECT_EQ(3, results()->at(2)->GetId()); | |
160 } | |
161 | |
136 TEST_F(DownloadQueryTest, DownloadQueryAllFilters) { | 162 TEST_F(DownloadQueryTest, DownloadQueryAllFilters) { |
137 // Set up mocks such that only mock(0) matches all filters, and every other | 163 // Set up mocks such that only mock(0) matches all filters, and every other |
138 // mock fails a different filter (or two for GREATER/LESS filters). | 164 // mock fails a different filter (or two for GREATER/LESS filters). |
139 static const size_t kNumItems = 19; | 165 static const size_t kNumItems = 18; |
140 CreateMocks(kNumItems); | 166 CreateMocks(kNumItems); |
141 FilePath refail_filename(FILE_PATH_LITERAL("z")); | 167 FilePath refail_filename(FILE_PATH_LITERAL("z")); |
142 FilePath fail_filename(FILE_PATH_LITERAL("fail")); | 168 FilePath fail_filename(FILE_PATH_LITERAL("fail")); |
143 FilePath match_filename(FILE_PATH_LITERAL("match")); | 169 FilePath match_filename(FILE_PATH_LITERAL("match")); |
144 GURL refail_url("http://z.com/"); | 170 GURL refail_url("http://z.com/"); |
145 GURL fail_url("http://example.com/fail"); | 171 GURL fail_url("http://example.com/fail"); |
146 GURL match_url("http://example.com/match"); | 172 GURL match_url("http://example.com/match"); |
147 // Picture a 2D matrix. The rows are MockDownloadItems and the columns are | 173 // Picture a 2D matrix. The rows are MockDownloadItems and the columns are |
148 // filter types. Every cell contains a value that matches all filters, except | 174 // filter types. Every cell contains a value that matches all filters, except |
149 // for the diagonal. Every item matches all the filters except one filter, | 175 // for the diagonal. Every item matches all the filters except one filter, |
150 // which it fails, except one item, which matches all the filters without | 176 // which it fails, except one item, which matches all the filters without |
151 // exception. Each mocked method is used to test (corresponds to) one or more | 177 // exception. Each mocked method is used to test (corresponds to) one or more |
152 // filter types (columns). For example, GetTotalBytes() is used to test | 178 // filter types (columns). For example, GetTotalBytes() is used to test |
153 // FILTER_TOTAL_BYTES_GREATER, FILTER_TOTAL_BYTES_LESS, and | 179 // FILTER_TOTAL_BYTES_GREATER, FILTER_TOTAL_BYTES_LESS, and |
154 // FILTER_TOTAL_BYTES, so it uses 3 columns: it returns 1 for row (item) 11, | 180 // FILTER_TOTAL_BYTES, so it uses 3 columns: it returns 1 for row (item) 11, |
155 // it returns 4 for row 12, 3 for 13, and it returns 2 for all other rows | 181 // it returns 4 for row 12, 3 for 13, and it returns 2 for all other rows |
156 // (items). | 182 // (items). |
157 for (size_t i = 0; i < kNumItems; ++i) { | 183 for (size_t i = 0; i < kNumItems; ++i) { |
158 EXPECT_CALL(mock(i), GetId()).WillRepeatedly(Return(i)); | 184 EXPECT_CALL(mock(i), GetId()).WillRepeatedly(Return(i)); |
159 EXPECT_CALL(mock(i), GetReceivedBytes()).WillRepeatedly(Return(SWITCH2(i, | 185 EXPECT_CALL(mock(i), GetReceivedBytes()).WillRepeatedly(Return(SWITCH2(i, |
160 1, 2, | 186 1, 2, |
161 1))); | 187 1))); |
162 EXPECT_CALL(mock(i), GetSafetyState()).WillRepeatedly(Return(SWITCH2(i, | 188 EXPECT_CALL(mock(i), GetSafetyState()).WillRepeatedly(Return(SWITCH2(i, |
163 2, DownloadItem::DANGEROUS, | 189 2, DownloadItem::DANGEROUS, |
164 DownloadItem::DANGEROUS_BUT_VALIDATED))); | 190 DownloadItem::DANGEROUS_BUT_VALIDATED))); |
165 EXPECT_CALL(mock(i), GetFullPath()).WillRepeatedly(ReturnRef(SWITCH3(i, | 191 EXPECT_CALL(mock(i), GetTargetFilePath()) |
192 .WillRepeatedly(ReturnRef(SWITCH3(i, | |
166 3, refail_filename, | 193 3, refail_filename, |
167 4, fail_filename, | 194 4, fail_filename, |
168 match_filename))); | 195 match_filename))); |
169 EXPECT_CALL(mock(i), GetMimeType()).WillRepeatedly(Return(SWITCH2(i, | 196 EXPECT_CALL(mock(i), GetMimeType()).WillRepeatedly(Return(SWITCH2(i, |
170 5, "image", | 197 5, "image", |
171 "text"))); | 198 "text"))); |
172 EXPECT_CALL(mock(i), IsPaused()).WillRepeatedly(Return(SWITCH2(i, | 199 EXPECT_CALL(mock(i), IsPaused()).WillRepeatedly(Return(SWITCH2(i, |
173 6, false, | 200 6, false, |
174 true))); | 201 true))); |
175 EXPECT_CALL(mock(i), MatchesQuery(_)).WillRepeatedly(Return(SWITCH2(i, | |
176 7, false, | |
177 true))); | |
178 EXPECT_CALL(mock(i), GetStartTime()).WillRepeatedly(Return(SWITCH4(i, | 202 EXPECT_CALL(mock(i), GetStartTime()).WillRepeatedly(Return(SWITCH4(i, |
179 8, base::Time::FromTimeT(1), | 203 7, base::Time::FromTimeT(1), |
180 9, base::Time::FromTimeT(4), | 204 8, base::Time::FromTimeT(4), |
181 10, base::Time::FromTimeT(3), | 205 9, base::Time::FromTimeT(3), |
182 base::Time::FromTimeT(2)))); | 206 base::Time::FromTimeT(2)))); |
183 EXPECT_CALL(mock(i), GetTotalBytes()).WillRepeatedly(Return(SWITCH4(i, | 207 EXPECT_CALL(mock(i), GetTotalBytes()).WillRepeatedly(Return(SWITCH4(i, |
184 11, 1, | 208 10, 1, |
185 12, 4, | 209 11, 4, |
186 13, 3, | 210 12, 3, |
187 2))); | 211 2))); |
188 EXPECT_CALL(mock(i), GetOriginalUrl()).WillRepeatedly(ReturnRef(SWITCH3(i, | 212 EXPECT_CALL(mock(i), GetOriginalUrl()).WillRepeatedly(ReturnRef(SWITCH3(i, |
189 14, refail_url, | 213 13, refail_url, |
190 15, fail_url, | 214 14, fail_url, |
191 match_url))); | 215 match_url))); |
216 // 15 is AddFilter(Bind(IdNotEqual, 15)) | |
192 EXPECT_CALL(mock(i), GetState()).WillRepeatedly(Return(SWITCH2(i, | 217 EXPECT_CALL(mock(i), GetState()).WillRepeatedly(Return(SWITCH2(i, |
193 17, DownloadItem::CANCELLED, | 218 16, DownloadItem::CANCELLED, |
194 DownloadItem::IN_PROGRESS))); | 219 DownloadItem::IN_PROGRESS))); |
195 EXPECT_CALL(mock(i), GetDangerType()).WillRepeatedly(Return(SWITCH2(i, | 220 EXPECT_CALL(mock(i), GetDangerType()).WillRepeatedly(Return(SWITCH2(i, |
196 18, content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE, | 221 17, content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE, |
197 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS))); | 222 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS))); |
198 } | 223 } |
199 for (size_t i = 0; i < kNumItems; ++i) { | 224 for (size_t i = 0; i < kNumItems; ++i) { |
200 switch (i) { | 225 switch (i) { |
201 case 0: break; | 226 case 0: break; |
202 case 1: AddFilter(DownloadQuery::FILTER_BYTES_RECEIVED, 1); break; | 227 case 1: AddFilter(DownloadQuery::FILTER_BYTES_RECEIVED, 1); break; |
203 case 2: AddFilter(DownloadQuery::FILTER_DANGER_ACCEPTED, true); | 228 case 2: AddFilter(DownloadQuery::FILTER_DANGER_ACCEPTED, true); |
204 break; | 229 break; |
205 case 3: AddFilter(DownloadQuery::FILTER_FILENAME_REGEX, "a"); break; | 230 case 3: AddFilter(DownloadQuery::FILTER_FILENAME_REGEX, "a"); break; |
206 case 4: AddFilter(DownloadQuery::FILTER_FILENAME, | 231 case 4: AddFilter(DownloadQuery::FILTER_FILENAME, |
207 match_filename.value().c_str()); break; | 232 match_filename.value().c_str()); break; |
208 case 5: AddFilter(DownloadQuery::FILTER_MIME, "text"); break; | 233 case 5: AddFilter(DownloadQuery::FILTER_MIME, "text"); break; |
209 case 6: AddFilter(DownloadQuery::FILTER_PAUSED, true); break; | 234 case 6: AddFilter(DownloadQuery::FILTER_PAUSED, true); break; |
210 case 7: AddFilter(DownloadQuery::FILTER_QUERY, ""); break; | 235 case 7: AddFilter(DownloadQuery::FILTER_STARTED_AFTER, 1000); break; |
211 case 8: AddFilter(DownloadQuery::FILTER_STARTED_AFTER, 1000); break; | 236 case 8: AddFilter(DownloadQuery::FILTER_STARTED_BEFORE, 4000); |
212 case 9: AddFilter(DownloadQuery::FILTER_STARTED_BEFORE, 4000); | |
213 break; | 237 break; |
214 case 10: AddFilter(DownloadQuery::FILTER_START_TIME, 2000); break; | 238 case 9: AddFilter(DownloadQuery::FILTER_START_TIME, 2000); break; |
215 case 11: AddFilter(DownloadQuery::FILTER_TOTAL_BYTES_GREATER, 1); | 239 case 10: AddFilter(DownloadQuery::FILTER_TOTAL_BYTES_GREATER, 1); |
216 break; | 240 break; |
217 case 12: AddFilter(DownloadQuery::FILTER_TOTAL_BYTES_LESS, 4); | 241 case 11: AddFilter(DownloadQuery::FILTER_TOTAL_BYTES_LESS, 4); |
218 break; | 242 break; |
219 case 13: AddFilter(DownloadQuery::FILTER_TOTAL_BYTES, 2); break; | 243 case 12: AddFilter(DownloadQuery::FILTER_TOTAL_BYTES, 2); break; |
220 case 14: AddFilter(DownloadQuery::FILTER_URL_REGEX, "example"); | 244 case 13: AddFilter(DownloadQuery::FILTER_URL_REGEX, "example"); |
221 break; | 245 break; |
222 case 15: AddFilter(DownloadQuery::FILTER_URL, | 246 case 14: AddFilter(DownloadQuery::FILTER_URL, |
223 match_url.spec().c_str()); break; | 247 match_url.spec().c_str()); break; |
224 case 16: CHECK(query()->AddFilter(base::Bind(&IdNotEqual, 16))); break; | 248 case 15: CHECK(query()->AddFilter(base::Bind(&IdNotEqual, 15))); break; |
225 case 17: query()->AddFilter(DownloadItem::IN_PROGRESS); break; | 249 case 16: query()->AddFilter(DownloadItem::IN_PROGRESS); break; |
226 case 18: query()->AddFilter(content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); | 250 case 17: query()->AddFilter(content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
227 break; | 251 break; |
228 default: NOTREACHED(); break; | 252 default: NOTREACHED(); break; |
229 } | 253 } |
230 Search(); | 254 Search(); |
231 ASSERT_EQ(kNumItems - i, results()->size()) | 255 ASSERT_EQ(kNumItems - i, results()->size()) |
232 << "Failing filter: " << i; | 256 << "Failing filter: " << i; |
233 if (i > 0) { | 257 if (i > 0) { |
234 ASSERT_EQ(0, results()->at(0)->GetId()) | 258 ASSERT_EQ(0, results()->at(0)->GetId()) |
235 << "Failing filter: " << i; | 259 << "Failing filter: " << i; |
236 for (size_t j = 1; j < kNumItems - i; ++j) { | 260 for (size_t j = 1; j < kNumItems - i; ++j) { |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
276 query()->AddSorter( | 300 query()->AddSorter( |
277 DownloadQuery::SORT_DANGER_ACCEPTED, DownloadQuery::DESCENDING); | 301 DownloadQuery::SORT_DANGER_ACCEPTED, DownloadQuery::DESCENDING); |
278 Search(); | 302 Search(); |
279 EXPECT_EQ(DownloadItem::DANGEROUS_BUT_VALIDATED, | 303 EXPECT_EQ(DownloadItem::DANGEROUS_BUT_VALIDATED, |
280 results()->at(0)->GetSafetyState()); | 304 results()->at(0)->GetSafetyState()); |
281 EXPECT_EQ(DownloadItem::DANGEROUS, results()->at(1)->GetSafetyState()); | 305 EXPECT_EQ(DownloadItem::DANGEROUS, results()->at(1)->GetSafetyState()); |
282 } | 306 } |
283 | 307 |
284 TEST_F(DownloadQueryTest, DownloadQuerySortFilename) { | 308 TEST_F(DownloadQueryTest, DownloadQuerySortFilename) { |
285 CreateMocks(2); | 309 CreateMocks(2); |
286 FilePath a_filename(FILE_PATH_LITERAL("a")); | 310 FilePath a_path(FILE_PATH_LITERAL("a")); |
287 FilePath b_filename(FILE_PATH_LITERAL("b")); | 311 FilePath b_path(FILE_PATH_LITERAL("b")); |
288 EXPECT_CALL(mock(0), GetFullPath()).WillRepeatedly(ReturnRef(b_filename)); | 312 EXPECT_CALL(mock(0), GetTargetFilePath()).WillRepeatedly(ReturnRef(b_path)); |
289 EXPECT_CALL(mock(1), GetFullPath()).WillRepeatedly(ReturnRef(a_filename)); | 313 EXPECT_CALL(mock(1), GetTargetFilePath()).WillRepeatedly(ReturnRef(a_path)); |
290 query()->AddSorter( | 314 query()->AddSorter( |
291 DownloadQuery::SORT_FILENAME, DownloadQuery::ASCENDING); | 315 DownloadQuery::SORT_FILENAME, DownloadQuery::ASCENDING); |
292 Search(); | 316 Search(); |
293 EXPECT_EQ(a_filename, results()->at(0)->GetFullPath()); | 317 EXPECT_EQ(a_path, results()->at(0)->GetTargetFilePath()); |
294 EXPECT_EQ(b_filename, results()->at(1)->GetFullPath()); | 318 EXPECT_EQ(b_path, results()->at(1)->GetTargetFilePath()); |
295 } | 319 } |
296 | 320 |
297 TEST_F(DownloadQueryTest, DownloadQuerySortMime) { | 321 TEST_F(DownloadQueryTest, DownloadQuerySortMime) { |
298 CreateMocks(2); | 322 CreateMocks(2); |
299 EXPECT_CALL(mock(0), GetMimeType()).WillRepeatedly(Return("a")); | 323 EXPECT_CALL(mock(0), GetMimeType()).WillRepeatedly(Return("a")); |
300 EXPECT_CALL(mock(1), GetMimeType()).WillRepeatedly(Return("b")); | 324 EXPECT_CALL(mock(1), GetMimeType()).WillRepeatedly(Return("b")); |
301 query()->AddSorter( | 325 query()->AddSorter( |
302 DownloadQuery::SORT_MIME, DownloadQuery::DESCENDING); | 326 DownloadQuery::SORT_MIME, DownloadQuery::DESCENDING); |
303 Search(); | 327 Search(); |
304 EXPECT_EQ("b", results()->at(0)->GetMimeType()); | 328 EXPECT_EQ("b", results()->at(0)->GetMimeType()); |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
390 base::Time start = base::Time::Now(); | 414 base::Time start = base::Time::Now(); |
391 Search(); | 415 Search(); |
392 base::Time end = base::Time::Now(); | 416 base::Time end = base::Time::Now(); |
393 double nanos = (end - start).InMillisecondsF() * 1000.0 * 1000.0; | 417 double nanos = (end - start).InMillisecondsF() * 1000.0 * 1000.0; |
394 double nanos_per_item = nanos / static_cast<double>(kNumItems); | 418 double nanos_per_item = nanos / static_cast<double>(kNumItems); |
395 double nanos_per_item_per_filter = nanos_per_item | 419 double nanos_per_item_per_filter = nanos_per_item |
396 / static_cast<double>(kNumFilters); | 420 / static_cast<double>(kNumFilters); |
397 std::cout << "Search took " << nanos_per_item_per_filter | 421 std::cout << "Search took " << nanos_per_item_per_filter |
398 << " nanoseconds per item per filter.\n"; | 422 << " nanoseconds per item per filter.\n"; |
399 } | 423 } |
OLD | NEW |