Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 <list> | 5 #include <list> |
| 6 | 6 |
| 7 #include "base/string_util.h" | 7 #include "base/string_util.h" |
| 8 #include "base/test/test_timeouts.h" | 8 #include "base/test/test_timeouts.h" |
| 9 #include "base/utf_string_conversions.h" | 9 #include "base/utf_string_conversions.h" |
| 10 #include "chrome/browser/autofill/autofill_download.h" | 10 #include "chrome/browser/autofill/autofill_download.h" |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 46 AutoFillDownloadTestHelper() | 46 AutoFillDownloadTestHelper() |
| 47 : download_manager(&profile) { | 47 : download_manager(&profile) { |
| 48 download_manager.SetObserver(this); | 48 download_manager.SetObserver(this); |
| 49 // For chromium builds forces Start*Request to actually execute. | 49 // For chromium builds forces Start*Request to actually execute. |
| 50 download_manager.is_testing_ = true; | 50 download_manager.is_testing_ = true; |
| 51 } | 51 } |
| 52 ~AutoFillDownloadTestHelper() { | 52 ~AutoFillDownloadTestHelper() { |
| 53 download_manager.SetObserver(NULL); | 53 download_manager.SetObserver(NULL); |
| 54 } | 54 } |
| 55 | 55 |
| 56 void LimitCache(size_t cache_size) { | |
| 57 download_manager.set_number_of_forms_to_cache(cache_size); | |
| 58 } | |
| 59 | |
| 56 // AutoFillDownloadManager::Observer overridables: | 60 // AutoFillDownloadManager::Observer overridables: |
| 57 virtual void OnLoadedAutoFillHeuristics( | 61 virtual void OnLoadedAutoFillHeuristics( |
| 58 const std::string& heuristic_xml) { | 62 const std::string& heuristic_xml) { |
| 59 ResponseData response; | 63 ResponseData response; |
| 60 response.response = heuristic_xml; | 64 response.response = heuristic_xml; |
| 61 response.type_of_response = QUERY_SUCCESSFULL; | 65 response.type_of_response = QUERY_SUCCESSFULL; |
| 62 responses_.push_back(response); | 66 responses_.push_back(response); |
| 63 }; | 67 }; |
| 64 | |
| 65 virtual void OnUploadedAutoFillHeuristics(const std::string& form_signature) { | 68 virtual void OnUploadedAutoFillHeuristics(const std::string& form_signature) { |
| 66 ResponseData response; | 69 ResponseData response; |
| 67 response.type_of_response = UPLOAD_SUCCESSFULL; | 70 response.type_of_response = UPLOAD_SUCCESSFULL; |
| 68 responses_.push_back(response); | 71 responses_.push_back(response); |
| 69 } | 72 } |
| 70 virtual void OnHeuristicsRequestError( | 73 virtual void OnHeuristicsRequestError( |
| 71 const std::string& form_signature, | 74 const std::string& form_signature, |
| 72 AutoFillDownloadManager::AutoFillRequestType request_type, | 75 AutoFillDownloadManager::AutoFillRequestType request_type, |
| 73 int http_error) { | 76 int http_error) { |
| 74 ResponseData response; | 77 ResponseData response; |
| (...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 269 helper.download_manager.SetPositiveUploadRate(0.0); | 272 helper.download_manager.SetPositiveUploadRate(0.0); |
| 270 helper.download_manager.SetNegativeUploadRate(0.0); | 273 helper.download_manager.SetNegativeUploadRate(0.0); |
| 271 // No actual requests for the next two calls, as we set upload rate to 0%. | 274 // No actual requests for the next two calls, as we set upload rate to 0%. |
| 272 EXPECT_FALSE(helper.download_manager.StartUploadRequest(*(form_structures[0]), | 275 EXPECT_FALSE(helper.download_manager.StartUploadRequest(*(form_structures[0]), |
| 273 true)); | 276 true)); |
| 274 EXPECT_FALSE(helper.download_manager.StartUploadRequest(*(form_structures[1]), | 277 EXPECT_FALSE(helper.download_manager.StartUploadRequest(*(form_structures[1]), |
| 275 false)); | 278 false)); |
| 276 fetcher = factory.GetFetcherByID(3); | 279 fetcher = factory.GetFetcherByID(3); |
| 277 EXPECT_EQ(NULL, fetcher); | 280 EXPECT_EQ(NULL, fetcher); |
| 278 | 281 |
| 282 // Modify form structures to miss the cache. | |
|
dhollowa
2011/01/25 23:33:02
I'm curious why this is was added to the existing
GeorgeY
2011/01/25 23:51:30
If we hit the cache, the request is always going t
| |
| 283 form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Address line 2"), | |
| 284 ASCIIToUTF16("address2"), | |
| 285 string16(), | |
| 286 ASCIIToUTF16("text"), | |
| 287 0, | |
| 288 false)); | |
| 289 form_structure = new FormStructure(form); | |
| 290 form_structures.push_back(form_structure); | |
| 291 | |
| 279 // Request with id 3. | 292 // Request with id 3. |
| 280 EXPECT_CALL(mock_metric_logger, Log(AutoFillMetrics::QUERY_SENT)).Times(1); | 293 EXPECT_CALL(mock_metric_logger, Log(AutoFillMetrics::QUERY_SENT)).Times(1); |
| 281 EXPECT_TRUE(helper.download_manager.StartQueryRequest(form_structures, | 294 EXPECT_TRUE(helper.download_manager.StartQueryRequest(form_structures, |
| 282 mock_metric_logger)); | 295 mock_metric_logger)); |
| 283 fetcher = factory.GetFetcherByID(3); | 296 fetcher = factory.GetFetcherByID(3); |
| 284 ASSERT_TRUE(fetcher); | 297 ASSERT_TRUE(fetcher); |
| 285 fetcher->set_backoff_delay( | 298 fetcher->set_backoff_delay( |
| 286 base::TimeDelta::FromMilliseconds(TestTimeouts::action_max_timeout_ms())); | 299 base::TimeDelta::FromMilliseconds(TestTimeouts::action_max_timeout_ms())); |
| 287 fetcher->delegate()->OnURLFetchComplete(fetcher, GURL(), | 300 fetcher->delegate()->OnURLFetchComplete(fetcher, GURL(), |
| 288 net::URLRequestStatus(), | 301 net::URLRequestStatus(), |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 322 | 335 |
| 323 // Upload requests should be ignored for the next 10 seconds. | 336 // Upload requests should be ignored for the next 10 seconds. |
| 324 EXPECT_FALSE(helper.download_manager.StartUploadRequest(*(form_structures[0]), | 337 EXPECT_FALSE(helper.download_manager.StartUploadRequest(*(form_structures[0]), |
| 325 true)); | 338 true)); |
| 326 fetcher = factory.GetFetcherByID(5); | 339 fetcher = factory.GetFetcherByID(5); |
| 327 EXPECT_EQ(NULL, fetcher); | 340 EXPECT_EQ(NULL, fetcher); |
| 328 | 341 |
| 329 // Make sure consumer of URLFetcher does the right thing. | 342 // Make sure consumer of URLFetcher does the right thing. |
| 330 URLFetcher::set_factory(NULL); | 343 URLFetcher::set_factory(NULL); |
| 331 } | 344 } |
| 345 | |
| 346 TEST(AutoFillDownloadTest, CacheQueryTest) { | |
| 347 MessageLoopForUI message_loop; | |
| 348 AutoFillDownloadTestHelper helper; | |
| 349 // Create and register factory. | |
| 350 TestURLFetcherFactory factory; | |
| 351 URLFetcher::set_factory(&factory); | |
| 352 | |
| 353 FormData form; | |
| 354 form.method = ASCIIToUTF16("post"); | |
| 355 form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("username"), | |
| 356 ASCIIToUTF16("username"), | |
| 357 string16(), | |
| 358 ASCIIToUTF16("text"), | |
| 359 0, | |
| 360 false)); | |
| 361 form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("First Name"), | |
| 362 ASCIIToUTF16("firstname"), | |
| 363 string16(), | |
| 364 ASCIIToUTF16("text"), | |
| 365 0, | |
| 366 false)); | |
| 367 form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Last Name"), | |
| 368 ASCIIToUTF16("lastname"), | |
| 369 string16(), | |
| 370 ASCIIToUTF16("text"), | |
| 371 0, | |
| 372 false)); | |
| 373 FormStructure *form_structure = new FormStructure(form); | |
| 374 ScopedVector<FormStructure> form_structures0; | |
| 375 form_structures0.push_back(form_structure); | |
| 376 | |
| 377 form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("email"), | |
| 378 ASCIIToUTF16("email"), | |
| 379 string16(), | |
| 380 ASCIIToUTF16("text"), | |
| 381 0, | |
| 382 false)); | |
| 383 // Slightly different form - so different request. | |
| 384 form_structure = new FormStructure(form); | |
| 385 ScopedVector<FormStructure> form_structures1; | |
| 386 form_structures1.push_back(form_structure); | |
| 387 | |
| 388 form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("email2"), | |
| 389 ASCIIToUTF16("email2"), | |
| 390 string16(), | |
| 391 ASCIIToUTF16("text"), | |
| 392 0, | |
| 393 false)); | |
| 394 // Slightly different form - so different request. | |
| 395 form_structure = new FormStructure(form); | |
| 396 ScopedVector<FormStructure> form_structures2; | |
| 397 form_structures2.push_back(form_structure); | |
| 398 | |
| 399 // Limit cache to two forms. | |
| 400 helper.LimitCache(2); | |
| 401 | |
| 402 const char *responses[] = { | |
| 403 "<autofillqueryresponse>" | |
| 404 "<field autofilltype=\"0\" />" | |
| 405 "<field autofilltype=\"3\" />" | |
| 406 "<field autofilltype=\"5\" />" | |
| 407 "</autofillqueryresponse>", | |
| 408 "<autofillqueryresponse>" | |
| 409 "<field autofilltype=\"0\" />" | |
| 410 "<field autofilltype=\"3\" />" | |
| 411 "<field autofilltype=\"5\" />" | |
| 412 "<field autofilltype=\"9\" />" | |
| 413 "</autofillqueryresponse>", | |
| 414 "<autofillqueryresponse>" | |
| 415 "<field autofilltype=\"0\" />" | |
| 416 "<field autofilltype=\"3\" />" | |
| 417 "<field autofilltype=\"5\" />" | |
| 418 "<field autofilltype=\"9\" />" | |
| 419 "<field autofilltype=\"0\" />" | |
| 420 "</autofillqueryresponse>", | |
| 421 }; | |
| 422 | |
| 423 // Request with id 0. | |
| 424 MockAutoFillMetrics mock_metric_logger; | |
| 425 EXPECT_CALL(mock_metric_logger, Log(AutoFillMetrics::QUERY_SENT)).Times(1); | |
| 426 EXPECT_TRUE(helper.download_manager.StartQueryRequest(form_structures0, | |
| 427 mock_metric_logger)); | |
| 428 // No responses yet | |
| 429 EXPECT_EQ(static_cast<size_t>(0), helper.responses_.size()); | |
| 430 | |
| 431 TestURLFetcher* fetcher = factory.GetFetcherByID(0); | |
| 432 ASSERT_TRUE(fetcher); | |
| 433 fetcher->delegate()->OnURLFetchComplete(fetcher, GURL(), | |
| 434 net::URLRequestStatus(), | |
| 435 200, ResponseCookies(), | |
| 436 std::string(responses[0])); | |
| 437 ASSERT_EQ(static_cast<size_t>(1), helper.responses_.size()); | |
| 438 EXPECT_EQ(responses[0], helper.responses_.front().response); | |
| 439 | |
| 440 helper.responses_.clear(); | |
| 441 | |
| 442 // No actual request - should be a cache hit. | |
| 443 EXPECT_CALL(mock_metric_logger, Log(AutoFillMetrics::QUERY_SENT)).Times(1); | |
| 444 EXPECT_TRUE(helper.download_manager.StartQueryRequest(form_structures0, | |
| 445 mock_metric_logger)); | |
| 446 // Data is available immediately from cache - no over-the-wire trip. | |
| 447 ASSERT_EQ(static_cast<size_t>(1), helper.responses_.size()); | |
| 448 EXPECT_EQ(responses[0], helper.responses_.front().response); | |
| 449 helper.responses_.clear(); | |
| 450 | |
| 451 // Request with id 1. | |
| 452 EXPECT_CALL(mock_metric_logger, Log(AutoFillMetrics::QUERY_SENT)).Times(1); | |
| 453 EXPECT_TRUE(helper.download_manager.StartQueryRequest(form_structures1, | |
| 454 mock_metric_logger)); | |
| 455 // No responses yet | |
| 456 EXPECT_EQ(static_cast<size_t>(0), helper.responses_.size()); | |
| 457 | |
| 458 fetcher = factory.GetFetcherByID(1); | |
| 459 ASSERT_TRUE(fetcher); | |
| 460 fetcher->delegate()->OnURLFetchComplete(fetcher, GURL(), | |
| 461 net::URLRequestStatus(), | |
| 462 200, ResponseCookies(), | |
| 463 std::string(responses[1])); | |
| 464 ASSERT_EQ(static_cast<size_t>(1), helper.responses_.size()); | |
| 465 EXPECT_EQ(responses[1], helper.responses_.front().response); | |
| 466 | |
| 467 helper.responses_.clear(); | |
| 468 | |
| 469 // Request with id 2. | |
| 470 EXPECT_CALL(mock_metric_logger, Log(AutoFillMetrics::QUERY_SENT)).Times(1); | |
| 471 EXPECT_TRUE(helper.download_manager.StartQueryRequest(form_structures2, | |
| 472 mock_metric_logger)); | |
| 473 | |
| 474 fetcher = factory.GetFetcherByID(2); | |
| 475 ASSERT_TRUE(fetcher); | |
| 476 fetcher->delegate()->OnURLFetchComplete(fetcher, GURL(), | |
| 477 net::URLRequestStatus(), | |
| 478 200, ResponseCookies(), | |
| 479 std::string(responses[2])); | |
| 480 ASSERT_EQ(static_cast<size_t>(1), helper.responses_.size()); | |
| 481 EXPECT_EQ(responses[2], helper.responses_.front().response); | |
| 482 | |
| 483 helper.responses_.clear(); | |
| 484 | |
| 485 // No actual requests - should be a cache hit. | |
| 486 EXPECT_CALL(mock_metric_logger, Log(AutoFillMetrics::QUERY_SENT)).Times(1); | |
| 487 EXPECT_TRUE(helper.download_manager.StartQueryRequest(form_structures1, | |
| 488 mock_metric_logger)); | |
| 489 | |
| 490 EXPECT_CALL(mock_metric_logger, Log(AutoFillMetrics::QUERY_SENT)).Times(1); | |
| 491 EXPECT_TRUE(helper.download_manager.StartQueryRequest(form_structures2, | |
| 492 mock_metric_logger)); | |
| 493 | |
| 494 ASSERT_EQ(static_cast<size_t>(2), helper.responses_.size()); | |
| 495 EXPECT_EQ(responses[1], helper.responses_.front().response); | |
| 496 EXPECT_EQ(responses[2], helper.responses_.back().response); | |
| 497 helper.responses_.clear(); | |
| 498 | |
| 499 // The first structure should've expired. | |
| 500 // Request with id 3. | |
| 501 EXPECT_CALL(mock_metric_logger, Log(AutoFillMetrics::QUERY_SENT)).Times(1); | |
| 502 EXPECT_TRUE(helper.download_manager.StartQueryRequest(form_structures0, | |
| 503 mock_metric_logger)); | |
| 504 // No responses yet | |
| 505 EXPECT_EQ(static_cast<size_t>(0), helper.responses_.size()); | |
| 506 | |
| 507 fetcher = factory.GetFetcherByID(3); | |
| 508 ASSERT_TRUE(fetcher); | |
| 509 fetcher->delegate()->OnURLFetchComplete(fetcher, GURL(), | |
| 510 net::URLRequestStatus(), | |
| 511 200, ResponseCookies(), | |
| 512 std::string(responses[0])); | |
| 513 ASSERT_EQ(static_cast<size_t>(1), helper.responses_.size()); | |
| 514 EXPECT_EQ(responses[0], helper.responses_.front().response); | |
| 515 | |
| 516 // Make sure consumer of URLFetcher does the right thing. | |
| 517 URLFetcher::set_factory(NULL); | |
| 518 } | |
| 519 | |
| OLD | NEW |