| 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
|
|
|