| Index: chrome/browser/autofill/autofill_download_unittest.cc
|
| ===================================================================
|
| --- chrome/browser/autofill/autofill_download_unittest.cc (revision 72523)
|
| +++ chrome/browser/autofill/autofill_download_unittest.cc (working copy)
|
| @@ -53,6 +53,10 @@
|
| download_manager.SetObserver(NULL);
|
| }
|
|
|
| + void LimitCache(size_t cache_size) {
|
| + download_manager.set_max_form_cache_size(cache_size);
|
| + }
|
| +
|
| // AutoFillDownloadManager::Observer overridables:
|
| virtual void OnLoadedAutoFillHeuristics(
|
| const std::string& heuristic_xml) {
|
| @@ -61,7 +65,6 @@
|
| response.type_of_response = QUERY_SUCCESSFULL;
|
| responses_.push_back(response);
|
| };
|
| -
|
| virtual void OnUploadedAutoFillHeuristics(const std::string& form_signature) {
|
| ResponseData response;
|
| response.type_of_response = UPLOAD_SUCCESSFULL;
|
| @@ -276,6 +279,16 @@
|
| fetcher = factory.GetFetcherByID(3);
|
| EXPECT_EQ(NULL, fetcher);
|
|
|
| + // Modify form structures to miss the cache.
|
| + form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Address line 2"),
|
| + ASCIIToUTF16("address2"),
|
| + string16(),
|
| + ASCIIToUTF16("text"),
|
| + 0,
|
| + false));
|
| + form_structure = new FormStructure(form);
|
| + form_structures.push_back(form_structure);
|
| +
|
| // Request with id 3.
|
| EXPECT_CALL(mock_metric_logger, Log(AutoFillMetrics::QUERY_SENT)).Times(1);
|
| EXPECT_TRUE(helper.download_manager.StartQueryRequest(form_structures,
|
| @@ -329,3 +342,178 @@
|
| // Make sure consumer of URLFetcher does the right thing.
|
| URLFetcher::set_factory(NULL);
|
| }
|
| +
|
| +TEST(AutoFillDownloadTest, CacheQueryTest) {
|
| + MessageLoopForUI message_loop;
|
| + AutoFillDownloadTestHelper helper;
|
| + // Create and register factory.
|
| + TestURLFetcherFactory factory;
|
| + URLFetcher::set_factory(&factory);
|
| +
|
| + FormData form;
|
| + form.method = ASCIIToUTF16("post");
|
| + form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("username"),
|
| + ASCIIToUTF16("username"),
|
| + string16(),
|
| + ASCIIToUTF16("text"),
|
| + 0,
|
| + false));
|
| + form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("First Name"),
|
| + ASCIIToUTF16("firstname"),
|
| + string16(),
|
| + ASCIIToUTF16("text"),
|
| + 0,
|
| + false));
|
| + form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Last Name"),
|
| + ASCIIToUTF16("lastname"),
|
| + string16(),
|
| + ASCIIToUTF16("text"),
|
| + 0,
|
| + false));
|
| + FormStructure *form_structure = new FormStructure(form);
|
| + ScopedVector<FormStructure> form_structures0;
|
| + form_structures0.push_back(form_structure);
|
| +
|
| + form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("email"),
|
| + ASCIIToUTF16("email"),
|
| + string16(),
|
| + ASCIIToUTF16("text"),
|
| + 0,
|
| + false));
|
| + // Slightly different form - so different request.
|
| + form_structure = new FormStructure(form);
|
| + ScopedVector<FormStructure> form_structures1;
|
| + form_structures1.push_back(form_structure);
|
| +
|
| + form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("email2"),
|
| + ASCIIToUTF16("email2"),
|
| + string16(),
|
| + ASCIIToUTF16("text"),
|
| + 0,
|
| + false));
|
| + // Slightly different form - so different request.
|
| + form_structure = new FormStructure(form);
|
| + ScopedVector<FormStructure> form_structures2;
|
| + form_structures2.push_back(form_structure);
|
| +
|
| + // Limit cache to two forms.
|
| + helper.LimitCache(2);
|
| +
|
| + const char *responses[] = {
|
| + "<autofillqueryresponse>"
|
| + "<field autofilltype=\"0\" />"
|
| + "<field autofilltype=\"3\" />"
|
| + "<field autofilltype=\"5\" />"
|
| + "</autofillqueryresponse>",
|
| + "<autofillqueryresponse>"
|
| + "<field autofilltype=\"0\" />"
|
| + "<field autofilltype=\"3\" />"
|
| + "<field autofilltype=\"5\" />"
|
| + "<field autofilltype=\"9\" />"
|
| + "</autofillqueryresponse>",
|
| + "<autofillqueryresponse>"
|
| + "<field autofilltype=\"0\" />"
|
| + "<field autofilltype=\"3\" />"
|
| + "<field autofilltype=\"5\" />"
|
| + "<field autofilltype=\"9\" />"
|
| + "<field autofilltype=\"0\" />"
|
| + "</autofillqueryresponse>",
|
| + };
|
| +
|
| + // Request with id 0.
|
| + MockAutoFillMetrics mock_metric_logger;
|
| + EXPECT_CALL(mock_metric_logger, Log(AutoFillMetrics::QUERY_SENT)).Times(1);
|
| + EXPECT_TRUE(helper.download_manager.StartQueryRequest(form_structures0,
|
| + mock_metric_logger));
|
| + // No responses yet
|
| + EXPECT_EQ(static_cast<size_t>(0), helper.responses_.size());
|
| +
|
| + TestURLFetcher* fetcher = factory.GetFetcherByID(0);
|
| + ASSERT_TRUE(fetcher);
|
| + fetcher->delegate()->OnURLFetchComplete(fetcher, GURL(),
|
| + net::URLRequestStatus(),
|
| + 200, ResponseCookies(),
|
| + std::string(responses[0]));
|
| + ASSERT_EQ(static_cast<size_t>(1), helper.responses_.size());
|
| + EXPECT_EQ(responses[0], helper.responses_.front().response);
|
| +
|
| + helper.responses_.clear();
|
| +
|
| + // No actual request - should be a cache hit.
|
| + EXPECT_CALL(mock_metric_logger, Log(AutoFillMetrics::QUERY_SENT)).Times(1);
|
| + EXPECT_TRUE(helper.download_manager.StartQueryRequest(form_structures0,
|
| + mock_metric_logger));
|
| + // Data is available immediately from cache - no over-the-wire trip.
|
| + ASSERT_EQ(static_cast<size_t>(1), helper.responses_.size());
|
| + EXPECT_EQ(responses[0], helper.responses_.front().response);
|
| + helper.responses_.clear();
|
| +
|
| + // Request with id 1.
|
| + EXPECT_CALL(mock_metric_logger, Log(AutoFillMetrics::QUERY_SENT)).Times(1);
|
| + EXPECT_TRUE(helper.download_manager.StartQueryRequest(form_structures1,
|
| + mock_metric_logger));
|
| + // No responses yet
|
| + EXPECT_EQ(static_cast<size_t>(0), helper.responses_.size());
|
| +
|
| + fetcher = factory.GetFetcherByID(1);
|
| + ASSERT_TRUE(fetcher);
|
| + fetcher->delegate()->OnURLFetchComplete(fetcher, GURL(),
|
| + net::URLRequestStatus(),
|
| + 200, ResponseCookies(),
|
| + std::string(responses[1]));
|
| + ASSERT_EQ(static_cast<size_t>(1), helper.responses_.size());
|
| + EXPECT_EQ(responses[1], helper.responses_.front().response);
|
| +
|
| + helper.responses_.clear();
|
| +
|
| + // Request with id 2.
|
| + EXPECT_CALL(mock_metric_logger, Log(AutoFillMetrics::QUERY_SENT)).Times(1);
|
| + EXPECT_TRUE(helper.download_manager.StartQueryRequest(form_structures2,
|
| + mock_metric_logger));
|
| +
|
| + fetcher = factory.GetFetcherByID(2);
|
| + ASSERT_TRUE(fetcher);
|
| + fetcher->delegate()->OnURLFetchComplete(fetcher, GURL(),
|
| + net::URLRequestStatus(),
|
| + 200, ResponseCookies(),
|
| + std::string(responses[2]));
|
| + ASSERT_EQ(static_cast<size_t>(1), helper.responses_.size());
|
| + EXPECT_EQ(responses[2], helper.responses_.front().response);
|
| +
|
| + helper.responses_.clear();
|
| +
|
| + // No actual requests - should be a cache hit.
|
| + EXPECT_CALL(mock_metric_logger, Log(AutoFillMetrics::QUERY_SENT)).Times(1);
|
| + EXPECT_TRUE(helper.download_manager.StartQueryRequest(form_structures1,
|
| + mock_metric_logger));
|
| +
|
| + EXPECT_CALL(mock_metric_logger, Log(AutoFillMetrics::QUERY_SENT)).Times(1);
|
| + EXPECT_TRUE(helper.download_manager.StartQueryRequest(form_structures2,
|
| + mock_metric_logger));
|
| +
|
| + ASSERT_EQ(static_cast<size_t>(2), helper.responses_.size());
|
| + EXPECT_EQ(responses[1], helper.responses_.front().response);
|
| + EXPECT_EQ(responses[2], helper.responses_.back().response);
|
| + helper.responses_.clear();
|
| +
|
| + // The first structure should've expired.
|
| + // Request with id 3.
|
| + EXPECT_CALL(mock_metric_logger, Log(AutoFillMetrics::QUERY_SENT)).Times(1);
|
| + EXPECT_TRUE(helper.download_manager.StartQueryRequest(form_structures0,
|
| + mock_metric_logger));
|
| + // No responses yet
|
| + EXPECT_EQ(static_cast<size_t>(0), helper.responses_.size());
|
| +
|
| + fetcher = factory.GetFetcherByID(3);
|
| + ASSERT_TRUE(fetcher);
|
| + fetcher->delegate()->OnURLFetchComplete(fetcher, GURL(),
|
| + net::URLRequestStatus(),
|
| + 200, ResponseCookies(),
|
| + std::string(responses[0]));
|
| + ASSERT_EQ(static_cast<size_t>(1), helper.responses_.size());
|
| + EXPECT_EQ(responses[0], helper.responses_.front().response);
|
| +
|
| + // Make sure consumer of URLFetcher does the right thing.
|
| + URLFetcher::set_factory(NULL);
|
| +}
|
| +
|
|
|