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

Side by Side Diff: components/autofill/content/browser/wallet/wallet_client_unittest.cc

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

Powered by Google App Engine
This is Rietveld 408576698