Home | History | Annotate | Download | only in wallet
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "base/json/json_reader.h"
      6 #include "base/logging.h"
      7 #include "base/memory/scoped_ptr.h"
      8 #include "base/strings/utf_string_conversions.h"
      9 #include "base/values.h"
     10 #include "components/autofill/content/browser/wallet/gaia_account.h"
     11 #include "components/autofill/content/browser/wallet/required_action.h"
     12 #include "components/autofill/content/browser/wallet/wallet_items.h"
     13 #include "components/autofill/content/browser/wallet/wallet_test_util.h"
     14 #include "testing/gtest/include/gtest/gtest.h"
     15 #include "url/gurl.h"
     16 
     17 using base::ASCIIToUTF16;
     18 
     19 namespace {
     20 
     21 const char kMaskedInstrument[] =
     22     "{"
     23     "  \"descriptive_name\":\"descriptive_name\","
     24     "  \"type\":\"VISA\","
     25     "  \"last_four_digits\":\"last_four_digits\","
     26     "  \"expiration_month\":12,"
     27     "  \"expiration_year\":2012,"
     28     "  \"billing_address\":"
     29     "  {"
     30     "    \"name\":\"name\","
     31     "    \"address1\":\"address1\","
     32     "    \"address2\":\"address2\","
     33     "    \"city\":\"city\","
     34     "    \"dependent_locality_name\":\"burough\","
     35     "    \"state\":\"state\","
     36     "    \"postal_code\":\"postal_code\","
     37     "    \"sorting_code\":\"sorting_code\","
     38     "    \"phone_number\":\"phone_number\","
     39     "    \"country_code\":\"US\","
     40     "    \"type\":\"FULL\","
     41     "    \"language_code\":\"language_code\""
     42     "  },"
     43     "  \"status\":\"VALID\","
     44     "  \"object_id\":\"object_id\""
     45     "}";
     46 
     47 const char kMaskedInstrumentMissingStatus[] =
     48     "{"
     49     "  \"descriptive_name\":\"descriptive_name\","
     50     "  \"type\":\"VISA\","
     51     "  \"last_four_digits\":\"last_four_digits\","
     52     "  \"expiration_month\":12,"
     53     "  \"expiration_year\":2012,"
     54     "  \"billing_address\":"
     55     "  {"
     56     "    \"name\":\"name\","
     57     "    \"address1\":\"address1\","
     58     "    \"address2\":\"address2\","
     59     "    \"city\":\"city\","
     60     "    \"dependent_locality_name\":\"burough\","
     61     "    \"state\":\"state\","
     62     "    \"postal_code\":\"postal_code\","
     63     "    \"sorting_code\":\"sorting_code\","
     64     "    \"phone_number\":\"phone_number\","
     65     "    \"country_code\":\"US\","
     66     "    \"language_code\":\"language_code\""
     67     "  },"
     68     "  \"object_id\":\"object_id\","
     69     "  \"amex_disallowed\":true"
     70     "}";
     71 
     72 const char kMaskedInstrumentMissingType[] =
     73     "{"
     74     "  \"descriptive_name\":\"descriptive_name\","
     75     "  \"last_four_digits\":\"last_four_digits\","
     76     "  \"expiration_month\":12,"
     77     "  \"expiration_year\":2012,"
     78     "  \"billing_address\":"
     79     "  {"
     80     "    \"name\":\"name\","
     81     "    \"address1\":\"address1\","
     82     "    \"address2\":\"address2\","
     83     "    \"city\":\"city\","
     84     "    \"dependent_locality_name\":\"burough\","
     85     "    \"state\":\"state\","
     86     "    \"postal_code\":\"postal_code\","
     87     "    \"sorting_code\":\"sorting_code\","
     88     "    \"phone_number\":\"phone_number\","
     89     "    \"country_code\":\"US\","
     90     "    \"language_code\":\"language_code\""
     91     "  },"
     92     "  \"status\":\"VALID\","
     93     "  \"object_id\":\"object_id\""
     94     "}";
     95 
     96 const char kMaskedInstrumentMissingLastFourDigits[] =
     97     "{"
     98     "  \"descriptive_name\":\"descriptive_name\","
     99     "  \"type\":\"VISA\","
    100     "  \"expiration_month\":12,"
    101     "  \"expiration_year\":2012,"
    102     "  \"billing_address\":"
    103     "  {"
    104     "    \"name\":\"name\","
    105     "    \"address1\":\"address1\","
    106     "    \"address2\":\"address2\","
    107     "    \"city\":\"city\","
    108     "    \"dependent_locality_name\":\"burough\","
    109     "    \"state\":\"state\","
    110     "    \"postal_code\":\"postal_code\","
    111     "    \"sorting_code\":\"sorting_code\","
    112     "    \"phone_number\":\"phone_number\","
    113     "    \"country_code\":\"US\","
    114     "    \"language_code\":\"language_code\""
    115     "  },"
    116     "  \"status\":\"VALID\","
    117     "  \"object_id\":\"object_id\""
    118     "}";
    119 
    120 const char kMaskedInstrumentMissingAddress[] =
    121     "{"
    122     "  \"descriptive_name\":\"descriptive_name\","
    123     "  \"type\":\"VISA\","
    124     "  \"last_four_digits\":\"last_four_digits\","
    125     "  \"expiration_month\":12,"
    126     "  \"expiration_year\":2012,"
    127     "  \"status\":\"VALID\","
    128     "  \"object_id\":\"object_id\""
    129     "}";
    130 
    131 const char kMaskedInstrumentMalformedAddress[] =
    132     "{"
    133     "  \"descriptive_name\":\"descriptive_name\","
    134     "  \"type\":\"VISA\","
    135     "  \"last_four_digits\":\"last_four_digits\","
    136     "  \"expiration_month\":12,"
    137     "  \"expiration_year\":2012,"
    138     "  \"billing_address\":"
    139     "  {"
    140     "    \"address1\":\"address1\","
    141     "    \"address2\":\"address2\","
    142     "    \"city\":\"city\","
    143     "    \"dependent_locality_name\":\"burough\","
    144     "    \"state\":\"state\","
    145     "    \"phone_number\":\"phone_number\","
    146     "    \"country_code\":\"US\""
    147     "  },"
    148     "  \"status\":\"VALID\","
    149     "  \"object_id\":\"object_id\""
    150     "}";
    151 
    152 const char kMaskedInstrumentMissingObjectId[] =
    153     "{"
    154     "  \"descriptive_name\":\"descriptive_name\","
    155     "  \"type\":\"VISA\","
    156     "  \"last_four_digits\":\"last_four_digits\","
    157     "  \"expiration_month\":12,"
    158     "  \"expiration_year\":2012,"
    159     "  \"billing_address\":"
    160     "  {"
    161     "    \"name\":\"name\","
    162     "    \"address1\":\"address1\","
    163     "    \"address2\":\"address2\","
    164     "    \"city\":\"city\","
    165     "    \"dependent_locality_name\":\"burough\","
    166     "    \"state\":\"state\","
    167     "    \"postal_code\":\"postal_code\","
    168     "    \"phone_number\":\"phone_number\","
    169     "    \"country_code\":\"US\","
    170     "    \"language_code\":\"language_code\""
    171     "  },"
    172     "  \"status\":\"VALID\""
    173     "}";
    174 
    175 const char kLegalDocument[] =
    176     "{"
    177     "  \"legal_document_id\":\"doc_id\","
    178     "  \"display_name\":\"display_name\""
    179     "}";
    180 
    181 const char kLegalDocumentMissingDocumentId[] =
    182     "{"
    183     "  \"display_name\":\"display_name\""
    184     "}";
    185 
    186 const char kLegalDocumentMissingDisplayName[] =
    187     "{"
    188     "  \"legal_document_id\":\"doc_id\""
    189     "}";
    190 
    191 const char kWalletItemsWithRequiredActions[] =
    192     "{"
    193     "  \"required_action\":"
    194     "  ["
    195     "    \"  setup_wallet\","
    196     "    \" CHOOse_ANother_INSTRUMENT_OR_ADDRESS\","
    197     "    \"AcCePt_ToS  \","
    198     "    \"  \\tGAIA_auth   \\n\\r\","
    199     "    \"UPDATE_expiration_date\","
    200     "    \"UPGRADE_min_ADDRESS   \","
    201     "    \" pAsSiVe_GAIA_auth \","
    202     "    \" REQUIRE_PHONE_NUMBER\\t \""
    203     "  ]"
    204     "}";
    205 
    206 const char kWalletItemsWithInvalidRequiredActions[] =
    207     "{"
    208     "  \"required_action\":"
    209     "  ["
    210     "    \"verify_CVV\","
    211     "    \"invalid_FORM_FIELD\","
    212     "    \"  \""
    213     "  ]"
    214     "}";
    215 
    216 const char kWalletItemsMissingGoogleTransactionId[] =
    217     "{"
    218     "  \"required_action\":"
    219     "  ["
    220     "  ],"
    221     "  \"instrument\":"
    222     "  ["
    223     "    {"
    224     "      \"descriptive_name\":\"descriptive_name\","
    225     "      \"type\":\"VISA\","
    226     "      \"last_four_digits\":\"last_four_digits\","
    227     "      \"expiration_month\":12,"
    228     "      \"expiration_year\":2012,"
    229     "      \"billing_address\":"
    230     "      {"
    231     "        \"name\":\"name\","
    232     "        \"address1\":\"address1\","
    233     "        \"address2\":\"address2\","
    234     "        \"city\":\"city\","
    235     "        \"state\":\"state\","
    236     "        \"postal_code\":\"postal_code\","
    237     "        \"phone_number\":\"phone_number\","
    238     "        \"country_code\":\"US\","
    239     "        \"language_code\":\"language_code\""
    240     "      },"
    241     "      \"status\":\"VALID\","
    242     "      \"object_id\":\"object_id\""
    243     "    }"
    244     "  ],"
    245     "  \"default_instrument_id\":\"default_instrument_id\","
    246     "  \"address\":"
    247     "  ["
    248     "    {"
    249     "      \"id\":\"id\","
    250     "      \"phone_number\":\"phone_number\","
    251     "      \"postal_address\":"
    252     "      {"
    253     "        \"recipient_name\":\"recipient_name\","
    254     "        \"address_line\":"
    255     "        ["
    256     "          \"address_line_1\","
    257     "          \"address_line_2\""
    258     "        ],"
    259     "        \"locality_name\":\"locality_name\","
    260     "        \"administrative_area_name\":\"administrative_area_name\","
    261     "        \"postal_code_number\":\"postal_code_number\","
    262     "        \"country_name_code\":\"US\","
    263     "        \"language_code\":\"language_code\""
    264     "      }"
    265     "    }"
    266     "  ],"
    267     "  \"default_address_id\":\"default_address_id\","
    268     "  \"amex_disallowed\":true,"
    269     "  \"required_legal_document\":"
    270     "  ["
    271     "    {"
    272     "      \"legal_document_id\":\"doc_id\","
    273     "      \"display_name\":\"display_name\""
    274     "    }"
    275     "  ]"
    276     "}";
    277 
    278 const char kWalletItems[] =
    279     "{"
    280     "  \"required_action\":"
    281     "  ["
    282     "  ],"
    283     "  \"google_transaction_id\":\"google_transaction_id\","
    284     "  \"instrument\":"
    285     "  ["
    286     "    {"
    287     "      \"descriptive_name\":\"descriptive_name\","
    288     "      \"type\":\"VISA\","
    289     "      \"last_four_digits\":\"last_four_digits\","
    290     "      \"expiration_month\":12,"
    291     "      \"expiration_year\":2012,"
    292     "      \"billing_address\":"
    293     "      {"
    294     "        \"name\":\"name\","
    295     "        \"address1\":\"address1\","
    296     "        \"address2\":\"address2\","
    297     "        \"city\":\"city\","
    298     "        \"dependent_locality_name\":\"burough\","
    299     "        \"state\":\"state\","
    300     "        \"postal_code\":\"postal_code\","
    301     "        \"sorting_code\":\"sorting_code\","
    302     "        \"phone_number\":\"phone_number\","
    303     "        \"country_code\":\"US\","
    304     "        \"type\":\"FULL\","
    305     "        \"language_code\":\"language_code\""
    306     "      },"
    307     "      \"status\":\"VALID\","
    308     "      \"object_id\":\"object_id\""
    309     "    }"
    310     "  ],"
    311     "  \"default_instrument_id\":\"default_instrument_id\","
    312     "  \"address\":"
    313     "  ["
    314     "    {"
    315     "      \"id\":\"id\","
    316     "      \"phone_number\":\"phone_number\","
    317     "      \"postal_address\":"
    318     "      {"
    319     "        \"recipient_name\":\"recipient_name\","
    320     "        \"address_line\":"
    321     "        ["
    322     "          \"address_line_1\","
    323     "          \"address_line_2\""
    324     "        ],"
    325     "        \"locality_name\":\"locality_name\","
    326     "        \"dependent_locality_name\":\"dependent_locality_name\","
    327     "        \"administrative_area_name\":\"administrative_area_name\","
    328     "        \"postal_code_number\":\"postal_code_number\","
    329     "        \"sorting_code\":\"sorting_code\","
    330     "        \"country_name_code\":\"US\","
    331     "        \"language_code\":\"language_code\""
    332     "      }"
    333     "    }"
    334     "  ],"
    335     "  \"default_address_id\":\"default_address_id\","
    336     "  \"obfuscated_gaia_id\":\"ignore_this_value\","
    337     "  \"amex_disallowed\":true,"
    338     "  \"gaia_profile\":"
    339     "  ["
    340     "    {"
    341     "      \"buyer_email\":\"user (at) chromium.org\","
    342     "      \"gaia_index\":0,"
    343     "      \"gaia_id\":\"123456789\","
    344     "      \"buyer_name\":\"Joe Usecase\","
    345     "      \"is_active\":true,"
    346     "      \"avatar_url_27x27\":\"https://lh3.googleusercontent.com/27.jpg\","
    347     "      \"avatar_url_54x54\":\"https://lh3.googleusercontent.com/54.jpg\","
    348     "      \"avatar_url_48x48\":\"https://lh3.googleusercontent.com/48.jpg\","
    349     "      \"avatar_url_96x96\":\"https://lh3.googleusercontent.com/96.jpg\""
    350     "    },"
    351     "    {"
    352     "      \"buyer_email\":\"user2 (at) chromium.org\","
    353     "      \"gaia_index\":1,"
    354     "      \"gaia_id\":\"obfuscated_gaia_id\","
    355     "      \"buyer_name\":\"Jill Usecase\","
    356     "      \"is_active\":false,"
    357     "      \"avatar_url_27x27\":\"https://lh3.googleusercontent.com/27.jpg\","
    358     "      \"avatar_url_54x54\":\"https://lh3.googleusercontent.com/54.jpg\","
    359     "      \"avatar_url_48x48\":\"https://lh3.googleusercontent.com/48.jpg\","
    360     "      \"avatar_url_96x96\":\"https://lh3.googleusercontent.com/96.jpg\""
    361     "    }"
    362     "  ],"
    363     "  \"allowed_shipping_spec_by_country\":"
    364     "  ["
    365     "    {\"country_code\":\"AC\"},"
    366     "    {\"country_code\":\"AD\"},"
    367     "    {\"country_code\":\"US\"}"
    368     "  ]";
    369 
    370 const char kRequiredLegalDocument[] =
    371     "  ,"
    372     "  \"required_legal_document\":"
    373     "  ["
    374     "    {"
    375     "      \"legal_document_id\":\"doc_id\","
    376     "      \"display_name\":\"display_name\""
    377     "    }"
    378     "  ]";
    379 
    380 const char kCloseJson[] = "}";
    381 
    382 }  // anonymous namespace
    383 
    384 namespace autofill {
    385 namespace wallet {
    386 
    387 class WalletItemsTest : public testing::Test {
    388  public:
    389   WalletItemsTest() {}
    390  protected:
    391   void SetUpDictionary(const std::string& json) {
    392     scoped_ptr<base::Value> value(base::JSONReader::Read(json));
    393     ASSERT_TRUE(value.get());
    394     ASSERT_TRUE(value->IsType(base::Value::TYPE_DICTIONARY));
    395     dict.reset(static_cast<base::DictionaryValue*>(value.release()));
    396   }
    397   scoped_ptr<base::DictionaryValue> dict;
    398 };
    399 
    400 TEST_F(WalletItemsTest, CreateMaskedInstrumentMissingStatus) {
    401   SetUpDictionary(kMaskedInstrumentMissingStatus);
    402   EXPECT_EQ(NULL,
    403             WalletItems::MaskedInstrument::CreateMaskedInstrument(*dict).get());
    404 }
    405 
    406 TEST_F(WalletItemsTest, CreateMaskedInstrumentMissingType) {
    407   SetUpDictionary(kMaskedInstrumentMissingType);
    408   EXPECT_EQ(NULL,
    409             WalletItems::MaskedInstrument::CreateMaskedInstrument(*dict).get());
    410 }
    411 
    412 TEST_F(WalletItemsTest, CreateMaskedInstrumentMissingLastFourDigits) {
    413   SetUpDictionary(kMaskedInstrumentMissingLastFourDigits);
    414   EXPECT_EQ(NULL,
    415             WalletItems::MaskedInstrument::CreateMaskedInstrument(*dict).get());
    416 }
    417 
    418 TEST_F(WalletItemsTest, CreateMaskedInstrumentMissingAddress) {
    419   SetUpDictionary(kMaskedInstrumentMissingAddress);
    420   EXPECT_EQ(NULL,
    421             WalletItems::MaskedInstrument::CreateMaskedInstrument(*dict).get());
    422 }
    423 
    424 TEST_F(WalletItemsTest, CreateMaskedInstrumentMalformedAddress) {
    425   SetUpDictionary(kMaskedInstrumentMalformedAddress);
    426   EXPECT_EQ(NULL,
    427             WalletItems::MaskedInstrument::CreateMaskedInstrument(*dict).get());
    428 }
    429 
    430 TEST_F(WalletItemsTest, CreateMaskedInstrumentMissingObjectId) {
    431   SetUpDictionary(kMaskedInstrumentMissingObjectId);
    432   EXPECT_EQ(NULL,
    433             WalletItems::MaskedInstrument::CreateMaskedInstrument(*dict).get());
    434 }
    435 
    436 TEST_F(WalletItemsTest, CreateMaskedInstrument) {
    437   SetUpDictionary(kMaskedInstrument);
    438   scoped_ptr<Address> address(
    439       new Address("US",
    440                   ASCIIToUTF16("name"),
    441                   StreetAddress("address1", "address2"),
    442                   ASCIIToUTF16("city"),
    443                   ASCIIToUTF16("burough"),
    444                   ASCIIToUTF16("state"),
    445                   ASCIIToUTF16("postal_code"),
    446                   ASCIIToUTF16("sorting_code"),
    447                   ASCIIToUTF16("phone_number"),
    448                   std::string(),
    449                   "language_code"));
    450   WalletItems::MaskedInstrument masked_instrument(
    451       ASCIIToUTF16("descriptive_name"),
    452       WalletItems::MaskedInstrument::VISA,
    453       ASCIIToUTF16("last_four_digits"),
    454       12,
    455       2012,
    456       address.Pass(),
    457       WalletItems::MaskedInstrument::VALID,
    458       "object_id");
    459   EXPECT_EQ(masked_instrument,
    460             *WalletItems::MaskedInstrument::CreateMaskedInstrument(*dict));
    461 }
    462 
    463 TEST_F(WalletItemsTest, CreateLegalDocumentMissingDocId) {
    464   SetUpDictionary(kLegalDocumentMissingDocumentId);
    465   EXPECT_EQ(NULL, WalletItems::LegalDocument::CreateLegalDocument(*dict).get());
    466 }
    467 
    468 TEST_F(WalletItemsTest, CreateLegalDocumentMissingDisplayName) {
    469   SetUpDictionary(kLegalDocumentMissingDisplayName);
    470   EXPECT_EQ(NULL, WalletItems::LegalDocument::CreateLegalDocument(*dict).get());
    471 }
    472 
    473 TEST_F(WalletItemsTest, CreateLegalDocument) {
    474   SetUpDictionary(kLegalDocument);
    475   WalletItems::LegalDocument expected("doc_id", ASCIIToUTF16("display_name"));
    476   EXPECT_EQ(expected,
    477             *WalletItems::LegalDocument::CreateLegalDocument(*dict));
    478 }
    479 
    480 TEST_F(WalletItemsTest, LegalDocumentUrl) {
    481   WalletItems::LegalDocument legal_doc("doc_id", ASCIIToUTF16("display_name"));
    482   EXPECT_EQ("https://wallet.google.com/legaldocument?docId=doc_id",
    483             legal_doc.url().spec());
    484 }
    485 
    486 TEST_F(WalletItemsTest, LegalDocumentEmptyId) {
    487   WalletItems::LegalDocument legal_doc(GURL("http://example.com"),
    488                                        ASCIIToUTF16("display_name"));
    489   EXPECT_TRUE(legal_doc.id().empty());
    490 }
    491 
    492 TEST_F(WalletItemsTest, CreateWalletItemsWithRequiredActions) {
    493   SetUpDictionary(kWalletItemsWithRequiredActions);
    494 
    495   std::vector<RequiredAction> required_actions;
    496   required_actions.push_back(SETUP_WALLET);
    497   required_actions.push_back(CHOOSE_ANOTHER_INSTRUMENT_OR_ADDRESS);
    498   required_actions.push_back(ACCEPT_TOS);
    499   required_actions.push_back(GAIA_AUTH);
    500   required_actions.push_back(UPDATE_EXPIRATION_DATE);
    501   required_actions.push_back(UPGRADE_MIN_ADDRESS);
    502   required_actions.push_back(PASSIVE_GAIA_AUTH);
    503   required_actions.push_back(REQUIRE_PHONE_NUMBER);
    504 
    505   WalletItems expected(required_actions,
    506                        std::string(),
    507                        std::string(),
    508                        std::string(),
    509                        AMEX_DISALLOWED);
    510   EXPECT_EQ(expected, *WalletItems::CreateWalletItems(*dict));
    511 
    512   ASSERT_FALSE(required_actions.empty());
    513   required_actions.pop_back();
    514   WalletItems different_required_actions(required_actions,
    515                                          std::string(),
    516                                          std::string(),
    517                                          std::string(),
    518                                          AMEX_DISALLOWED);
    519   EXPECT_NE(expected, different_required_actions);
    520 }
    521 
    522 TEST_F(WalletItemsTest, CreateWalletItemsWithInvalidRequiredActions) {
    523   SetUpDictionary(kWalletItemsWithInvalidRequiredActions);
    524   EXPECT_EQ(NULL, WalletItems::CreateWalletItems(*dict).get());
    525 }
    526 
    527 TEST_F(WalletItemsTest, CreateWalletItemsMissingGoogleTransactionId) {
    528   SetUpDictionary(kWalletItemsMissingGoogleTransactionId);
    529   EXPECT_EQ(NULL, WalletItems::CreateWalletItems(*dict).get());
    530 }
    531 
    532 TEST_F(WalletItemsTest, CreateWalletItemsMissingAmexDisallowed) {
    533   SetUpDictionary(std::string(kWalletItems) + std::string(kCloseJson));
    534   EXPECT_TRUE(dict->Remove("amex_disallowed", NULL));
    535   base::string16 amex_number = ASCIIToUTF16("378282246310005");
    536   base::string16 message;
    537   EXPECT_FALSE(WalletItems::CreateWalletItems(*dict)->SupportsCard(amex_number,
    538                                                                    &message));
    539   EXPECT_FALSE(message.empty());
    540 }
    541 
    542 TEST_F(WalletItemsTest, CreateWalletItems) {
    543   SetUpDictionary(std::string(kWalletItems) + std::string(kCloseJson));
    544   std::vector<RequiredAction> required_actions;
    545   WalletItems expected(required_actions,
    546                        "google_transaction_id",
    547                        "default_instrument_id",
    548                        "default_address_id",
    549                        AMEX_DISALLOWED);
    550 
    551   scoped_ptr<GaiaAccount> user1(GaiaAccount::CreateForTesting(
    552       "user (at) chromium.org",
    553       "123456789",
    554       0,
    555       true));
    556   expected.AddAccount(user1.Pass());
    557   scoped_ptr<GaiaAccount> user2(GaiaAccount::CreateForTesting(
    558       "user2 (at) chromium.org",
    559       "obfuscated_gaia_id",
    560       1,
    561       false));
    562   expected.AddAccount(user2.Pass());
    563   EXPECT_EQ("123456789", expected.ObfuscatedGaiaId());
    564 
    565   scoped_ptr<Address> billing_address(
    566       new Address("US",
    567                   ASCIIToUTF16("name"),
    568                   StreetAddress("address1", "address2"),
    569                   ASCIIToUTF16("city"),
    570                   ASCIIToUTF16("burough"),
    571                   ASCIIToUTF16("state"),
    572                   ASCIIToUTF16("postal_code"),
    573                   ASCIIToUTF16("sorting_code"),
    574                   ASCIIToUTF16("phone_number"),
    575                   std::string(),
    576                   "language_code"));
    577   scoped_ptr<WalletItems::MaskedInstrument> masked_instrument(
    578       new WalletItems::MaskedInstrument(ASCIIToUTF16("descriptive_name"),
    579                                         WalletItems::MaskedInstrument::VISA,
    580                                         ASCIIToUTF16("last_four_digits"),
    581                                         12,
    582                                         2012,
    583                                         billing_address.Pass(),
    584                                         WalletItems::MaskedInstrument::VALID,
    585                                         "object_id"));
    586   expected.AddInstrument(masked_instrument.Pass());
    587 
    588   scoped_ptr<Address> shipping_address(
    589       new Address("US",
    590                   ASCIIToUTF16("recipient_name"),
    591                   StreetAddress("address_line_1", "address_line_2"),
    592                   ASCIIToUTF16("locality_name"),
    593                   ASCIIToUTF16("dependent_locality_name"),
    594                   ASCIIToUTF16("administrative_area_name"),
    595                   ASCIIToUTF16("postal_code_number"),
    596                   ASCIIToUTF16("sorting_code"),
    597                   ASCIIToUTF16("phone_number"),
    598                   "id",
    599                   "language_code"));
    600   expected.AddAddress(shipping_address.Pass());
    601 
    602   expected.AddAllowedShippingCountry("AC");
    603   expected.AddAllowedShippingCountry("AD");
    604   expected.AddAllowedShippingCountry("US");
    605 
    606   EXPECT_EQ(expected, *WalletItems::CreateWalletItems(*dict));
    607 
    608   // Now try with a legal document as well.
    609   SetUpDictionary(std::string(kWalletItems) +
    610                   std::string(kRequiredLegalDocument) +
    611                   std::string(kCloseJson));
    612   scoped_ptr<WalletItems::LegalDocument> legal_document(
    613       new WalletItems::LegalDocument("doc_id",
    614                                      ASCIIToUTF16("display_name")));
    615   expected.AddLegalDocument(legal_document.Pass());
    616   expected.AddLegalDocument(
    617       WalletItems::LegalDocument::CreatePrivacyPolicyDocument());
    618 
    619   EXPECT_EQ(expected, *WalletItems::CreateWalletItems(*dict));
    620 }
    621 
    622 }  // namespace wallet
    623 }  // namespace autofill
    624