1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/chromeos/policy/consumer_management_service.h"
8 #include "base/bind_helpers.h"
9 #include "base/callback.h"
10 #include "base/prefs/pref_registry_simple.h"
11 #include "base/prefs/pref_service.h"
12 #include "chrome/browser/browser_process.h"
13 #include "chrome/browser/chromeos/policy/device_policy_builder.h"
14 #include "chrome/browser/chromeos/settings/device_settings_test_helper.h"
15 #include "chrome/common/pref_names.h"
16 #include "chrome/test/base/browser_with_test_window_test.h"
17 #include "chrome/test/base/scoped_testing_local_state.h"
18 #include "chrome/test/base/testing_browser_process.h"
19 #include "chrome/test/base/testing_profile_manager.h"
20 #include "chromeos/dbus/cryptohome/rpc.pb.h"
21 #include "chromeos/dbus/cryptohome_client.h"
22 #include "chromeos/dbus/mock_cryptohome_client.h"
23 #include "policy/proto/device_management_backend.pb.h"
24 #include "testing/gmock/include/gmock/gmock.h"
25 #include "testing/gtest/include/gtest/gtest.h"
27 using testing::Invoke;
28 using testing::NiceMock;
31 namespace em = enterprise_management;
34 const char kAttributeOwnerId[] = "consumer_management.owner_id";
35 const char kTestOwner[] = "test@chromium.org.test";
40 class ConsumerManagementServiceTest : public BrowserWithTestWindowTest {
42 ConsumerManagementServiceTest()
43 : cryptohome_result_(false),
44 set_owner_status_(false) {
45 ON_CALL(mock_cryptohome_client_, GetBootAttribute(_, _))
47 Invoke(this, &ConsumerManagementServiceTest::MockGetBootAttribute));
48 ON_CALL(mock_cryptohome_client_, SetBootAttribute(_, _))
50 Invoke(this, &ConsumerManagementServiceTest::MockSetBootAttribute));
51 ON_CALL(mock_cryptohome_client_, FlushAndSignBootAttributes(_, _))
54 &ConsumerManagementServiceTest::
55 MockFlushAndSignBootAttributes));
58 virtual void SetUp() override {
59 BrowserWithTestWindowTest::SetUp();
61 testing_profile_manager_.reset(new TestingProfileManager(
62 TestingBrowserProcess::GetGlobal()));
63 ASSERT_TRUE(testing_profile_manager_->SetUp());
64 service_.reset(new ConsumerManagementService(&mock_cryptohome_client_,
68 virtual void TearDown() override {
69 testing_profile_manager_.reset();
72 BrowserWithTestWindowTest::TearDown();
75 ConsumerManagementService::EnrollmentStage GetEnrollmentStage() {
76 return static_cast<ConsumerManagementService::EnrollmentStage>(
77 g_browser_process->local_state()->GetInteger(
78 prefs::kConsumerManagementEnrollmentStage));
81 void SetEnrollmentStage(ConsumerManagementService::EnrollmentStage stage) {
82 g_browser_process->local_state()->SetInteger(
83 prefs::kConsumerManagementEnrollmentStage, stage);
86 void MockGetBootAttribute(
87 const cryptohome::GetBootAttributeRequest& request,
88 const chromeos::CryptohomeClient::ProtobufMethodCallback& callback) {
89 get_boot_attribute_request_ = request;
90 callback.Run(cryptohome_status_, cryptohome_result_, cryptohome_reply_);
93 void MockSetBootAttribute(
94 const cryptohome::SetBootAttributeRequest& request,
95 const chromeos::CryptohomeClient::ProtobufMethodCallback& callback) {
96 set_boot_attribute_request_ = request;
97 callback.Run(cryptohome_status_, cryptohome_result_, cryptohome_reply_);
100 void MockFlushAndSignBootAttributes(
101 const cryptohome::FlushAndSignBootAttributesRequest& request,
102 const chromeos::CryptohomeClient::ProtobufMethodCallback& callback) {
103 callback.Run(cryptohome_status_, cryptohome_result_, cryptohome_reply_);
106 void OnGetOwnerDone(const std::string& owner) {
110 void OnSetOwnerDone(bool status) {
111 set_owner_status_ = status;
114 NiceMock<chromeos::MockCryptohomeClient> mock_cryptohome_client_;
115 scoped_ptr<ConsumerManagementService> service_;
116 scoped_ptr<TestingProfileManager> testing_profile_manager_;
118 // Variables for setting the return value or catching the arguments of mock
120 chromeos::DBusMethodCallStatus cryptohome_status_;
121 bool cryptohome_result_;
122 cryptohome::BaseReply cryptohome_reply_;
123 cryptohome::GetBootAttributeRequest get_boot_attribute_request_;
124 cryptohome::SetBootAttributeRequest set_boot_attribute_request_;
126 bool set_owner_status_;
129 TEST_F(ConsumerManagementServiceTest, CanGetEnrollmentStage) {
130 EXPECT_EQ(ConsumerManagementService::ENROLLMENT_STAGE_NONE,
131 service_->GetEnrollmentStage());
133 SetEnrollmentStage(ConsumerManagementService::ENROLLMENT_STAGE_REQUESTED);
135 EXPECT_EQ(ConsumerManagementService::ENROLLMENT_STAGE_REQUESTED,
136 service_->GetEnrollmentStage());
139 TEST_F(ConsumerManagementServiceTest, CanSetEnrollmentStage) {
140 EXPECT_EQ(ConsumerManagementService::ENROLLMENT_STAGE_NONE,
141 GetEnrollmentStage());
143 service_->SetEnrollmentStage(
144 ConsumerManagementService::ENROLLMENT_STAGE_REQUESTED);
146 EXPECT_EQ(ConsumerManagementService::ENROLLMENT_STAGE_REQUESTED,
147 GetEnrollmentStage());
150 TEST_F(ConsumerManagementServiceTest, CanGetOwner) {
151 cryptohome_status_ = chromeos::DBUS_METHOD_CALL_SUCCESS;
152 cryptohome_result_ = true;
153 cryptohome_reply_.MutableExtension(cryptohome::GetBootAttributeReply::reply)->
154 set_value(kTestOwner);
156 service_->GetOwner(base::Bind(&ConsumerManagementServiceTest::OnGetOwnerDone,
157 base::Unretained(this)));
159 EXPECT_EQ(kAttributeOwnerId, get_boot_attribute_request_.name());
160 EXPECT_EQ(kTestOwner, owner_);
163 TEST_F(ConsumerManagementServiceTest, GetOwnerReturnsAnEmptyStringWhenItFails) {
164 cryptohome_status_ = chromeos::DBUS_METHOD_CALL_FAILURE;
165 cryptohome_result_ = false;
166 cryptohome_reply_.MutableExtension(cryptohome::GetBootAttributeReply::reply)->
167 set_value(kTestOwner);
169 service_->GetOwner(base::Bind(&ConsumerManagementServiceTest::OnGetOwnerDone,
170 base::Unretained(this)));
172 EXPECT_EQ("", owner_);
175 TEST_F(ConsumerManagementServiceTest, CanSetOwner) {
176 cryptohome_status_ = chromeos::DBUS_METHOD_CALL_SUCCESS;
177 cryptohome_result_ = true;
179 service_->SetOwner(kTestOwner,
180 base::Bind(&ConsumerManagementServiceTest::OnSetOwnerDone,
181 base::Unretained(this)));
183 EXPECT_EQ(kAttributeOwnerId, set_boot_attribute_request_.name());
184 EXPECT_EQ(kTestOwner, set_boot_attribute_request_.value());
185 EXPECT_TRUE(set_owner_status_);
188 TEST_F(ConsumerManagementServiceTest, SetOwnerReturnsFalseWhenItFails) {
189 cryptohome_status_ = chromeos::DBUS_METHOD_CALL_FAILURE;
190 cryptohome_result_ = false;
192 service_->SetOwner(kTestOwner,
193 base::Bind(&ConsumerManagementServiceTest::OnSetOwnerDone,
194 base::Unretained(this)));
196 EXPECT_FALSE(set_owner_status_);
199 class ConsumerManagementServiceStatusTest
200 : public chromeos::DeviceSettingsTestBase {
202 ConsumerManagementServiceStatusTest()
203 : testing_local_state_(TestingBrowserProcess::GetGlobal()),
204 service_(NULL, &device_settings_service_) {
207 void SetEnrollmentStage(ConsumerManagementService::EnrollmentStage stage) {
208 testing_local_state_.Get()->SetInteger(
209 prefs::kConsumerManagementEnrollmentStage, stage);
212 void SetManagementMode(em::PolicyData::ManagementMode mode) {
213 device_policy_.policy_data().set_management_mode(mode);
214 device_policy_.Build();
215 device_settings_test_helper_.set_policy_blob(device_policy_.GetBlob());
216 ReloadDeviceSettings();
219 ScopedTestingLocalState testing_local_state_;
220 ConsumerManagementService service_;
223 TEST_F(ConsumerManagementServiceStatusTest,
224 GetStatusGetStatusStringAndHasPendingEnrollmentNotificationWork) {
225 EXPECT_EQ(ConsumerManagementService::STATUS_UNKNOWN, service_.GetStatus());
226 EXPECT_EQ("StatusUnknown", service_.GetStatusString());
228 SetManagementMode(em::PolicyData::NOT_MANAGED);
229 SetEnrollmentStage(ConsumerManagementService::ENROLLMENT_STAGE_NONE);
231 EXPECT_EQ(ConsumerManagementService::STATUS_UNENROLLED, service_.GetStatus());
232 EXPECT_EQ("StatusUnenrolled", service_.GetStatusString());
233 EXPECT_FALSE(service_.HasPendingEnrollmentNotification());
235 SetEnrollmentStage(ConsumerManagementService::ENROLLMENT_STAGE_REQUESTED);
237 EXPECT_EQ(ConsumerManagementService::STATUS_ENROLLING, service_.GetStatus());
238 EXPECT_EQ("StatusEnrolling", service_.GetStatusString());
240 SetManagementMode(em::PolicyData::CONSUMER_MANAGED);
241 SetEnrollmentStage(ConsumerManagementService::ENROLLMENT_STAGE_SUCCESS);
243 EXPECT_EQ(ConsumerManagementService::STATUS_ENROLLED, service_.GetStatus());
244 EXPECT_EQ("StatusEnrolled", service_.GetStatusString());
245 EXPECT_TRUE(service_.HasPendingEnrollmentNotification());
247 // TODO(davidyu): Test for STATUS_UNENROLLING when it is implemented.
248 // http://crbug.com/353050.
251 } // namespace policy