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