Chromium Code Reviews| 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 |