Home | History | Annotate | Download | only in wallet
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "base/json/json_reader.h"
      6 #include "base/json/json_writer.h"
      7 #include "base/logging.h"
      8 #include "base/memory/scoped_ptr.h"
      9 #include "base/run_loop.h"
     10 #include "base/strings/string_number_conversions.h"
     11 #include "base/strings/string_split.h"
     12 #include "base/strings/string_util.h"
     13 #include "base/strings/stringprintf.h"
     14 #include "base/values.h"
     15 #include "chrome/test/base/testing_profile.h"
     16 #include "components/autofill/content/browser/autocheckout_steps.h"
     17 #include "components/autofill/content/browser/wallet/full_wallet.h"
     18 #include "components/autofill/content/browser/wallet/instrument.h"
     19 #include "components/autofill/content/browser/wallet/wallet_client.h"
     20 #include "components/autofill/content/browser/wallet/wallet_client_delegate.h"
     21 #include "components/autofill/content/browser/wallet/wallet_items.h"
     22 #include "components/autofill/content/browser/wallet/wallet_test_util.h"
     23 #include "components/autofill/core/browser/autofill_metrics.h"
     24 #include "components/autofill/core/common/autocheckout_status.h"
     25 #include "content/public/test/test_browser_thread_bundle.h"
     26 #include "net/base/escape.h"
     27 #include "net/base/net_errors.h"
     28 #include "net/http/http_request_headers.h"
     29 #include "net/http/http_status_code.h"
     30 #include "net/url_request/test_url_fetcher_factory.h"
     31 #include "net/url_request/url_fetcher_delegate.h"
     32 #include "net/url_request/url_request_status.h"
     33 #include "testing/gmock/include/gmock/gmock.h"
     34 #include "testing/gtest/include/gtest/gtest.h"
     35 #include "url/gurl.h"
     36 
     37 namespace autofill {
     38 namespace wallet {
     39 
     40 namespace {
     41 
     42 const char kGoogleTransactionId[] = "google-transaction-id";
     43 const char kMerchantUrl[] = "https://example.com/path?key=value";
     44 
     45 const char kGetFullWalletValidResponse[] =
     46     "{"
     47     "  \"expiration_month\":12,"
     48     "  \"expiration_year\":3000,"
     49     "  \"iin\":\"iin\","
     50     "  \"rest\":\"rest\","
     51     "  \"billing_address\":"
     52     "  {"
     53     "    \"id\":\"id\","
     54     "    \"phone_number\":\"phone_number\","
     55     "    \"postal_address\":"
     56     "    {"
     57     "      \"recipient_name\":\"recipient_name\","
     58     "      \"address_line\":"
     59     "      ["
     60     "        \"address_line_1\","
     61     "        \"address_line_2\""
     62     "      ],"
     63     "      \"locality_name\":\"locality_name\","
     64     "      \"administrative_area_name\":\"administrative_area_name\","
     65     "      \"postal_code_number\":\"postal_code_number\","
     66     "      \"country_name_code\":\"US\""
     67     "    }"
     68     "  },"
     69     "  \"shipping_address\":"
     70     "  {"
     71     "    \"id\":\"ship_id\","
     72     "    \"phone_number\":\"ship_phone_number\","
     73     "    \"postal_address\":"
     74     "    {"
     75     "      \"recipient_name\":\"ship_recipient_name\","
     76     "      \"address_line\":"
     77     "      ["
     78     "        \"ship_address_line_1\","
     79     "        \"ship_address_line_2\""
     80     "      ],"
     81     "      \"locality_name\":\"ship_locality_name\","
     82     "      \"administrative_area_name\":\"ship_administrative_area_name\","
     83     "      \"postal_code_number\":\"ship_postal_code_number\","
     84     "      \"country_name_code\":\"US\""
     85     "    }"
     86     "  },"
     87     "  \"required_action\":"
     88     "  ["
     89     "  ]"
     90     "}";
     91 
     92 const char kGetFullWalletInvalidResponse[] =
     93     "{"
     94     "  \"garbage\":123"
     95     "}";
     96 
     97 const char kGetWalletItemsValidResponse[] =
     98     "{"
     99     "  \"required_action\":"
    100     "  ["
    101     "  ],"
    102     "  \"google_transaction_id\":\"google_transaction_id\","
    103     "  \"instrument\":"
    104     "  ["
    105     "    {"
    106     "      \"descriptive_name\":\"descriptive_name\","
    107     "      \"type\":\"VISA\","
    108     "      \"supported_currency\":\"currency_code\","
    109     "      \"last_four_digits\":\"4111\","
    110     "      \"expiration_month\":12,"
    111     "      \"expiration_year\":3000,"
    112     "      \"brand\":\"monkeys\","
    113     "      \"billing_address\":"
    114     "      {"
    115     "        \"name\":\"name\","
    116     "        \"address1\":\"address1\","
    117     "        \"address2\":\"address2\","
    118     "        \"city\":\"city\","
    119     "        \"state\":\"state\","
    120     "        \"postal_code\":\"postal_code\","
    121     "        \"phone_number\":\"phone_number\","
    122     "        \"country_code\":\"country_code\""
    123     "      },"
    124     "      \"status\":\"VALID\","
    125     "      \"object_id\":\"default_instrument_id\""
    126     "    }"
    127     "  ],"
    128     "  \"default_instrument_id\":\"default_instrument_id\","
    129     "  \"obfuscated_gaia_id\":\"obfuscated_gaia_id\","
    130     "  \"address\":"
    131     "  ["
    132     "  ],"
    133     "  \"default_address_id\":\"default_address_id\","
    134     "  \"required_legal_document\":"
    135     "  ["
    136     "  ]"
    137     "}";
    138 
    139 const char kSaveAddressValidResponse[] =
    140     "{"
    141     "  \"shipping_address_id\":\"saved_address_id\""
    142     "}";
    143 
    144 const char kSaveAddressWithRequiredActionsValidResponse[] =
    145     "{"
    146     "  \"form_field_error\":"
    147     "  ["
    148     "    {"
    149     "      \"location\":\"SHIPPING_ADDRESS\","
    150     "      \"type\":\"INVALID_POSTAL_CODE\""
    151     "    }"
    152     "  ],"
    153     "  \"required_action\":"
    154     "  ["
    155     "    \"  \\treqUIRE_PhOnE_number   \\n\\r\","
    156     "    \"INVALID_form_field\""
    157     "  ]"
    158     "}";
    159 
    160 const char kSaveWithInvalidRequiredActionsResponse[] =
    161     "{"
    162     "  \"required_action\":"
    163     "  ["
    164     "    \"  setup_wallet\","
    165     "    \"  \\treqUIRE_PhOnE_number   \\n\\r\","
    166     "    \"INVALID_form_field\""
    167     "  ]"
    168     "}";
    169 
    170 const char kSaveInvalidResponse[] =
    171     "{"
    172     "  \"garbage\":123"
    173     "}";
    174 
    175 const char kSaveInstrumentValidResponse[] =
    176     "{"
    177     "  \"instrument_id\":\"instrument_id\""
    178     "}";
    179 
    180 const char kSaveInstrumentWithRequiredActionsValidResponse[] =
    181     "{"
    182     "  \"form_field_error\":"
    183     "  ["
    184     "    {"
    185     "      \"location\":\"SHIPPING_ADDRESS\","
    186     "      \"type\":\"INVALID_POSTAL_CODE\""
    187     "    }"
    188     "  ],"
    189     "  \"required_action\":"
    190     "  ["
    191     "    \"  \\treqUIRE_PhOnE_number   \\n\\r\","
    192     "    \"INVALID_form_field\""
    193     "  ]"
    194     "}";
    195 
    196 const char kSaveInstrumentAndAddressValidResponse[] =
    197     "{"
    198     "  \"shipping_address_id\":\"saved_address_id\","
    199     "  \"instrument_id\":\"saved_instrument_id\""
    200     "}";
    201 
    202 const char kSaveInstrumentAndAddressWithRequiredActionsValidResponse[] =
    203     "{"
    204     "  \"form_field_error\":"
    205     "  ["
    206     "    {"
    207     "      \"location\":\"SHIPPING_ADDRESS\","
    208     "      \"type\":\"INVALID_POSTAL_CODE\""
    209     "    }"
    210     "  ],"
    211     "  \"required_action\":"
    212     "  ["
    213     "    \"  \\treqUIRE_PhOnE_number   \\n\\r\","
    214     "    \"INVALID_form_field\""
    215     "  ]"
    216     "}";
    217 
    218 const char kUpdateInstrumentValidResponse[] =
    219     "{"
    220     "  \"instrument_id\":\"instrument_id\""
    221     "}";
    222 
    223 const char kUpdateAddressValidResponse[] =
    224     "{"
    225     "  \"shipping_address_id\":\"shipping_address_id\""
    226     "}";
    227 
    228 const char kUpdateWithRequiredActionsValidResponse[] =
    229     "{"
    230     "  \"form_field_error\":"
    231     "  ["
    232     "    {"
    233     "      \"location\":\"SHIPPING_ADDRESS\","
    234     "      \"type\":\"INVALID_POSTAL_CODE\""
    235     "    }"
    236     "  ],"
    237     "  \"required_action\":"
    238     "  ["
    239     "    \"  \\treqUIRE_PhOnE_number   \\n\\r\","
    240     "    \"INVALID_form_field\""
    241     "  ]"
    242     "}";
    243 
    244 const char kUpdateMalformedResponse[] =
    245     "{"
    246     "  \"cheese\":\"monkeys\""
    247     "}";
    248 
    249 const char kAuthenticateInstrumentFailureResponse[] =
    250     "{"
    251     "  \"auth_result\":\"anything else\""
    252     "}";
    253 
    254 const char kAuthenticateInstrumentSuccessResponse[] =
    255     "{"
    256     "  \"auth_result\":\"SUCCESS\""
    257     "}";
    258 
    259 const char kErrorResponse[] =
    260     "{"
    261     "  \"error_type\":\"APPLICATION_ERROR\","
    262     "  \"error_detail\":\"error_detail\","
    263     "  \"application_error\":\"application_error\","
    264     "  \"debug_data\":"
    265     "  {"
    266     "    \"debug_message\":\"debug_message\","
    267     "    \"stack_trace\":\"stack_trace\""
    268     "  },"
    269     "  \"application_error_data\":\"application_error_data\","
    270     "  \"wallet_error\":"
    271     "  {"
    272     "    \"error_type\":\"SERVICE_UNAVAILABLE\","
    273     "    \"error_detail\":\"error_detail\","
    274     "    \"message_for_user\":"
    275     "    {"
    276     "      \"text\":\"text\","
    277     "      \"subtext\":\"subtext\","
    278     "      \"details\":\"details\""
    279     "    }"
    280     "  }"
    281     "}";
    282 
    283 const char kErrorTypeMissingInResponse[] =
    284     "{"
    285     "  \"error_type\":\"Not APPLICATION_ERROR\","
    286     "  \"error_detail\":\"error_detail\","
    287     "  \"application_error\":\"application_error\","
    288     "  \"debug_data\":"
    289     "  {"
    290     "    \"debug_message\":\"debug_message\","
    291     "    \"stack_trace\":\"stack_trace\""
    292     "  },"
    293     "  \"application_error_data\":\"application_error_data\""
    294     "}";
    295 
    296 // The JSON below is used to test against the request payload being sent to
    297 // Online Wallet. It's indented differently since JSONWriter creates compact
    298 // JSON from DictionaryValues.
    299 
    300 const char kAcceptLegalDocumentsValidRequest[] =
    301     "{"
    302         "\"accepted_legal_document\":"
    303         "["
    304             "\"doc_id_1\","
    305             "\"doc_id_2\""
    306         "],"
    307         "\"google_transaction_id\":\"google-transaction-id\","
    308         "\"merchant_domain\":\"https://example.com/\""
    309     "}";
    310 
    311 const char kAuthenticateInstrumentValidRequest[] =
    312     "{"
    313         "\"instrument_id\":\"instrument_id\","
    314         "\"risk_params\":\"risky business\""
    315     "}";
    316 
    317 const char kGetFullWalletValidRequest[] =
    318     "{"
    319         "\"feature\":\"REQUEST_AUTOCOMPLETE\","
    320         "\"google_transaction_id\":\"google_transaction_id\","
    321         "\"merchant_domain\":\"https://example.com/\","
    322         "\"phone_number_required\":true,"
    323         "\"risk_params\":\"risky business\","
    324         "\"selected_address_id\":\"shipping_address_id\","
    325         "\"selected_instrument_id\":\"instrument_id\","
    326         "\"supported_risk_challenge\":"
    327         "["
    328         "],"
    329         "\"use_minimal_addresses\":false"
    330     "}";
    331 
    332 const char kGetFullWalletWithRiskCapabilitesValidRequest[] =
    333     "{"
    334         "\"feature\":\"REQUEST_AUTOCOMPLETE\","
    335         "\"google_transaction_id\":\"google_transaction_id\","
    336         "\"merchant_domain\":\"https://example.com/\","
    337         "\"phone_number_required\":true,"
    338         "\"risk_params\":\"risky business\","
    339         "\"selected_address_id\":\"shipping_address_id\","
    340         "\"selected_instrument_id\":\"instrument_id\","
    341         "\"supported_risk_challenge\":"
    342         "["
    343             "\"VERIFY_CVC\""
    344         "],"
    345         "\"use_minimal_addresses\":false"
    346     "}";
    347 
    348 const char kGetWalletItemsValidRequest[] =
    349     "{"
    350         "\"merchant_domain\":\"https://example.com/\","
    351         "\"phone_number_required\":true,"
    352         "\"shipping_address_required\":true,"
    353         "\"use_minimal_addresses\":false"
    354     "}";
    355 
    356 const char kGetWalletItemsNoShippingRequest[] =
    357     "{"
    358         "\"merchant_domain\":\"https://example.com/\","
    359         "\"phone_number_required\":true,"
    360         "\"shipping_address_required\":false,"
    361         "\"use_minimal_addresses\":false"
    362     "}";
    363 
    364 const char kSaveAddressValidRequest[] =
    365     "{"
    366         "\"merchant_domain\":\"https://example.com/\","
    367         "\"phone_number_required\":true,"
    368         "\"risk_params\":\"risky business\","
    369         "\"shipping_address\":"
    370         "{"
    371             "\"phone_number\":\"save_phone_number\","
    372             "\"postal_address\":"
    373             "{"
    374                 "\"address_line\":"
    375                 "["
    376                     "\"save_address_line_1\","
    377                     "\"save_address_line_2\""
    378                 "],"
    379                 "\"administrative_area_name\":\"save_admin_area_name\","
    380                 "\"country_name_code\":\"US\","
    381                 "\"locality_name\":\"save_locality_name\","
    382                 "\"postal_code_number\":\"save_postal_code_number\","
    383                 "\"recipient_name\":\"save_recipient_name\""
    384             "}"
    385         "},"
    386         "\"use_minimal_addresses\":false"
    387     "}";
    388 
    389 const char kSaveInstrumentValidRequest[] =
    390     "{"
    391         "\"instrument\":"
    392         "{"
    393             "\"credit_card\":"
    394             "{"
    395                 "\"address\":"
    396                 "{"
    397                     "\"address_line\":"
    398                     "["
    399                         "\"address_line_1\","
    400                         "\"address_line_2\""
    401                     "],"
    402                     "\"administrative_area_name\":\"admin_area_name\","
    403                     "\"country_name_code\":\"US\","
    404                     "\"locality_name\":\"locality_name\","
    405                     "\"postal_code_number\":\"postal_code_number\","
    406                     "\"recipient_name\":\"recipient_name\""
    407                 "},"
    408                 "\"exp_month\":12,"
    409                 "\"exp_year\":3000,"
    410                 "\"fop_type\":\"VISA\","
    411                 "\"last_4_digits\":\"4448\""
    412             "},"
    413             "\"type\":\"CREDIT_CARD\""
    414         "},"
    415         "\"instrument_phone_number\":\"phone_number\","
    416         "\"merchant_domain\":\"https://example.com/\","
    417         "\"phone_number_required\":true,"
    418         "\"risk_params\":\"risky business\","
    419         "\"use_minimal_addresses\":false"
    420       "}";
    421 
    422 const char kSaveInstrumentAndAddressValidRequest[] =
    423     "{"
    424         "\"instrument\":"
    425         "{"
    426             "\"credit_card\":"
    427             "{"
    428                 "\"address\":"
    429                 "{"
    430                     "\"address_line\":"
    431                     "["
    432                         "\"address_line_1\","
    433                         "\"address_line_2\""
    434                     "],"
    435                     "\"administrative_area_name\":\"admin_area_name\","
    436                     "\"country_name_code\":\"US\","
    437                     "\"locality_name\":\"locality_name\","
    438                     "\"postal_code_number\":\"postal_code_number\","
    439                     "\"recipient_name\":\"recipient_name\""
    440                 "},"
    441                 "\"exp_month\":12,"
    442                 "\"exp_year\":3000,"
    443                 "\"fop_type\":\"VISA\","
    444                 "\"last_4_digits\":\"4448\""
    445             "},"
    446             "\"type\":\"CREDIT_CARD\""
    447         "},"
    448         "\"instrument_phone_number\":\"phone_number\","
    449         "\"merchant_domain\":\"https://example.com/\","
    450         "\"phone_number_required\":true,"
    451         "\"risk_params\":\"risky business\","
    452         "\"shipping_address\":"
    453         "{"
    454             "\"phone_number\":\"save_phone_number\","
    455             "\"postal_address\":"
    456             "{"
    457                 "\"address_line\":"
    458                 "["
    459                     "\"save_address_line_1\","
    460                     "\"save_address_line_2\""
    461                 "],"
    462                 "\"administrative_area_name\":\"save_admin_area_name\","
    463                 "\"country_name_code\":\"US\","
    464                 "\"locality_name\":\"save_locality_name\","
    465                 "\"postal_code_number\":\"save_postal_code_number\","
    466                 "\"recipient_name\":\"save_recipient_name\""
    467             "}"
    468         "},"
    469         "\"use_minimal_addresses\":false"
    470     "}";
    471 
    472 const char kSendAutocheckoutStatusOfSuccessValidRequest[] =
    473     "{"
    474         "\"google_transaction_id\":\"google_transaction_id\","
    475         "\"merchant_domain\":\"https://example.com/\","
    476         "\"success\":true"
    477     "}";
    478 
    479 const char kSendAutocheckoutStatusWithStatisticsValidRequest[] =
    480     "{"
    481         "\"google_transaction_id\":\"google_transaction_id\","
    482         "\"merchant_domain\":\"https://example.com/\","
    483         "\"steps\":[{\"step_description\":\"1_AUTOCHECKOUT_STEP_SHIPPING\""
    484         ",\"time_taken\":100}],"
    485         "\"success\":true"
    486     "}";
    487 
    488 const char kSendAutocheckoutStatusOfFailureValidRequest[] =
    489     "{"
    490         "\"google_transaction_id\":\"google_transaction_id\","
    491         "\"merchant_domain\":\"https://example.com/\","
    492         "\"reason\":\"CANNOT_PROCEED\","
    493         "\"success\":false"
    494     "}";
    495 
    496 const char kUpdateAddressValidRequest[] =
    497     "{"
    498         "\"merchant_domain\":\"https://example.com/\","
    499         "\"phone_number_required\":true,"
    500         "\"risk_params\":\"risky business\","
    501         "\"shipping_address\":"
    502         "{"
    503             "\"id\":\"shipping_address_id\","
    504             "\"phone_number\":\"ship_phone_number\","
    505             "\"postal_address\":"
    506             "{"
    507                 "\"address_line\":"
    508                 "["
    509                     "\"ship_address_line_1\","
    510                     "\"ship_address_line_2\""
    511                 "],"
    512                 "\"administrative_area_name\":\"ship_admin_area_name\","
    513                 "\"country_name_code\":\"US\","
    514                 "\"locality_name\":\"ship_locality_name\","
    515                 "\"postal_code_number\":\"ship_postal_code_number\","
    516                 "\"recipient_name\":\"ship_recipient_name\""
    517             "}"
    518         "},"
    519         "\"use_minimal_addresses\":false"
    520     "}";
    521 
    522 const char kUpdateInstrumentAddressValidRequest[] =
    523     "{"
    524         "\"instrument_phone_number\":\"phone_number\","
    525         "\"merchant_domain\":\"https://example.com/\","
    526         "\"phone_number_required\":true,"
    527         "\"risk_params\":\"risky business\","
    528         "\"upgraded_billing_address\":"
    529         "{"
    530             "\"address_line\":"
    531             "["
    532                 "\"address_line_1\","
    533                 "\"address_line_2\""
    534             "],"
    535             "\"administrative_area_name\":\"admin_area_name\","
    536             "\"country_name_code\":\"US\","
    537             "\"locality_name\":\"locality_name\","
    538             "\"postal_code_number\":\"postal_code_number\","
    539             "\"recipient_name\":\"recipient_name\""
    540         "},"
    541         "\"upgraded_instrument_id\":\"instrument_id\","
    542         "\"use_minimal_addresses\":false"
    543     "}";
    544 
    545 const char kUpdateInstrumentAddressWithNameChangeValidRequest[] =
    546     "{"
    547         "\"instrument_phone_number\":\"phone_number\","
    548         "\"merchant_domain\":\"https://example.com/\","
    549         "\"phone_number_required\":true,"
    550         "\"risk_params\":\"risky business\","
    551         "\"upgraded_billing_address\":"
    552         "{"
    553             "\"address_line\":"
    554             "["
    555                 "\"address_line_1\","
    556                 "\"address_line_2\""
    557             "],"
    558             "\"administrative_area_name\":\"admin_area_name\","
    559             "\"country_name_code\":\"US\","
    560             "\"locality_name\":\"locality_name\","
    561             "\"postal_code_number\":\"postal_code_number\","
    562             "\"recipient_name\":\"recipient_name\""
    563         "},"
    564         "\"upgraded_instrument_id\":\"instrument_id\","
    565         "\"use_minimal_addresses\":false"
    566     "}";
    567 
    568 const char kUpdateInstrumentExpirationDateValidRequest[] =
    569     "{"
    570         "\"instrument\":"
    571         "{"
    572             "\"credit_card\":"
    573             "{"
    574                 "\"exp_month\":12,"
    575                 "\"exp_year\":3000"
    576             "},"
    577             "\"type\":\"CREDIT_CARD\""
    578         "},"
    579         "\"merchant_domain\":\"https://example.com/\","
    580         "\"phone_number_required\":true,"
    581         "\"risk_params\":\"risky business\","
    582         "\"upgraded_instrument_id\":\"instrument_id\","
    583         "\"use_minimal_addresses\":false"
    584     "}";
    585 
    586 class MockAutofillMetrics : public AutofillMetrics {
    587  public:
    588   MockAutofillMetrics() {}
    589   MOCK_CONST_METHOD2(LogWalletApiCallDuration,
    590                      void(WalletApiCallMetric metric,
    591                           const base::TimeDelta& duration));
    592   MOCK_CONST_METHOD2(LogWalletErrorMetric,
    593                      void(DialogType dialog_type, WalletErrorMetric metric));
    594   MOCK_CONST_METHOD2(LogWalletRequiredActionMetric,
    595                      void(DialogType dialog_type,
    596                           WalletRequiredActionMetric action));
    597  private:
    598   DISALLOW_COPY_AND_ASSIGN(MockAutofillMetrics);
    599 };
    600 
    601 class MockWalletClientDelegate : public WalletClientDelegate {
    602  public:
    603   MockWalletClientDelegate()
    604       : full_wallets_received_(0),
    605         wallet_items_received_(0),
    606         is_shipping_required_(true) {}
    607   ~MockWalletClientDelegate() {}
    608 
    609   virtual const AutofillMetrics& GetMetricLogger() const OVERRIDE {
    610     return metric_logger_;
    611   }
    612 
    613   virtual DialogType GetDialogType() const OVERRIDE {
    614     return DIALOG_TYPE_REQUEST_AUTOCOMPLETE;
    615   }
    616 
    617   virtual std::string GetRiskData() const OVERRIDE {
    618     return "risky business";
    619   }
    620 
    621   virtual std::string GetWalletCookieValue() const OVERRIDE {
    622     return "gdToken";
    623   }
    624 
    625   virtual bool IsShippingAddressRequired() const OVERRIDE {
    626     return is_shipping_required_;
    627   }
    628 
    629   void SetIsShippingAddressRequired(bool is_shipping_required) {
    630     is_shipping_required_ = is_shipping_required;
    631   }
    632 
    633   void ExpectLogWalletApiCallDuration(
    634       AutofillMetrics::WalletApiCallMetric metric,
    635       size_t times) {
    636     EXPECT_CALL(metric_logger_,
    637                 LogWalletApiCallDuration(metric, testing::_)).Times(times);
    638   }
    639 
    640   void ExpectWalletErrorMetric(AutofillMetrics::WalletErrorMetric metric) {
    641     EXPECT_CALL(
    642         metric_logger_,
    643         LogWalletErrorMetric(
    644             DIALOG_TYPE_REQUEST_AUTOCOMPLETE, metric)).Times(1);
    645   }
    646 
    647   void ExpectWalletRequiredActionMetric(
    648       AutofillMetrics::WalletRequiredActionMetric metric) {
    649     EXPECT_CALL(
    650         metric_logger_,
    651         LogWalletRequiredActionMetric(
    652             DIALOG_TYPE_REQUEST_AUTOCOMPLETE, metric)).Times(1);
    653   }
    654 
    655   void ExpectBaselineMetrics() {
    656     EXPECT_CALL(
    657         metric_logger_,
    658         LogWalletErrorMetric(
    659             DIALOG_TYPE_REQUEST_AUTOCOMPLETE,
    660             AutofillMetrics::WALLET_ERROR_BASELINE_ISSUED_REQUEST))
    661                 .Times(1);
    662     ExpectWalletRequiredActionMetric(
    663         AutofillMetrics::WALLET_REQUIRED_ACTION_BASELINE_ISSUED_REQUEST);
    664   }
    665 
    666   MockAutofillMetrics* metric_logger() {
    667     return &metric_logger_;
    668   }
    669 
    670   MOCK_METHOD0(OnDidAcceptLegalDocuments, void());
    671   MOCK_METHOD1(OnDidAuthenticateInstrument, void(bool success));
    672   MOCK_METHOD4(OnDidSaveToWallet,
    673                void(const std::string& instrument_id,
    674                     const std::string& shipping_address_id,
    675                     const std::vector<RequiredAction>& required_actions,
    676                     const std::vector<FormFieldError>& form_field_errors));
    677   MOCK_METHOD1(OnWalletError, void(WalletClient::ErrorType error_type));
    678 
    679   virtual void OnDidGetFullWallet(scoped_ptr<FullWallet> full_wallet) OVERRIDE {
    680     EXPECT_TRUE(full_wallet);
    681     ++full_wallets_received_;
    682   }
    683   virtual void OnDidGetWalletItems(scoped_ptr<WalletItems> wallet_items)
    684       OVERRIDE {
    685     EXPECT_TRUE(wallet_items);
    686     ++wallet_items_received_;
    687   }
    688   size_t full_wallets_received() const { return full_wallets_received_; }
    689   size_t wallet_items_received() const { return wallet_items_received_; }
    690 
    691  private:
    692   size_t full_wallets_received_;
    693   size_t wallet_items_received_;
    694   bool is_shipping_required_;
    695 
    696   testing::StrictMock<MockAutofillMetrics> metric_logger_;
    697 };
    698 
    699 }  // namespace
    700 
    701 class WalletClientTest : public testing::Test {
    702  public:
    703   virtual void SetUp() OVERRIDE {
    704     wallet_client_.reset(
    705         new WalletClient(browser_context_.GetRequestContext(), &delegate_));
    706   }
    707 
    708   virtual void TearDown() OVERRIDE {
    709     wallet_client_.reset();
    710   }
    711 
    712   void VerifyAndFinishRequest(net::HttpStatusCode response_code,
    713                               const std::string& request_body,
    714                               const std::string& response_body) {
    715     net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0);
    716     ASSERT_TRUE(fetcher);
    717 
    718     const std::string& upload_data = fetcher->upload_data();
    719     EXPECT_EQ(request_body, GetData(upload_data));
    720     net::HttpRequestHeaders request_headers;
    721     fetcher->GetExtraRequestHeaders(&request_headers);
    722     std::string auth_header_value;
    723     EXPECT_TRUE(request_headers.GetHeader(
    724         net::HttpRequestHeaders::kAuthorization,
    725         &auth_header_value));
    726     EXPECT_EQ("GoogleLogin auth=gdToken", auth_header_value);
    727 
    728     fetcher->set_response_code(response_code);
    729     fetcher->SetResponseString(response_body);
    730     fetcher->delegate()->OnURLFetchComplete(fetcher);
    731 
    732     // Pump the message loop to catch up to any asynchronous tasks that might
    733     // have been posted from OnURLFetchComplete().
    734     base::RunLoop().RunUntilIdle();
    735   }
    736 
    737   void VerifyAndFinishFormEncodedRequest(net::HttpStatusCode response_code,
    738                                          const std::string& json_payload,
    739                                          const std::string& response_body,
    740                                          size_t expected_parameter_number) {
    741     net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0);
    742     ASSERT_TRUE(fetcher);
    743 
    744     net::HttpRequestHeaders request_headers;
    745     fetcher->GetExtraRequestHeaders(&request_headers);
    746     std::string auth_header_value;
    747     EXPECT_TRUE(request_headers.GetHeader(
    748         net::HttpRequestHeaders::kAuthorization,
    749         &auth_header_value));
    750     EXPECT_EQ("GoogleLogin auth=gdToken", auth_header_value);
    751 
    752     const std::string& upload_data = fetcher->upload_data();
    753     std::vector<std::pair<std::string, std::string> > tokens;
    754     base::SplitStringIntoKeyValuePairs(upload_data, '=', '&', &tokens);
    755     EXPECT_EQ(tokens.size(), expected_parameter_number);
    756 
    757     size_t num_params = 0U;
    758     for (size_t i = 0; i < tokens.size(); ++i) {
    759       const std::string& key = tokens[i].first;
    760       const std::string& value = tokens[i].second;
    761 
    762       if (key == "request_content_type") {
    763         EXPECT_EQ("application/json", value);
    764         num_params++;
    765       }
    766 
    767       if (key == "request") {
    768         EXPECT_EQ(json_payload,
    769                   GetData(
    770                       net::UnescapeURLComponent(
    771                           value, net::UnescapeRule::URL_SPECIAL_CHARS |
    772                           net::UnescapeRule::REPLACE_PLUS_WITH_SPACE)));
    773         num_params++;
    774       }
    775 
    776       if (key == "cvn") {
    777         EXPECT_EQ("123", value);
    778         num_params++;
    779       }
    780 
    781       if (key == "card_number") {
    782         EXPECT_EQ("4444444444444448", value);
    783         num_params++;
    784       }
    785 
    786       if (key == "otp") {
    787         EXPECT_FALSE(value.empty());
    788         num_params++;
    789       }
    790     }
    791     EXPECT_EQ(expected_parameter_number, num_params);
    792 
    793     fetcher->set_response_code(response_code);
    794     fetcher->SetResponseString(response_body);
    795     fetcher->delegate()->OnURLFetchComplete(fetcher);
    796   }
    797 
    798   void TestWalletErrorCode(
    799       const std::string& error_type_string,
    800       const std::string& buyer_error_type_string,
    801       WalletClient::ErrorType expected_error_type,
    802       AutofillMetrics::WalletErrorMetric expected_autofill_metric) {
    803     static const char kResponseTemplate[] =
    804         "{"
    805         "  \"error_type\":\"APPLICATION_ERROR\","
    806         "  \"error_detail\":\"error_detail\","
    807         "  \"application_error\":\"application_error\","
    808         "  \"debug_data\":"
    809         "  {"
    810         "    \"debug_message\":\"debug_message\","
    811         "    \"stack_trace\":\"stack_trace\""
    812         "  },"
    813         "  \"application_error_data\":\"application_error_data\","
    814         "  \"wallet_error\":"
    815         "  {"
    816         "    \"error_type\":\"%s\","
    817         "    %s"  // Placeholder for |user_error_type|.
    818         "    \"error_detail\":\"error_detail\","
    819         "    \"message_for_user\":"
    820         "    {"
    821         "      \"text\":\"text\","
    822         "      \"subtext\":\"subtext\","
    823         "      \"details\":\"details\""
    824         "    }"
    825         "  }"
    826         "}";
    827     EXPECT_CALL(delegate_, OnWalletError(expected_error_type)).Times(1);
    828     delegate_.ExpectLogWalletApiCallDuration(AutofillMetrics::SEND_STATUS, 1);
    829     delegate_.ExpectBaselineMetrics();
    830     delegate_.ExpectWalletErrorMetric(expected_autofill_metric);
    831 
    832     std::vector<AutocheckoutStatistic> statistics;
    833     wallet_client_->SendAutocheckoutStatus(autofill::SUCCESS,
    834                                            GURL(kMerchantUrl),
    835                                            statistics,
    836                                            "google_transaction_id");
    837     std::string buyer_error;
    838     if (!buyer_error_type_string.empty()) {
    839       buyer_error = base::StringPrintf("\"buyer_error_type\":\"%s\",",
    840                                        buyer_error_type_string.c_str());
    841     }
    842     std::string response = base::StringPrintf(kResponseTemplate,
    843                                               error_type_string.c_str(),
    844                                               buyer_error.c_str());
    845     VerifyAndFinishRequest(net::HTTP_INTERNAL_SERVER_ERROR,
    846                            kSendAutocheckoutStatusOfSuccessValidRequest,
    847                            response);
    848   }
    849 
    850  protected:
    851   content::TestBrowserThreadBundle thread_bundle_;
    852   scoped_ptr<WalletClient> wallet_client_;
    853   TestingProfile browser_context_;
    854   MockWalletClientDelegate delegate_;
    855 
    856  private:
    857   std::string GetData(const std::string& upload_data) {
    858     scoped_ptr<Value> root(base::JSONReader::Read(upload_data));
    859 
    860     // If this is not a JSON dictionary, return plain text.
    861     if (!root || !root->IsType(Value::TYPE_DICTIONARY))
    862       return upload_data;
    863 
    864     // Remove api_key entry (to prevent accidental leak), return JSON as text.
    865     DictionaryValue* dict = static_cast<DictionaryValue*>(root.get());
    866     dict->Remove("api_key", NULL);
    867     std::string clean_upload_data;
    868     base::JSONWriter::Write(dict, &clean_upload_data);
    869     return clean_upload_data;
    870   }
    871 
    872   net::TestURLFetcherFactory factory_;
    873 };
    874 
    875 TEST_F(WalletClientTest, WalletErrorCodes) {
    876   struct {
    877     std::string error_type_string;
    878     std::string buyer_error_type_string;
    879     WalletClient::ErrorType expected_error_type;
    880     AutofillMetrics::WalletErrorMetric expected_autofill_metric;
    881   } test_cases[] = {
    882       // General |BUYER_ACCOUNT_ERROR| with no |buyer_error_type_string|.
    883       {
    884           "buyer_account_error",
    885           "",
    886           WalletClient::BUYER_ACCOUNT_ERROR,
    887           AutofillMetrics::WALLET_BUYER_ACCOUNT_ERROR
    888       },
    889       // |BUYER_ACCOUNT_ERROR| with "buyer_legal_address_not_supported" in
    890       // buyer_error_type field.
    891       {
    892           "buyer_account_error",
    893           "bla_country_not_supported",
    894           WalletClient::BUYER_LEGAL_ADDRESS_NOT_SUPPORTED,
    895           AutofillMetrics::WALLET_BUYER_LEGAL_ADDRESS_NOT_SUPPORTED
    896       },
    897       // |BUYER_ACCOUNT_ERROR| with KYC error code in buyer_error_type field.
    898       {
    899           "buyer_account_error",
    900           "buyer_kyc_error",
    901           WalletClient::UNVERIFIED_KNOW_YOUR_CUSTOMER_STATUS,
    902           AutofillMetrics::WALLET_UNVERIFIED_KNOW_YOUR_CUSTOMER_STATUS
    903       },
    904       // |BUYER_ACCOUNT_ERROR| with un-recognizable |buyer_error_type|.
    905       {
    906           "buyer_account_error",
    907           "random_string",
    908           WalletClient::BUYER_ACCOUNT_ERROR,
    909           AutofillMetrics::WALLET_BUYER_ACCOUNT_ERROR
    910       },
    911       // The following are other error types we could get from Wallet.
    912       {
    913           "unsupported_merchant",
    914           "",
    915           WalletClient::UNSUPPORTED_MERCHANT,
    916           AutofillMetrics::WALLET_UNSUPPORTED_MERCHANT
    917       },
    918       {
    919           "internal_error",
    920           "",
    921           WalletClient::INTERNAL_ERROR,
    922           AutofillMetrics::WALLET_INTERNAL_ERROR
    923       },
    924       {
    925           "invalid_params",
    926           "",
    927           WalletClient::INVALID_PARAMS,
    928           AutofillMetrics::WALLET_INVALID_PARAMS
    929       },
    930       {
    931           "service_unavailable",
    932           "",
    933           WalletClient::SERVICE_UNAVAILABLE,
    934           AutofillMetrics::WALLET_SERVICE_UNAVAILABLE
    935       },
    936       {
    937           "unsupported_api_version",
    938           "",
    939           WalletClient::UNSUPPORTED_API_VERSION,
    940           AutofillMetrics::WALLET_UNSUPPORTED_API_VERSION
    941       },
    942       // Any un-recognizable |error_type| is a |UNKNOWN_ERROR|.
    943       {
    944           "random_string_1",
    945           "",
    946           WalletClient::UNKNOWN_ERROR,
    947           AutofillMetrics::WALLET_UNKNOWN_ERROR
    948       },
    949       {
    950           "random_string_2",
    951           "",
    952           WalletClient::UNKNOWN_ERROR,
    953           AutofillMetrics::WALLET_UNKNOWN_ERROR
    954       },
    955   };
    956 
    957   for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); ++i) {
    958     SCOPED_TRACE(
    959         base::StringPrintf("%s - %s",
    960                            test_cases[i].error_type_string.c_str(),
    961                            test_cases[i].buyer_error_type_string.c_str()));
    962     TestWalletErrorCode(test_cases[i].error_type_string,
    963                         test_cases[i].buyer_error_type_string,
    964                         test_cases[i].expected_error_type,
    965                         test_cases[i].expected_autofill_metric);
    966   }
    967 }
    968 
    969 TEST_F(WalletClientTest, WalletErrorResponseMissing) {
    970   EXPECT_CALL(delegate_, OnWalletError(
    971       WalletClient::UNKNOWN_ERROR)).Times(1);
    972   delegate_.ExpectLogWalletApiCallDuration(AutofillMetrics::SEND_STATUS, 1);
    973   delegate_.ExpectBaselineMetrics();
    974   delegate_.ExpectWalletErrorMetric(AutofillMetrics::WALLET_UNKNOWN_ERROR);
    975 
    976   std::vector<AutocheckoutStatistic> statistics;
    977   wallet_client_->SendAutocheckoutStatus(autofill::SUCCESS,
    978                                          GURL(kMerchantUrl),
    979                                          statistics,
    980                                          "google_transaction_id");
    981   VerifyAndFinishRequest(net::HTTP_INTERNAL_SERVER_ERROR,
    982                          kSendAutocheckoutStatusOfSuccessValidRequest,
    983                          kErrorTypeMissingInResponse);
    984 }
    985 
    986 TEST_F(WalletClientTest, NetworkFailureOnExpectedVoidResponse) {
    987   EXPECT_CALL(delegate_, OnWalletError(WalletClient::NETWORK_ERROR)).Times(1);
    988   delegate_.ExpectLogWalletApiCallDuration(AutofillMetrics::SEND_STATUS, 1);
    989   delegate_.ExpectBaselineMetrics();
    990   delegate_.ExpectWalletErrorMetric(AutofillMetrics::WALLET_NETWORK_ERROR);
    991 
    992   std::vector<AutocheckoutStatistic> statistics;
    993   wallet_client_->SendAutocheckoutStatus(autofill::SUCCESS,
    994                                          GURL(kMerchantUrl),
    995                                          statistics,
    996                                          "google_transaction_id");
    997   VerifyAndFinishRequest(net::HTTP_UNAUTHORIZED,
    998                          kSendAutocheckoutStatusOfSuccessValidRequest,
    999                          std::string());
   1000 }
   1001 
   1002 TEST_F(WalletClientTest, NetworkFailureOnExpectedResponse) {
   1003   EXPECT_CALL(delegate_, OnWalletError(WalletClient::NETWORK_ERROR)).Times(1);
   1004   delegate_.ExpectLogWalletApiCallDuration(AutofillMetrics::GET_WALLET_ITEMS,
   1005                                            1);
   1006   delegate_.ExpectBaselineMetrics();
   1007   delegate_.ExpectWalletErrorMetric(AutofillMetrics::WALLET_NETWORK_ERROR);
   1008 
   1009   wallet_client_->GetWalletItems(GURL(kMerchantUrl));
   1010   VerifyAndFinishRequest(net::HTTP_UNAUTHORIZED,
   1011                          kGetWalletItemsValidRequest,
   1012                          std::string());
   1013 }
   1014 
   1015 TEST_F(WalletClientTest, RequestError) {
   1016   EXPECT_CALL(delegate_, OnWalletError(WalletClient::BAD_REQUEST)).Times(1);
   1017   delegate_.ExpectLogWalletApiCallDuration(AutofillMetrics::SEND_STATUS, 1);
   1018   delegate_.ExpectBaselineMetrics();
   1019   delegate_.ExpectWalletErrorMetric(AutofillMetrics::WALLET_BAD_REQUEST);
   1020 
   1021   std::vector<AutocheckoutStatistic> statistics;
   1022   wallet_client_->SendAutocheckoutStatus(autofill::SUCCESS,
   1023                                          GURL(kMerchantUrl),
   1024                                          statistics,
   1025                                          "google_transaction_id");
   1026   VerifyAndFinishRequest(net::HTTP_BAD_REQUEST,
   1027                          kSendAutocheckoutStatusOfSuccessValidRequest,
   1028                          std::string());
   1029 }
   1030 
   1031 TEST_F(WalletClientTest, GetFullWalletSuccess) {
   1032   delegate_.ExpectLogWalletApiCallDuration(AutofillMetrics::GET_FULL_WALLET, 1);
   1033   delegate_.ExpectBaselineMetrics();
   1034 
   1035   WalletClient::FullWalletRequest full_wallet_request(
   1036       "instrument_id",
   1037       "shipping_address_id",
   1038       GURL(kMerchantUrl),
   1039       "google_transaction_id",
   1040       std::vector<WalletClient::RiskCapability>());
   1041   wallet_client_->GetFullWallet(full_wallet_request);
   1042 
   1043   VerifyAndFinishFormEncodedRequest(net::HTTP_OK,
   1044                                     kGetFullWalletValidRequest,
   1045                                     kGetFullWalletValidResponse,
   1046                                     3U);
   1047   EXPECT_EQ(1U, delegate_.full_wallets_received());
   1048 }
   1049 
   1050 TEST_F(WalletClientTest, GetFullWalletWithRiskCapabilitesSuccess) {
   1051   delegate_.ExpectLogWalletApiCallDuration(AutofillMetrics::GET_FULL_WALLET, 1);
   1052   delegate_.ExpectBaselineMetrics();
   1053 
   1054   std::vector<WalletClient::RiskCapability> risk_capabilities;
   1055   risk_capabilities.push_back(WalletClient::VERIFY_CVC);
   1056   WalletClient::FullWalletRequest full_wallet_request(
   1057       "instrument_id",
   1058       "shipping_address_id",
   1059       GURL(kMerchantUrl),
   1060       "google_transaction_id",
   1061       risk_capabilities);
   1062   wallet_client_->GetFullWallet(full_wallet_request);
   1063 
   1064   VerifyAndFinishFormEncodedRequest(
   1065       net::HTTP_OK,
   1066       kGetFullWalletWithRiskCapabilitesValidRequest,
   1067       kGetFullWalletValidResponse,
   1068       3U);
   1069   EXPECT_EQ(1U, delegate_.full_wallets_received());
   1070 }
   1071 
   1072 
   1073 TEST_F(WalletClientTest, GetFullWalletMalformedResponse) {
   1074   EXPECT_CALL(delegate_,
   1075               OnWalletError(WalletClient::MALFORMED_RESPONSE)).Times(1);
   1076   delegate_.ExpectLogWalletApiCallDuration(AutofillMetrics::GET_FULL_WALLET, 1);
   1077   delegate_.ExpectBaselineMetrics();
   1078   delegate_.ExpectWalletErrorMetric(AutofillMetrics::WALLET_MALFORMED_RESPONSE);
   1079 
   1080   WalletClient::FullWalletRequest full_wallet_request(
   1081       "instrument_id",
   1082       "shipping_address_id",
   1083       GURL(kMerchantUrl),
   1084       "google_transaction_id",
   1085       std::vector<WalletClient::RiskCapability>());
   1086   wallet_client_->GetFullWallet(full_wallet_request);
   1087 
   1088   VerifyAndFinishFormEncodedRequest(net::HTTP_OK,
   1089                                     kGetFullWalletValidRequest,
   1090                                     kGetFullWalletInvalidResponse,
   1091                                     3U);
   1092   EXPECT_EQ(0U, delegate_.full_wallets_received());
   1093 }
   1094 
   1095 TEST_F(WalletClientTest, AcceptLegalDocuments) {
   1096   EXPECT_CALL(delegate_, OnDidAcceptLegalDocuments()).Times(1);
   1097   delegate_.ExpectLogWalletApiCallDuration(
   1098       AutofillMetrics::ACCEPT_LEGAL_DOCUMENTS,
   1099       1);
   1100   delegate_.ExpectBaselineMetrics();
   1101 
   1102   ScopedVector<WalletItems::LegalDocument> docs;
   1103   base::DictionaryValue document;
   1104   document.SetString("legal_document_id", "doc_id_1");
   1105   document.SetString("display_name", "doc_1");
   1106   docs.push_back(
   1107       WalletItems::LegalDocument::CreateLegalDocument(document).release());
   1108   document.SetString("legal_document_id", "doc_id_2");
   1109   document.SetString("display_name", "doc_2");
   1110   docs.push_back(
   1111       WalletItems::LegalDocument::CreateLegalDocument(document).release());
   1112   docs.push_back(
   1113       WalletItems::LegalDocument::CreatePrivacyPolicyDocument().release());
   1114   wallet_client_->AcceptLegalDocuments(docs.get(),
   1115                                        kGoogleTransactionId,
   1116                                        GURL(kMerchantUrl));
   1117   VerifyAndFinishRequest(net::HTTP_OK,
   1118                          kAcceptLegalDocumentsValidRequest,
   1119                          ")}'");  // Invalid JSON. Should be ignored.
   1120 }
   1121 
   1122 TEST_F(WalletClientTest, AuthenticateInstrumentSucceeded) {
   1123   EXPECT_CALL(delegate_, OnDidAuthenticateInstrument(true)).Times(1);
   1124   delegate_.ExpectLogWalletApiCallDuration(
   1125       AutofillMetrics::AUTHENTICATE_INSTRUMENT,
   1126       1);
   1127   delegate_.ExpectBaselineMetrics();
   1128 
   1129   wallet_client_->AuthenticateInstrument("instrument_id", "123");
   1130 
   1131   VerifyAndFinishFormEncodedRequest(net::HTTP_OK,
   1132                                     kAuthenticateInstrumentValidRequest,
   1133                                     kAuthenticateInstrumentSuccessResponse,
   1134                                     3U);
   1135 }
   1136 
   1137 TEST_F(WalletClientTest, AuthenticateInstrumentFailed) {
   1138   EXPECT_CALL(delegate_, OnDidAuthenticateInstrument(false)).Times(1);
   1139   delegate_.ExpectLogWalletApiCallDuration(
   1140       AutofillMetrics::AUTHENTICATE_INSTRUMENT,
   1141       1);
   1142   delegate_.ExpectBaselineMetrics();
   1143 
   1144   wallet_client_->AuthenticateInstrument("instrument_id", "123");
   1145 
   1146   VerifyAndFinishFormEncodedRequest(net::HTTP_OK,
   1147                                     kAuthenticateInstrumentValidRequest,
   1148                                     kAuthenticateInstrumentFailureResponse,
   1149                                     3U);
   1150 }
   1151 
   1152 TEST_F(WalletClientTest, AuthenticateInstrumentFailedMalformedResponse) {
   1153   EXPECT_CALL(delegate_,
   1154               OnWalletError(WalletClient::MALFORMED_RESPONSE)).Times(1);
   1155   delegate_.ExpectLogWalletApiCallDuration(
   1156       AutofillMetrics::AUTHENTICATE_INSTRUMENT,
   1157       1);
   1158   delegate_.ExpectBaselineMetrics();
   1159   delegate_.ExpectWalletErrorMetric(AutofillMetrics::WALLET_MALFORMED_RESPONSE);
   1160 
   1161   wallet_client_->AuthenticateInstrument("instrument_id", "123");
   1162 
   1163   VerifyAndFinishFormEncodedRequest(net::HTTP_OK,
   1164                                     kAuthenticateInstrumentValidRequest,
   1165                                     kSaveInvalidResponse,
   1166                                     3U);
   1167 }
   1168 
   1169 // TODO(ahutter): Add failure tests for GetWalletItems.
   1170 
   1171 TEST_F(WalletClientTest, GetWalletItems) {
   1172   delegate_.ExpectLogWalletApiCallDuration(AutofillMetrics::GET_WALLET_ITEMS,
   1173                                            1);
   1174   delegate_.ExpectBaselineMetrics();
   1175 
   1176   wallet_client_->GetWalletItems(GURL(kMerchantUrl));
   1177 
   1178   VerifyAndFinishRequest(net::HTTP_OK,
   1179                          kGetWalletItemsValidRequest,
   1180                          kGetWalletItemsValidResponse);
   1181   EXPECT_EQ(1U, delegate_.wallet_items_received());
   1182 }
   1183 
   1184 TEST_F(WalletClientTest, GetWalletItemsRespectsDelegateForShippingRequired) {
   1185   delegate_.ExpectLogWalletApiCallDuration(AutofillMetrics::GET_WALLET_ITEMS,
   1186                                            1);
   1187   delegate_.ExpectBaselineMetrics();
   1188   delegate_.SetIsShippingAddressRequired(false);
   1189 
   1190   wallet_client_->GetWalletItems(GURL(kMerchantUrl));
   1191 
   1192   VerifyAndFinishRequest(net::HTTP_OK,
   1193                          kGetWalletItemsNoShippingRequest,
   1194                          kGetWalletItemsValidResponse);
   1195   EXPECT_EQ(1U, delegate_.wallet_items_received());
   1196 }
   1197 
   1198 TEST_F(WalletClientTest, SaveAddressSucceeded) {
   1199   EXPECT_CALL(delegate_,
   1200               OnDidSaveToWallet(std::string(),
   1201                                 "saved_address_id",
   1202                                 std::vector<RequiredAction>(),
   1203                                 std::vector<FormFieldError>())).Times(1);
   1204   delegate_.ExpectLogWalletApiCallDuration(AutofillMetrics::SAVE_TO_WALLET, 1);
   1205   delegate_.ExpectBaselineMetrics();
   1206 
   1207   scoped_ptr<Address> address = GetTestSaveableAddress();
   1208   wallet_client_->SaveToWallet(scoped_ptr<Instrument>(),
   1209                                address.Pass(),
   1210                                GURL(kMerchantUrl));
   1211   VerifyAndFinishRequest(net::HTTP_OK,
   1212                          kSaveAddressValidRequest,
   1213                          kSaveAddressValidResponse);
   1214 }
   1215 
   1216 TEST_F(WalletClientTest, SaveAddressWithRequiredActionsSucceeded) {
   1217   delegate_.ExpectLogWalletApiCallDuration(AutofillMetrics::SAVE_TO_WALLET, 1);
   1218   delegate_.ExpectBaselineMetrics();
   1219   delegate_.ExpectWalletRequiredActionMetric(
   1220       AutofillMetrics::REQUIRE_PHONE_NUMBER);
   1221   delegate_.ExpectWalletRequiredActionMetric(
   1222       AutofillMetrics::INVALID_FORM_FIELD);
   1223 
   1224   std::vector<RequiredAction> required_actions;
   1225   required_actions.push_back(REQUIRE_PHONE_NUMBER);
   1226   required_actions.push_back(INVALID_FORM_FIELD);
   1227 
   1228   std::vector<FormFieldError> form_errors;
   1229   form_errors.push_back(FormFieldError(FormFieldError::INVALID_POSTAL_CODE,
   1230                                        FormFieldError::SHIPPING_ADDRESS));
   1231 
   1232   EXPECT_CALL(delegate_,
   1233               OnDidSaveToWallet(std::string(),
   1234                                 std::string(),
   1235                                 required_actions,
   1236                                 form_errors)).Times(1);
   1237 
   1238   scoped_ptr<Address> address = GetTestSaveableAddress();
   1239   wallet_client_->SaveToWallet(scoped_ptr<Instrument>(),
   1240                                address.Pass(),
   1241                                GURL(kMerchantUrl));
   1242   VerifyAndFinishRequest(net::HTTP_OK,
   1243                          kSaveAddressValidRequest,
   1244                          kSaveAddressWithRequiredActionsValidResponse);
   1245 }
   1246 
   1247 TEST_F(WalletClientTest, SaveAddressFailedInvalidRequiredAction) {
   1248   EXPECT_CALL(delegate_,
   1249               OnWalletError(WalletClient::MALFORMED_RESPONSE)).Times(1);
   1250   delegate_.ExpectLogWalletApiCallDuration(AutofillMetrics::SAVE_TO_WALLET, 1);
   1251   delegate_.ExpectBaselineMetrics();
   1252   delegate_.ExpectWalletErrorMetric(AutofillMetrics::WALLET_MALFORMED_RESPONSE);
   1253 
   1254   scoped_ptr<Address> address = GetTestSaveableAddress();
   1255   wallet_client_->SaveToWallet(scoped_ptr<Instrument>(),
   1256                                address.Pass(),
   1257                                GURL(kMerchantUrl));
   1258   VerifyAndFinishRequest(net::HTTP_OK,
   1259                          kSaveAddressValidRequest,
   1260                          kSaveWithInvalidRequiredActionsResponse);
   1261 }
   1262 
   1263 TEST_F(WalletClientTest, SaveAddressFailedMalformedResponse) {
   1264   EXPECT_CALL(delegate_,
   1265               OnWalletError(WalletClient::MALFORMED_RESPONSE)).Times(1);
   1266   delegate_.ExpectLogWalletApiCallDuration(AutofillMetrics::SAVE_TO_WALLET, 1);
   1267   delegate_.ExpectBaselineMetrics();
   1268   delegate_.ExpectWalletErrorMetric(AutofillMetrics::WALLET_MALFORMED_RESPONSE);
   1269 
   1270   scoped_ptr<Address> address = GetTestSaveableAddress();
   1271   wallet_client_->SaveToWallet(scoped_ptr<Instrument>(),
   1272                                address.Pass(),
   1273                                GURL(kMerchantUrl));
   1274   VerifyAndFinishRequest(net::HTTP_OK,
   1275                          kSaveAddressValidRequest,
   1276                          kSaveInvalidResponse);
   1277 }
   1278 
   1279 TEST_F(WalletClientTest, SaveInstrumentSucceeded) {
   1280   EXPECT_CALL(delegate_,
   1281               OnDidSaveToWallet("instrument_id",
   1282                                 std::string(),
   1283                                 std::vector<RequiredAction>(),
   1284                                 std::vector<FormFieldError>())).Times(1);
   1285   delegate_.ExpectLogWalletApiCallDuration(AutofillMetrics::SAVE_TO_WALLET, 1);
   1286   delegate_.ExpectBaselineMetrics();
   1287 
   1288   scoped_ptr<Instrument> instrument = GetTestInstrument();
   1289   wallet_client_->SaveToWallet(instrument.Pass(),
   1290                                scoped_ptr<Address>(),
   1291                                GURL(kMerchantUrl));
   1292 
   1293   VerifyAndFinishFormEncodedRequest(net::HTTP_OK,
   1294                                     kSaveInstrumentValidRequest,
   1295                                     kSaveInstrumentValidResponse,
   1296                                     4U);
   1297 }
   1298 
   1299 TEST_F(WalletClientTest, SaveInstrumentWithRequiredActionsSucceeded) {
   1300   delegate_.ExpectLogWalletApiCallDuration(AutofillMetrics::SAVE_TO_WALLET, 1);
   1301   delegate_.ExpectBaselineMetrics();
   1302   delegate_.ExpectWalletRequiredActionMetric(
   1303       AutofillMetrics::REQUIRE_PHONE_NUMBER);
   1304   delegate_.ExpectWalletRequiredActionMetric(
   1305       AutofillMetrics::INVALID_FORM_FIELD);
   1306 
   1307   std::vector<RequiredAction> required_actions;
   1308   required_actions.push_back(REQUIRE_PHONE_NUMBER);
   1309   required_actions.push_back(INVALID_FORM_FIELD);
   1310 
   1311   std::vector<FormFieldError> form_errors;
   1312   form_errors.push_back(FormFieldError(FormFieldError::INVALID_POSTAL_CODE,
   1313                                        FormFieldError::SHIPPING_ADDRESS));
   1314 
   1315   EXPECT_CALL(delegate_,
   1316               OnDidSaveToWallet(std::string(),
   1317                                 std::string(),
   1318                                 required_actions,
   1319                                 form_errors)).Times(1);
   1320 
   1321   scoped_ptr<Instrument> instrument = GetTestInstrument();
   1322   wallet_client_->SaveToWallet(instrument.Pass(),
   1323                                scoped_ptr<Address>(),
   1324                                GURL(kMerchantUrl));
   1325 
   1326   VerifyAndFinishFormEncodedRequest(
   1327       net::HTTP_OK,
   1328       kSaveInstrumentValidRequest,
   1329       kSaveInstrumentWithRequiredActionsValidResponse,
   1330       4U);
   1331 }
   1332 
   1333 TEST_F(WalletClientTest, SaveInstrumentFailedInvalidRequiredActions) {
   1334   delegate_.ExpectLogWalletApiCallDuration(AutofillMetrics::SAVE_TO_WALLET, 1);
   1335   delegate_.ExpectBaselineMetrics();
   1336   delegate_.ExpectWalletErrorMetric(AutofillMetrics::WALLET_MALFORMED_RESPONSE);
   1337 
   1338   EXPECT_CALL(delegate_,
   1339               OnWalletError(WalletClient::MALFORMED_RESPONSE));
   1340 
   1341   scoped_ptr<Instrument> instrument = GetTestInstrument();
   1342   wallet_client_->SaveToWallet(instrument.Pass(),
   1343                                scoped_ptr<Address>(),
   1344                                GURL(kMerchantUrl));
   1345 
   1346   VerifyAndFinishFormEncodedRequest(net::HTTP_OK,
   1347                                     kSaveInstrumentValidRequest,
   1348                                     kSaveWithInvalidRequiredActionsResponse,
   1349                                     4U);
   1350 }
   1351 
   1352 TEST_F(WalletClientTest, SaveInstrumentFailedMalformedResponse) {
   1353   EXPECT_CALL(delegate_,
   1354               OnWalletError(WalletClient::MALFORMED_RESPONSE)).Times(1);
   1355   delegate_.ExpectLogWalletApiCallDuration(AutofillMetrics::SAVE_TO_WALLET, 1);
   1356   delegate_.ExpectBaselineMetrics();
   1357   delegate_.ExpectWalletErrorMetric(AutofillMetrics::WALLET_MALFORMED_RESPONSE);
   1358 
   1359   scoped_ptr<Instrument> instrument = GetTestInstrument();
   1360   wallet_client_->SaveToWallet(instrument.Pass(),
   1361                                scoped_ptr<Address>(),
   1362                                GURL(kMerchantUrl));
   1363 
   1364   VerifyAndFinishFormEncodedRequest(net::HTTP_OK,
   1365                                     kSaveInstrumentValidRequest,
   1366                                     kSaveInvalidResponse,
   1367                                     4U);
   1368 }
   1369 
   1370 TEST_F(WalletClientTest, SaveInstrumentAndAddressSucceeded) {
   1371   EXPECT_CALL(delegate_,
   1372               OnDidSaveToWallet("saved_instrument_id",
   1373                                 "saved_address_id",
   1374                                 std::vector<RequiredAction>(),
   1375                                 std::vector<FormFieldError>())).Times(1);
   1376   delegate_.ExpectLogWalletApiCallDuration(
   1377       AutofillMetrics::SAVE_TO_WALLET,
   1378       1);
   1379   delegate_.ExpectBaselineMetrics();
   1380 
   1381   scoped_ptr<Instrument> instrument = GetTestInstrument();
   1382   scoped_ptr<Address> address = GetTestSaveableAddress();
   1383   wallet_client_->SaveToWallet(instrument.Pass(),
   1384                                address.Pass(),
   1385                                GURL(kMerchantUrl));
   1386 
   1387   VerifyAndFinishFormEncodedRequest(net::HTTP_OK,
   1388                                     kSaveInstrumentAndAddressValidRequest,
   1389                                     kSaveInstrumentAndAddressValidResponse,
   1390                                     4U);
   1391 }
   1392 
   1393 TEST_F(WalletClientTest, SaveInstrumentAndAddressWithRequiredActionsSucceeded) {
   1394   delegate_.ExpectLogWalletApiCallDuration(
   1395       AutofillMetrics::SAVE_TO_WALLET,
   1396       1);
   1397   delegate_.ExpectBaselineMetrics();
   1398   delegate_.ExpectWalletRequiredActionMetric(
   1399       AutofillMetrics::REQUIRE_PHONE_NUMBER);
   1400   delegate_.ExpectWalletRequiredActionMetric(
   1401       AutofillMetrics::INVALID_FORM_FIELD);
   1402 
   1403   std::vector<RequiredAction> required_actions;
   1404   required_actions.push_back(REQUIRE_PHONE_NUMBER);
   1405   required_actions.push_back(INVALID_FORM_FIELD);
   1406 
   1407   std::vector<FormFieldError> form_errors;
   1408   form_errors.push_back(FormFieldError(FormFieldError::INVALID_POSTAL_CODE,
   1409                                        FormFieldError::SHIPPING_ADDRESS));
   1410 
   1411   EXPECT_CALL(delegate_,
   1412               OnDidSaveToWallet(std::string(),
   1413                                 std::string(),
   1414                                 required_actions,
   1415                                 form_errors)).Times(1);
   1416 
   1417   scoped_ptr<Instrument> instrument = GetTestInstrument();
   1418   scoped_ptr<Address> address = GetTestSaveableAddress();
   1419   wallet_client_->SaveToWallet(instrument.Pass(),
   1420                                address.Pass(),
   1421                                GURL(kMerchantUrl));
   1422 
   1423   VerifyAndFinishFormEncodedRequest(
   1424       net::HTTP_OK,
   1425       kSaveInstrumentAndAddressValidRequest,
   1426       kSaveInstrumentAndAddressWithRequiredActionsValidResponse,
   1427       4U);
   1428 }
   1429 
   1430 TEST_F(WalletClientTest, SaveInstrumentAndAddressFailedInvalidRequiredAction) {
   1431   EXPECT_CALL(delegate_,
   1432               OnWalletError(WalletClient::MALFORMED_RESPONSE)).Times(1);
   1433   delegate_.ExpectLogWalletApiCallDuration(
   1434       AutofillMetrics::SAVE_TO_WALLET,
   1435       1);
   1436   delegate_.ExpectBaselineMetrics();
   1437   delegate_.ExpectWalletErrorMetric(AutofillMetrics::WALLET_MALFORMED_RESPONSE);
   1438 
   1439   scoped_ptr<Instrument> instrument = GetTestInstrument();
   1440   scoped_ptr<Address> address = GetTestSaveableAddress();
   1441   wallet_client_->SaveToWallet(instrument.Pass(),
   1442                                address.Pass(),
   1443                                GURL(kMerchantUrl));
   1444 
   1445   VerifyAndFinishFormEncodedRequest(net::HTTP_OK,
   1446                                     kSaveInstrumentAndAddressValidRequest,
   1447                                     kSaveWithInvalidRequiredActionsResponse,
   1448                                     4U);
   1449 }
   1450 
   1451 TEST_F(WalletClientTest, UpdateAddressSucceeded) {
   1452   EXPECT_CALL(delegate_,
   1453               OnDidSaveToWallet(std::string(),
   1454                                 "shipping_address_id",
   1455                                 std::vector<RequiredAction>(),
   1456                                 std::vector<FormFieldError>())).Times(1);
   1457   delegate_.ExpectLogWalletApiCallDuration(AutofillMetrics::SAVE_TO_WALLET, 1);
   1458   delegate_.ExpectBaselineMetrics();
   1459 
   1460   scoped_ptr<Address> address = GetTestShippingAddress();
   1461   address->set_object_id("shipping_address_id");
   1462 
   1463   wallet_client_->SaveToWallet(scoped_ptr<Instrument>(),
   1464                                address.Pass(),
   1465                                GURL(kMerchantUrl));
   1466   VerifyAndFinishRequest(net::HTTP_OK,
   1467                          kUpdateAddressValidRequest,
   1468                          kUpdateAddressValidResponse);
   1469 }
   1470 
   1471 TEST_F(WalletClientTest, UpdateAddressWithRequiredActionsSucceeded) {
   1472   delegate_.ExpectLogWalletApiCallDuration(AutofillMetrics::SAVE_TO_WALLET, 1);
   1473   delegate_.ExpectBaselineMetrics();
   1474   delegate_.ExpectWalletRequiredActionMetric(
   1475       AutofillMetrics::REQUIRE_PHONE_NUMBER);
   1476   delegate_.ExpectWalletRequiredActionMetric(
   1477       AutofillMetrics::INVALID_FORM_FIELD);
   1478 
   1479   std::vector<RequiredAction> required_actions;
   1480   required_actions.push_back(REQUIRE_PHONE_NUMBER);
   1481   required_actions.push_back(INVALID_FORM_FIELD);
   1482 
   1483   std::vector<FormFieldError> form_errors;
   1484   form_errors.push_back(FormFieldError(FormFieldError::INVALID_POSTAL_CODE,
   1485                                        FormFieldError::SHIPPING_ADDRESS));
   1486 
   1487   EXPECT_CALL(delegate_, OnDidSaveToWallet(std::string(),
   1488                                            std::string(),
   1489                                            required_actions,
   1490                                            form_errors)).Times(1);
   1491 
   1492   scoped_ptr<Address> address = GetTestShippingAddress();
   1493   address->set_object_id("shipping_address_id");
   1494 
   1495   wallet_client_->SaveToWallet(scoped_ptr<Instrument>(),
   1496                                address.Pass(),
   1497                                GURL(kMerchantUrl));
   1498   VerifyAndFinishRequest(net::HTTP_OK,
   1499                          kUpdateAddressValidRequest,
   1500                          kUpdateWithRequiredActionsValidResponse);
   1501 }
   1502 
   1503 TEST_F(WalletClientTest, UpdateAddressFailedInvalidRequiredAction) {
   1504   EXPECT_CALL(delegate_,
   1505               OnWalletError(WalletClient::MALFORMED_RESPONSE)).Times(1);
   1506   delegate_.ExpectLogWalletApiCallDuration(AutofillMetrics::SAVE_TO_WALLET, 1);
   1507   delegate_.ExpectBaselineMetrics();
   1508   delegate_.ExpectWalletErrorMetric(AutofillMetrics::WALLET_MALFORMED_RESPONSE);
   1509 
   1510   scoped_ptr<Address> address = GetTestShippingAddress();
   1511   address->set_object_id("shipping_address_id");
   1512 
   1513   wallet_client_->SaveToWallet(scoped_ptr<Instrument>(),
   1514                                address.Pass(),
   1515                                GURL(kMerchantUrl));
   1516   VerifyAndFinishRequest(net::HTTP_OK,
   1517                          kUpdateAddressValidRequest,
   1518                          kSaveWithInvalidRequiredActionsResponse);
   1519 }
   1520 
   1521 TEST_F(WalletClientTest, UpdateAddressMalformedResponse) {
   1522   EXPECT_CALL(delegate_,
   1523               OnWalletError(WalletClient::MALFORMED_RESPONSE)).Times(1);
   1524   delegate_.ExpectLogWalletApiCallDuration(AutofillMetrics::SAVE_TO_WALLET, 1);
   1525   delegate_.ExpectBaselineMetrics();
   1526   delegate_.ExpectWalletErrorMetric(AutofillMetrics::WALLET_MALFORMED_RESPONSE);
   1527 
   1528   scoped_ptr<Address> address = GetTestShippingAddress();
   1529   address->set_object_id("shipping_address_id");
   1530 
   1531   wallet_client_->SaveToWallet(scoped_ptr<Instrument>(),
   1532                                address.Pass(),
   1533                                GURL(kMerchantUrl));
   1534   VerifyAndFinishRequest(net::HTTP_OK,
   1535                          kUpdateAddressValidRequest,
   1536                          kUpdateMalformedResponse);
   1537 }
   1538 
   1539 TEST_F(WalletClientTest, UpdateInstrumentAddressSucceeded) {
   1540   EXPECT_CALL(delegate_,
   1541               OnDidSaveToWallet("instrument_id",
   1542                                 std::string(),
   1543                                 std::vector<RequiredAction>(),
   1544                                 std::vector<FormFieldError>())).Times(1);
   1545   delegate_.ExpectLogWalletApiCallDuration(AutofillMetrics::SAVE_TO_WALLET,
   1546                                            1);
   1547   delegate_.ExpectBaselineMetrics();
   1548 
   1549   wallet_client_->SaveToWallet(GetTestAddressUpgradeInstrument(),
   1550                                scoped_ptr<Address>(),
   1551                                GURL(kMerchantUrl));
   1552 
   1553   VerifyAndFinishRequest(net::HTTP_OK,
   1554                          kUpdateInstrumentAddressValidRequest,
   1555                          kUpdateInstrumentValidResponse);
   1556 }
   1557 
   1558 TEST_F(WalletClientTest, UpdateInstrumentExpirationDateSuceeded) {
   1559   EXPECT_CALL(delegate_,
   1560               OnDidSaveToWallet("instrument_id",
   1561                                 std::string(),
   1562                                 std::vector<RequiredAction>(),
   1563                                 std::vector<FormFieldError>())).Times(1);
   1564   delegate_.ExpectLogWalletApiCallDuration(AutofillMetrics::SAVE_TO_WALLET,
   1565                                            1);
   1566   delegate_.ExpectBaselineMetrics();
   1567 
   1568   wallet_client_->SaveToWallet(GetTestExpirationDateChangeInstrument(),
   1569                                scoped_ptr<Address>(),
   1570                                GURL(kMerchantUrl));
   1571 
   1572   VerifyAndFinishFormEncodedRequest(net::HTTP_OK,
   1573                                     kUpdateInstrumentExpirationDateValidRequest,
   1574                                     kUpdateInstrumentValidResponse,
   1575                                     3U);
   1576 }
   1577 
   1578 TEST_F(WalletClientTest, UpdateInstrumentAddressWithNameChangeSucceeded) {
   1579   EXPECT_CALL(delegate_,
   1580               OnDidSaveToWallet("instrument_id",
   1581                                 std::string(),
   1582                                 std::vector<RequiredAction>(),
   1583                                 std::vector<FormFieldError>())).Times(1);
   1584   delegate_.ExpectLogWalletApiCallDuration(AutofillMetrics::SAVE_TO_WALLET,
   1585                                            1);
   1586   delegate_.ExpectBaselineMetrics();
   1587 
   1588   wallet_client_->SaveToWallet(GetTestAddressNameChangeInstrument(),
   1589                                scoped_ptr<Address>(),
   1590                                GURL(kMerchantUrl));
   1591 
   1592   VerifyAndFinishFormEncodedRequest(
   1593       net::HTTP_OK,
   1594       kUpdateInstrumentAddressWithNameChangeValidRequest,
   1595       kUpdateInstrumentValidResponse,
   1596       3U);
   1597 }
   1598 
   1599 TEST_F(WalletClientTest, UpdateInstrumentWithRequiredActionsSucceeded) {
   1600   delegate_.ExpectLogWalletApiCallDuration(AutofillMetrics::SAVE_TO_WALLET,
   1601                                            1);
   1602   delegate_.ExpectBaselineMetrics();
   1603   delegate_.ExpectWalletRequiredActionMetric(
   1604       AutofillMetrics::REQUIRE_PHONE_NUMBER);
   1605   delegate_.ExpectWalletRequiredActionMetric(
   1606       AutofillMetrics::INVALID_FORM_FIELD);
   1607 
   1608   std::vector<RequiredAction> required_actions;
   1609   required_actions.push_back(REQUIRE_PHONE_NUMBER);
   1610   required_actions.push_back(INVALID_FORM_FIELD);
   1611 
   1612   std::vector<FormFieldError> form_errors;
   1613   form_errors.push_back(FormFieldError(FormFieldError::INVALID_POSTAL_CODE,
   1614                                        FormFieldError::SHIPPING_ADDRESS));
   1615 
   1616   EXPECT_CALL(delegate_,
   1617               OnDidSaveToWallet(std::string(),
   1618                                 std::string(),
   1619                                 required_actions,
   1620                                 form_errors)).Times(1);
   1621 
   1622   wallet_client_->SaveToWallet(GetTestAddressUpgradeInstrument(),
   1623                                scoped_ptr<Address>(),
   1624                                GURL(kMerchantUrl));
   1625 
   1626   VerifyAndFinishRequest(net::HTTP_OK,
   1627                          kUpdateInstrumentAddressValidRequest,
   1628                          kUpdateWithRequiredActionsValidResponse);
   1629 }
   1630 
   1631 TEST_F(WalletClientTest, UpdateInstrumentFailedInvalidRequiredAction) {
   1632   EXPECT_CALL(delegate_,
   1633               OnWalletError(WalletClient::MALFORMED_RESPONSE)).Times(1);
   1634   delegate_.ExpectLogWalletApiCallDuration(AutofillMetrics::SAVE_TO_WALLET,
   1635                                            1);
   1636   delegate_.ExpectBaselineMetrics();
   1637   delegate_.ExpectWalletErrorMetric(AutofillMetrics::WALLET_MALFORMED_RESPONSE);
   1638 
   1639   wallet_client_->SaveToWallet(GetTestAddressUpgradeInstrument(),
   1640                                scoped_ptr<Address>(),
   1641                                GURL(kMerchantUrl));
   1642 
   1643   VerifyAndFinishRequest(net::HTTP_OK,
   1644                          kUpdateInstrumentAddressValidRequest,
   1645                          kSaveWithInvalidRequiredActionsResponse);
   1646 }
   1647 
   1648 TEST_F(WalletClientTest, UpdateInstrumentMalformedResponse) {
   1649   EXPECT_CALL(delegate_,
   1650               OnWalletError(WalletClient::MALFORMED_RESPONSE)).Times(1);
   1651   delegate_.ExpectLogWalletApiCallDuration(AutofillMetrics::SAVE_TO_WALLET,
   1652                                            1);
   1653   delegate_.ExpectBaselineMetrics();
   1654   delegate_.ExpectWalletErrorMetric(AutofillMetrics::WALLET_MALFORMED_RESPONSE);
   1655 
   1656   wallet_client_->SaveToWallet(GetTestAddressUpgradeInstrument(),
   1657                                scoped_ptr<Address>(),
   1658                                GURL(kMerchantUrl));
   1659 
   1660   VerifyAndFinishRequest(net::HTTP_OK,
   1661                          kUpdateInstrumentAddressValidRequest,
   1662                          kUpdateMalformedResponse);
   1663 }
   1664 
   1665 TEST_F(WalletClientTest, SendAutocheckoutOfStatusSuccess) {
   1666   delegate_.ExpectLogWalletApiCallDuration(AutofillMetrics::SEND_STATUS, 1);
   1667   delegate_.ExpectBaselineMetrics();
   1668 
   1669   AutocheckoutStatistic statistic;
   1670   statistic.page_number = 1;
   1671   statistic.steps.push_back(AUTOCHECKOUT_STEP_SHIPPING);
   1672   statistic.time_taken = base::TimeDelta::FromMilliseconds(100);
   1673   std::vector<AutocheckoutStatistic> statistics;
   1674   statistics.push_back(statistic);
   1675   wallet_client_->SendAutocheckoutStatus(autofill::SUCCESS,
   1676                                          GURL(kMerchantUrl),
   1677                                          statistics,
   1678                                          "google_transaction_id");
   1679   VerifyAndFinishRequest(net::HTTP_OK,
   1680                          kSendAutocheckoutStatusWithStatisticsValidRequest,
   1681                          ")]}");  // Invalid JSON. Should be ignored.
   1682 }
   1683 
   1684 TEST_F(WalletClientTest, SendAutocheckoutStatusOfFailure) {
   1685   delegate_.ExpectLogWalletApiCallDuration(AutofillMetrics::SEND_STATUS, 1);
   1686   delegate_.ExpectBaselineMetrics();
   1687 
   1688   std::vector<AutocheckoutStatistic> statistics;
   1689   wallet_client_->SendAutocheckoutStatus(autofill::CANNOT_PROCEED,
   1690                                          GURL(kMerchantUrl),
   1691                                          statistics,
   1692                                          "google_transaction_id");
   1693   VerifyAndFinishRequest(net::HTTP_OK,
   1694                          kSendAutocheckoutStatusOfFailureValidRequest,
   1695                          ")]}");  // Invalid JSON. Should be ignored.
   1696 }
   1697 
   1698 TEST_F(WalletClientTest, HasRequestInProgress) {
   1699   EXPECT_FALSE(wallet_client_->HasRequestInProgress());
   1700   delegate_.ExpectLogWalletApiCallDuration(AutofillMetrics::GET_WALLET_ITEMS,
   1701                                            1);
   1702   delegate_.ExpectBaselineMetrics();
   1703 
   1704   wallet_client_->GetWalletItems(GURL(kMerchantUrl));
   1705   EXPECT_TRUE(wallet_client_->HasRequestInProgress());
   1706 
   1707   VerifyAndFinishRequest(net::HTTP_OK,
   1708                          kGetWalletItemsValidRequest,
   1709                          kGetWalletItemsValidResponse);
   1710   EXPECT_FALSE(wallet_client_->HasRequestInProgress());
   1711 }
   1712 
   1713 TEST_F(WalletClientTest, PendingRequest) {
   1714   EXPECT_EQ(0U, wallet_client_->pending_requests_.size());
   1715 
   1716   // Shouldn't queue the first request.
   1717   delegate_.ExpectBaselineMetrics();
   1718   wallet_client_->GetWalletItems(GURL(kMerchantUrl));
   1719   EXPECT_EQ(0U, wallet_client_->pending_requests_.size());
   1720   testing::Mock::VerifyAndClear(delegate_.metric_logger());
   1721 
   1722   wallet_client_->GetWalletItems(GURL(kMerchantUrl));
   1723   EXPECT_EQ(1U, wallet_client_->pending_requests_.size());
   1724 
   1725   delegate_.ExpectLogWalletApiCallDuration(AutofillMetrics::GET_WALLET_ITEMS,
   1726                                            1);
   1727   delegate_.ExpectBaselineMetrics();
   1728   VerifyAndFinishRequest(net::HTTP_OK,
   1729                          kGetWalletItemsValidRequest,
   1730                          kGetWalletItemsValidResponse);
   1731   EXPECT_EQ(0U, wallet_client_->pending_requests_.size());
   1732   testing::Mock::VerifyAndClear(delegate_.metric_logger());
   1733 
   1734   EXPECT_CALL(delegate_, OnWalletError(
   1735       WalletClient::SERVICE_UNAVAILABLE)).Times(1);
   1736   delegate_.ExpectLogWalletApiCallDuration(AutofillMetrics::GET_WALLET_ITEMS,
   1737                                            1);
   1738   delegate_.ExpectWalletErrorMetric(
   1739       AutofillMetrics::WALLET_SERVICE_UNAVAILABLE);
   1740 
   1741   // Finish the second request.
   1742   VerifyAndFinishRequest(net::HTTP_INTERNAL_SERVER_ERROR,
   1743                          kGetWalletItemsValidRequest,
   1744                          kErrorResponse);
   1745 }
   1746 
   1747 TEST_F(WalletClientTest, CancelRequests) {
   1748   ASSERT_EQ(0U, wallet_client_->pending_requests_.size());
   1749   delegate_.ExpectLogWalletApiCallDuration(AutofillMetrics::GET_WALLET_ITEMS,
   1750                                            0);
   1751   delegate_.ExpectBaselineMetrics();
   1752 
   1753   wallet_client_->GetWalletItems(GURL(kMerchantUrl));
   1754   wallet_client_->GetWalletItems(GURL(kMerchantUrl));
   1755   wallet_client_->GetWalletItems(GURL(kMerchantUrl));
   1756   EXPECT_EQ(2U, wallet_client_->pending_requests_.size());
   1757 
   1758   wallet_client_->CancelRequests();
   1759   EXPECT_EQ(0U, wallet_client_->pending_requests_.size());
   1760   EXPECT_FALSE(wallet_client_->HasRequestInProgress());
   1761 }
   1762 
   1763 }  // namespace wallet
   1764 }  // namespace autofill
   1765