1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
|
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "components/webauthn/ios/passkey_tab_helper.h"
#import "base/base64url.h"
#import "base/test/metrics/histogram_tester.h"
#import "components/webauthn/core/browser/passkey_model.h"
#import "components/webauthn/core/browser/test_passkey_model.h"
#import "ios/web/public/test/fakes/fake_web_state.h"
#import "ios/web/public/test/web_task_environment.h"
#import "testing/platform_test.h"
namespace {
constexpr char kCredentialId[] = "credential_id";
constexpr char kRpId[] = "example.com";
constexpr char kWebAuthenticationIOSContentAreaEventHistogram[] =
"WebAuthentication.IOS.ContentAreaEvent";
} // namespace
class PasskeyTabHelperTest : public PlatformTest {
public:
PasskeyTabHelperTest() {
PasskeyTabHelper::CreateForWebState(&fake_web_state_, passkey_model_.get());
}
protected:
PasskeyTabHelper* passkey_tab_helper() {
return PasskeyTabHelper::FromWebState(&fake_web_state_);
}
web::WebTaskEnvironment task_environment_;
base::HistogramTester histogram_tester_;
std::unique_ptr<webauthn::PasskeyModel> passkey_model_ =
std::make_unique<webauthn::TestPasskeyModel>();
web::FakeWebState fake_web_state_;
};
TEST_F(PasskeyTabHelperTest, LogsEventFromGetRequestedString) {
passkey_tab_helper()->LogEventFromString("getRequested");
constexpr int kGetRequestedBucket = 0;
histogram_tester_.ExpectUniqueSample(
kWebAuthenticationIOSContentAreaEventHistogram, kGetRequestedBucket,
/*count=*/1);
}
TEST_F(PasskeyTabHelperTest, LogsEventFromCreateRequestedString) {
passkey_tab_helper()->LogEventFromString("createRequested");
constexpr int kCreateRequestedBucket = 1;
histogram_tester_.ExpectUniqueSample(
kWebAuthenticationIOSContentAreaEventHistogram, kCreateRequestedBucket,
/*count=*/1);
}
TEST_F(PasskeyTabHelperTest, LogsGetResolvedEventGpmPasskey) {
sync_pb::WebauthnCredentialSpecifics passkey;
passkey.set_credential_id(kCredentialId);
passkey.set_rp_id(kRpId);
passkey_model_->AddNewPasskeyForTesting(std::move(passkey));
std::string credential_id_base64url_encoded;
base::Base64UrlEncode(kCredentialId,
base::Base64UrlEncodePolicy::INCLUDE_PADDING,
&credential_id_base64url_encoded);
passkey_tab_helper()->HandleGetResolvedEvent(credential_id_base64url_encoded,
kRpId);
constexpr int kGetResolvedGpmBucket = 2;
histogram_tester_.ExpectUniqueSample(
kWebAuthenticationIOSContentAreaEventHistogram, kGetResolvedGpmBucket,
/*count=*/1);
}
TEST_F(PasskeyTabHelperTest, LogsGetResolvedEventNonGpmPasskey) {
std::string credential_id_base64url_encoded;
base::Base64UrlEncode(kCredentialId,
base::Base64UrlEncodePolicy::INCLUDE_PADDING,
&credential_id_base64url_encoded);
passkey_tab_helper()->HandleGetResolvedEvent(credential_id_base64url_encoded,
kRpId);
constexpr int kGetResolvedNonGpmBucket = 3;
histogram_tester_.ExpectUniqueSample(
kWebAuthenticationIOSContentAreaEventHistogram, kGetResolvedNonGpmBucket,
/*count=*/1);
}
TEST_F(PasskeyTabHelperTest, LogsEventFromCreateResolvedGpmString) {
passkey_tab_helper()->LogEventFromString("createResolvedGpm");
constexpr int kCreateRequestedBucket = 4;
histogram_tester_.ExpectUniqueSample(
kWebAuthenticationIOSContentAreaEventHistogram, kCreateRequestedBucket,
/*count=*/1);
}
TEST_F(PasskeyTabHelperTest, LogsEventFromCreateResolvedNonGpmString) {
passkey_tab_helper()->LogEventFromString("createResolvedNonGpm");
constexpr int kCreateRequestedBucket = 5;
histogram_tester_.ExpectUniqueSample(
kWebAuthenticationIOSContentAreaEventHistogram, kCreateRequestedBucket,
/*count=*/1);
}
|