blob: a31fa28801522a04507bce7c0ff07f69a7d1330d [file] [log] [blame]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ash/system/timezone_resolver_manager.h"
#include "ash/constants/ash_features.h"
#include "ash/constants/ash_pref_names.h"
#include "ash/constants/ash_switches.h"
#include "ash/constants/geolocation_access_level.h"
#include "ash/system/privacy_hub/privacy_hub_controller.h"
#include "chrome/browser/ash/login/login_manager_test.h"
#include "chrome/browser/ash/login/test/device_state_mixin.h"
#include "chrome/browser/ash/login/test/login_manager_mixin.h"
#include "chrome/browser/ash/policy/core/device_policy_cros_browser_test.h"
#include "chrome/browser/ash/policy/test_support/embedded_policy_test_server_mixin.h"
#include "chrome/browser/ash/system/timezone_util.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/browser_process_platform_part_ash.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/ui/ash/login/user_adding_screen.h"
#include "chrome/common/pref_names.h"
#include "chrome/test/base/testing_browser_process.h"
#include "chromeos/ash/components/dbus/session_manager/fake_session_manager_client.h"
#include "chromeos/ash/components/policy/device_policy/cached_device_policy_updater.h"
#include "chromeos/ash/components/settings/cros_settings_names.h"
#include "chromeos/ash/components/settings/cros_settings_waiter.h"
#include "components/account_id/account_id.h"
#include "components/policy/proto/chrome_device_policy.pb.h"
#include "components/prefs/pref_service.h"
#include "content/public/test/browser_test.h"
namespace ash {
namespace em = enterprise_management;
namespace {
static constexpr std::array<
em::SystemTimezoneProto::AutomaticTimezoneDetectionType,
5>
kTimeZoneAutomaticDetectionCloudPolicies = {
em::SystemTimezoneProto::AutomaticTimezoneDetectionType::
SystemTimezoneProto_AutomaticTimezoneDetectionType_USERS_DECIDE,
em::SystemTimezoneProto::AutomaticTimezoneDetectionType::
SystemTimezoneProto_AutomaticTimezoneDetectionType_DISABLED,
em::SystemTimezoneProto::AutomaticTimezoneDetectionType::
SystemTimezoneProto_AutomaticTimezoneDetectionType_IP_ONLY,
em::SystemTimezoneProto::AutomaticTimezoneDetectionType::
SystemTimezoneProto_AutomaticTimezoneDetectionType_SEND_WIFI_ACCESS_POINTS,
em::SystemTimezoneProto::AutomaticTimezoneDetectionType::
SystemTimezoneProto_AutomaticTimezoneDetectionType_SEND_ALL_LOCATION_INFO};
constexpr std::array<system::TimeZoneResolverManager::TimeZoneResolveMethod, 4>
kUserTimeZoneAutomaticDetectionUserChoices = {
system::TimeZoneResolverManager::TimeZoneResolveMethod::DISABLED,
system::TimeZoneResolverManager::TimeZoneResolveMethod::IP_ONLY,
system::TimeZoneResolverManager::TimeZoneResolveMethod::
SEND_WIFI_ACCESS_POINTS,
system::TimeZoneResolverManager::TimeZoneResolveMethod::
SEND_ALL_LOCATION_INFO,
};
} // namespace
class TimeZoneResolverManagerTestBase : public LoginManagerTest {
public:
TimeZoneResolverManagerTestBase() {
login_manager_.AppendManagedUsers(1);
login_manager_.AppendRegularUsers(2);
managed_user_id_ = login_manager_.users()[0].account_id;
regular_primary_user_id_ = login_manager_.users()[1].account_id;
regular_secondary_user_id_ = login_manager_.users()[2].account_id;
}
~TimeZoneResolverManagerTestBase() override = default;
void SetUpCommandLine(base::CommandLine* command_line) override {
// This is needed so that tests don't need to mock our policy
// infrastructure. When settings this, profile initialization will not fail,
// because of policies.
command_line->AppendSwitch(switches::kAllowFailedPolicyFetchForTest);
LoginManagerTest::SetUpCommandLine(command_line);
}
void SetUserTimeZoneResolveMethod(
PrefService* pref_service,
system::TimeZoneResolverManager::TimeZoneResolveMethod method) {
// The way the automatic time zone is implemented today is that we have 2
// user preferences. kResolveTimezoneByGeolocationMigratedToMethod - marked
// to true, when user first interacts with the automatic time zone setting.
// kResolveTimezoneByGeolocationMethod - storing the user choice, whether
// they want to use coarse (IP-based) or precise (Wi-Fi and Cellular-based)
// location.
if (!pref_service->GetBoolean(
::prefs::kResolveTimezoneByGeolocationMigratedToMethod)) {
pref_service->SetBoolean(
::prefs::kResolveTimezoneByGeolocationMigratedToMethod, true);
}
pref_service->SetInteger(::prefs::kResolveTimezoneByGeolocationMethod,
static_cast<int>(method));
}
bool IsStaticTimezoneSelected(PrefService* pref_service) {
return !pref_service->GetBoolean(
::prefs::kResolveTimezoneByGeolocationMigratedToMethod) &&
static_cast<system::TimeZoneResolverManager::TimeZoneResolveMethod>(
pref_service->GetInteger(
::prefs::kResolveTimezoneByGeolocationMethod)) ==
system::TimeZoneResolverManager::TimeZoneResolveMethod::DISABLED;
}
void UpdateUserGeolocationPermission(PrefService* pref_service,
GeolocationAccessLevel access_level) {
pref_service->SetInteger(ash::prefs::kUserGeolocationAccessLevel,
static_cast<int>(access_level));
}
void UpdateDeviceGeolocationPermission(bool enabled) {
PrefService* local_state = g_browser_process->local_state();
GeolocationAccessLevel access_level;
if (enabled) {
access_level = GeolocationAccessLevel::kAllowed;
} else {
access_level = GeolocationAccessLevel::kDisallowed;
}
local_state->SetInteger(ash::prefs::kDeviceGeolocationAllowed,
static_cast<int>(access_level));
}
protected:
AccountId managed_user_id_;
AccountId regular_primary_user_id_;
AccountId regular_secondary_user_id_;
ash::EmbeddedPolicyTestServerMixin policy_test_server_mixin_{&mixin_host_};
LoginManagerMixin login_manager_{&mixin_host_};
};
class TimeZoneResolverManagerEnrolledDeviceTest
: public TimeZoneResolverManagerTestBase {
public:
// Set the cloud policy for automatic time zone detection and wait until it's
// propagated to the local state.
void SetDeviceTimeZoneAutomaticDetectionPolicy(
em::SystemTimezoneProto::AutomaticTimezoneDetectionType detection_type) {
// Override the cloud policy for automatic time zone detection to the given
// value.
policy::CachedDevicePolicyUpdater updater;
updater.payload().mutable_system_timezone()->set_timezone_detection_type(
detection_type);
updater.Commit();
policy_test_server_mixin_.UpdateDevicePolicy(
std::cref(updater).get().payload());
// Wait for the policy value to get propagated.
policy::LocalStateValueWaiter(
::prefs::kSystemTimezoneAutomaticDetectionPolicy,
base::Value(detection_type))
.Wait();
}
// Static policy overrides automatic detection policy
void SetDeviceTimeZoneStaticPolicy(const std::string& value) {
ash::CrosSettingsWaiter waiter({ash::kSystemTimezonePolicy});
policy::CachedDevicePolicyUpdater updater;
updater.payload().mutable_system_timezone()->set_timezone(value);
updater.Commit();
waiter.Wait();
}
private:
DeviceStateMixin device_state_{
&mixin_host_, DeviceStateMixin::State::OOBE_COMPLETED_CLOUD_ENROLLED};
};
class TimeZoneResolverManagerUnenrolledDeviceTest
: public TimeZoneResolverManagerTestBase {
protected:
TimeZoneResolverManagerUnenrolledDeviceTest() {
// Enabling Privacy Hub with location switch
scoped_feature_list_.InitWithFeatures({ash::features::kCrosPrivacyHub}, {});
}
private:
base::test::ScopedFeatureList scoped_feature_list_;
DeviceStateMixin device_state_{
&mixin_host_, DeviceStateMixin::State::OOBE_COMPLETED_CONSUMER_OWNED};
};
IN_PROC_BROWSER_TEST_F(TimeZoneResolverManagerUnenrolledDeviceTest,
RegularUser) {
ash::system::TimeZoneResolverManager* tz_resolver_manager =
g_browser_process->platform_part()->GetTimezoneResolverManager();
// Log in a user.
LoginUser(regular_primary_user_id_);
base::RunLoop().RunUntilIdle();
PrefService* pref_service =
g_browser_process->profile_manager()->GetActiveUserProfile()->GetPrefs();
// Check that all user options for automatic timezone is working correctly:
SetUserTimeZoneResolveMethod(
pref_service,
system::TimeZoneResolverManager::TimeZoneResolveMethod::DISABLED);
EXPECT_FALSE(tz_resolver_manager->ShouldSendWiFiGeolocationData());
EXPECT_FALSE(tz_resolver_manager->ShouldSendCellularGeolocationData());
SetUserTimeZoneResolveMethod(
pref_service,
system::TimeZoneResolverManager::TimeZoneResolveMethod::IP_ONLY);
EXPECT_FALSE(tz_resolver_manager->ShouldSendWiFiGeolocationData());
EXPECT_FALSE(tz_resolver_manager->ShouldSendCellularGeolocationData());
SetUserTimeZoneResolveMethod(
pref_service, system::TimeZoneResolverManager::TimeZoneResolveMethod::
SEND_WIFI_ACCESS_POINTS);
EXPECT_TRUE(tz_resolver_manager->ShouldSendWiFiGeolocationData());
EXPECT_FALSE(tz_resolver_manager->ShouldSendCellularGeolocationData());
SetUserTimeZoneResolveMethod(
pref_service, system::TimeZoneResolverManager::TimeZoneResolveMethod::
SEND_ALL_LOCATION_INFO);
EXPECT_TRUE(tz_resolver_manager->ShouldSendWiFiGeolocationData());
EXPECT_TRUE(tz_resolver_manager->ShouldSendCellularGeolocationData());
}
IN_PROC_BROWSER_TEST_F(TimeZoneResolverManagerUnenrolledDeviceTest,
RegularMultiUser) {
ash::system::TimeZoneResolverManager* tz_resolver_manager =
g_browser_process->platform_part()->GetTimezoneResolverManager();
// Log in primary user.
LoginUser(regular_primary_user_id_);
base::RunLoop().RunUntilIdle();
PrefService* primary_pref_service =
g_browser_process->profile_manager()->GetActiveUserProfile()->GetPrefs();
// Add secondary user and log in.
ash::UserAddingScreen::Get()->Start();
AddUser(regular_secondary_user_id_);
base::RunLoop().RunUntilIdle();
// Check that primary user's choice for time zone detection method is
// overriding secondary user's choice. Checking all configurations:
PrefService* secondary_pref_service =
g_browser_process->profile_manager()->GetActiveUserProfile()->GetPrefs();
SetUserTimeZoneResolveMethod(
primary_pref_service,
system::TimeZoneResolverManager::TimeZoneResolveMethod::DISABLED);
for (auto tz_choice : kUserTimeZoneAutomaticDetectionUserChoices) {
SetUserTimeZoneResolveMethod(secondary_pref_service, tz_choice);
EXPECT_FALSE(tz_resolver_manager->ShouldSendWiFiGeolocationData());
EXPECT_FALSE(tz_resolver_manager->ShouldSendCellularGeolocationData());
}
SetUserTimeZoneResolveMethod(
primary_pref_service,
system::TimeZoneResolverManager::TimeZoneResolveMethod::IP_ONLY);
for (auto tz_choice : kUserTimeZoneAutomaticDetectionUserChoices) {
SetUserTimeZoneResolveMethod(secondary_pref_service, tz_choice);
EXPECT_FALSE(tz_resolver_manager->ShouldSendWiFiGeolocationData());
EXPECT_FALSE(tz_resolver_manager->ShouldSendCellularGeolocationData());
}
SetUserTimeZoneResolveMethod(
primary_pref_service, system::TimeZoneResolverManager::
TimeZoneResolveMethod::SEND_WIFI_ACCESS_POINTS);
for (auto tz_choice : kUserTimeZoneAutomaticDetectionUserChoices) {
SetUserTimeZoneResolveMethod(secondary_pref_service, tz_choice);
EXPECT_TRUE(tz_resolver_manager->ShouldSendWiFiGeolocationData());
EXPECT_FALSE(tz_resolver_manager->ShouldSendCellularGeolocationData());
}
SetUserTimeZoneResolveMethod(
primary_pref_service, system::TimeZoneResolverManager::
TimeZoneResolveMethod::SEND_ALL_LOCATION_INFO);
for (auto tz_choice : kUserTimeZoneAutomaticDetectionUserChoices) {
SetUserTimeZoneResolveMethod(secondary_pref_service, tz_choice);
EXPECT_TRUE(tz_resolver_manager->ShouldSendWiFiGeolocationData());
EXPECT_TRUE(tz_resolver_manager->ShouldSendCellularGeolocationData());
}
}
IN_PROC_BROWSER_TEST_F(TimeZoneResolverManagerEnrolledDeviceTest, ManagedUser) {
ash::system::TimeZoneResolverManager* tz_resolver_manager =
g_browser_process->platform_part()->GetTimezoneResolverManager();
// Check that on login screen TimeZoneResolverManager is not sending any data
// to Google servers.
SetDeviceTimeZoneAutomaticDetectionPolicy(
em::SystemTimezoneProto::AutomaticTimezoneDetectionType::
SystemTimezoneProto_AutomaticTimezoneDetectionType_USERS_DECIDE);
EXPECT_FALSE(tz_resolver_manager->ShouldSendWiFiGeolocationData());
EXPECT_FALSE(tz_resolver_manager->ShouldSendCellularGeolocationData());
// Log in a managed user.
LoginUser(managed_user_id_);
base::RunLoop().RunUntilIdle();
EXPECT_FALSE(tz_resolver_manager->ShouldSendWiFiGeolocationData());
EXPECT_FALSE(tz_resolver_manager->ShouldSendCellularGeolocationData());
// Disable automatic time zone detection by policy.
SetDeviceTimeZoneAutomaticDetectionPolicy(
em::SystemTimezoneProto::AutomaticTimezoneDetectionType::
SystemTimezoneProto_AutomaticTimezoneDetectionType_DISABLED);
EXPECT_FALSE(tz_resolver_manager->ShouldSendWiFiGeolocationData());
EXPECT_FALSE(tz_resolver_manager->ShouldSendCellularGeolocationData());
// Set automatic time zone to IP_ONLY.
SetDeviceTimeZoneAutomaticDetectionPolicy(
em::SystemTimezoneProto::AutomaticTimezoneDetectionType::
SystemTimezoneProto_AutomaticTimezoneDetectionType_IP_ONLY);
EXPECT_FALSE(tz_resolver_manager->ShouldSendWiFiGeolocationData());
EXPECT_FALSE(tz_resolver_manager->ShouldSendCellularGeolocationData());
// Set automatic time zone to WIFI.
SetDeviceTimeZoneAutomaticDetectionPolicy(
em::SystemTimezoneProto::AutomaticTimezoneDetectionType::
SystemTimezoneProto_AutomaticTimezoneDetectionType_SEND_WIFI_ACCESS_POINTS);
EXPECT_TRUE(tz_resolver_manager->ShouldSendWiFiGeolocationData());
EXPECT_FALSE(tz_resolver_manager->ShouldSendCellularGeolocationData());
// Set automatic time zone to ALL_INFO (i.e. Wi-Fi and cellular).
SetDeviceTimeZoneAutomaticDetectionPolicy(
em::SystemTimezoneProto::AutomaticTimezoneDetectionType::
SystemTimezoneProto_AutomaticTimezoneDetectionType_SEND_ALL_LOCATION_INFO);
EXPECT_TRUE(tz_resolver_manager->ShouldSendWiFiGeolocationData());
EXPECT_TRUE(tz_resolver_manager->ShouldSendCellularGeolocationData());
}
IN_PROC_BROWSER_TEST_F(TimeZoneResolverManagerEnrolledDeviceTest,
ManagedUserStaticTimeZonePolicy) {
// Set static time zone by policy and log in a managed user.
// Static time zone policy overrides automatic time zone policies,
// so no matter what other policies are provided, automatic time zone
// resolution will be prohobited.
SetDeviceTimeZoneStaticPolicy("Europe/Berlin");
LoginUser(managed_user_id_);
base::RunLoop().RunUntilIdle();
// Iterate over all possible automatic time zone policies and check that
// TimeZoneResolverManager is not sending out any sensor data.
ash::system::TimeZoneResolverManager* tz_resolver_manager =
g_browser_process->platform_part()->GetTimezoneResolverManager();
for (auto tz_policy : kTimeZoneAutomaticDetectionCloudPolicies) {
SetDeviceTimeZoneAutomaticDetectionPolicy(tz_policy);
EXPECT_FALSE(tz_resolver_manager->ShouldSendWiFiGeolocationData());
EXPECT_FALSE(tz_resolver_manager->ShouldSendCellularGeolocationData());
}
// Iterate over all possible user options in time zone settings and check that
// TimeZoneResolverManager is not sending any sensor data.
SetDeviceTimeZoneAutomaticDetectionPolicy(
em::SystemTimezoneProto::AutomaticTimezoneDetectionType::
SystemTimezoneProto_AutomaticTimezoneDetectionType_USERS_DECIDE);
PrefService* pref_service =
g_browser_process->profile_manager()->GetActiveUserProfile()->GetPrefs();
for (auto tz_user_choice : kUserTimeZoneAutomaticDetectionUserChoices) {
SetUserTimeZoneResolveMethod(pref_service, tz_user_choice);
EXPECT_FALSE(tz_resolver_manager->ShouldSendWiFiGeolocationData());
EXPECT_FALSE(tz_resolver_manager->ShouldSendCellularGeolocationData());
}
}
IN_PROC_BROWSER_TEST_F(TimeZoneResolverManagerEnrolledDeviceTest,
CheckIsTimezonePrefManaged) {
// Log in a user.
LoginUser(regular_primary_user_id_);
base::RunLoop().RunUntilIdle();
// Without any policy applied, the timezone pref should be not managed by
// default.
EXPECT_FALSE(system::IsTimezonePrefsManaged(kSystemTimezone));
EXPECT_FALSE(system::IsTimezonePrefsManaged(::prefs::kUserTimezone));
EXPECT_FALSE(system::IsTimezonePrefsManaged(
::prefs::kResolveTimezoneByGeolocationMethod));
// Apply device timezone automatic detection policy. kSystemTimezone is only
// managed if kSystemTimezonePolicy is applied. Since kSystemTimezonePolicy is
// not applied yet, kSystemTimezone should not be managed.
for (auto tz_policy : kTimeZoneAutomaticDetectionCloudPolicies) {
SetDeviceTimeZoneAutomaticDetectionPolicy(tz_policy);
EXPECT_FALSE(system::IsTimezonePrefsManaged(kSystemTimezone));
if (tz_policy ==
enterprise_management::
SystemTimezoneProto_AutomaticTimezoneDetectionType_USERS_DECIDE) {
EXPECT_FALSE(system::IsTimezonePrefsManaged(::prefs::kUserTimezone));
EXPECT_FALSE(system::IsTimezonePrefsManaged(
::prefs::kResolveTimezoneByGeolocationMethod));
} else if (
tz_policy ==
enterprise_management::
SystemTimezoneProto_AutomaticTimezoneDetectionType_DISABLED) {
EXPECT_FALSE(system::IsTimezonePrefsManaged(::prefs::kUserTimezone));
EXPECT_TRUE(system::IsTimezonePrefsManaged(
::prefs::kResolveTimezoneByGeolocationMethod));
} else {
EXPECT_TRUE(system::IsTimezonePrefsManaged(::prefs::kUserTimezone));
EXPECT_TRUE(system::IsTimezonePrefsManaged(
::prefs::kResolveTimezoneByGeolocationMethod));
}
}
// Apply user decided device timezone automatic detection policy, the timezone
// pref should be not managed.
SetDeviceTimeZoneAutomaticDetectionPolicy(
enterprise_management::
SystemTimezoneProto_AutomaticTimezoneDetectionType_USERS_DECIDE);
EXPECT_FALSE(system::IsTimezonePrefsManaged(kSystemTimezone));
EXPECT_FALSE(system::IsTimezonePrefsManaged(::prefs::kUserTimezone));
EXPECT_FALSE(system::IsTimezonePrefsManaged(
::prefs::kResolveTimezoneByGeolocationMethod));
// Apply device timezone static policy, all timezone prefs should be managed.
SetDeviceTimeZoneStaticPolicy("Europe/Berlin");
EXPECT_TRUE(system::IsTimezonePrefsManaged(kSystemTimezone));
EXPECT_TRUE(system::IsTimezonePrefsManaged(::prefs::kUserTimezone));
EXPECT_TRUE(system::IsTimezonePrefsManaged(
::prefs::kResolveTimezoneByGeolocationMethod));
}
IN_PROC_BROWSER_TEST_F(TimeZoneResolverManagerEnrolledDeviceTest,
CheckSystemGeolocationPermissionOnLogInScreen) {
ash::system::TimeZoneResolverManager* tz_resolver_manager =
g_browser_process->platform_part()->GetTimezoneResolverManager();
ASSERT_NE(tz_resolver_manager, nullptr);
// By default the resolver is up and running.
EXPECT_TRUE(tz_resolver_manager->TimeZoneResolverShouldBeRunning());
// Setting the detection policy to USERS_DECIDE should keep the default state.
SetDeviceTimeZoneAutomaticDetectionPolicy(
em::SystemTimezoneProto::AutomaticTimezoneDetectionType::
SystemTimezoneProto_AutomaticTimezoneDetectionType_USERS_DECIDE);
EXPECT_TRUE(tz_resolver_manager->TimeZoneResolverShouldBeRunning());
// Disable timezone detection:
SetDeviceTimeZoneAutomaticDetectionPolicy(
em::SystemTimezoneProto::AutomaticTimezoneDetectionType::
SystemTimezoneProto_AutomaticTimezoneDetectionType_DISABLED);
ASSERT_TRUE(
system::TimeZoneResolverManager::IsTimeZoneResolutionPolicyControlled());
EXPECT_FALSE(tz_resolver_manager->TimeZoneResolverShouldBeRunning());
// Re-enable timezone detection:
SetDeviceTimeZoneAutomaticDetectionPolicy(
em::SystemTimezoneProto::AutomaticTimezoneDetectionType::
SystemTimezoneProto_AutomaticTimezoneDetectionType_IP_ONLY);
EXPECT_TRUE(tz_resolver_manager->TimeZoneResolverShouldBeRunning());
}
IN_PROC_BROWSER_TEST_F(TimeZoneResolverManagerUnenrolledDeviceTest,
CheckSystemGeolocationPermission) {
ASSERT_FALSE(
system::TimeZoneResolverManager::IsTimeZoneResolutionPolicyControlled());
ash::system::TimeZoneResolverManager* tz_resolver_manager =
g_browser_process->platform_part()->GetTimezoneResolverManager();
TimeZoneResolver* tz_resolver = tz_resolver_manager->GetResolver();
ASSERT_NE(tz_resolver_manager, nullptr);
ASSERT_NE(tz_resolver, nullptr);
// Login-screen geolocation permission is On by default.
EXPECT_TRUE(system::TimeZoneResolverManager::
IfServiceShouldBeRunningForSigninScreen());
// Log in a user.
LoginUser(regular_primary_user_id_);
PrefService* pref_service =
g_browser_process->profile_manager()->GetActiveUserProfile()->GetPrefs();
// Check the default configuration: Should be set to IP-resolution.
EXPECT_TRUE(
tz_resolver_manager->TimeZoneResolverAllowedByTimeZoneConfigData());
EXPECT_EQ(
system::TimeZoneResolverManager::GetEffectiveUserTimeZoneResolveMethod(
pref_service, true),
system::TimeZoneResolverManager::TimeZoneResolveMethod::IP_ONLY);
// Check the permission is granted and timezone resolver is actually running.
EXPECT_EQ(
SimpleGeolocationProvider::GetInstance()->GetGeolocationAccessLevel(),
GeolocationAccessLevel::kAllowed);
EXPECT_TRUE(tz_resolver_manager->TimeZoneResolverShouldBeRunning());
EXPECT_TRUE(tz_resolver->IsRunning());
// Disable geolocation permission.
UpdateUserGeolocationPermission(pref_service,
GeolocationAccessLevel::kDisallowed);
// Change of `kUserGeolocationAccessLevel` will trigger the
// `OnGeolocationPermissionChanged()`, stopping the scheduler.
EXPECT_FALSE(tz_resolver_manager->TimeZoneResolverShouldBeRunning());
EXPECT_FALSE(tz_resolver->IsRunning());
// Check the timezone configuration didn't change on permission update.
EXPECT_TRUE(
tz_resolver_manager->TimeZoneResolverAllowedByTimeZoneConfigData());
// Re-enable geolocation permission and check that the resolver is working
// again.
UpdateUserGeolocationPermission(pref_service,
GeolocationAccessLevel::kAllowed);
EXPECT_TRUE(tz_resolver_manager->TimeZoneResolverShouldBeRunning());
EXPECT_TRUE(tz_resolver->IsRunning());
// Check timezone configuration still hasn't changed.
EXPECT_TRUE(
tz_resolver_manager->TimeZoneResolverAllowedByTimeZoneConfigData());
// Disable and re-enable geolocation permission with `kOnlyAllowedForSystem`.
// Check that the resolver is working.
UpdateUserGeolocationPermission(pref_service,
GeolocationAccessLevel::kDisallowed);
UpdateUserGeolocationPermission(
pref_service, GeolocationAccessLevel::kOnlyAllowedForSystem);
// Check that resolver is actually running.
EXPECT_TRUE(tz_resolver_manager->TimeZoneResolverShouldBeRunning());
EXPECT_TRUE(tz_resolver->IsRunning());
// Check timezone configuration is still unchanged.
EXPECT_TRUE(
tz_resolver_manager->TimeZoneResolverAllowedByTimeZoneConfigData());
}
} // namespace ash