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_max_form_cache_size(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. |
| 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 |