blob: 80a5e8ead2e6929763c7bf8a09c45d261917adfa [file] [log] [blame]
// 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