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 |