Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1451)

Unified Diff: components/autofill/browser/autofill_download_unittest.cc

Issue 17392006: In components/autofill, move browser/ to core/browser/ (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase to fix conflicts Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: components/autofill/browser/autofill_download_unittest.cc
diff --git a/components/autofill/browser/autofill_download_unittest.cc b/components/autofill/browser/autofill_download_unittest.cc
deleted file mode 100644
index 7b3798c0375cc221b2073825ad35756adc735e7f..0000000000000000000000000000000000000000
--- a/components/autofill/browser/autofill_download_unittest.cc
+++ /dev/null
@@ -1,509 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <list>
-
-#include "base/message_loop.h"
-#include "base/strings/string_util.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/test/test_timeouts.h"
-#include "chrome/test/base/testing_browser_process.h"
-#include "chrome/test/base/testing_profile.h"
-#include "components/autofill/browser/autofill_download.h"
-#include "components/autofill/browser/autofill_field.h"
-#include "components/autofill/browser/autofill_metrics.h"
-#include "components/autofill/browser/autofill_type.h"
-#include "components/autofill/browser/form_structure.h"
-#include "components/autofill/core/common/form_data.h"
-#include "content/public/test/test_browser_thread.h"
-#include "net/url_request/test_url_fetcher_factory.h"
-#include "net/url_request/url_request_status.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/WebKit/Source/WebKit/chromium/public/WebInputElement.h"
-
-using content::BrowserThread;
-using WebKit::WebInputElement;
-
-namespace autofill {
-
-namespace {
-
-class MockAutofillMetrics : public AutofillMetrics {
- public:
- MockAutofillMetrics() {}
- MOCK_CONST_METHOD1(LogServerQueryMetric, void(ServerQueryMetric metric));
-
- private:
- DISALLOW_COPY_AND_ASSIGN(MockAutofillMetrics);
-};
-
-// Call |fetcher->OnURLFetchComplete()| as the URLFetcher would when
-// a response is received. Params allow caller to set fake status.
-void FakeOnURLFetchComplete(net::TestURLFetcher* fetcher,
- int response_code,
- const std::string& response_body) {
- fetcher->set_url(GURL());
- fetcher->set_status(net::URLRequestStatus());
- fetcher->set_response_code(response_code);
- fetcher->SetResponseString(response_body);
-
- fetcher->delegate()->OnURLFetchComplete(fetcher);
-}
-
-} // namespace
-
-// This tests AutofillDownloadManager. AutofillDownloadTest implements
-// AutofillDownloadManager::Observer and creates an instance of
-// AutofillDownloadManager. Then it records responses to different initiated
-// requests, which are verified later. To mock network requests
-// TestURLFetcherFactory is used, which creates URLFetchers that do not
-// go over the wire, but allow calling back HTTP responses directly.
-// The responses in test are out of order and verify: successful query request,
-// successful upload request, failed upload request.
-class AutofillDownloadTest : public AutofillDownloadManager::Observer,
- public testing::Test {
- public:
- AutofillDownloadTest()
- : download_manager_(&profile_, this),
- io_thread_(BrowserThread::IO) {
- }
-
- virtual void SetUp() {
- io_thread_.StartIOThread();
- profile_.CreateRequestContext();
- }
-
- virtual void TearDown() {
- profile_.ResetRequestContext();
- io_thread_.Stop();
- }
-
- void LimitCache(size_t cache_size) {
- download_manager_.set_max_form_cache_size(cache_size);
- }
-
- // AutofillDownloadManager::Observer implementation.
- virtual void OnLoadedServerPredictions(
- const std::string& response_xml) OVERRIDE {
- ResponseData response;
- response.response = response_xml;
- response.type_of_response = QUERY_SUCCESSFULL;
- responses_.push_back(response);
- }
-
- virtual void OnUploadedPossibleFieldTypes() OVERRIDE {
- ResponseData response;
- response.type_of_response = UPLOAD_SUCCESSFULL;
- responses_.push_back(response);
- }
-
- virtual void OnServerRequestError(
- const std::string& form_signature,
- AutofillDownloadManager::AutofillRequestType request_type,
- int http_error) OVERRIDE {
- ResponseData response;
- response.signature = form_signature;
- response.error = http_error;
- response.type_of_response =
- request_type == AutofillDownloadManager::REQUEST_QUERY ?
- REQUEST_QUERY_FAILED : REQUEST_UPLOAD_FAILED;
- responses_.push_back(response);
- }
-
- enum ResponseType {
- QUERY_SUCCESSFULL,
- UPLOAD_SUCCESSFULL,
- REQUEST_QUERY_FAILED,
- REQUEST_UPLOAD_FAILED,
- };
-
- struct ResponseData {
- ResponseType type_of_response;
- int error;
- std::string signature;
- std::string response;
-
- ResponseData() : type_of_response(REQUEST_QUERY_FAILED), error(0) {}
- };
- std::list<ResponseData> responses_;
-
- TestingProfile profile_;
- AutofillDownloadManager download_manager_;
-
- private:
- // The profile's request context must be released on the IO thread.
- content::TestBrowserThread io_thread_;
-};
-
-TEST_F(AutofillDownloadTest, QueryAndUploadTest) {
- base::MessageLoopForUI message_loop;
- // Create and register factory.
- net::TestURLFetcherFactory factory;
-
- FormData form;
- form.method = ASCIIToUTF16("post");
-
- FormFieldData field;
- field.label = ASCIIToUTF16("username");
- field.name = ASCIIToUTF16("username");
- field.form_control_type = "text";
- form.fields.push_back(field);
-
- field.label = ASCIIToUTF16("First Name");
- field.name = ASCIIToUTF16("firstname");
- field.form_control_type = "text";
- form.fields.push_back(field);
-
- field.label = ASCIIToUTF16("Last Name");
- field.name = ASCIIToUTF16("lastname");
- field.form_control_type = "text";
- form.fields.push_back(field);
-
- field.label = ASCIIToUTF16("email");
- field.name = ASCIIToUTF16("email");
- field.form_control_type = "text";
- form.fields.push_back(field);
-
- field.label = ASCIIToUTF16("email2");
- field.name = ASCIIToUTF16("email2");
- field.form_control_type = "text";
- form.fields.push_back(field);
-
- field.label = ASCIIToUTF16("password");
- field.name = ASCIIToUTF16("password");
- field.form_control_type = "password";
- form.fields.push_back(field);
-
- field.label = base::string16();
- field.name = ASCIIToUTF16("Submit");
- field.form_control_type = "submit";
- form.fields.push_back(field);
-
- FormStructure *form_structure = new FormStructure(form, std::string());
- ScopedVector<FormStructure> form_structures;
- form_structures.push_back(form_structure);
-
- form.fields.clear();
-
- field.label = ASCIIToUTF16("address");
- field.name = ASCIIToUTF16("address");
- field.form_control_type = "text";
- form.fields.push_back(field);
-
- field.label = ASCIIToUTF16("address2");
- field.name = ASCIIToUTF16("address2");
- field.form_control_type = "text";
- form.fields.push_back(field);
-
- field.label = ASCIIToUTF16("city");
- field.name = ASCIIToUTF16("city");
- field.form_control_type = "text";
- form.fields.push_back(field);
-
- field.label = base::string16();
- field.name = ASCIIToUTF16("Submit");
- field.form_control_type = "submit";
- form.fields.push_back(field);
-
- form_structure = new FormStructure(form, std::string());
- form_structures.push_back(form_structure);
-
- // Request with id 0.
- MockAutofillMetrics mock_metric_logger;
- EXPECT_CALL(mock_metric_logger,
- LogServerQueryMetric(AutofillMetrics::QUERY_SENT)).Times(1);
- EXPECT_TRUE(download_manager_.StartQueryRequest(form_structures.get(),
- mock_metric_logger));
- // Set upload to 100% so requests happen.
- download_manager_.SetPositiveUploadRate(1.0);
- download_manager_.SetNegativeUploadRate(1.0);
- // Request with id 1.
- EXPECT_TRUE(download_manager_.StartUploadRequest(
- *(form_structures[0]), true, FieldTypeSet()));
- // Request with id 2.
- EXPECT_TRUE(download_manager_.StartUploadRequest(
- *(form_structures[1]), false, FieldTypeSet()));
-
- const char *responses[] = {
- "<autofillqueryresponse>"
- "<field autofilltype=\"0\" />"
- "<field autofilltype=\"3\" />"
- "<field autofilltype=\"5\" />"
- "<field autofilltype=\"9\" />"
- "<field autofilltype=\"0\" />"
- "<field autofilltype=\"30\" />"
- "<field autofilltype=\"31\" />"
- "<field autofilltype=\"33\" />"
- "</autofillqueryresponse>",
- "<autofilluploadresponse positiveuploadrate=\"0.5\" "
- "negativeuploadrate=\"0.3\"/>",
- "<html></html>",
- };
-
- // Return them out of sequence.
- net::TestURLFetcher* fetcher = factory.GetFetcherByID(1);
- ASSERT_TRUE(fetcher);
- FakeOnURLFetchComplete(fetcher, 200, std::string(responses[1]));
-
- // After that upload rates would be adjusted to 0.5/0.3
- EXPECT_DOUBLE_EQ(0.5, download_manager_.GetPositiveUploadRate());
- EXPECT_DOUBLE_EQ(0.3, download_manager_.GetNegativeUploadRate());
-
- fetcher = factory.GetFetcherByID(2);
- ASSERT_TRUE(fetcher);
- FakeOnURLFetchComplete(fetcher, 404, std::string(responses[2]));
-
- fetcher = factory.GetFetcherByID(0);
- ASSERT_TRUE(fetcher);
- FakeOnURLFetchComplete(fetcher, 200, std::string(responses[0]));
- EXPECT_EQ(static_cast<size_t>(3), responses_.size());
-
- EXPECT_EQ(AutofillDownloadTest::UPLOAD_SUCCESSFULL,
- responses_.front().type_of_response);
- EXPECT_EQ(0, responses_.front().error);
- EXPECT_EQ(std::string(), responses_.front().signature);
- // Expected response on non-query request is an empty string.
- EXPECT_EQ(std::string(), responses_.front().response);
- responses_.pop_front();
-
- EXPECT_EQ(AutofillDownloadTest::REQUEST_UPLOAD_FAILED,
- responses_.front().type_of_response);
- EXPECT_EQ(404, responses_.front().error);
- EXPECT_EQ(form_structures[1]->FormSignature(),
- responses_.front().signature);
- // Expected response on non-query request is an empty string.
- EXPECT_EQ(std::string(), responses_.front().response);
- responses_.pop_front();
-
- EXPECT_EQ(responses_.front().type_of_response,
- AutofillDownloadTest::QUERY_SUCCESSFULL);
- EXPECT_EQ(0, responses_.front().error);
- EXPECT_EQ(std::string(), responses_.front().signature);
- EXPECT_EQ(responses[0], responses_.front().response);
- responses_.pop_front();
-
- // Set upload to 0% so no new requests happen.
- download_manager_.SetPositiveUploadRate(0.0);
- download_manager_.SetNegativeUploadRate(0.0);
- // No actual requests for the next two calls, as we set upload rate to 0%.
- EXPECT_FALSE(download_manager_.StartUploadRequest(
- *(form_structures[0]), true, FieldTypeSet()));
- EXPECT_FALSE(download_manager_.StartUploadRequest(
- *(form_structures[1]), false, FieldTypeSet()));
- fetcher = factory.GetFetcherByID(3);
- EXPECT_EQ(NULL, fetcher);
-
- // Modify form structures to miss the cache.
- field.label = ASCIIToUTF16("Address line 2");
- field.name = ASCIIToUTF16("address2");
- field.form_control_type = "text";
- form.fields.push_back(field);
- form_structure = new FormStructure(form, std::string());
- form_structures.push_back(form_structure);
-
- // Request with id 3.
- EXPECT_CALL(mock_metric_logger,
- LogServerQueryMetric(AutofillMetrics::QUERY_SENT)).Times(1);
- EXPECT_TRUE(download_manager_.StartQueryRequest(form_structures.get(),
- mock_metric_logger));
- fetcher = factory.GetFetcherByID(3);
- ASSERT_TRUE(fetcher);
- fetcher->set_backoff_delay(TestTimeouts::action_max_timeout());
- FakeOnURLFetchComplete(fetcher, 500, std::string(responses[0]));
-
- EXPECT_EQ(AutofillDownloadTest::REQUEST_QUERY_FAILED,
- responses_.front().type_of_response);
- EXPECT_EQ(500, responses_.front().error);
- // Expected response on non-query request is an empty string.
- EXPECT_EQ(std::string(), responses_.front().response);
- responses_.pop_front();
-
- // Query requests should be ignored for the next 10 seconds.
- EXPECT_CALL(mock_metric_logger,
- LogServerQueryMetric(AutofillMetrics::QUERY_SENT)).Times(0);
- EXPECT_FALSE(download_manager_.StartQueryRequest(form_structures.get(),
- mock_metric_logger));
- fetcher = factory.GetFetcherByID(4);
- EXPECT_EQ(NULL, fetcher);
-
- // Set upload required to true so requests happen.
- form_structures[0]->upload_required_ = UPLOAD_REQUIRED;
- // Request with id 4.
- EXPECT_TRUE(download_manager_.StartUploadRequest(
- *(form_structures[0]), true, FieldTypeSet()));
- fetcher = factory.GetFetcherByID(4);
- ASSERT_TRUE(fetcher);
- fetcher->set_backoff_delay(TestTimeouts::action_max_timeout());
- FakeOnURLFetchComplete(fetcher, 503, std::string(responses[2]));
- EXPECT_EQ(AutofillDownloadTest::REQUEST_UPLOAD_FAILED,
- responses_.front().type_of_response);
- EXPECT_EQ(503, responses_.front().error);
- responses_.pop_front();
-
- // Upload requests should be ignored for the next 10 seconds.
- EXPECT_FALSE(download_manager_.StartUploadRequest(
- *(form_structures[0]), true, FieldTypeSet()));
- fetcher = factory.GetFetcherByID(5);
- EXPECT_EQ(NULL, fetcher);
-}
-
-TEST_F(AutofillDownloadTest, CacheQueryTest) {
- base::MessageLoopForUI message_loop;
- // Create and register factory.
- net::TestURLFetcherFactory factory;
-
- FormData form;
- form.method = ASCIIToUTF16("post");
-
- FormFieldData field;
- field.form_control_type = "text";
-
- field.label = ASCIIToUTF16("username");
- field.name = ASCIIToUTF16("username");
- form.fields.push_back(field);
-
- field.label = ASCIIToUTF16("First Name");
- field.name = ASCIIToUTF16("firstname");
- form.fields.push_back(field);
-
- field.label = ASCIIToUTF16("Last Name");
- field.name = ASCIIToUTF16("lastname");
- form.fields.push_back(field);
-
- FormStructure *form_structure = new FormStructure(form, std::string());
- ScopedVector<FormStructure> form_structures0;
- form_structures0.push_back(form_structure);
-
- // Add a slightly different form, which should result in a different request.
- field.label = ASCIIToUTF16("email");
- field.name = ASCIIToUTF16("email");
- form.fields.push_back(field);
- form_structure = new FormStructure(form, std::string());
- ScopedVector<FormStructure> form_structures1;
- form_structures1.push_back(form_structure);
-
- // Add another slightly different form, which should also result in a
- // different request.
- field.label = ASCIIToUTF16("email2");
- field.name = ASCIIToUTF16("email2");
- form.fields.push_back(field);
- form_structure = new FormStructure(form, std::string());
- ScopedVector<FormStructure> form_structures2;
- form_structures2.push_back(form_structure);
-
- // Limit cache to two forms.
- 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,
- LogServerQueryMetric(AutofillMetrics::QUERY_SENT)).Times(1);
- EXPECT_TRUE(download_manager_.StartQueryRequest(form_structures0.get(),
- mock_metric_logger));
- // No responses yet
- EXPECT_EQ(static_cast<size_t>(0), responses_.size());
-
- net::TestURLFetcher* fetcher = factory.GetFetcherByID(0);
- ASSERT_TRUE(fetcher);
- FakeOnURLFetchComplete(fetcher, 200, std::string(responses[0]));
- ASSERT_EQ(static_cast<size_t>(1), responses_.size());
- EXPECT_EQ(responses[0], responses_.front().response);
-
- responses_.clear();
-
- // No actual request - should be a cache hit.
- EXPECT_CALL(mock_metric_logger,
- LogServerQueryMetric(AutofillMetrics::QUERY_SENT)).Times(1);
- EXPECT_TRUE(download_manager_.StartQueryRequest(form_structures0.get(),
- mock_metric_logger));
- // Data is available immediately from cache - no over-the-wire trip.
- ASSERT_EQ(static_cast<size_t>(1), responses_.size());
- EXPECT_EQ(responses[0], responses_.front().response);
- responses_.clear();
-
- // Request with id 1.
- EXPECT_CALL(mock_metric_logger,
- LogServerQueryMetric(AutofillMetrics::QUERY_SENT)).Times(1);
- EXPECT_TRUE(download_manager_.StartQueryRequest(form_structures1.get(),
- mock_metric_logger));
- // No responses yet
- EXPECT_EQ(static_cast<size_t>(0), responses_.size());
-
- fetcher = factory.GetFetcherByID(1);
- ASSERT_TRUE(fetcher);
- FakeOnURLFetchComplete(fetcher, 200, std::string(responses[1]));
- ASSERT_EQ(static_cast<size_t>(1), responses_.size());
- EXPECT_EQ(responses[1], responses_.front().response);
-
- responses_.clear();
-
- // Request with id 2.
- EXPECT_CALL(mock_metric_logger,
- LogServerQueryMetric(AutofillMetrics::QUERY_SENT)).Times(1);
- EXPECT_TRUE(download_manager_.StartQueryRequest(form_structures2.get(),
- mock_metric_logger));
-
- fetcher = factory.GetFetcherByID(2);
- ASSERT_TRUE(fetcher);
- FakeOnURLFetchComplete(fetcher, 200, std::string(responses[2]));
- ASSERT_EQ(static_cast<size_t>(1), responses_.size());
- EXPECT_EQ(responses[2], responses_.front().response);
-
- responses_.clear();
-
- // No actual requests - should be a cache hit.
- EXPECT_CALL(mock_metric_logger,
- LogServerQueryMetric(AutofillMetrics::QUERY_SENT)).Times(1);
- EXPECT_TRUE(download_manager_.StartQueryRequest(form_structures1.get(),
- mock_metric_logger));
-
- EXPECT_CALL(mock_metric_logger,
- LogServerQueryMetric(AutofillMetrics::QUERY_SENT)).Times(1);
- EXPECT_TRUE(download_manager_.StartQueryRequest(form_structures2.get(),
- mock_metric_logger));
-
- ASSERT_EQ(static_cast<size_t>(2), responses_.size());
- EXPECT_EQ(responses[1], responses_.front().response);
- EXPECT_EQ(responses[2], responses_.back().response);
- responses_.clear();
-
- // The first structure should've expired.
- // Request with id 3.
- EXPECT_CALL(mock_metric_logger,
- LogServerQueryMetric(AutofillMetrics::QUERY_SENT)).Times(1);
- EXPECT_TRUE(download_manager_.StartQueryRequest(form_structures0.get(),
- mock_metric_logger));
- // No responses yet
- EXPECT_EQ(static_cast<size_t>(0), responses_.size());
-
- fetcher = factory.GetFetcherByID(3);
- ASSERT_TRUE(fetcher);
- FakeOnURLFetchComplete(fetcher, 200, std::string(responses[0]));
- ASSERT_EQ(static_cast<size_t>(1), responses_.size());
- EXPECT_EQ(responses[0], responses_.front().response);
-}
-
-} // namespace autofill
« no previous file with comments | « components/autofill/browser/autofill_download.cc ('k') | components/autofill/browser/autofill_download_url.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698