blob: f8856e9b4497f147addee4342dd62a893033c1a0 [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/policy/enrollment/enrollment_state_fetcher.h"
#include <algorithm>
#include <memory>
#include "ash/constants/ash_switches.h"
#include "base/functional/bind.h"
#include "base/strings/stringprintf.h"
#include "base/test/gmock_callback_support.h"
#include "base/test/scoped_command_line.h"
#include "base/test/task_environment.h"
#include "base/test/test_future.h"
#include "base/time/time.h"
#include "chrome/browser/ash/policy/core/device_cloud_policy_manager_ash.h"
#include "chrome/browser/ash/policy/enrollment/auto_enrollment_client.h"
#include "chrome/browser/ash/policy/enrollment/auto_enrollment_type_checker.h"
#include "chrome/browser/ash/policy/enrollment/psm/rlwe_test_support.h"
#include "chrome/browser/ash/policy/server_backed_state/server_backed_device_state.h"
#include "chrome/browser/ash/policy/server_backed_state/server_backed_state_keys_broker.h"
#include "chrome/browser/ash/settings/device_settings_service.h"
#include "chrome/common/pref_names.h"
#include "chromeos/ash/components/dbus/system_clock/fake_system_clock_client.h"
#include "chromeos/ash/components/install_attributes/stub_install_attributes.h"
#include "chromeos/ash/components/system/fake_statistics_provider.h"
#include "chromeos/ash/components/system/statistics_provider.h"
#include "components/policy/core/common/cloud/device_management_service.h"
#include "components/policy/core/common/cloud/mock_device_management_service.h"
#include "components/policy/proto/device_management_backend.pb.h"
#include "components/prefs/pref_registry_simple.h"
#include "components/prefs/pref_service.h"
#include "components/prefs/testing_pref_service.h"
#include "content/public/test/browser_task_environment.h"
#include "services/network/public/cpp/shared_url_loader_factory.h"
#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
#include "services/network/test/test_url_loader_factory.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace policy {
namespace {
namespace em = enterprise_management;
const char kTestStateKey[] = "test-state-key";
const char kTestSerialNumber[] = "test-serial-number";
const char kTestBrandCode[] = "GOOG";
const char kTestPsmId[] = "474F4F47/test-serial-number";
const char kTestDisabledMessage[] = "test-disabled-message";
class MockStateKeyBroker : public ServerBackedStateKeysBroker {
public:
MockStateKeyBroker() : ServerBackedStateKeysBroker(nullptr) {}
~MockStateKeyBroker() override = default;
MOCK_METHOD(void, RequestStateKeys, (StateKeysCallback), (override));
};
class MockDeviceSettingsService : public ash::DeviceSettingsService {
public:
MOCK_METHOD(void,
GetOwnershipStatusAsync,
(OwnershipStatusCallback callback),
(override));
};
std::unique_ptr<EnrollmentStateFetcher::RlweClient> CreateRlweClientForTesting(
const psm::testing::RlweTestCase& test_case,
const private_membership::rlwe::RlwePlaintextId& plaintext_id) {
// Below we use test_case.plaintext_id() instead of the computed plaintext_id
// to ensure that Query/OPRF requests and responses match the ones in the
// test_case. Hence we check that computed plaintext_id is correct here.
EXPECT_EQ(plaintext_id.sensitive_id(), kTestPsmId);
EXPECT_TRUE(plaintext_id.non_sensitive_id().empty());
auto client =
private_membership::rlwe::PrivateMembershipRlweClient::CreateForTesting(
private_membership::rlwe::RlweUseCase::CROS_DEVICE_STATE,
{test_case.plaintext_id()}, test_case.ec_cipher_key(),
test_case.seed());
return std::move(client.value());
}
em::DeviceManagementResponse CreatePsmOprfResponse(
const psm::testing::RlweTestCase& test_case) {
em::DeviceManagementResponse response;
auto* rlwe_response = response.mutable_private_set_membership_response()
->mutable_rlwe_response();
*rlwe_response->mutable_oprf_response() = test_case.oprf_response();
return response;
}
MATCHER_P(JobWithPsmRlweRequest, rlwe_request_matcher, "") {
DeviceManagementService::JobConfiguration* config =
arg.GetConfigurationForTesting();
if (config->GetType() != DeviceManagementService::JobConfiguration::
TYPE_PSM_HAS_DEVICE_STATE_REQUEST) {
return false;
}
em::DeviceManagementRequest request;
request.ParseFromString(config->GetPayload());
if (!request.private_set_membership_request().has_rlwe_request()) {
return false;
}
return testing::Matches(rlwe_request_matcher)(
request.private_set_membership_request().rlwe_request());
}
MATCHER_P3(JobWithStateRequest, state_key, serial_number, brand_code, "") {
DeviceManagementService::JobConfiguration* config =
arg.GetConfigurationForTesting();
if (config->GetType() !=
DeviceManagementService::JobConfiguration::TYPE_DEVICE_STATE_RETRIEVAL) {
return false;
}
em::DeviceManagementRequest request;
request.ParseFromString(config->GetPayload());
if (!request.has_device_state_retrieval_request()) {
return false;
}
const auto& state_request = request.device_state_retrieval_request();
return state_request.server_backed_state_key() == state_key &&
state_request.serial_number() == serial_number &&
state_request.brand_code() == brand_code;
}
MATCHER_P(WithOprfRequestFor, test_case, "") {
if (!test_case) {
return arg.has_oprf_request();
}
return arg.oprf_request().SerializeAsString() ==
test_case->expected_oprf_request().SerializeAsString();
}
MATCHER_P(WithQueryRequestFor, test_case, "") {
return arg.query_request().SerializeAsString() ==
test_case->expected_query_request().SerializeAsString();
}
} // namespace
class EnrollmentStateFetcherTest : public testing::Test {
public:
void SetUp() override {
psm_test_case_ = psm::testing::LoadTestCase(/*is_member=*/true);
fake_dm_service_ =
std::make_unique<FakeDeviceManagementService>(&job_creation_handler_);
shared_url_loader_factory_ =
base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
&url_loader_factory_);
command_line_.GetProcessCommandLine()->AppendSwitchASCII(
ash::switches::kEnterpriseEnableUnifiedStateDetermination,
AutoEnrollmentTypeChecker::kUnifiedStateDeterminationAlways);
system_clock_.SetNetworkSynchronized(true);
DeviceCloudPolicyManagerAsh::RegisterPrefs(local_state_.registry());
EnrollmentStateFetcher::RegisterPrefs(local_state_.registry());
ash::system::StatisticsProvider::SetTestProvider(&statistics_provider_);
statistics_provider_.SetMachineStatistic(
ash::system::kSerialNumberKeyForTest, kTestSerialNumber);
statistics_provider_.SetMachineStatistic(ash::system::kRlzBrandCodeKey,
kTestBrandCode);
}
AutoEnrollmentState FetchEnrollmentState() {
base::test::TestFuture<AutoEnrollmentState> future;
auto fetcher = EnrollmentStateFetcher::Create(
future.GetCallback(), &local_state_,
base::BindRepeating(&CreateRlweClientForTesting, psm_test_case_),
fake_dm_service_.get(), shared_url_loader_factory_, &system_clock_,
&state_key_broker_, &device_settings_service_);
fetcher->Start();
return future.Get();
}
protected:
void ExpectOwnershipCheck() {
EXPECT_CALL(device_settings_service_, GetOwnershipStatusAsync)
.WillOnce(base::test::RunOnceCallback<0>(
ash::DeviceSettingsService::OWNERSHIP_NONE));
}
void ExpectStateKeysRequest() {
EXPECT_CALL(state_key_broker_, RequestStateKeys)
.WillOnce(base::test::RunOnceCallback<0>(
std::vector<std::string>{kTestStateKey}));
}
void ExpectOprfRequest(bool any = false) {
EXPECT_CALL(job_creation_handler_,
OnJobCreation(JobWithPsmRlweRequest(
WithOprfRequestFor((any ? nullptr : &psm_test_case_)))))
.WillOnce(fake_dm_service_->SendJobOKAsync(
CreatePsmOprfResponse(psm_test_case_)));
}
void ExpectQueryRequest() {
em::DeviceManagementResponse response;
auto* rlwe_response = response.mutable_private_set_membership_response()
->mutable_rlwe_response();
*rlwe_response->mutable_query_response() = psm_test_case_.query_response();
EXPECT_CALL(job_creation_handler_,
OnJobCreation(JobWithPsmRlweRequest(
WithQueryRequestFor(&psm_test_case_))))
.WillOnce(fake_dm_service_->SendJobOKAsync(response));
}
content::BrowserTaskEnvironment task_environment_;
base::test::ScopedCommandLine command_line_;
TestingPrefServiceSimple local_state_;
ash::FakeSystemClockClient system_clock_;
ash::system::FakeStatisticsProvider statistics_provider_;
ash::ScopedStubInstallAttributes install_attributes_;
MockStateKeyBroker state_key_broker_;
MockDeviceSettingsService device_settings_service_;
psm::testing::RlweTestCase psm_test_case_;
// Fake URL loader factories.
network::TestURLLoaderFactory url_loader_factory_;
scoped_refptr<network::SharedURLLoaderFactory> shared_url_loader_factory_;
// Fake DMService.
MockJobCreationHandler job_creation_handler_;
std::unique_ptr<FakeDeviceManagementService> fake_dm_service_;
};
TEST_F(EnrollmentStateFetcherTest, RegisterPrefs) {
TestingPrefServiceSimple local_state;
auto* registry = local_state.registry();
DeviceCloudPolicyManagerAsh::RegisterPrefs(registry);
EnrollmentStateFetcher::RegisterPrefs(registry);
const base::Value* value;
auto defaults = registry->defaults();
ASSERT_TRUE(defaults->GetValue(prefs::kServerBackedDeviceState, &value));
ASSERT_TRUE(value->is_dict());
EXPECT_TRUE(value->GetDict().empty());
ASSERT_TRUE(defaults->GetValue(prefs::kEnrollmentPsmResult, &value));
EXPECT_EQ(value->GetInt(), -1);
ASSERT_TRUE(
defaults->GetValue(prefs::kEnrollmentPsmDeterminationTime, &value));
EXPECT_EQ(value->GetString(), "0");
}
TEST_F(EnrollmentStateFetcherTest, DisabledViaSwitches) {
command_line_.GetProcessCommandLine()->AppendSwitchASCII(
ash::switches::kEnterpriseEnableUnifiedStateDetermination,
AutoEnrollmentTypeChecker::kUnifiedStateDeterminationNever);
AutoEnrollmentState state = FetchEnrollmentState();
EXPECT_EQ(state, AutoEnrollmentState::kNoEnrollment);
}
TEST_F(EnrollmentStateFetcherTest, SystemClockNotSyncronized) {
system_clock_.DisableService();
AutoEnrollmentState state = FetchEnrollmentState();
EXPECT_EQ(state, AutoEnrollmentState::kConnectionError);
}
TEST_F(EnrollmentStateFetcherTest, EmbargoDateNotPassed) {
base::Time::Exploded exploded;
base::Time embargo_date = base::Time::Now() + base::Days(7);
embargo_date.UTCExplode(&exploded);
statistics_provider_.SetMachineStatistic(
ash::system::kRlzEmbargoEndDateKey,
base::StringPrintf("%04d-%02d-%02d", exploded.year, exploded.month,
exploded.day_of_month));
AutoEnrollmentState state = FetchEnrollmentState();
EXPECT_EQ(state, AutoEnrollmentState::kNoEnrollment);
}
TEST_F(EnrollmentStateFetcherTest, RlzBrandCodeMissing) {
statistics_provider_.ClearMachineStatistic(ash::system::kRlzBrandCodeKey);
AutoEnrollmentState state = FetchEnrollmentState();
EXPECT_EQ(state, AutoEnrollmentState::kNoEnrollment);
}
TEST_F(EnrollmentStateFetcherTest, SerialNumberMissing) {
statistics_provider_.ClearMachineStatistic(
ash::system::kSerialNumberKeyForTest);
AutoEnrollmentState state = FetchEnrollmentState();
EXPECT_EQ(state, AutoEnrollmentState::kNoEnrollment);
}
TEST_F(EnrollmentStateFetcherTest, OwnershipTaken) {
EXPECT_CALL(device_settings_service_, GetOwnershipStatusAsync)
.WillOnce(base::test::RunOnceCallback<0>(
ash::DeviceSettingsService::OWNERSHIP_TAKEN));
AutoEnrollmentState state = FetchEnrollmentState();
EXPECT_EQ(state, AutoEnrollmentState::kNoEnrollment);
}
TEST_F(EnrollmentStateFetcherTest, OwnershipUnknown) {
EXPECT_CALL(device_settings_service_, GetOwnershipStatusAsync)
.WillOnce(base::test::RunOnceCallback<0>(
ash::DeviceSettingsService::OWNERSHIP_UNKNOWN));
AutoEnrollmentState state = FetchEnrollmentState();
EXPECT_EQ(state, AutoEnrollmentState::kNoEnrollment);
}
TEST_F(EnrollmentStateFetcherTest, StateKeysMissing) {
ExpectOwnershipCheck();
EXPECT_CALL(state_key_broker_, RequestStateKeys)
.WillRepeatedly(
base::test::RunOnceCallback<0>(std::vector<std::string>{}));
AutoEnrollmentState state = FetchEnrollmentState();
EXPECT_EQ(state, AutoEnrollmentState::kNoEnrollment);
}
TEST_F(EnrollmentStateFetcherTest, EmptyOprfResponse) {
ExpectOwnershipCheck();
ExpectStateKeysRequest();
EXPECT_CALL(
job_creation_handler_,
OnJobCreation(JobWithPsmRlweRequest(WithOprfRequestFor(&psm_test_case_))))
.WillOnce(fake_dm_service_->SendJobOKAsync(""));
AutoEnrollmentState state = FetchEnrollmentState();
EXPECT_EQ(state, AutoEnrollmentState::kServerError);
}
TEST_F(EnrollmentStateFetcherTest, ConnectionErrorOnOprfRequest) {
ExpectOwnershipCheck();
ExpectStateKeysRequest();
EXPECT_CALL(
job_creation_handler_,
OnJobCreation(JobWithPsmRlweRequest(WithOprfRequestFor(&psm_test_case_))))
.WillOnce(fake_dm_service_->SendJobResponseAsync(-1, 0));
AutoEnrollmentState state = FetchEnrollmentState();
EXPECT_EQ(state, AutoEnrollmentState::kConnectionError);
}
TEST_F(EnrollmentStateFetcherTest, ServerErrorOnOprfRequest) {
ExpectOwnershipCheck();
ExpectStateKeysRequest();
EXPECT_CALL(
job_creation_handler_,
OnJobCreation(JobWithPsmRlweRequest(WithOprfRequestFor(&psm_test_case_))))
.WillOnce(fake_dm_service_->SendJobResponseAsync(
0, DM_STATUS_HTTP_STATUS_ERROR));
AutoEnrollmentState state = FetchEnrollmentState();
EXPECT_EQ(state, AutoEnrollmentState::kServerError);
}
TEST_F(EnrollmentStateFetcherTest, FailToCreateQueryRequest) {
ExpectOwnershipCheck();
ExpectStateKeysRequest();
ExpectOprfRequest(/*any=*/true);
base::test::TestFuture<AutoEnrollmentState> future;
auto fetcher = EnrollmentStateFetcher::Create(
future.GetCallback(), &local_state_,
base::BindRepeating(
[](const private_membership::rlwe::RlwePlaintextId& plaintext_id) {
return private_membership::rlwe::PrivateMembershipRlweClient::
CreateForTesting(
private_membership::rlwe::RlweUseCase::CROS_DEVICE_STATE,
// Using fake ID, cipher key and seed will cause failure
// to create query request since it won't match the
// ecrypted ID in OPRF response from the psm_test_case_.
{plaintext_id}, "ec_cipher_key",
"seed4567890123456789012345678912")
.value();
}),
fake_dm_service_.get(), shared_url_loader_factory_, &system_clock_,
&state_key_broker_, &device_settings_service_);
fetcher->Start();
AutoEnrollmentState state = future.Get();
EXPECT_EQ(state, AutoEnrollmentState::kNoEnrollment);
}
TEST_F(EnrollmentStateFetcherTest, EmptyQueryResponse) {
ExpectOwnershipCheck();
ExpectStateKeysRequest();
ExpectOprfRequest();
EXPECT_CALL(job_creation_handler_, OnJobCreation(JobWithPsmRlweRequest(
WithQueryRequestFor(&psm_test_case_))))
.WillOnce(fake_dm_service_->SendJobOKAsync(""));
AutoEnrollmentState state = FetchEnrollmentState();
EXPECT_EQ(state, AutoEnrollmentState::kServerError);
}
TEST_F(EnrollmentStateFetcherTest, ConnectionErrorOnQueryRequest) {
ExpectOwnershipCheck();
ExpectStateKeysRequest();
ExpectOprfRequest();
EXPECT_CALL(job_creation_handler_, OnJobCreation(JobWithPsmRlweRequest(
WithQueryRequestFor(&psm_test_case_))))
.WillOnce(fake_dm_service_->SendJobResponseAsync(-1, 0));
AutoEnrollmentState state = FetchEnrollmentState();
EXPECT_EQ(state, AutoEnrollmentState::kConnectionError);
}
TEST_F(EnrollmentStateFetcherTest, ServerErrorOnQueryRequest) {
ExpectOwnershipCheck();
ExpectStateKeysRequest();
ExpectOprfRequest();
EXPECT_CALL(job_creation_handler_, OnJobCreation(JobWithPsmRlweRequest(
WithQueryRequestFor(&psm_test_case_))))
.WillOnce(fake_dm_service_->SendJobResponseAsync(
0, DM_STATUS_HTTP_STATUS_ERROR));
AutoEnrollmentState state = FetchEnrollmentState();
EXPECT_EQ(state, AutoEnrollmentState::kServerError);
}
TEST_F(EnrollmentStateFetcherTest, EmptyEnrollmentStateResponse) {
ExpectOwnershipCheck();
ExpectStateKeysRequest();
ExpectOprfRequest();
ExpectQueryRequest();
EXPECT_CALL(job_creation_handler_,
OnJobCreation(JobWithStateRequest(
kTestStateKey, kTestSerialNumber, kTestBrandCode)))
.WillOnce(
fake_dm_service_->SendJobOKAsync(em::DeviceManagementResponse()));
AutoEnrollmentState state = FetchEnrollmentState();
EXPECT_EQ(state, AutoEnrollmentState::kServerError);
}
TEST_F(EnrollmentStateFetcherTest, ConnectionErrorOnEnrollmentStateRequest) {
ExpectOwnershipCheck();
ExpectStateKeysRequest();
ExpectOprfRequest();
ExpectQueryRequest();
EXPECT_CALL(job_creation_handler_,
OnJobCreation(JobWithStateRequest(
kTestStateKey, kTestSerialNumber, kTestBrandCode)))
.WillOnce(fake_dm_service_->SendJobResponseAsync(-1, 0));
AutoEnrollmentState state = FetchEnrollmentState();
EXPECT_EQ(state, AutoEnrollmentState::kConnectionError);
}
TEST_F(EnrollmentStateFetcherTest, ServerErrorOnEnrollmentStateRequest) {
ExpectOwnershipCheck();
ExpectStateKeysRequest();
ExpectOprfRequest();
ExpectQueryRequest();
EXPECT_CALL(job_creation_handler_,
OnJobCreation(JobWithStateRequest(
kTestStateKey, kTestSerialNumber, kTestBrandCode)))
.WillOnce(fake_dm_service_->SendJobResponseAsync(
0, DM_STATUS_HTTP_STATUS_ERROR));
AutoEnrollmentState state = FetchEnrollmentState();
EXPECT_EQ(state, AutoEnrollmentState::kServerError);
}
TEST_F(EnrollmentStateFetcherTest, NoEnrollment) {
ExpectOwnershipCheck();
ExpectStateKeysRequest();
ExpectOprfRequest();
ExpectQueryRequest();
em::DeviceManagementResponse response;
response.mutable_device_state_retrieval_response();
EXPECT_CALL(job_creation_handler_,
OnJobCreation(JobWithStateRequest(
kTestStateKey, kTestSerialNumber, kTestBrandCode)))
.WillOnce(fake_dm_service_->SendJobOKAsync(response));
AutoEnrollmentState state = FetchEnrollmentState();
EXPECT_EQ(state, AutoEnrollmentState::kNoEnrollment);
const base::Value::Dict& device_state =
local_state_.GetDict(prefs::kServerBackedDeviceState);
EXPECT_TRUE(device_state.empty());
}
TEST_F(EnrollmentStateFetcherTest, InitialEnrollmentEnforced) {
ExpectOwnershipCheck();
ExpectStateKeysRequest();
ExpectOprfRequest();
ExpectQueryRequest();
em::DeviceManagementResponse response;
auto* state_response = response.mutable_device_state_retrieval_response()
->mutable_initial_state_response();
state_response->set_initial_enrollment_mode(
em::DeviceInitialEnrollmentStateResponse::
INITIAL_ENROLLMENT_MODE_ENROLLMENT_ENFORCED);
state_response->set_management_domain("example.org");
EXPECT_CALL(job_creation_handler_,
OnJobCreation(JobWithStateRequest(
kTestStateKey, kTestSerialNumber, kTestBrandCode)))
.WillOnce(fake_dm_service_->SendJobOKAsync(response));
AutoEnrollmentState state = FetchEnrollmentState();
EXPECT_EQ(state, AutoEnrollmentState::kEnrollment);
const base::Value::Dict& device_state =
local_state_.GetDict(prefs::kServerBackedDeviceState);
ASSERT_TRUE(device_state.FindString(kDeviceStateMode));
EXPECT_EQ(*device_state.FindString(kDeviceStateMode),
kDeviceStateInitialModeEnrollmentEnforced);
ASSERT_TRUE(device_state.FindString(kDeviceStateManagementDomain));
EXPECT_EQ(*device_state.FindString(kDeviceStateManagementDomain),
"example.org");
EXPECT_FALSE(device_state.FindString(kDeviceStateDisabledMessage));
EXPECT_FALSE(device_state.FindString(kDeviceStateLicenseType));
EXPECT_FALSE(device_state.FindString(kDeviceStatePackagedLicense));
EXPECT_FALSE(device_state.FindString(kDeviceStateAssignedUpgradeType));
}
TEST_F(EnrollmentStateFetcherTest, InitialEnrollmentDisabled) {
ExpectOwnershipCheck();
ExpectStateKeysRequest();
ExpectOprfRequest();
ExpectQueryRequest();
em::DeviceManagementResponse response;
auto* state_response = response.mutable_device_state_retrieval_response()
->mutable_initial_state_response();
state_response->set_initial_enrollment_mode(
em::DeviceInitialEnrollmentStateResponse::
INITIAL_ENROLLMENT_MODE_DISABLED);
state_response->mutable_disabled_state()->set_message(kTestDisabledMessage);
EXPECT_CALL(job_creation_handler_,
OnJobCreation(JobWithStateRequest(
kTestStateKey, kTestSerialNumber, kTestBrandCode)))
.WillOnce(fake_dm_service_->SendJobOKAsync(response));
AutoEnrollmentState state = FetchEnrollmentState();
EXPECT_EQ(state, AutoEnrollmentState::kDisabled);
const base::Value::Dict& device_state =
local_state_.GetDict(prefs::kServerBackedDeviceState);
ASSERT_TRUE(device_state.FindString(kDeviceStateMode));
EXPECT_EQ(*device_state.FindString(kDeviceStateMode),
kDeviceStateModeDisabled);
ASSERT_TRUE(device_state.FindString(kDeviceStateDisabledMessage));
EXPECT_EQ(*device_state.FindString(kDeviceStateDisabledMessage),
kTestDisabledMessage);
}
TEST_F(EnrollmentStateFetcherTest, ZTEWithPackagedEnterpriseLicense) {
ExpectOwnershipCheck();
ExpectStateKeysRequest();
ExpectOprfRequest();
ExpectQueryRequest();
em::DeviceManagementResponse response;
auto* state_response = response.mutable_device_state_retrieval_response()
->mutable_initial_state_response();
state_response->set_initial_enrollment_mode(
em::DeviceInitialEnrollmentStateResponse::
INITIAL_ENROLLMENT_MODE_ZERO_TOUCH_ENFORCED);
state_response->set_is_license_packaged_with_device(true);
state_response->set_license_packaging_sku(
enterprise_management::DeviceInitialEnrollmentStateResponse::
CHROME_ENTERPRISE);
EXPECT_CALL(job_creation_handler_,
OnJobCreation(JobWithStateRequest(
kTestStateKey, kTestSerialNumber, kTestBrandCode)))
.WillOnce(fake_dm_service_->SendJobOKAsync(response));
AutoEnrollmentState state = FetchEnrollmentState();
EXPECT_EQ(state, AutoEnrollmentState::kEnrollment);
const base::Value::Dict& device_state =
local_state_.GetDict(prefs::kServerBackedDeviceState);
ASSERT_TRUE(device_state.FindString(kDeviceStateMode));
EXPECT_EQ(*device_state.FindString(kDeviceStateMode),
kDeviceStateInitialModeEnrollmentZeroTouch);
ASSERT_TRUE(device_state.FindBool(kDeviceStatePackagedLicense));
EXPECT_EQ(*device_state.FindBool(kDeviceStatePackagedLicense), true);
ASSERT_TRUE(device_state.FindString(kDeviceStateLicenseType));
EXPECT_EQ(*device_state.FindString(kDeviceStateLicenseType),
kDeviceStateLicenseTypeEnterprise);
}
TEST_F(EnrollmentStateFetcherTest, ZTEWithEducationLicense) {
ExpectOwnershipCheck();
ExpectStateKeysRequest();
ExpectOprfRequest();
ExpectQueryRequest();
em::DeviceManagementResponse response;
auto* state_response = response.mutable_device_state_retrieval_response()
->mutable_initial_state_response();
state_response->set_initial_enrollment_mode(
em::DeviceInitialEnrollmentStateResponse::
INITIAL_ENROLLMENT_MODE_ZERO_TOUCH_ENFORCED);
state_response->set_is_license_packaged_with_device(false);
state_response->set_license_packaging_sku(
enterprise_management::DeviceInitialEnrollmentStateResponse::
CHROME_EDUCATION);
EXPECT_CALL(job_creation_handler_,
OnJobCreation(JobWithStateRequest(
kTestStateKey, kTestSerialNumber, kTestBrandCode)))
.WillOnce(fake_dm_service_->SendJobOKAsync(response));
AutoEnrollmentState state = FetchEnrollmentState();
EXPECT_EQ(state, AutoEnrollmentState::kEnrollment);
const base::Value::Dict& device_state =
local_state_.GetDict(prefs::kServerBackedDeviceState);
ASSERT_TRUE(device_state.FindBool(kDeviceStatePackagedLicense));
EXPECT_EQ(*device_state.FindBool(kDeviceStatePackagedLicense), false);
ASSERT_TRUE(device_state.FindString(kDeviceStateLicenseType));
EXPECT_EQ(*device_state.FindString(kDeviceStateLicenseType),
kDeviceStateLicenseTypeEducation);
}
TEST_F(EnrollmentStateFetcherTest, ZTEWithTerminalLicense) {
ExpectOwnershipCheck();
ExpectStateKeysRequest();
ExpectOprfRequest();
ExpectQueryRequest();
em::DeviceManagementResponse response;
auto* state_response = response.mutable_device_state_retrieval_response()
->mutable_initial_state_response();
state_response->set_initial_enrollment_mode(
em::DeviceInitialEnrollmentStateResponse::
INITIAL_ENROLLMENT_MODE_ZERO_TOUCH_ENFORCED);
state_response->set_license_packaging_sku(
enterprise_management::DeviceInitialEnrollmentStateResponse::
CHROME_TERMINAL);
EXPECT_CALL(job_creation_handler_,
OnJobCreation(JobWithStateRequest(
kTestStateKey, kTestSerialNumber, kTestBrandCode)))
.WillOnce(fake_dm_service_->SendJobOKAsync(response));
AutoEnrollmentState state = FetchEnrollmentState();
EXPECT_EQ(state, AutoEnrollmentState::kEnrollment);
const base::Value::Dict& device_state =
local_state_.GetDict(prefs::kServerBackedDeviceState);
ASSERT_TRUE(device_state.FindString(kDeviceStateLicenseType));
EXPECT_EQ(*device_state.FindString(kDeviceStateLicenseType),
kDeviceStateLicenseTypeTerminal);
}
TEST_F(EnrollmentStateFetcherTest, ZTEWithUnspecifiedUpgrade) {
ExpectOwnershipCheck();
ExpectStateKeysRequest();
ExpectOprfRequest();
ExpectQueryRequest();
em::DeviceManagementResponse response;
auto* state_response = response.mutable_device_state_retrieval_response()
->mutable_initial_state_response();
state_response->set_initial_enrollment_mode(
em::DeviceInitialEnrollmentStateResponse::
INITIAL_ENROLLMENT_MODE_ZERO_TOUCH_ENFORCED);
state_response->set_assigned_upgrade_type(
enterprise_management::DeviceInitialEnrollmentStateResponse::
ASSIGNED_UPGRADE_TYPE_UNSPECIFIED);
EXPECT_CALL(job_creation_handler_,
OnJobCreation(JobWithStateRequest(
kTestStateKey, kTestSerialNumber, kTestBrandCode)))
.WillOnce(fake_dm_service_->SendJobOKAsync(response));
AutoEnrollmentState state = FetchEnrollmentState();
EXPECT_EQ(state, AutoEnrollmentState::kEnrollment);
const base::Value::Dict& device_state =
local_state_.GetDict(prefs::kServerBackedDeviceState);
ASSERT_TRUE(device_state.FindString(kDeviceStateAssignedUpgradeType));
EXPECT_TRUE(
device_state.FindString(kDeviceStateAssignedUpgradeType)->empty());
}
TEST_F(EnrollmentStateFetcherTest, ZTEWithChromeEnterpriseUpgrade) {
ExpectOwnershipCheck();
ExpectStateKeysRequest();
ExpectOprfRequest();
ExpectQueryRequest();
em::DeviceManagementResponse response;
auto* state_response = response.mutable_device_state_retrieval_response()
->mutable_initial_state_response();
state_response->set_initial_enrollment_mode(
em::DeviceInitialEnrollmentStateResponse::
INITIAL_ENROLLMENT_MODE_ZERO_TOUCH_ENFORCED);
state_response->set_assigned_upgrade_type(
enterprise_management::DeviceInitialEnrollmentStateResponse::
ASSIGNED_UPGRADE_TYPE_CHROME_ENTERPRISE);
EXPECT_CALL(job_creation_handler_,
OnJobCreation(JobWithStateRequest(
kTestStateKey, kTestSerialNumber, kTestBrandCode)))
.WillOnce(fake_dm_service_->SendJobOKAsync(response));
AutoEnrollmentState state = FetchEnrollmentState();
EXPECT_EQ(state, AutoEnrollmentState::kEnrollment);
const base::Value::Dict& device_state =
local_state_.GetDict(prefs::kServerBackedDeviceState);
ASSERT_TRUE(device_state.FindString(kDeviceStateAssignedUpgradeType));
EXPECT_EQ(*device_state.FindString(kDeviceStateAssignedUpgradeType),
kDeviceStateAssignedUpgradeTypeChromeEnterprise);
}
TEST_F(EnrollmentStateFetcherTest, ZTEWithKioskAndSignageUpgrade) {
ExpectOwnershipCheck();
ExpectStateKeysRequest();
ExpectOprfRequest();
ExpectQueryRequest();
em::DeviceManagementResponse response;
auto* state_response = response.mutable_device_state_retrieval_response()
->mutable_initial_state_response();
state_response->set_initial_enrollment_mode(
em::DeviceInitialEnrollmentStateResponse::
INITIAL_ENROLLMENT_MODE_ZERO_TOUCH_ENFORCED);
state_response->set_assigned_upgrade_type(
enterprise_management::DeviceInitialEnrollmentStateResponse::
ASSIGNED_UPGRADE_TYPE_KIOSK_AND_SIGNAGE);
EXPECT_CALL(job_creation_handler_,
OnJobCreation(JobWithStateRequest(
kTestStateKey, kTestSerialNumber, kTestBrandCode)))
.WillOnce(fake_dm_service_->SendJobOKAsync(response));
AutoEnrollmentState state = FetchEnrollmentState();
EXPECT_EQ(state, AutoEnrollmentState::kEnrollment);
const base::Value::Dict& device_state =
local_state_.GetDict(prefs::kServerBackedDeviceState);
ASSERT_TRUE(device_state.FindString(kDeviceStateAssignedUpgradeType));
EXPECT_EQ(*device_state.FindString(kDeviceStateAssignedUpgradeType),
kDeviceStateAssignedUpgradeTypeKiosk);
}
TEST_F(EnrollmentStateFetcherTest, ReEnrollmentRequested) {
ExpectOwnershipCheck();
ExpectStateKeysRequest();
ExpectOprfRequest();
ExpectQueryRequest();
em::DeviceManagementResponse response;
auto* state_response = response.mutable_device_state_retrieval_response();
state_response->set_restore_mode(
em::DeviceStateRetrievalResponse::RESTORE_MODE_REENROLLMENT_REQUESTED);
state_response->set_management_domain("example.org");
EXPECT_CALL(job_creation_handler_,
OnJobCreation(JobWithStateRequest(
kTestStateKey, kTestSerialNumber, kTestBrandCode)))
.WillOnce(fake_dm_service_->SendJobOKAsync(response));
AutoEnrollmentState state = FetchEnrollmentState();
EXPECT_EQ(state, AutoEnrollmentState::kEnrollment);
const base::Value::Dict& device_state =
local_state_.GetDict(prefs::kServerBackedDeviceState);
ASSERT_TRUE(device_state.FindString(kDeviceStateMode));
EXPECT_EQ(*device_state.FindString(kDeviceStateMode),
kDeviceStateRestoreModeReEnrollmentRequested);
ASSERT_TRUE(device_state.FindString(kDeviceStateManagementDomain));
EXPECT_EQ(*device_state.FindString(kDeviceStateManagementDomain),
"example.org");
EXPECT_FALSE(device_state.FindString(kDeviceStateDisabledMessage));
EXPECT_FALSE(device_state.FindString(kDeviceStateLicenseType));
EXPECT_FALSE(device_state.FindString(kDeviceStatePackagedLicense));
EXPECT_FALSE(device_state.FindString(kDeviceStateAssignedUpgradeType));
}
TEST_F(EnrollmentStateFetcherTest, ReEnrollmentEnforced) {
ExpectOwnershipCheck();
ExpectStateKeysRequest();
ExpectOprfRequest();
ExpectQueryRequest();
em::DeviceManagementResponse response;
auto* state_response = response.mutable_device_state_retrieval_response();
state_response->set_restore_mode(
em::DeviceStateRetrievalResponse::RESTORE_MODE_REENROLLMENT_ENFORCED);
EXPECT_CALL(job_creation_handler_,
OnJobCreation(JobWithStateRequest(
kTestStateKey, kTestSerialNumber, kTestBrandCode)))
.WillOnce(fake_dm_service_->SendJobOKAsync(response));
AutoEnrollmentState state = FetchEnrollmentState();
EXPECT_EQ(state, AutoEnrollmentState::kEnrollment);
const base::Value::Dict& device_state =
local_state_.GetDict(prefs::kServerBackedDeviceState);
ASSERT_TRUE(device_state.FindString(kDeviceStateMode));
EXPECT_EQ(*device_state.FindString(kDeviceStateMode),
kDeviceStateRestoreModeReEnrollmentEnforced);
}
TEST_F(EnrollmentStateFetcherTest, ReEnrollmentDisabled) {
ExpectOwnershipCheck();
ExpectStateKeysRequest();
ExpectOprfRequest();
ExpectQueryRequest();
em::DeviceManagementResponse response;
auto* state_response = response.mutable_device_state_retrieval_response();
state_response->set_restore_mode(
em::DeviceStateRetrievalResponse::RESTORE_MODE_DISABLED);
state_response->mutable_disabled_state()->set_message(kTestDisabledMessage);
EXPECT_CALL(job_creation_handler_,
OnJobCreation(JobWithStateRequest(
kTestStateKey, kTestSerialNumber, kTestBrandCode)))
.WillOnce(fake_dm_service_->SendJobOKAsync(response));
AutoEnrollmentState state = FetchEnrollmentState();
EXPECT_EQ(state, AutoEnrollmentState::kDisabled);
const base::Value::Dict& device_state =
local_state_.GetDict(prefs::kServerBackedDeviceState);
ASSERT_TRUE(device_state.FindString(kDeviceStateMode));
EXPECT_EQ(*device_state.FindString(kDeviceStateMode),
kDeviceStateModeDisabled);
ASSERT_TRUE(device_state.FindString(kDeviceStateDisabledMessage));
EXPECT_EQ(*device_state.FindString(kDeviceStateDisabledMessage),
kTestDisabledMessage);
}
TEST_F(EnrollmentStateFetcherTest, AutoREWithPerpetualLicense) {
ExpectOwnershipCheck();
ExpectStateKeysRequest();
ExpectOprfRequest();
ExpectQueryRequest();
em::DeviceManagementResponse response;
auto* state_response = response.mutable_device_state_retrieval_response();
state_response->set_restore_mode(
em::DeviceStateRetrievalResponse::RESTORE_MODE_REENROLLMENT_ZERO_TOUCH);
state_response->mutable_license_type()->set_license_type(
em::LicenseType::CDM_PERPETUAL);
EXPECT_CALL(job_creation_handler_,
OnJobCreation(JobWithStateRequest(
kTestStateKey, kTestSerialNumber, kTestBrandCode)))
.WillOnce(fake_dm_service_->SendJobOKAsync(response));
AutoEnrollmentState state = FetchEnrollmentState();
EXPECT_EQ(state, AutoEnrollmentState::kEnrollment);
const base::Value::Dict& device_state =
local_state_.GetDict(prefs::kServerBackedDeviceState);
ASSERT_TRUE(device_state.FindString(kDeviceStateMode));
EXPECT_EQ(*device_state.FindString(kDeviceStateMode),
kDeviceStateRestoreModeReEnrollmentZeroTouch);
ASSERT_TRUE(device_state.FindString(kDeviceStateLicenseType));
EXPECT_EQ(*device_state.FindString(kDeviceStateLicenseType),
kDeviceStateLicenseTypeEnterprise);
}
TEST_F(EnrollmentStateFetcherTest, AutoREWithUndefinedLicense) {
ExpectOwnershipCheck();
ExpectStateKeysRequest();
ExpectOprfRequest();
ExpectQueryRequest();
em::DeviceManagementResponse response;
auto* state_response = response.mutable_device_state_retrieval_response();
state_response->set_restore_mode(
em::DeviceStateRetrievalResponse::RESTORE_MODE_REENROLLMENT_ZERO_TOUCH);
state_response->mutable_license_type()->set_license_type(
em::LicenseType::UNDEFINED);
EXPECT_CALL(job_creation_handler_,
OnJobCreation(JobWithStateRequest(
kTestStateKey, kTestSerialNumber, kTestBrandCode)))
.WillOnce(fake_dm_service_->SendJobOKAsync(response));
AutoEnrollmentState state = FetchEnrollmentState();
EXPECT_EQ(state, AutoEnrollmentState::kEnrollment);
const base::Value::Dict& device_state =
local_state_.GetDict(prefs::kServerBackedDeviceState);
ASSERT_TRUE(device_state.FindString(kDeviceStateLicenseType));
EXPECT_TRUE(device_state.FindString(kDeviceStateLicenseType)->empty());
}
TEST_F(EnrollmentStateFetcherTest, AutoREWithAnnualLicense) {
ExpectOwnershipCheck();
ExpectStateKeysRequest();
ExpectOprfRequest();
ExpectQueryRequest();
em::DeviceManagementResponse response;
auto* state_response = response.mutable_device_state_retrieval_response();
state_response->set_restore_mode(
em::DeviceStateRetrievalResponse::RESTORE_MODE_REENROLLMENT_ZERO_TOUCH);
state_response->mutable_license_type()->set_license_type(
em::LicenseType::CDM_ANNUAL);
EXPECT_CALL(job_creation_handler_,
OnJobCreation(JobWithStateRequest(
kTestStateKey, kTestSerialNumber, kTestBrandCode)))
.WillOnce(fake_dm_service_->SendJobOKAsync(response));
AutoEnrollmentState state = FetchEnrollmentState();
EXPECT_EQ(state, AutoEnrollmentState::kEnrollment);
const base::Value::Dict& device_state =
local_state_.GetDict(prefs::kServerBackedDeviceState);
ASSERT_TRUE(device_state.FindString(kDeviceStateLicenseType));
EXPECT_EQ(*device_state.FindString(kDeviceStateLicenseType),
kDeviceStateLicenseTypeEnterprise);
}
TEST_F(EnrollmentStateFetcherTest, AutoREWithKioskLicense) {
ExpectOwnershipCheck();
ExpectStateKeysRequest();
ExpectOprfRequest();
ExpectQueryRequest();
em::DeviceManagementResponse response;
auto* state_response = response.mutable_device_state_retrieval_response();
state_response->set_restore_mode(
em::DeviceStateRetrievalResponse::RESTORE_MODE_REENROLLMENT_ZERO_TOUCH);
state_response->mutable_license_type()->set_license_type(
em::LicenseType::KIOSK);
EXPECT_CALL(job_creation_handler_,
OnJobCreation(JobWithStateRequest(
kTestStateKey, kTestSerialNumber, kTestBrandCode)))
.WillOnce(fake_dm_service_->SendJobOKAsync(response));
AutoEnrollmentState state = FetchEnrollmentState();
EXPECT_EQ(state, AutoEnrollmentState::kEnrollment);
const base::Value::Dict& device_state =
local_state_.GetDict(prefs::kServerBackedDeviceState);
ASSERT_TRUE(device_state.FindString(kDeviceStateLicenseType));
EXPECT_EQ(*device_state.FindString(kDeviceStateLicenseType),
kDeviceStateLicenseTypeTerminal);
}
TEST_F(EnrollmentStateFetcherTest, AutoREWithPackagedLicense) {
ExpectOwnershipCheck();
ExpectStateKeysRequest();
ExpectOprfRequest();
ExpectQueryRequest();
em::DeviceManagementResponse response;
auto* state_response = response.mutable_device_state_retrieval_response();
state_response->set_restore_mode(
em::DeviceStateRetrievalResponse::RESTORE_MODE_REENROLLMENT_ZERO_TOUCH);
state_response->mutable_license_type()->set_license_type(
em::LicenseType::CDM_PACKAGED);
EXPECT_CALL(job_creation_handler_,
OnJobCreation(JobWithStateRequest(
kTestStateKey, kTestSerialNumber, kTestBrandCode)))
.WillOnce(fake_dm_service_->SendJobOKAsync(response));
AutoEnrollmentState state = FetchEnrollmentState();
EXPECT_EQ(state, AutoEnrollmentState::kEnrollment);
const base::Value::Dict& device_state =
local_state_.GetDict(prefs::kServerBackedDeviceState);
ASSERT_TRUE(device_state.FindString(kDeviceStateLicenseType));
EXPECT_EQ(*device_state.FindString(kDeviceStateLicenseType),
kDeviceStateLicenseTypeEnterprise);
}
} // namespace policy