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) { |
| 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 // TODO(phajdan.jr): Also test these strings: |
| 162 // "/\xe4\xbd\xa0\xe5\xa5\xbd\xe4\xbd\xa0\xe5\xa5\xbd", |
| 163 // L"/\x4f60\x597d\x4f60\x597d", |
| 164 // "/%E4%BD%A0%E5%A5%BD%E4%BD%A0%E5%A5%BD" |
| 165 } |
| 166 |
136 TEST_F(DownloadQueryTest, DownloadQueryAllFilters) { | 167 TEST_F(DownloadQueryTest, DownloadQueryAllFilters) { |
137 // Set up mocks such that only mock(0) matches all filters, and every other | 168 // 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). | 169 // mock fails a different filter (or two for GREATER/LESS filters). |
139 static const size_t kNumItems = 19; | 170 static const size_t kNumItems = 18; |
140 CreateMocks(kNumItems); | 171 CreateMocks(kNumItems); |
141 FilePath refail_filename(FILE_PATH_LITERAL("z")); | 172 FilePath refail_filename(FILE_PATH_LITERAL("z")); |
142 FilePath fail_filename(FILE_PATH_LITERAL("fail")); | 173 FilePath fail_filename(FILE_PATH_LITERAL("fail")); |
143 FilePath match_filename(FILE_PATH_LITERAL("match")); | 174 FilePath match_filename(FILE_PATH_LITERAL("match")); |
144 GURL refail_url("http://z.com/"); | 175 GURL refail_url("http://z.com/"); |
145 GURL fail_url("http://example.com/fail"); | 176 GURL fail_url("http://example.com/fail"); |
146 GURL match_url("http://example.com/match"); | 177 GURL match_url("http://example.com/match"); |
147 // Picture a 2D matrix. The rows are MockDownloadItems and the columns are | 178 // 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 | 179 // 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, | 180 // 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 | 181 // 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 | 182 // exception. Each mocked method is used to test (corresponds to) one or more |
152 // filter types (columns). For example, GetTotalBytes() is used to test | 183 // filter types (columns). For example, GetTotalBytes() is used to test |
153 // FILTER_TOTAL_BYTES_GREATER, FILTER_TOTAL_BYTES_LESS, and | 184 // 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, | 185 // 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 | 186 // it returns 4 for row 12, 3 for 13, and it returns 2 for all other rows |
156 // (items). | 187 // (items). |
157 for (size_t i = 0; i < kNumItems; ++i) { | 188 for (size_t i = 0; i < kNumItems; ++i) { |
158 EXPECT_CALL(mock(i), GetId()).WillRepeatedly(Return(i)); | 189 EXPECT_CALL(mock(i), GetId()).WillRepeatedly(Return(i)); |
159 EXPECT_CALL(mock(i), GetReceivedBytes()).WillRepeatedly(Return(SWITCH2(i, | 190 EXPECT_CALL(mock(i), GetReceivedBytes()).WillRepeatedly(Return(SWITCH2(i, |
160 1, 2, | 191 1, 2, |
161 1))); | 192 1))); |
162 EXPECT_CALL(mock(i), GetSafetyState()).WillRepeatedly(Return(SWITCH2(i, | 193 EXPECT_CALL(mock(i), GetSafetyState()).WillRepeatedly(Return(SWITCH2(i, |
163 2, DownloadItem::DANGEROUS, | 194 2, DownloadItem::DANGEROUS, |
164 DownloadItem::DANGEROUS_BUT_VALIDATED))); | 195 DownloadItem::DANGEROUS_BUT_VALIDATED))); |
165 EXPECT_CALL(mock(i), GetFullPath()).WillRepeatedly(ReturnRef(SWITCH3(i, | 196 EXPECT_CALL(mock(i), GetTargetFilePath()) |
| 197 .WillRepeatedly(ReturnRef(SWITCH3(i, |
166 3, refail_filename, | 198 3, refail_filename, |
167 4, fail_filename, | 199 4, fail_filename, |
168 match_filename))); | 200 match_filename))); |
169 EXPECT_CALL(mock(i), GetMimeType()).WillRepeatedly(Return(SWITCH2(i, | 201 EXPECT_CALL(mock(i), GetMimeType()).WillRepeatedly(Return(SWITCH2(i, |
170 5, "image", | 202 5, "image", |
171 "text"))); | 203 "text"))); |
172 EXPECT_CALL(mock(i), IsPaused()).WillRepeatedly(Return(SWITCH2(i, | 204 EXPECT_CALL(mock(i), IsPaused()).WillRepeatedly(Return(SWITCH2(i, |
173 6, false, | 205 6, false, |
174 true))); | 206 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, | 207 EXPECT_CALL(mock(i), GetStartTime()).WillRepeatedly(Return(SWITCH4(i, |
179 8, base::Time::FromTimeT(1), | 208 7, base::Time::FromTimeT(1), |
180 9, base::Time::FromTimeT(4), | 209 8, base::Time::FromTimeT(4), |
181 10, base::Time::FromTimeT(3), | 210 9, base::Time::FromTimeT(3), |
182 base::Time::FromTimeT(2)))); | 211 base::Time::FromTimeT(2)))); |
183 EXPECT_CALL(mock(i), GetTotalBytes()).WillRepeatedly(Return(SWITCH4(i, | 212 EXPECT_CALL(mock(i), GetTotalBytes()).WillRepeatedly(Return(SWITCH4(i, |
184 11, 1, | 213 10, 1, |
185 12, 4, | 214 11, 4, |
186 13, 3, | 215 12, 3, |
187 2))); | 216 2))); |
188 EXPECT_CALL(mock(i), GetOriginalUrl()).WillRepeatedly(ReturnRef(SWITCH3(i, | 217 EXPECT_CALL(mock(i), GetOriginalUrl()).WillRepeatedly(ReturnRef(SWITCH3(i, |
189 14, refail_url, | 218 13, refail_url, |
190 15, fail_url, | 219 14, fail_url, |
191 match_url))); | 220 match_url))); |
| 221 // 15 is AddFilter(Bind(IdNotEqual, 15)) |
192 EXPECT_CALL(mock(i), GetState()).WillRepeatedly(Return(SWITCH2(i, | 222 EXPECT_CALL(mock(i), GetState()).WillRepeatedly(Return(SWITCH2(i, |
193 17, DownloadItem::CANCELLED, | 223 16, DownloadItem::CANCELLED, |
194 DownloadItem::IN_PROGRESS))); | 224 DownloadItem::IN_PROGRESS))); |
195 EXPECT_CALL(mock(i), GetDangerType()).WillRepeatedly(Return(SWITCH2(i, | 225 EXPECT_CALL(mock(i), GetDangerType()).WillRepeatedly(Return(SWITCH2(i, |
196 18, content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE, | 226 17, content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE, |
197 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS))); | 227 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS))); |
198 } | 228 } |
199 for (size_t i = 0; i < kNumItems; ++i) { | 229 for (size_t i = 0; i < kNumItems; ++i) { |
200 switch (i) { | 230 switch (i) { |
201 case 0: break; | 231 case 0: break; |
202 case 1: AddFilter(DownloadQuery::FILTER_BYTES_RECEIVED, 1); break; | 232 case 1: AddFilter(DownloadQuery::FILTER_BYTES_RECEIVED, 1); break; |
203 case 2: AddFilter(DownloadQuery::FILTER_DANGER_ACCEPTED, true); | 233 case 2: AddFilter(DownloadQuery::FILTER_DANGER_ACCEPTED, true); |
204 break; | 234 break; |
205 case 3: AddFilter(DownloadQuery::FILTER_FILENAME_REGEX, "a"); break; | 235 case 3: AddFilter(DownloadQuery::FILTER_FILENAME_REGEX, "a"); break; |
206 case 4: AddFilter(DownloadQuery::FILTER_FILENAME, | 236 case 4: AddFilter(DownloadQuery::FILTER_FILENAME, |
207 match_filename.value().c_str()); break; | 237 match_filename.value().c_str()); break; |
208 case 5: AddFilter(DownloadQuery::FILTER_MIME, "text"); break; | 238 case 5: AddFilter(DownloadQuery::FILTER_MIME, "text"); break; |
209 case 6: AddFilter(DownloadQuery::FILTER_PAUSED, true); break; | 239 case 6: AddFilter(DownloadQuery::FILTER_PAUSED, true); break; |
210 case 7: AddFilter(DownloadQuery::FILTER_QUERY, ""); break; | 240 case 7: AddFilter(DownloadQuery::FILTER_STARTED_AFTER, 1000); break; |
211 case 8: AddFilter(DownloadQuery::FILTER_STARTED_AFTER, 1000); break; | 241 case 8: AddFilter(DownloadQuery::FILTER_STARTED_BEFORE, 4000); |
212 case 9: AddFilter(DownloadQuery::FILTER_STARTED_BEFORE, 4000); | |
213 break; | 242 break; |
214 case 10: AddFilter(DownloadQuery::FILTER_START_TIME, 2000); break; | 243 case 9: AddFilter(DownloadQuery::FILTER_START_TIME, 2000); break; |
215 case 11: AddFilter(DownloadQuery::FILTER_TOTAL_BYTES_GREATER, 1); | 244 case 10: AddFilter(DownloadQuery::FILTER_TOTAL_BYTES_GREATER, 1); |
216 break; | 245 break; |
217 case 12: AddFilter(DownloadQuery::FILTER_TOTAL_BYTES_LESS, 4); | 246 case 11: AddFilter(DownloadQuery::FILTER_TOTAL_BYTES_LESS, 4); |
218 break; | 247 break; |
219 case 13: AddFilter(DownloadQuery::FILTER_TOTAL_BYTES, 2); break; | 248 case 12: AddFilter(DownloadQuery::FILTER_TOTAL_BYTES, 2); break; |
220 case 14: AddFilter(DownloadQuery::FILTER_URL_REGEX, "example"); | 249 case 13: AddFilter(DownloadQuery::FILTER_URL_REGEX, "example"); |
221 break; | 250 break; |
222 case 15: AddFilter(DownloadQuery::FILTER_URL, | 251 case 14: AddFilter(DownloadQuery::FILTER_URL, |
223 match_url.spec().c_str()); break; | 252 match_url.spec().c_str()); break; |
224 case 16: CHECK(query()->AddFilter(base::Bind(&IdNotEqual, 16))); break; | 253 case 15: CHECK(query()->AddFilter(base::Bind(&IdNotEqual, 15))); break; |
225 case 17: query()->AddFilter(DownloadItem::IN_PROGRESS); break; | 254 case 16: query()->AddFilter(DownloadItem::IN_PROGRESS); break; |
226 case 18: query()->AddFilter(content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); | 255 case 17: query()->AddFilter(content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
227 break; | 256 break; |
228 default: NOTREACHED(); break; | 257 default: NOTREACHED(); break; |
229 } | 258 } |
230 Search(); | 259 Search(); |
231 ASSERT_EQ(kNumItems - i, results()->size()) | 260 ASSERT_EQ(kNumItems - i, results()->size()) |
232 << "Failing filter: " << i; | 261 << "Failing filter: " << i; |
233 if (i > 0) { | 262 if (i > 0) { |
234 ASSERT_EQ(0, results()->at(0)->GetId()) | 263 ASSERT_EQ(0, results()->at(0)->GetId()) |
235 << "Failing filter: " << i; | 264 << "Failing filter: " << i; |
236 for (size_t j = 1; j < kNumItems - i; ++j) { | 265 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( | 305 query()->AddSorter( |
277 DownloadQuery::SORT_DANGER_ACCEPTED, DownloadQuery::DESCENDING); | 306 DownloadQuery::SORT_DANGER_ACCEPTED, DownloadQuery::DESCENDING); |
278 Search(); | 307 Search(); |
279 EXPECT_EQ(DownloadItem::DANGEROUS_BUT_VALIDATED, | 308 EXPECT_EQ(DownloadItem::DANGEROUS_BUT_VALIDATED, |
280 results()->at(0)->GetSafetyState()); | 309 results()->at(0)->GetSafetyState()); |
281 EXPECT_EQ(DownloadItem::DANGEROUS, results()->at(1)->GetSafetyState()); | 310 EXPECT_EQ(DownloadItem::DANGEROUS, results()->at(1)->GetSafetyState()); |
282 } | 311 } |
283 | 312 |
284 TEST_F(DownloadQueryTest, DownloadQuerySortFilename) { | 313 TEST_F(DownloadQueryTest, DownloadQuerySortFilename) { |
285 CreateMocks(2); | 314 CreateMocks(2); |
286 FilePath a_filename(FILE_PATH_LITERAL("a")); | 315 FilePath a_path(FILE_PATH_LITERAL("a")); |
287 FilePath b_filename(FILE_PATH_LITERAL("b")); | 316 FilePath b_path(FILE_PATH_LITERAL("b")); |
288 EXPECT_CALL(mock(0), GetFullPath()).WillRepeatedly(ReturnRef(b_filename)); | 317 EXPECT_CALL(mock(0), GetTargetFilePath()).WillRepeatedly(ReturnRef(b_path)); |
289 EXPECT_CALL(mock(1), GetFullPath()).WillRepeatedly(ReturnRef(a_filename)); | 318 EXPECT_CALL(mock(1), GetTargetFilePath()).WillRepeatedly(ReturnRef(a_path)); |
290 query()->AddSorter( | 319 query()->AddSorter( |
291 DownloadQuery::SORT_FILENAME, DownloadQuery::ASCENDING); | 320 DownloadQuery::SORT_FILENAME, DownloadQuery::ASCENDING); |
292 Search(); | 321 Search(); |
293 EXPECT_EQ(a_filename, results()->at(0)->GetFullPath()); | 322 EXPECT_EQ(a_path, results()->at(0)->GetTargetFilePath()); |
294 EXPECT_EQ(b_filename, results()->at(1)->GetFullPath()); | 323 EXPECT_EQ(b_path, results()->at(1)->GetTargetFilePath()); |
295 } | 324 } |
296 | 325 |
297 TEST_F(DownloadQueryTest, DownloadQuerySortMime) { | 326 TEST_F(DownloadQueryTest, DownloadQuerySortMime) { |
298 CreateMocks(2); | 327 CreateMocks(2); |
299 EXPECT_CALL(mock(0), GetMimeType()).WillRepeatedly(Return("a")); | 328 EXPECT_CALL(mock(0), GetMimeType()).WillRepeatedly(Return("a")); |
300 EXPECT_CALL(mock(1), GetMimeType()).WillRepeatedly(Return("b")); | 329 EXPECT_CALL(mock(1), GetMimeType()).WillRepeatedly(Return("b")); |
301 query()->AddSorter( | 330 query()->AddSorter( |
302 DownloadQuery::SORT_MIME, DownloadQuery::DESCENDING); | 331 DownloadQuery::SORT_MIME, DownloadQuery::DESCENDING); |
303 Search(); | 332 Search(); |
304 EXPECT_EQ("b", results()->at(0)->GetMimeType()); | 333 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(); | 419 base::Time start = base::Time::Now(); |
391 Search(); | 420 Search(); |
392 base::Time end = base::Time::Now(); | 421 base::Time end = base::Time::Now(); |
393 double nanos = (end - start).InMillisecondsF() * 1000.0 * 1000.0; | 422 double nanos = (end - start).InMillisecondsF() * 1000.0 * 1000.0; |
394 double nanos_per_item = nanos / static_cast<double>(kNumItems); | 423 double nanos_per_item = nanos / static_cast<double>(kNumItems); |
395 double nanos_per_item_per_filter = nanos_per_item | 424 double nanos_per_item_per_filter = nanos_per_item |
396 / static_cast<double>(kNumFilters); | 425 / static_cast<double>(kNumFilters); |
397 std::cout << "Search took " << nanos_per_item_per_filter | 426 std::cout << "Search took " << nanos_per_item_per_filter |
398 << " nanoseconds per item per filter.\n"; | 427 << " nanoseconds per item per filter.\n"; |
399 } | 428 } |
OLD | NEW |