blob: 6a78ab69e75cae7a5c75d4b61dee6f20075f7a04 [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/payment_method_manifest_table.h"
#include <stdint.h>
#include <memory>
#include <string>
#include <utility>
#include <vector>
#include "base/containers/contains.h"
#include "base/files/file_path.h"
#include "base/files/scoped_temp_dir.h"
#include "base/strings/utf_string_conversions.h"
#include "base/test/scoped_feature_list.h"
#include "base/time/time.h"
#include "components/payments/core/secure_payment_confirmation_credential.h"
#include "components/webdata/common/web_database.h"
#include "content/public/common/content_features.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace payments {
namespace {
// Creates one identifier (for a credential or user) for testing.
std::vector<uint8_t> CreateIdentifier(uint8_t first_byte) {
std::vector<uint8_t> identifier;
identifier.push_back(first_byte++);
identifier.push_back(first_byte++);
identifier.push_back(first_byte++);
identifier.push_back(first_byte);
return identifier;
}
// Creates one credential identifier for testing. Equivalent to calling
// CreateIdentifier, used for test readability.
std::vector<uint8_t> CreateCredentialId(uint8_t first_byte = 0) {
return CreateIdentifier(first_byte);
}
// Creates a list of one credential identifier for testing.
std::vector<std::vector<uint8_t>> CreateCredentialIdList(
uint8_t first_byte = 0) {
std::vector<std::vector<uint8_t>> credential_ids;
credential_ids.push_back(CreateCredentialId(first_byte));
return credential_ids;
}
// Creates one user identifier for testing. Equivalent to calling
// CreateIdentifier, used for test readability.
std::vector<uint8_t> CreateUserId(uint8_t first_byte = 4) {
return CreateIdentifier(first_byte);
}
void ExpectOneValidCredential(
const std::vector<uint8_t>& credential_id,
const std::string& relying_party_id,
const std::vector<uint8_t>& user_id,
std::vector<std::unique_ptr<SecurePaymentConfirmationCredential>>
credentials) {
ASSERT_EQ(1U, credentials.size());
ASSERT_NE(nullptr, credentials.back());
ASSERT_TRUE(credentials.back()->IsValidNewCredential());
EXPECT_EQ(credential_id, credentials.back()->credential_id);
EXPECT_EQ(relying_party_id, credentials.back()->relying_party_id);
EXPECT_EQ(user_id, credentials.back()->user_id);
}
class PaymentMethodManifestTableTest : public testing::Test {
public:
PaymentMethodManifestTableTest() = default;
~PaymentMethodManifestTableTest() override = default;
PaymentMethodManifestTableTest(const PaymentMethodManifestTableTest& other) =
delete;
PaymentMethodManifestTableTest& operator=(
const PaymentMethodManifestTableTest& other) = delete;
protected:
void SetUp() override {
ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
file_ = temp_dir_.GetPath().AppendASCII("TestWebDatabase");
table_ = std::make_unique<PaymentMethodManifestTable>();
db_ = std::make_unique<WebDatabase>();
db_->AddTable(table_.get());
ASSERT_EQ(sql::INIT_OK, db_->Init(file_));
}
base::FilePath file_;
base::ScopedTempDir temp_dir_;
std::unique_ptr<PaymentMethodManifestTable> table_;
std::unique_ptr<WebDatabase> db_;
};
TEST_F(PaymentMethodManifestTableTest, GetNonExistManifest) {
PaymentMethodManifestTable* payment_method_manifest_table =
PaymentMethodManifestTable::FromWebDatabase(db_.get());
std::vector<std::string> web_app_ids =
payment_method_manifest_table->GetManifest("https://bobpay.com");
ASSERT_TRUE(web_app_ids.empty());
}
TEST_F(PaymentMethodManifestTableTest, AddAndGetSingleManifest) {
PaymentMethodManifestTable* payment_method_manifest_table =
PaymentMethodManifestTable::FromWebDatabase(db_.get());
std::string method_name("https://bobpay.com");
std::vector<std::string> web_app_ids = {"com.bobpay"};
ASSERT_TRUE(
payment_method_manifest_table->AddManifest(method_name, web_app_ids));
std::vector<std::string> retrieved_web_app_ids =
payment_method_manifest_table->GetManifest(method_name);
ASSERT_EQ(web_app_ids.size(), retrieved_web_app_ids.size());
ASSERT_EQ(web_app_ids[0], retrieved_web_app_ids[0]);
web_app_ids.emplace_back("com.alicepay");
ASSERT_TRUE(
payment_method_manifest_table->AddManifest(method_name, web_app_ids));
retrieved_web_app_ids =
payment_method_manifest_table->GetManifest("https://bobpay.com");
ASSERT_EQ(web_app_ids.size(), retrieved_web_app_ids.size());
ASSERT_TRUE(base::Contains(retrieved_web_app_ids, web_app_ids[0]));
ASSERT_TRUE(base::Contains(retrieved_web_app_ids, web_app_ids[1]));
}
TEST_F(PaymentMethodManifestTableTest, AddAndGetMultipleManifest) {
PaymentMethodManifestTable* payment_method_manifest_table =
PaymentMethodManifestTable::FromWebDatabase(db_.get());
std::string method_name_1("https://bobpay.com");
std::string method_name_2("https://alicepay.com");
std::vector<std::string> web_app_ids = {"com.bobpay"};
ASSERT_TRUE(
payment_method_manifest_table->AddManifest(method_name_1, web_app_ids));
ASSERT_TRUE(
payment_method_manifest_table->AddManifest(method_name_2, web_app_ids));
std::vector<std::string> bobpay_web_app_ids =
payment_method_manifest_table->GetManifest(method_name_1);
ASSERT_EQ(web_app_ids.size(), bobpay_web_app_ids.size());
ASSERT_EQ(web_app_ids[0], bobpay_web_app_ids[0]);
std::vector<std::string> alicepay_web_app_ids =
payment_method_manifest_table->GetManifest(method_name_2);
ASSERT_EQ(web_app_ids.size(), alicepay_web_app_ids.size());
ASSERT_EQ(web_app_ids[0], alicepay_web_app_ids[0]);
web_app_ids.emplace_back("com.alicepay");
ASSERT_TRUE(
payment_method_manifest_table->AddManifest(method_name_1, web_app_ids));
ASSERT_TRUE(
payment_method_manifest_table->AddManifest(method_name_2, web_app_ids));
bobpay_web_app_ids =
payment_method_manifest_table->GetManifest(method_name_1);
ASSERT_EQ(web_app_ids.size(), bobpay_web_app_ids.size());
ASSERT_TRUE(base::Contains(bobpay_web_app_ids, web_app_ids[0]));
ASSERT_TRUE(base::Contains(bobpay_web_app_ids, web_app_ids[1]));
alicepay_web_app_ids =
payment_method_manifest_table->GetManifest(method_name_1);
ASSERT_EQ(web_app_ids.size(), alicepay_web_app_ids.size());
ASSERT_TRUE(base::Contains(alicepay_web_app_ids, web_app_ids[0]));
ASSERT_TRUE(base::Contains(alicepay_web_app_ids, web_app_ids[1]));
}
TEST_F(PaymentMethodManifestTableTest, GetNonExistingCredential) {
PaymentMethodManifestTable* table =
PaymentMethodManifestTable::FromWebDatabase(db_.get());
std::string relying_party_id("relying-party.example");
EXPECT_TRUE(table
->GetSecurePaymentConfirmationCredentials(
CreateCredentialIdList(), relying_party_id)
.empty());
EXPECT_TRUE(
table->GetSecurePaymentConfirmationCredentials({}, relying_party_id)
.empty());
EXPECT_TRUE(table
->GetSecurePaymentConfirmationCredentials(
{std::vector<uint8_t>()}, relying_party_id)
.empty());
}
TEST_F(PaymentMethodManifestTableTest, AddAndGetOneValidCredential) {
PaymentMethodManifestTable* table =
PaymentMethodManifestTable::FromWebDatabase(db_.get());
std::string relying_party_id("relying-party.example");
EXPECT_TRUE(table->AddSecurePaymentConfirmationCredential(
SecurePaymentConfirmationCredential(CreateCredentialId(),
relying_party_id, CreateUserId())));
auto credentials = table->GetSecurePaymentConfirmationCredentials(
CreateCredentialIdList(), relying_party_id);
ExpectOneValidCredential({0, 1, 2, 3}, relying_party_id, {4, 5, 6, 7},
std::move(credentials));
EXPECT_TRUE(
table->GetSecurePaymentConfirmationCredentials({}, relying_party_id)
.empty());
EXPECT_TRUE(table
->GetSecurePaymentConfirmationCredentials(
{std::vector<uint8_t>()}, relying_party_id)
.empty());
}
TEST_F(PaymentMethodManifestTableTest, AddingInvalidCredentialReturnsFalse) {
PaymentMethodManifestTable* table =
PaymentMethodManifestTable::FromWebDatabase(db_.get());
// An empty credential.
EXPECT_FALSE(table->AddSecurePaymentConfirmationCredential(
SecurePaymentConfirmationCredential(
/*credential_id=*/{}, "relying-party.example", CreateUserId())));
// Empty relying party identifier.
EXPECT_FALSE(table->AddSecurePaymentConfirmationCredential(
SecurePaymentConfirmationCredential(CreateCredentialId(),
/*relying_party_id=*/"",
CreateUserId())));
// Empty user id.
EXPECT_FALSE(table->AddSecurePaymentConfirmationCredential(
SecurePaymentConfirmationCredential(CreateCredentialId(),
"relying-party.example",
/*user_id=*/{})));
}
TEST_F(PaymentMethodManifestTableTest, UpdatingCredentialReturnsTrue) {
PaymentMethodManifestTable* table =
PaymentMethodManifestTable::FromWebDatabase(db_.get());
std::string relying_party_id("relying-party.example");
EXPECT_TRUE(table->AddSecurePaymentConfirmationCredential(
SecurePaymentConfirmationCredential(CreateCredentialId(/*first_byte=*/0),
relying_party_id,
CreateUserId(/*first_byte=*/4))));
EXPECT_TRUE(table->AddSecurePaymentConfirmationCredential(
SecurePaymentConfirmationCredential(CreateCredentialId(/*first_byte=*/0),
relying_party_id,
CreateUserId(/*first_byte=*/4))));
auto credentials = table->GetSecurePaymentConfirmationCredentials(
CreateCredentialIdList(/*first_byte=*/0), relying_party_id);
ExpectOneValidCredential({0, 1, 2, 3}, relying_party_id, {4, 5, 6, 7},
std::move(credentials));
}
TEST_F(PaymentMethodManifestTableTest,
DifferentRelyingPartiesCannotUseSameCredentialIdentifier) {
PaymentMethodManifestTable* table =
PaymentMethodManifestTable::FromWebDatabase(db_.get());
EXPECT_TRUE(table->AddSecurePaymentConfirmationCredential(
SecurePaymentConfirmationCredential(CreateCredentialId(/*first_byte=*/0),
"relying-party-1.example",
CreateUserId(/*first_byte=*/4))));
EXPECT_FALSE(table->AddSecurePaymentConfirmationCredential(
SecurePaymentConfirmationCredential(CreateCredentialId(/*first_byte=*/0),
"relying-party-2.example",
CreateUserId(/*first_byte=*/5))));
auto credentials = table->GetSecurePaymentConfirmationCredentials(
CreateCredentialIdList(/*first_byte=*/0), "relying-party-1.example");
ExpectOneValidCredential({0, 1, 2, 3}, "relying-party-1.example",
{4, 5, 6, 7}, std::move(credentials));
}
TEST_F(PaymentMethodManifestTableTest, RelyingPartyCanHaveMultipleCredentials) {
PaymentMethodManifestTable* table =
PaymentMethodManifestTable::FromWebDatabase(db_.get());
std::string relying_party_id("relying-party.example");
EXPECT_TRUE(table->AddSecurePaymentConfirmationCredential(
SecurePaymentConfirmationCredential(CreateCredentialId(/*first_byte=*/0),
relying_party_id,
CreateUserId(/*first_byte=*/4))));
EXPECT_TRUE(table->AddSecurePaymentConfirmationCredential(
SecurePaymentConfirmationCredential(CreateCredentialId(/*first_byte=*/4),
relying_party_id,
CreateUserId(/*first_byte=*/8))));
auto credentials = table->GetSecurePaymentConfirmationCredentials(
CreateCredentialIdList(/*first_byte=*/0), relying_party_id);
ExpectOneValidCredential({0, 1, 2, 3}, relying_party_id, {4, 5, 6, 7},
std::move(credentials));
credentials = table->GetSecurePaymentConfirmationCredentials(
CreateCredentialIdList(/*first_byte=*/4), relying_party_id);
ExpectOneValidCredential({4, 5, 6, 7}, relying_party_id, {8, 9, 10, 11},
std::move(credentials));
std::vector<std::vector<uint8_t>> credential_ids;
credential_ids.push_back(CreateCredentialId(/*first_byte=*/0));
credential_ids.push_back(CreateCredentialId(/*first_byte=*/4));
credentials = table->GetSecurePaymentConfirmationCredentials(
std::move(credential_ids), relying_party_id);
ASSERT_EQ(2U, credentials.size());
ASSERT_NE(nullptr, credentials.front());
ASSERT_TRUE(credentials.front()->IsValidNewCredential());
std::vector<uint8_t> expected_credential_id = {0, 1, 2, 3};
EXPECT_EQ(expected_credential_id, credentials.front()->credential_id);
EXPECT_EQ("relying-party.example", credentials.front()->relying_party_id);
std::vector<uint8_t> expected_user_id = {4, 5, 6, 7};
EXPECT_EQ(expected_user_id, credentials.front()->user_id);
ASSERT_NE(nullptr, credentials.back());
ASSERT_TRUE(credentials.back()->IsValidNewCredential());
expected_credential_id = {4, 5, 6, 7};
EXPECT_EQ(expected_credential_id, credentials.back()->credential_id);
EXPECT_EQ("relying-party.example", credentials.back()->relying_party_id);
expected_user_id = {8, 9, 10, 11};
EXPECT_EQ(expected_user_id, credentials.back()->user_id);
}
TEST_F(PaymentMethodManifestTableTest,
SameRelyingPartyAndUserIdOverwritesCredential) {
PaymentMethodManifestTable* table =
PaymentMethodManifestTable::FromWebDatabase(db_.get());
std::string relying_party_id("relying-party.example");
EXPECT_TRUE(table->AddSecurePaymentConfirmationCredential(
SecurePaymentConfirmationCredential(CreateCredentialId(/*first_byte=*/0),
relying_party_id,
CreateUserId(/*first_byte=*/4))));
EXPECT_TRUE(table->AddSecurePaymentConfirmationCredential(
SecurePaymentConfirmationCredential(CreateCredentialId(/*first_byte=*/4),
relying_party_id,
CreateUserId(/*first_byte=*/4))));
EXPECT_TRUE(
table
->GetSecurePaymentConfirmationCredentials(
CreateCredentialIdList(/*first_byte=*/0), relying_party_id)
.empty());
auto credentials = table->GetSecurePaymentConfirmationCredentials(
CreateCredentialIdList(/*first_byte=*/4), relying_party_id);
ExpectOneValidCredential({4, 5, 6, 7}, relying_party_id, {4, 5, 6, 7},
std::move(credentials));
std::vector<std::vector<uint8_t>> credential_ids;
credential_ids.push_back(CreateCredentialId(/*first_byte=*/0));
credential_ids.push_back(CreateCredentialId(/*first_byte=*/4));
credentials = table->GetSecurePaymentConfirmationCredentials(
std::move(credential_ids), relying_party_id);
ASSERT_EQ(1U, credentials.size());
ASSERT_NE(nullptr, credentials.front());
ASSERT_TRUE(credentials.front()->IsValidNewCredential());
std::vector<uint8_t> expected_credential_id = {4, 5, 6, 7};
EXPECT_EQ(expected_credential_id, credentials.front()->credential_id);
EXPECT_EQ(relying_party_id, credentials.front()->relying_party_id);
std::vector<uint8_t> expected_user_id = {4, 5, 6, 7};
EXPECT_EQ(expected_user_id, credentials.front()->user_id);
}
TEST_F(PaymentMethodManifestTableTest, ClearCredentials) {
PaymentMethodManifestTable* table =
PaymentMethodManifestTable::FromWebDatabase(db_.get());
std::string relying_party_id("relying-party.example");
EXPECT_TRUE(table->AddSecurePaymentConfirmationCredential(
SecurePaymentConfirmationCredential(CreateCredentialId(/*first_byte=*/0),
relying_party_id,
CreateUserId(/*first_byte=*/4))));
EXPECT_TRUE(table->AddSecurePaymentConfirmationCredential(
SecurePaymentConfirmationCredential(CreateCredentialId(/*first_byte=*/1),
relying_party_id,
CreateUserId(/*first_byte=*/8))));
table->ClearSecurePaymentConfirmationCredentials(
base::Time::Now() - base::Minutes(1),
base::Time::Now() + base::Minutes(1));
std::vector<std::vector<uint8_t>> credential_ids;
credential_ids.push_back(CreateCredentialId(/*first_byte=*/0));
credential_ids.push_back(CreateCredentialId(/*first_byte=*/1));
EXPECT_TRUE(table
->GetSecurePaymentConfirmationCredentials(
std::move(credential_ids), relying_party_id)
.empty());
}
TEST_F(PaymentMethodManifestTableTest,
ClearCredentials_NotDeleteOutOfTimeRange) {
PaymentMethodManifestTable* table =
PaymentMethodManifestTable::FromWebDatabase(db_.get());
std::string relying_party_id("relying-party.example");
EXPECT_TRUE(table->AddSecurePaymentConfirmationCredential(
SecurePaymentConfirmationCredential(CreateCredentialId(/*first_byte=*/0),
relying_party_id,
CreateUserId(/*first_byte=*/4))));
EXPECT_TRUE(table->AddSecurePaymentConfirmationCredential(
SecurePaymentConfirmationCredential(CreateCredentialId(/*first_byte=*/1),
relying_party_id,
CreateUserId(/*first_byte=*/8))));
table->ClearSecurePaymentConfirmationCredentials(
base::Time(), base::Time::Now() - base::Minutes(1));
std::vector<std::vector<uint8_t>> credential_ids;
credential_ids.push_back(CreateCredentialId(/*first_byte=*/0));
credential_ids.push_back(CreateCredentialId(/*first_byte=*/1));
EXPECT_EQ(2u, table
->GetSecurePaymentConfirmationCredentials(
std::move(credential_ids), std::move(relying_party_id))
.size());
}
TEST_F(PaymentMethodManifestTableTest,
CredentialTableAddDateCreatedAndUserIdColumn) {
PaymentMethodManifestTable* payment_method_manifest_table =
PaymentMethodManifestTable::FromWebDatabase(db_.get());
EXPECT_TRUE(payment_method_manifest_table->RazeForTest());
EXPECT_TRUE(payment_method_manifest_table->ExecuteForTest(
"CREATE TABLE IF NOT EXISTS secure_payment_confirmation_instrument ( "
"credential_id BLOB NOT NULL PRIMARY KEY, "
"relying_party_id VARCHAR NOT NULL, "
"label VARCHAR NOT NULL, "
"icon BLOB NOT NULL)"));
EXPECT_FALSE(payment_method_manifest_table->DoesColumnExistForTest(
"secure_payment_confirmation_instrument", "date_created"));
EXPECT_FALSE(payment_method_manifest_table->DoesColumnExistForTest(
"secure_payment_confirmation_instrument", "user_id"));
EXPECT_TRUE(payment_method_manifest_table->CreateTablesIfNecessary());
EXPECT_TRUE(payment_method_manifest_table->DoesColumnExistForTest(
"secure_payment_confirmation_instrument", "date_created"));
EXPECT_TRUE(payment_method_manifest_table->DoesColumnExistForTest(
"secure_payment_confirmation_instrument", "user_id"));
}
// Test migrating an existing credential table that didn't have the user ID.
TEST_F(PaymentMethodManifestTableTest, CredentialTableUserIdMigration) {
SecurePaymentConfirmationCredential valid_legacy_credential(
CreateCredentialId(/*first_byte=*/0), "relying-party.example", {});
EXPECT_TRUE(valid_legacy_credential.IsValid());
EXPECT_FALSE(valid_legacy_credential.IsValidNewCredential());
SecurePaymentConfirmationCredential valid_new_credential(
CreateCredentialId(/*first_byte=*/1), "relying-party.example",
CreateUserId());
EXPECT_TRUE(valid_new_credential.IsValid());
EXPECT_TRUE(valid_new_credential.IsValidNewCredential());
PaymentMethodManifestTable* payment_method_manifest_table =
PaymentMethodManifestTable::FromWebDatabase(db_.get());
EXPECT_TRUE(payment_method_manifest_table->RazeForTest());
// Create the SPC table as it would have been prior to storing the user ID.
EXPECT_TRUE(payment_method_manifest_table->ExecuteForTest(
"CREATE TABLE IF NOT EXISTS secure_payment_confirmation_instrument ( "
"credential_id BLOB NOT NULL PRIMARY KEY, "
"relying_party_id VARCHAR NOT NULL, "
"label VARCHAR NOT NULL, "
"icon BLOB NOT NULL, "
"date_created INTEGER NOT NULL DEFAULT 0)"));
// Insert the legacy credential.
EXPECT_TRUE(payment_method_manifest_table->ExecuteForTest(
("INSERT INTO secure_payment_confirmation_instrument "
"(credential_id, relying_party_id, label, icon, date_created) "
"VALUES ("
" x'00010203',"
" 'relying-party.example',"
" '',"
" x''," +
std::to_string(
base::Time::Now().ToDeltaSinceWindowsEpoch().InMicroseconds()) +
")")
.c_str()));
EXPECT_FALSE(payment_method_manifest_table->DoesColumnExistForTest(
"secure_payment_confirmation_instrument", "user_id"));
EXPECT_TRUE(payment_method_manifest_table->CreateTablesIfNecessary());
EXPECT_TRUE(payment_method_manifest_table->DoesColumnExistForTest(
"secure_payment_confirmation_instrument", "user_id"));
PaymentMethodManifestTable* table =
PaymentMethodManifestTable::FromWebDatabase(db_.get());
EXPECT_TRUE(
table->AddSecurePaymentConfirmationCredential(valid_new_credential));
std::vector<std::vector<uint8_t>> credential_ids;
credential_ids.push_back(CreateCredentialId(/*first_byte=*/0));
credential_ids.push_back(CreateCredentialId(/*first_byte=*/1));
EXPECT_EQ(2u, table
->GetSecurePaymentConfirmationCredentials(
std::move(credential_ids), "relying-party.example")
.size());
}
// Tests where there's additional test expectations when SPC API V3 is enabled.
// These are very similar to their equivalent PaymentMethodManifestTableTests,
// just with some additional expectations at the end of each test.
class PaymentMethodManifestTableSecurePaymentConfirmationAPIV3Test
: public PaymentMethodManifestTableTest {
public:
PaymentMethodManifestTableSecurePaymentConfirmationAPIV3Test() = default;
~PaymentMethodManifestTableSecurePaymentConfirmationAPIV3Test() override =
default;
PaymentMethodManifestTableSecurePaymentConfirmationAPIV3Test(
const PaymentMethodManifestTableSecurePaymentConfirmationAPIV3Test&
other) = delete;
PaymentMethodManifestTableSecurePaymentConfirmationAPIV3Test& operator=(
const PaymentMethodManifestTableSecurePaymentConfirmationAPIV3Test&
other) = delete;
protected:
void SetUp() override {
scoped_feature_list_.InitAndEnableFeature(
features::kSecurePaymentConfirmationAPIV3);
PaymentMethodManifestTableTest::SetUp();
}
base::test::ScopedFeatureList scoped_feature_list_;
};
TEST_F(PaymentMethodManifestTableSecurePaymentConfirmationAPIV3Test,
AddAndGetOneValidCredential) {
PaymentMethodManifestTable* table =
PaymentMethodManifestTable::FromWebDatabase(db_.get());
std::string relying_party_id("relying-party.example");
EXPECT_TRUE(table->AddSecurePaymentConfirmationCredential(
SecurePaymentConfirmationCredential(CreateCredentialId(),
relying_party_id, CreateUserId())));
auto credentials = table->GetSecurePaymentConfirmationCredentials(
CreateCredentialIdList(), relying_party_id);
ExpectOneValidCredential({0, 1, 2, 3}, relying_party_id, {4, 5, 6, 7},
std::move(credentials));
EXPECT_TRUE(
table->GetSecurePaymentConfirmationCredentials({}, relying_party_id)
.empty());
EXPECT_TRUE(table
->GetSecurePaymentConfirmationCredentials(
{std::vector<uint8_t>()}, relying_party_id)
.empty());
EXPECT_TRUE(table
->GetSecurePaymentConfirmationCredentials(
CreateCredentialIdList(), /*relying_party_id=*/"")
.empty());
}
TEST_F(PaymentMethodManifestTableSecurePaymentConfirmationAPIV3Test,
DifferentRelyingPartiesCannotUseSameCredentialIdentifier) {
PaymentMethodManifestTable* table =
PaymentMethodManifestTable::FromWebDatabase(db_.get());
EXPECT_TRUE(table->AddSecurePaymentConfirmationCredential(
SecurePaymentConfirmationCredential(CreateCredentialId(/*first_byte=*/0),
"relying-party-1.example",
CreateUserId(/*first_byte=*/4))));
EXPECT_FALSE(table->AddSecurePaymentConfirmationCredential(
SecurePaymentConfirmationCredential(CreateCredentialId(/*first_byte=*/0),
"relying-party-2.example",
CreateUserId(/*first_byte=*/5))));
auto credentials = table->GetSecurePaymentConfirmationCredentials(
CreateCredentialIdList(/*first_byte=*/0), "relying-party-1.example");
ExpectOneValidCredential({0, 1, 2, 3}, "relying-party-1.example",
{4, 5, 6, 7}, std::move(credentials));
EXPECT_TRUE(table
->GetSecurePaymentConfirmationCredentials(
CreateCredentialIdList(/*first_byte=*/0),
"relying-party-2.example")
.empty());
}
} // namespace
} // namespace payments