| 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 |