Commit f9a2e454 authored by Roman Sorokin's avatar Roman Sorokin Committed by Chromium LUCI CQ

Report fingerprint scan results

Bug: 1100942
Change-Id: Idf4c0d44b85614c592bd333b0ec9410360b1cb31
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2560507
Commit-Queue: Roman Sorokin [CET] <rsorokin@chromium.org>
Reviewed-by: default avatarMark Pearson <mpearson@chromium.org>
Reviewed-by: default avatarRoman Aleksandrov <raleksandrov@google.com>
Reviewed-by: default avatarJoe Mason <joenotcharles@chromium.org>
Cr-Commit-Position: refs/heads/master@{#833273}
parent cdeab1fc
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#include "chrome/browser/chromeos/login/lock/screen_locker.h" #include "chrome/browser/chromeos/login/lock/screen_locker.h"
#include "base/test/metrics/histogram_tester.h"
#include "base/test/simple_test_clock.h" #include "base/test/simple_test_clock.h"
#include "base/test/simple_test_tick_clock.h" #include "base/test/simple_test_tick_clock.h"
#include "chrome/browser/chromeos/login/lock/screen_locker_tester.h" #include "chrome/browser/chromeos/login/lock/screen_locker_tester.h"
...@@ -21,6 +22,7 @@ ...@@ -21,6 +22,7 @@
#include "components/session_manager/core/session_manager.h" #include "components/session_manager/core/session_manager.h"
#include "components/user_manager/user_names.h" #include "components/user_manager/user_names.h"
#include "content/public/test/browser_test.h" #include "content/public/test/browser_test.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
#include "ui/compositor/scoped_animation_duration_scale_mode.h" #include "ui/compositor/scoped_animation_duration_scale_mode.h"
...@@ -245,4 +247,45 @@ IN_PROC_BROWSER_TEST_F(InProcessBrowserTest, FingerprintRecordsGone) { ...@@ -245,4 +247,45 @@ IN_PROC_BROWSER_TEST_F(InProcessBrowserTest, FingerprintRecordsGone) {
profile->GetPrefs()->GetInteger(prefs::kQuickUnlockFingerprintRecord), 0); profile->GetPrefs()->GetInteger(prefs::kQuickUnlockFingerprintRecord), 0);
} }
IN_PROC_BROWSER_TEST_F(InProcessBrowserTest, FingerprintScanResult) {
base::HistogramTester histogram_tester;
// Simulate fingerprint enrollment.
FakeBiodClient::Get()->StartEnrollSession(
"test-user", std::string(),
base::BindOnce([](const dbus::ObjectPath& result) {}));
FakeBiodClient::Get()->SendEnrollScanDone(
kFingerprint, biod::SCAN_RESULT_TOO_SLOW, false /* is_complete */,
-1 /* percent_complete */);
FakeBiodClient::Get()->SendEnrollScanDone(
kFingerprint, biod::SCAN_RESULT_SUCCESS, true /* is_complete */,
100 /* percent_complete */);
// Simulate fingerprint authentication.
FakeBiodClient::Get()->StartAuthSession(
base::BindOnce([](const dbus::ObjectPath& result) {}));
FakeBiodClient::Get()->SendAuthScanDone(kFingerprint,
biod::SCAN_RESULT_TOO_FAST);
FakeBiodClient::Get()->SendAuthScanDone(kFingerprint,
biod::SCAN_RESULT_SUCCESS);
base::RunLoop().RunUntilIdle();
EXPECT_THAT(histogram_tester.GetAllSamples("Fingerprint.Enroll.ScanResult"),
::testing::ElementsAre(
base::Bucket(static_cast<base::HistogramBase::Sample>(
device::mojom::ScanResult::SUCCESS),
1),
base::Bucket(static_cast<base::HistogramBase::Sample>(
device::mojom::ScanResult::TOO_SLOW),
1)));
EXPECT_THAT(histogram_tester.GetAllSamples("Fingerprint.Auth.ScanResult"),
::testing::ElementsAre(
base::Bucket(static_cast<base::HistogramBase::Sample>(
device::mojom::ScanResult::SUCCESS),
1),
base::Bucket(static_cast<base::HistogramBase::Sample>(
device::mojom::ScanResult::TOO_FAST),
1)));
}
} // namespace chromeos } // namespace chromeos
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#include "chrome/browser/chromeos/login/quick_unlock/fingerprint_storage.h" #include "chrome/browser/chromeos/login/quick_unlock/fingerprint_storage.h"
#include "base/metrics/histogram_functions.h"
#include "chrome/browser/chromeos/login/quick_unlock/quick_unlock_utils.h" #include "chrome/browser/chromeos/login/quick_unlock/quick_unlock_utils.h"
#include "chrome/browser/chromeos/profiles/profile_helper.h" #include "chrome/browser/chromeos/profiles/profile_helper.h"
#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile.h"
...@@ -12,10 +13,37 @@ ...@@ -12,10 +13,37 @@
#include "components/prefs/pref_registry_simple.h" #include "components/prefs/pref_registry_simple.h"
#include "components/prefs/pref_service.h" #include "components/prefs/pref_service.h"
#include "content/public/browser/device_service.h" #include "content/public/browser/device_service.h"
#include "services/device/public/mojom/fingerprint.mojom.h"
namespace chromeos { namespace chromeos {
namespace quick_unlock { namespace quick_unlock {
class FingerprintMetricsReporter : public device::mojom::FingerprintObserver {
public:
// device::mojom::FingerprintObserver:
void OnRestarted() override {}
void OnEnrollScanDone(device::mojom::ScanResult scan_result,
bool is_complete,
int32_t percent_complete) override {
base::UmaHistogramEnumeration("Fingerprint.Enroll.ScanResult", scan_result);
}
void OnAuthScanDone(
device::mojom::ScanResult scan_result,
const base::flat_map<std::string, std::vector<std::string>>& matches)
override {
base::UmaHistogramEnumeration("Fingerprint.Auth.ScanResult", scan_result);
}
void OnSessionFailed() override {}
mojo::PendingRemote<device::mojom::FingerprintObserver> GetRemote() {
return fingerprint_observer_receiver_.BindNewPipeAndPassRemote();
}
private:
mojo::Receiver<device::mojom::FingerprintObserver>
fingerprint_observer_receiver_{this};
};
// static // static
void FingerprintStorage::RegisterProfilePrefs(PrefRegistrySimple* registry) { void FingerprintStorage::RegisterProfilePrefs(PrefRegistrySimple* registry) {
registry->RegisterIntegerPref(prefs::kQuickUnlockFingerprintRecord, 0); registry->RegisterIntegerPref(prefs::kQuickUnlockFingerprintRecord, 0);
...@@ -34,6 +62,9 @@ FingerprintStorage::FingerprintStorage(Profile* profile) : profile_(profile) { ...@@ -34,6 +62,9 @@ FingerprintStorage::FingerprintStorage(Profile* profile) : profile_(profile) {
fp_service_->GetRecordsForUser( fp_service_->GetRecordsForUser(
user_id, base::BindOnce(&FingerprintStorage::OnGetRecords, user_id, base::BindOnce(&FingerprintStorage::OnGetRecords,
weak_factory_.GetWeakPtr())); weak_factory_.GetWeakPtr()));
metrics_reporter_ = std::make_unique<FingerprintMetricsReporter>();
fp_service_->AddFingerprintObserver(metrics_reporter_->GetRemote());
} }
FingerprintStorage::~FingerprintStorage() {} FingerprintStorage::~FingerprintStorage() {}
......
...@@ -20,6 +20,7 @@ class FingerprintStorageTestApi; ...@@ -20,6 +20,7 @@ class FingerprintStorageTestApi;
namespace quick_unlock { namespace quick_unlock {
class FingerprintMetricsReporter;
class QuickUnlockStorage; class QuickUnlockStorage;
class FingerprintStorage { class FingerprintStorage {
...@@ -63,6 +64,8 @@ class FingerprintStorage { ...@@ -63,6 +64,8 @@ class FingerprintStorage {
mojo::Remote<device::mojom::Fingerprint> fp_service_; mojo::Remote<device::mojom::Fingerprint> fp_service_;
std::unique_ptr<FingerprintMetricsReporter> metrics_reporter_;
base::WeakPtrFactory<FingerprintStorage> weak_factory_{this}; base::WeakPtrFactory<FingerprintStorage> weak_factory_{this};
DISALLOW_COPY_AND_ASSIGN(FingerprintStorage); DISALLOW_COPY_AND_ASSIGN(FingerprintStorage);
......
...@@ -6,6 +6,9 @@ module device.mojom; ...@@ -6,6 +6,9 @@ module device.mojom;
// Note: this needs to stay in sync with // Note: this needs to stay in sync with
// src/platform2/system_api/dbus/biod/constants.proto in the ChromeOS repro. // src/platform2/system_api/dbus/biod/constants.proto in the ChromeOS repro.
// These values are persisted to logs. Entries should not be renumbered and
// numeric values should never be reused (See FingerprintScanResult metrics
// enum).
enum ScanResult { enum ScanResult {
SUCCESS = 0, SUCCESS = 0,
PARTIAL = 1, PARTIAL = 1,
......
...@@ -32016,6 +32016,16 @@ Called by update_feature_policy_enum.py.--> ...@@ -32016,6 +32016,16 @@ Called by update_feature_policy_enum.py.-->
<int value="2" label="Record format version with validation value"/> <int value="2" label="Record format version with validation value"/>
</enum> </enum>
<enum name="FingerprintScanResult">
<int value="0" label="Success"/>
<int value="1" label="Partial"/>
<int value="2" label="Insufficient"/>
<int value="3" label="Sensor Dirty"/>
<int value="4" label="Too Slow"/>
<int value="5" label="Too Fast"/>
<int value="6" label="Immobile"/>
</enum>
<enum name="FingerprintSensorMode"> <enum name="FingerprintSensorMode">
<int value="0" label="None"/> <int value="0" label="None"/>
<int value="1" label="Deepsleep"/> <int value="1" label="Deepsleep"/>
...@@ -21,6 +21,32 @@ reviews. Googlers can read more about this at go/gwsq-gerrit. ...@@ -21,6 +21,32 @@ reviews. Googlers can read more about this at go/gwsq-gerrit.
<histograms> <histograms>
<histogram name="Fingerprint.Auth.ScanResult" enum="FingerprintScanResult"
expires_after="2021-09-01">
<owner>rsorokin@chromium.org</owner>
<owner>tomhughes@chromium.org</owner>
<owner>cros-oac@google.com</owner>
<owner>chromeos-fingerprint@google.com</owner>
<summary>
Tracks the scan result during fingerprint authentication session. It is
recorded every time user touches the fingerprint sensor while authenticating
(unlock screen, web auth, etc.).
</summary>
</histogram>
<histogram name="Fingerprint.Enroll.ScanResult" enum="FingerprintScanResult"
expires_after="2021-09-01">
<owner>rsorokin@chromium.org</owner>
<owner>tomhughes@chromium.org</owner>
<owner>cros-oac@google.com</owner>
<owner>chromeos-fingerprint@google.com</owner>
<summary>
Tracks the scan result during fingerprint enrollment session. It is recorded
every time user touches the fingerprint sensor while enrolling fingerprints
(during onboarding or in Chrome OS settings).
</summary>
</histogram>
<histogram name="Fingerprint.Reset.ResetContextMode" <histogram name="Fingerprint.Reset.ResetContextMode"
enum="FingerprintSensorMode" expires_after="2021-03-15"> enum="FingerprintSensorMode" expires_after="2021-03-15">
<owner>tomhughes@chromium.org</owner> <owner>tomhughes@chromium.org</owner>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment