| // Copyright 2017 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include "components/payments/content/web_app_manifest_section_table.h" | 
 |  | 
 | #include <stdint.h> | 
 | #include <memory> | 
 |  | 
 | #include "base/files/file_path.h" | 
 | #include "base/files/scoped_temp_dir.h" | 
 | #include "components/webdata/common/web_database.h" | 
 | #include "sql/init_status.h" | 
 | #include "testing/gtest/include/gtest/gtest.h" | 
 |  | 
 | namespace payments { | 
 | namespace { | 
 |  | 
 | class WebAppManifestSectionTableTest : public testing::Test { | 
 |  public: | 
 |   WebAppManifestSectionTableTest() {} | 
 |   ~WebAppManifestSectionTableTest() override {} | 
 |  | 
 |  protected: | 
 |   void SetUp() override { | 
 |     ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); | 
 |     file_ = temp_dir_.GetPath().AppendASCII("TestWebDatabase"); | 
 |  | 
 |     table_ = std::make_unique<WebAppManifestSectionTable>(); | 
 |     db_ = std::make_unique<WebDatabase>(); | 
 |     db_->AddTable(table_.get()); | 
 |     ASSERT_EQ(sql::INIT_OK, db_->Init(file_)); | 
 |   } | 
 |  | 
 |   void TearDown() override {} | 
 |  | 
 |   std::vector<uint8_t> GenerateFingerprint(uint8_t seed) { | 
 |     std::vector<uint8_t> fingerprint; | 
 |     // Note that the fingerprint is calculated with SHA-256, so the length is | 
 |     // 32. | 
 |     for (size_t i = 0; i < 32U; i++) { | 
 |       fingerprint.push_back((seed + i) % 256U); | 
 |     } | 
 |     return fingerprint; | 
 |   } | 
 |  | 
 |   base::FilePath file_; | 
 |   base::ScopedTempDir temp_dir_; | 
 |   std::unique_ptr<WebAppManifestSectionTable> table_; | 
 |   std::unique_ptr<WebDatabase> db_; | 
 |  | 
 |  private: | 
 |   DISALLOW_COPY_AND_ASSIGN(WebAppManifestSectionTableTest); | 
 | }; | 
 |  | 
 | TEST_F(WebAppManifestSectionTableTest, GetNonExistManifest) { | 
 |   WebAppManifestSectionTable* web_app_manifest_section_table = | 
 |       WebAppManifestSectionTable::FromWebDatabase(db_.get()); | 
 |   std::vector<WebAppManifestSection> retrieved_manifest = | 
 |       web_app_manifest_section_table->GetWebAppManifest("https://bobpay.com"); | 
 |   ASSERT_TRUE(retrieved_manifest.empty()); | 
 | } | 
 |  | 
 | TEST_F(WebAppManifestSectionTableTest, AddAndGetManifest) { | 
 |   std::vector<uint8_t> fingerprint_one = GenerateFingerprint(1); | 
 |   std::vector<uint8_t> fingerprint_two = GenerateFingerprint(32); | 
 |  | 
 |   // create a bobpay web app manifest. | 
 |   std::vector<WebAppManifestSection> manifest; | 
 |   WebAppManifestSection section; | 
 |   section.id = "com.bobpay"; | 
 |   section.min_version = static_cast<int64_t>(1); | 
 |   section.fingerprints.push_back(fingerprint_one); | 
 |   section.fingerprints.push_back(fingerprint_two); | 
 |   manifest.emplace_back(std::move(section)); | 
 |  | 
 |   // Adds the manifest to the table. | 
 |   WebAppManifestSectionTable* web_app_manifest_section_table = | 
 |       WebAppManifestSectionTable::FromWebDatabase(db_.get()); | 
 |   ASSERT_TRUE(web_app_manifest_section_table->AddWebAppManifest(manifest)); | 
 |  | 
 |   // Gets and verifys the manifest. | 
 |   std::vector<WebAppManifestSection> retrieved_manifest = | 
 |       web_app_manifest_section_table->GetWebAppManifest("com.bobpay"); | 
 |   ASSERT_EQ(retrieved_manifest.size(), 1U); | 
 |   ASSERT_EQ(retrieved_manifest[0].id, "com.bobpay"); | 
 |   ASSERT_EQ(retrieved_manifest[0].min_version, 1); | 
 |   ASSERT_EQ(retrieved_manifest[0].fingerprints.size(), 2U); | 
 |  | 
 |   // Verify the two fingerprints. | 
 |   ASSERT_TRUE(retrieved_manifest[0].fingerprints[0] == fingerprint_one); | 
 |   ASSERT_TRUE(retrieved_manifest[0].fingerprints[1] == fingerprint_two); | 
 | } | 
 |  | 
 | TEST_F(WebAppManifestSectionTableTest, AddAndGetMultipleManifests) { | 
 |   std::vector<uint8_t> fingerprint_one = GenerateFingerprint(1); | 
 |   std::vector<uint8_t> fingerprint_two = GenerateFingerprint(32); | 
 |   std::vector<uint8_t> fingerprint_three = GenerateFingerprint(2); | 
 |   std::vector<uint8_t> fingerprint_four = GenerateFingerprint(30); | 
 |  | 
 |   WebAppManifestSectionTable* web_app_manifest_section_table = | 
 |       WebAppManifestSectionTable::FromWebDatabase(db_.get()); | 
 |  | 
 |   // Adds bobpay manifest to the table. | 
 |   std::vector<WebAppManifestSection> manifest_1; | 
 |   WebAppManifestSection manifest_1_section; | 
 |   manifest_1_section.id = "com.bobpay"; | 
 |   manifest_1_section.min_version = static_cast<int64_t>(1); | 
 |   // Adds two finger prints. | 
 |   manifest_1_section.fingerprints.push_back(fingerprint_one); | 
 |   manifest_1_section.fingerprints.push_back(fingerprint_two); | 
 |   manifest_1.emplace_back(std::move(manifest_1_section)); | 
 |   ASSERT_TRUE(web_app_manifest_section_table->AddWebAppManifest(manifest_1)); | 
 |  | 
 |   // Adds alicepay manifest to the table. | 
 |   std::vector<WebAppManifestSection> manifest_2; | 
 |   WebAppManifestSection manifest_2_section; | 
 |   manifest_2_section.id = "com.alicepay"; | 
 |   manifest_2_section.min_version = static_cast<int64_t>(2); | 
 |   // Adds two finger prints. | 
 |   manifest_2_section.fingerprints.push_back(fingerprint_three); | 
 |   manifest_2_section.fingerprints.push_back(fingerprint_four); | 
 |   manifest_2.emplace_back(std::move(manifest_2_section)); | 
 |   ASSERT_TRUE(web_app_manifest_section_table->AddWebAppManifest(manifest_2)); | 
 |  | 
 |   // Verifys bobpay manifest. | 
 |   std::vector<WebAppManifestSection> bobpay_manifest = | 
 |       web_app_manifest_section_table->GetWebAppManifest("com.bobpay"); | 
 |   ASSERT_EQ(bobpay_manifest.size(), 1U); | 
 |   ASSERT_EQ(bobpay_manifest[0].id, "com.bobpay"); | 
 |   ASSERT_EQ(bobpay_manifest[0].min_version, 1); | 
 |   ASSERT_EQ(bobpay_manifest[0].fingerprints.size(), 2U); | 
 |   ASSERT_TRUE(bobpay_manifest[0].fingerprints[0] == fingerprint_one); | 
 |   ASSERT_TRUE(bobpay_manifest[0].fingerprints[1] == fingerprint_two); | 
 |  | 
 |   // Verifys alicepay manifest. | 
 |   std::vector<WebAppManifestSection> alicepay_manifest = | 
 |       web_app_manifest_section_table->GetWebAppManifest("com.alicepay"); | 
 |   ASSERT_EQ(alicepay_manifest.size(), 1U); | 
 |   ASSERT_EQ(alicepay_manifest[0].id, "com.alicepay"); | 
 |   ASSERT_EQ(alicepay_manifest[0].min_version, 2); | 
 |   ASSERT_EQ(alicepay_manifest[0].fingerprints.size(), 2U); | 
 |   ASSERT_TRUE(alicepay_manifest[0].fingerprints[0] == fingerprint_three); | 
 |   ASSERT_TRUE(alicepay_manifest[0].fingerprints[1] == fingerprint_four); | 
 | } | 
 |  | 
 | // A single manifest can have multiple package names, e.g., one for developer | 
 | // and one for production version of the app. A package name is unique among all | 
 | // the apps on Android, so this means we can define multiple apps in a single | 
 | // manifest. | 
 | TEST_F(WebAppManifestSectionTableTest, AddAndGetSingleManifestWithTwoIds) { | 
 |   std::vector<uint8_t> fingerprint_dev = GenerateFingerprint(1); | 
 |   std::vector<uint8_t> fingerprint_prod = GenerateFingerprint(32); | 
 |  | 
 |   WebAppManifestSectionTable* web_app_manifest_section_table = | 
 |       WebAppManifestSectionTable::FromWebDatabase(db_.get()); | 
 |  | 
 |   std::vector<WebAppManifestSection> manifest; | 
 |   { | 
 |     // Adds dev version to the manifest. | 
 |     WebAppManifestSection manifest_dev_section; | 
 |     manifest_dev_section.id = "com.bobpay.dev"; | 
 |     manifest_dev_section.min_version = static_cast<int64_t>(2); | 
 |     manifest_dev_section.fingerprints.push_back(fingerprint_dev); | 
 |     manifest.emplace_back(std::move(manifest_dev_section)); | 
 |   } | 
 |   { | 
 |     // Adds prod version to the manifest. | 
 |     WebAppManifestSection manifest_prod_section; | 
 |     manifest_prod_section.id = "com.bobpay.prod"; | 
 |     manifest_prod_section.min_version = static_cast<int64_t>(1); | 
 |     manifest_prod_section.fingerprints.push_back(fingerprint_prod); | 
 |     manifest.emplace_back(std::move(manifest_prod_section)); | 
 |   } | 
 |   ASSERT_TRUE(web_app_manifest_section_table->AddWebAppManifest(manifest)); | 
 |  | 
 |   { | 
 |     // Verify the dev manifest. | 
 |     std::vector<WebAppManifestSection> actual_manifest = | 
 |         web_app_manifest_section_table->GetWebAppManifest("com.bobpay.dev"); | 
 |     ASSERT_EQ(actual_manifest.size(), 1U); | 
 |     EXPECT_EQ(actual_manifest[0].id, "com.bobpay.dev"); | 
 |     EXPECT_EQ(actual_manifest[0].min_version, 2); | 
 |     ASSERT_EQ(actual_manifest[0].fingerprints.size(), 1U); | 
 |     EXPECT_TRUE(actual_manifest[0].fingerprints[0] == fingerprint_dev); | 
 |   } | 
 |  | 
 |   { | 
 |     // Verify the prod manifest. | 
 |     std::vector<WebAppManifestSection> actual_manifest = | 
 |         web_app_manifest_section_table->GetWebAppManifest("com.bobpay.prod"); | 
 |     ASSERT_EQ(actual_manifest.size(), 1U); | 
 |     EXPECT_EQ(actual_manifest[0].id, "com.bobpay.prod"); | 
 |     EXPECT_EQ(actual_manifest[0].min_version, 1); | 
 |     ASSERT_EQ(actual_manifest[0].fingerprints.size(), 1U); | 
 |     EXPECT_TRUE(actual_manifest[0].fingerprints[0] == fingerprint_prod); | 
 |   } | 
 | } | 
 |  | 
 | }  // namespace | 
 |  | 
 | }  // namespace payments |