Commit 30da3977 authored by Vincent Boisselle's avatar Vincent Boisselle Committed by Commit Bot

Provide user demographics to UMA from browser.

Summary of changes:
 * Piped demographic metrics provider with chrome browser (iOS + others).
 * Expose user demographics from DemographicMetricsProvider.

TBR=treib@chromium.org

Bug: 979371
Change-Id: Ib0d1eff9b767cf121fe768a9a46a3ff1fb57dd27
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1687019
Commit-Queue: Vincent Boisselle <vincb@google.com>
Reviewed-by: default avatarRoger McFarlane <rogerm@chromium.org>
Reviewed-by: default avatarEugene But <eugenebut@chromium.org>
Reviewed-by: default avatarAlexei Svitkine <asvitkine@chromium.org>
Cr-Commit-Position: refs/heads/master@{#680540}
parent 174fa686
......@@ -1974,6 +1974,7 @@ jumbo_split_static_library("browser") {
"//components/leveldb_proto/content:factory",
"//components/metrics:call_stack_profile_collector",
"//components/metrics:component_metrics",
"//components/metrics:demographic_metrics_provider",
"//components/metrics:gpu",
"//components/metrics:net",
"//components/metrics:ui",
......@@ -3653,7 +3654,7 @@ jumbo_split_static_library("browser") {
]
}
if (is_chromeos || enable_extensions) {
if (is_chromeos || enable_extensions || is_android) {
sources += [
"metrics/cached_metrics_profile.cc",
"metrics/cached_metrics_profile.h",
......
......@@ -38,6 +38,7 @@
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/google/google_brand.h"
#include "chrome/browser/history/history_service_factory.h"
#include "chrome/browser/metrics/cached_metrics_profile.h"
#include "chrome/browser/metrics/chrome_metrics_service_accessor.h"
#include "chrome/browser/metrics/chrome_stability_metrics_provider.h"
#include "chrome/browser/metrics/desktop_platform_features_metrics_provider.h"
......@@ -67,6 +68,7 @@
#include "components/metrics/call_stack_profile_metrics_provider.h"
#include "components/metrics/component_metrics_provider.h"
#include "components/metrics/cpu_metrics_provider.h"
#include "components/metrics/demographic_metrics_provider.h"
#include "components/metrics/drive_metrics_provider.h"
#include "components/metrics/field_trials_provider.h"
#include "components/metrics/gpu/gpu_metrics_provider.h"
......@@ -85,6 +87,7 @@
#include "components/metrics/ui/screen_info_metrics_provider.h"
#include "components/metrics/url_constants.h"
#include "components/metrics/version_utils.h"
#include "components/network_time/network_time_tracker.h"
#include "components/omnibox/browser/omnibox_metrics_provider.h"
#include "components/prefs/pref_registry_simple.h"
#include "components/prefs/pref_service.h"
......@@ -390,6 +393,45 @@ bool IsProcessRunning(base::ProcessId pid) {
return false;
}
// Client used by DemographicMetricsProvider to retrieve Profile information.
class ProfileClientImpl
: public metrics::DemographicMetricsProvider::ProfileClient {
public:
~ProfileClientImpl() override {}
ProfileClientImpl() = default;
int GetNumberOfProfilesOnDisk() override {
return g_browser_process->profile_manager()->GetNumberOfProfiles();
}
syncer::SyncService* GetSyncService() override {
Profile* profile = cached_metrics_profile_.GetMetricsProfile();
if (!profile)
return nullptr;
return ProfileSyncServiceFactory::GetForProfile(profile);
}
base::Time GetNetworkTime() const override {
base::Time time;
if (g_browser_process->network_time_tracker()->GetNetworkTime(&time,
nullptr) !=
network_time::NetworkTimeTracker::NETWORK_TIME_AVAILABLE) {
// Return null time to indicate that it could not get the network time. It
// is the responsibility of the client to have the strategy to deal with
// the absence of network time.
return base::Time();
}
return time;
}
private:
// Provides the same cached Profile each time.
metrics::CachedMetricsProfile cached_metrics_profile_;
DISALLOW_COPY_AND_ASSIGN(ProfileClientImpl);
};
} // namespace
// UKM suffix for field trial recording.
......@@ -644,6 +686,10 @@ void ChromeMetricsServiceClient::RegisterMetricsServiceProviders() {
metrics_service_->RegisterMetricsProvider(
std::make_unique<tracing::BackgroundTracingMetricsProvider>());
metrics_service_->RegisterMetricsProvider(
std::make_unique<metrics::DemographicMetricsProvider>(
std::make_unique<ProfileClientImpl>()));
#if defined(OS_ANDROID)
metrics_service_->RegisterMetricsProvider(
std::make_unique<AndroidMetricsProvider>());
......
......@@ -156,7 +156,7 @@ TEST_F(ChromeMetricsServiceClientTest, TestRegisterMetricsServiceProviders) {
size_t expected_providers = 3;
// This is the number of metrics providers that are outside any #if macros.
expected_providers += 17;
expected_providers += 18;
#if BUILDFLAG(ENABLE_EXTENSIONS)
expected_providers++; // ExtensionsMetricsProvider.
......
......@@ -5,6 +5,24 @@
import("//build/config/jumbo.gni")
import("//testing/test.gni")
static_library("demographic_metrics_provider") {
sources = [
"demographic_metrics_provider.cc",
"demographic_metrics_provider.h",
]
public_deps = [
"//third_party/metrics_proto",
]
deps = [
":metrics",
"//base",
"//components/sync/base",
"//components/sync/driver",
]
}
jumbo_static_library("metrics") {
sources = [
"call_stack_profile_metrics_provider.cc",
......@@ -23,8 +41,6 @@ jumbo_static_library("metrics") {
"data_use_tracker.h",
"delegating_provider.cc",
"delegating_provider.h",
"demographic_metrics_provider.cc",
"demographic_metrics_provider.h",
"drive_metrics_provider.cc",
"drive_metrics_provider.h",
"drive_metrics_provider_android.cc",
......@@ -397,6 +413,7 @@ source_set("unit_tests") {
deps = [
":call_stack_profile_builder",
":component_metrics",
":demographic_metrics_provider",
":metrics",
":net",
":single_sample_metrics",
......@@ -406,6 +423,8 @@ source_set("unit_tests") {
"//components/component_updater:test_support",
"//components/encrypted_messages:encrypted_message_proto",
"//components/prefs:test_support",
"//components/sync/base",
"//components/sync/driver:test_support",
"//components/variations",
"//extensions/buildflags",
"//mojo/public/cpp/bindings",
......
......@@ -7,6 +7,7 @@ include_rules = [
"+components/compression",
"+components/metrics",
"+components/prefs",
"+components/sync",
"+components/variations",
"+components/version_info",
"+content/public/test",
......
......@@ -5,55 +5,50 @@
#include "components/metrics/demographic_metrics_provider.h"
#include "base/feature_list.h"
#include "base/metrics/histogram_functions.h"
#include "base/metrics/histogram_macros.h"
#include "base/optional.h"
#include "components/sync/base/sync_prefs.h"
#include "components/sync/base/user_demographics.h"
#include "components/sync/driver/sync_service.h"
namespace metrics {
namespace {
// TODO(crbug/979371): Implement this.
// Gets user's birth year from Profile prefs that are provided by |service|.
// Returns false if could not retrieve birth year.
bool GetUserBirthYear(const PrefService& service, int* birth_year) {
*birth_year = 1990;
return true;
}
// TODO(crbug/979371): Implement this.
// Gets user's gender from Profile prefs that are provided by |service|. Returns
// false if could not retrieve birth year.
bool GetUserGender(const PrefService& service,
UserDemographicsProto::Gender* gender) {
*gender = UserDemographicsProto::GENDER_UNKNOWN_OR_OTHER;
return true;
}
} // namespace
// static
const base::Feature DemographicMetricsProvider::kDemographicMetricsReporting = {
"DemographicMetricsReporting", base::FEATURE_DISABLED_BY_DEFAULT};
DemographicMetricsProvider::DemographicMetricsProvider(
PrefService* pref_service)
: pref_service_(pref_service) {
// TODO(crbug/979371): Remove this log. Only there to avoid compilation error.
DVLOG(1) << "Using pref service instance at: " << pref_service_;
std::unique_ptr<ProfileClient> profile_client)
: profile_client_(std::move(profile_client)) {
DCHECK(profile_client_);
}
DemographicMetricsProvider::~DemographicMetricsProvider() {}
void DemographicMetricsProvider::ProvideCurrentSessionData(
ChromeUserMetricsExtension* uma_proto) {
// Skip if feature disabled.
if (!base::FeatureList::IsEnabled(kDemographicMetricsReporting))
return;
int birth_year;
if (GetUserBirthYear(*pref_service_, &birth_year))
uma_proto->mutable_user_demographics()->set_birth_year(birth_year);
UserDemographicsProto::Gender user_gender;
if (GetUserGender(*pref_service_, &user_gender))
uma_proto->mutable_user_demographics()->set_gender(user_gender);
}
// Skip if not exactly one Profile on disk. Having more than one Profile that
// is using the browser can make demographics less relevant. This approach
// cannot determine if there is more than 1 distinct user using the Profile.
if (profile_client_->GetNumberOfProfilesOnDisk() != 1)
return;
// static
const base::Feature DemographicMetricsProvider::kDemographicMetricsReporting = {
"DemographicMetricsReporting", base::FEATURE_DISABLED_BY_DEFAULT};
syncer::SyncService* sync_service = profile_client_->GetSyncService();
// Skip if no sync service.
if (!sync_service)
return;
// Report demographics if they are available.
base::Optional<syncer::UserDemographics> demographics =
sync_service->GetUserDemographics(profile_client_->GetNetworkTime());
if (demographics.has_value()) {
auto* demographics_proto = uma_proto->mutable_user_demographics();
demographics_proto->set_birth_year(demographics->birth_year);
demographics_proto->set_gender(demographics->gender);
}
}
} // namespace metrics
......@@ -5,8 +5,11 @@
#ifndef COMPONENTS_METRICS_DEMOGRAPHIC_METRICS_PROVIDER_H_
#define COMPONENTS_METRICS_DEMOGRAPHIC_METRICS_PROVIDER_H_
#include <memory>
#include "base/time/time.h"
#include "components/metrics/metrics_provider.h"
#include "components/prefs/pref_service.h"
#include "components/sync/driver/sync_service.h"
#include "third_party/metrics_proto/chrome_user_metrics_extension.pb.h"
namespace base {
......@@ -17,21 +20,35 @@ namespace metrics {
class DemographicMetricsProvider : public MetricsProvider {
public:
// Constructs a demographic metrics provider that gets demographic data from
// |pref_service|, which must outlive the use of an object of this class.
explicit DemographicMetricsProvider(PrefService* pref_service);
~DemographicMetricsProvider() override = default;
// Interface that represents the client that retrieves Profile information.
class ProfileClient {
public:
virtual ~ProfileClient() = default;
// Gets the total number of profiles that are on disk (loaded + not loaded)
// for the browser.
virtual int GetNumberOfProfilesOnDisk() = 0;
// Gets a weak pointer to the ProfileSyncService of the Profile.
virtual syncer::SyncService* GetSyncService() = 0;
// Gets the network time that represents now.
virtual base::Time GetNetworkTime() const = 0;
};
explicit DemographicMetricsProvider(
std::unique_ptr<ProfileClient> profile_client);
~DemographicMetricsProvider() override;
// MetricsProvider:
void ProvideCurrentSessionData(
ChromeUserMetricsExtension* uma_proto) override;
// Feature switch for reporting demographic data.
// Feature switch to report user demographic data.
static const base::Feature kDemographicMetricsReporting;
private:
// Preference Service to get profile prefs from.
PrefService* const pref_service_;
std::unique_ptr<ProfileClient> profile_client_;
DISALLOW_COPY_AND_ASSIGN(DemographicMetricsProvider);
};
......
......@@ -4,32 +4,109 @@
#include "components/metrics/demographic_metrics_provider.h"
#include <memory>
#include "base/optional.h"
#include "base/test/scoped_feature_list.h"
#include "base/test/simple_test_clock.h"
#include "base/time/time.h"
#include "components/sync/base/sync_prefs.h"
#include "components/sync/base/user_demographics.h"
#include "components/sync/driver/test_sync_service.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/metrics_proto/chrome_user_metrics_extension.pb.h"
namespace metrics {
namespace {
// Profile client for testing that gets fake Profile information and services.
class TestProfileClient : public DemographicMetricsProvider::ProfileClient {
public:
~TestProfileClient() override = default;
TestProfileClient(std::unique_ptr<syncer::SyncService> sync_service,
int number_of_profiles)
: sync_service_(std::move(sync_service)),
number_of_profiles_(number_of_profiles) {}
int GetNumberOfProfilesOnDisk() override { return number_of_profiles_; }
syncer::SyncService* GetSyncService() override { return sync_service_.get(); }
base::Time GetNetworkTime() const override {
base::Time time;
auto result = base::Time::FromString("17 Jun 2019 00:00:00 UDT", &time);
DCHECK(result);
return time;
}
private:
std::unique_ptr<syncer::SyncService> sync_service_;
const int number_of_profiles_;
base::SimpleTestClock clock_;
DISALLOW_COPY_AND_ASSIGN(TestProfileClient);
};
// Make arbitrary user demographics to provide.
base::Optional<syncer::UserDemographics> GetDemographics() {
base::Optional<syncer::UserDemographics> user_demographics =
syncer::UserDemographics();
user_demographics->birth_year = 1983;
user_demographics->gender = UserDemographicsProto::GENDER_FEMALE;
return user_demographics;
}
std::unique_ptr<TestProfileClient> MakeTestProfileClient(
const base::Optional<syncer::UserDemographics>& user_demographics,
int number_of_profiles,
bool has_sync_service) {
std::unique_ptr<syncer::TestSyncService> sync_service = nullptr;
if (has_sync_service) {
sync_service = std::make_unique<syncer::TestSyncService>();
sync_service->SetUserDemographics(user_demographics);
}
return std::make_unique<TestProfileClient>(std::move(sync_service),
number_of_profiles);
}
TEST(DemographicMetricsProviderTest, ProvideCurrentSessionData_FeatureEnabled) {
// Enable demographics reporting feature.
base::test::ScopedFeatureList local_feature;
local_feature.InitAndEnableFeature(
DemographicMetricsProvider::kDemographicMetricsReporting);
// Run demographics provider.
DemographicMetricsProvider provider(
MakeTestProfileClient(GetDemographics(), /*number_of_profiles=*/1,
/*has_sync_service=*/true));
ChromeUserMetricsExtension uma_proto;
DemographicMetricsProvider provider(/*pref_service=*/nullptr);
provider.ProvideCurrentSessionData(&uma_proto);
// Demographics are hard-coded in the provider for now, see crbug/979371.
const int test_user_birthyear_bucket = 1990;
const UserDemographicsProto::Gender test_user_gender =
UserDemographicsProto::GENDER_UNKNOWN_OR_OTHER;
EXPECT_EQ(test_user_birthyear_bucket,
// Verify provided demographics.
EXPECT_EQ(GetDemographics()->birth_year,
uma_proto.user_demographics().birth_year());
EXPECT_EQ(test_user_gender, uma_proto.user_demographics().gender());
EXPECT_EQ(GetDemographics()->gender, uma_proto.user_demographics().gender());
}
TEST(DemographicMetricsProviderTest, ProvideCurrentSessionData_NoSyncService) {
// Enable demographics reporting feature.
base::test::ScopedFeatureList local_feature;
local_feature.InitAndDisableFeature(
DemographicMetricsProvider::kDemographicMetricsReporting);
// Run demographics provider.
DemographicMetricsProvider provider(
MakeTestProfileClient(GetDemographics(),
/*number_of_profiles=*/1,
/*has_sync_service=*/false));
ChromeUserMetricsExtension uma_proto;
provider.ProvideCurrentSessionData(&uma_proto);
// Expect the proto fields to be not set and left to default.
EXPECT_FALSE(uma_proto.user_demographics().has_birth_year());
EXPECT_FALSE(uma_proto.user_demographics().has_gender());
}
TEST(DemographicMetricsProviderTest,
......@@ -39,13 +116,53 @@ TEST(DemographicMetricsProviderTest,
local_feature.InitAndDisableFeature(
DemographicMetricsProvider::kDemographicMetricsReporting);
// Run demographics provider.
DemographicMetricsProvider provider(
MakeTestProfileClient(GetDemographics(), /*number_of_profiles=*/1,
/*has_sync_service=*/true));
ChromeUserMetricsExtension uma_proto;
provider.ProvideCurrentSessionData(&uma_proto);
DemographicMetricsProvider provider(/*pref_service=*/nullptr);
// Expect that the UMA proto is untouched.
EXPECT_FALSE(uma_proto.user_demographics().has_birth_year());
EXPECT_FALSE(uma_proto.user_demographics().has_gender());
}
TEST(DemographicMetricsProviderTest,
ProvideCurrentSessionData_NotExactlyOneProfile) {
// Enable demographics reporting feature.
base::test::ScopedFeatureList local_feature;
local_feature.InitAndEnableFeature(
DemographicMetricsProvider::kDemographicMetricsReporting);
// Run demographics provider with not exactly one Profile on disk.
DemographicMetricsProvider provider(
MakeTestProfileClient(GetDemographics(), /*number_of_profiles=*/2,
/*has_sync_service=*/true));
ChromeUserMetricsExtension uma_proto;
provider.ProvideCurrentSessionData(&uma_proto);
// Expect that the UMA proto is untouched.
EXPECT_FALSE(uma_proto.user_demographics().has_birth_year());
EXPECT_FALSE(uma_proto.user_demographics().has_gender());
}
TEST(DemographicMetricsProviderTest,
ProvideCurrentSessionData_NoUserDemographics) {
// Enable demographics reporting feature.
base::test::ScopedFeatureList local_feature;
local_feature.InitAndEnableFeature(
DemographicMetricsProvider::kDemographicMetricsReporting);
// Run demographics provider with a ProfileClient that does not provide
// demographics.
DemographicMetricsProvider provider(
MakeTestProfileClient(base::nullopt, /*number_of_profiles=*/1,
/*has_sync_service=*/true));
ChromeUserMetricsExtension uma_proto;
provider.ProvideCurrentSessionData(&uma_proto);
// Expect that the UMA proto is untouched and has default data when feature
// disabled.
// Expect that the UMA proto is untouched.
EXPECT_FALSE(uma_proto.user_demographics().has_birth_year());
EXPECT_FALSE(uma_proto.user_demographics().has_gender());
}
......
......@@ -28,6 +28,22 @@ source_set("features") {
]
}
source_set("chrome_browser_state_client") {
configs += [ "//build/config/compiler:enable_arc" ]
sources = [
"chrome_browser_state_client.h",
"chrome_browser_state_client.mm",
]
deps = [
"//base",
"//components/metrics:demographic_metrics_provider",
"//components/network_time",
"//ios/chrome/browser",
"//ios/chrome/browser/browser_state",
"//ios/chrome/browser/sync",
]
}
source_set("metrics") {
configs += [ "//build/config/compiler:enable_arc" ]
sources = [
......@@ -57,6 +73,7 @@ source_set("metrics") {
":ukm_url_recorder",
]
deps = [
":chrome_browser_state_client",
":features",
"//base",
"//components/browser_sync",
......@@ -64,6 +81,7 @@ source_set("metrics") {
"//components/keyed_service/core",
"//components/keyed_service/ios",
"//components/metrics",
"//components/metrics:demographic_metrics_provider",
"//components/metrics:net",
"//components/metrics:ui",
"//components/metrics_services_manager",
......@@ -103,6 +121,7 @@ source_set("unit_tests") {
configs += [ "//build/config/compiler:enable_arc" ]
testonly = true
sources = [
"chrome_browser_state_client_unittest.mm",
"ios_chrome_metrics_service_accessor_unittest.cc",
"ios_chrome_stability_metrics_provider_unittest.mm",
"mobile_session_shutdown_metrics_provider_unittest.mm",
......@@ -110,18 +129,23 @@ source_set("unit_tests") {
"ukm_url_recorder_unittest.mm",
]
deps = [
":chrome_browser_state_client",
":metrics",
"//base",
"//base/test:test_support",
"//components/metrics",
"//components/metrics:test_support",
"//components/network_time:network_time",
"//components/prefs",
"//components/prefs:test_support",
"//components/ukm:test_support",
"//components/version_info",
"//ios/chrome/browser",
"//ios/chrome/browser/browser_state:test_support",
"//ios/chrome/browser/web:test_support",
"//ios/chrome/test:test_support",
"//ios/web/public:public",
"//ios/web/public/test",
"//ios/web/public/test/fakes",
"//net:test_support",
"//testing/gtest",
......
// Copyright 2019 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.
#ifndef IOS_CHROME_BROWSER_METRICS_CHROME_BROWSER_STATE_CLIENT_H_
#define IOS_CHROME_BROWSER_METRICS_CHROME_BROWSER_STATE_CLIENT_H_
#include "base/macros.h"
#include "components/metrics/demographic_metrics_provider.h"
namespace metrics {
// Client used by DemographicMetricsProvider to retrieve Profile information.
class ChromeBrowserStateClient
: public metrics::DemographicMetricsProvider::ProfileClient {
public:
~ChromeBrowserStateClient() override;
ChromeBrowserStateClient() = default;
// DemographicMetricsProvider::ProfileClient:
int GetNumberOfProfilesOnDisk() override;
syncer::SyncService* GetSyncService() override;
base::Time GetNetworkTime() const override;
DISALLOW_COPY_AND_ASSIGN(ChromeBrowserStateClient);
};
} // namespace metrics
#endif // IOS_CHROME_BROWSER_METRICS_CHROME_BROWSER_STATE_CLIENT_H_
// Copyright 2019 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 "ios/chrome/browser/metrics/chrome_browser_state_client.h"
#include "components/network_time/network_time_tracker.h"
#include "ios/chrome/browser/application_context.h"
#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
#include "ios/chrome/browser/browser_state/chrome_browser_state_manager.h"
#include "ios/chrome/browser/sync/profile_sync_service_factory.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
namespace metrics {
ChromeBrowserStateClient::~ChromeBrowserStateClient() {}
base::Time ChromeBrowserStateClient::GetNetworkTime() const {
base::Time time;
if (GetApplicationContext()->GetNetworkTimeTracker()->GetNetworkTime(
&time, nullptr) !=
network_time::NetworkTimeTracker::NETWORK_TIME_AVAILABLE) {
// Return null time to indicate that it could not get the network time. It
// is the responsibility of the client to have the strategy to deal with the
// absence of network time.
return base::Time();
}
return time;
}
syncer::SyncService* ChromeBrowserStateClient::GetSyncService() {
// Get SyncService from BrowserState that was the last to be used. Will create
// a new BrowserState if no BrowserState exists.
return ProfileSyncServiceFactory::GetForBrowserState(
GetApplicationContext()
->GetChromeBrowserStateManager()
->GetLastUsedBrowserState()
->GetOriginalChromeBrowserState());
}
int ChromeBrowserStateClient::GetNumberOfProfilesOnDisk() {
// Return 1 because there should be only one Profile available.
return 1;
}
} // namespace metrics
// Copyright 2019 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 "ios/chrome/browser/metrics/chrome_browser_state_client.h"
#include "base/time/default_clock.h"
#include "base/time/default_tick_clock.h"
#include "base/time/time.h"
#include "components/network_time/network_time_tracker.h"
#include "ios/chrome/browser/application_context.h"
#include "ios/chrome/browser/browser_state/test_chrome_browser_state.h"
#include "ios/chrome/browser/browser_state/test_chrome_browser_state_manager.h"
#include "ios/chrome/test/ios_chrome_scoped_testing_chrome_browser_state_manager.h"
#include "ios/web/public/test/test_web_thread_bundle.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "testing/platform_test.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
namespace metrics {
class ChromeBrowserStateClientTest : public PlatformTest {
public:
ChromeBrowserStateClientTest()
: scoped_browser_state_manager_(
std::make_unique<TestChromeBrowserStateManager>(
TestChromeBrowserState::Builder().Build())) {}
~ChromeBrowserStateClientTest() override {}
void SetUp() override { PlatformTest::SetUp(); }
private:
web::TestWebThreadBundle test_web_thread_bundle_;
IOSChromeScopedTestingChromeBrowserStateManager scoped_browser_state_manager_;
};
TEST_F(ChromeBrowserStateClientTest, GetNetworkTime) {
// Set initial time of the network clock.
base::TimeDelta resolution = base::TimeDelta::FromMilliseconds(17);
base::TimeDelta latency = base::TimeDelta::FromMilliseconds(50);
base::DefaultClock clock;
base::DefaultTickClock tick_clock;
GetApplicationContext()->GetNetworkTimeTracker()->UpdateNetworkTime(
clock.Now() - latency / 2, resolution, latency, tick_clock.NowTicks());
// Verify network clock gives non-null time.
ChromeBrowserStateClient profile_client;
EXPECT_FALSE(profile_client.GetNetworkTime().is_null());
}
TEST_F(ChromeBrowserStateClientTest, GetSyncService) {
ChromeBrowserStateClient profile_client;
// Verify if it possible to retrieve the instance of the SyncService
// associated with the ChromeBrowserState.
EXPECT_TRUE(profile_client.GetSyncService());
}
TEST_F(ChromeBrowserStateClientTest, GetNumberOfProfilesOnDisk) {
ChromeBrowserStateClient profile_client;
EXPECT_EQ(1, profile_client.GetNumberOfProfilesOnDisk());
}
} // namespace metrics
......@@ -24,6 +24,7 @@
#include "components/history/core/browser/history_service.h"
#include "components/keyed_service/core/service_access_type.h"
#include "components/metrics/call_stack_profile_metrics_provider.h"
#include "components/metrics/demographic_metrics_provider.h"
#include "components/metrics/drive_metrics_provider.h"
#include "components/metrics/metrics_log_uploader.h"
#include "components/metrics/metrics_pref_names.h"
......@@ -52,6 +53,7 @@
#include "ios/chrome/browser/chrome_paths.h"
#include "ios/chrome/browser/google/google_brand.h"
#include "ios/chrome/browser/history/history_service_factory.h"
#include "ios/chrome/browser/metrics/chrome_browser_state_client.h"
#include "ios/chrome/browser/metrics/ios_chrome_stability_metrics_provider.h"
#include "ios/chrome/browser/metrics/ios_user_type_metrics_provider.h"
#include "ios/chrome/browser/metrics/mobile_session_shutdown_metrics_provider.h"
......@@ -242,6 +244,10 @@ void IOSChromeMetricsServiceClient::Initialize() {
metrics_service_->RegisterMetricsProvider(
std::make_unique<IOSUserTypeMetricsProvider>());
metrics_service_->RegisterMetricsProvider(
std::make_unique<metrics::DemographicMetricsProvider>(
std::make_unique<metrics::ChromeBrowserStateClient>()));
}
void IOSChromeMetricsServiceClient::CollectFinalHistograms() {
......
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