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