| // 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 |