• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 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.
4 
5 #include "chrome/browser/chromeos/login/signed_settings_helper.h"
6 
7 #include "chrome/browser/chromeos/cros/cros_library.h"
8 #include "chrome/browser/chromeos/cros_settings_names.h"
9 #include "chrome/browser/chromeos/login/mock_ownership_service.h"
10 #include "chrome/browser/chromeos/login/owner_manager.h"
11 #include "chrome/browser/chromeos/login/signed_settings.h"
12 #include "chrome/browser/policy/proto/chrome_device_policy.pb.h"
13 #include "chrome/browser/policy/proto/device_management_backend.pb.h"
14 #include "content/browser/browser_thread.h"
15 #include "testing/gmock/include/gmock/gmock.h"
16 #include "testing/gtest/include/gtest/gtest.h"
17 
18 using ::testing::_;
19 using ::testing::A;
20 using ::testing::AtLeast;
21 using ::testing::InSequence;
22 using ::testing::Invoke;
23 using ::testing::Return;
24 using ::testing::ReturnRef;
25 using ::testing::SaveArg;
26 using ::testing::WithArg;
27 
28 namespace em = enterprise_management;
29 namespace chromeos {
30 
31 class MockSignedSettingsHelperCallback : public SignedSettingsHelper::Callback {
32  public:
33   MOCK_METHOD2(OnCheckWhitelistCompleted, void(
34       SignedSettings::ReturnCode code, const std::string& email));
35   MOCK_METHOD2(OnWhitelistCompleted, void(
36       SignedSettings::ReturnCode code, const std::string& email));
37   MOCK_METHOD2(OnUnwhitelistCompleted, void(
38       SignedSettings::ReturnCode code, const std::string& email));
39   MOCK_METHOD3(OnStorePropertyCompleted, void(
40       SignedSettings::ReturnCode code,
41       const std::string& name,
42       const std::string& value));
43   MOCK_METHOD3(OnRetrievePropertyCompleted, void(
44       SignedSettings::ReturnCode code,
45       const std::string& name,
46       const std::string& value));
47 };
48 
49 class SignedSettingsHelperTest : public ::testing::Test,
50                                  public SignedSettingsHelper::TestDelegate {
51  public:
SignedSettingsHelperTest()52   SignedSettingsHelperTest()
53       : fake_email_("fakey@example.com"),
54         fake_prop_(kAccountsPrefAllowGuest),
55         fake_value_("false"),
56         message_loop_(MessageLoop::TYPE_UI),
57         ui_thread_(BrowserThread::UI, &message_loop_),
58         file_thread_(BrowserThread::FILE),
59         pending_ops_(0) {
60   }
61 
SetUp()62   virtual void SetUp() {
63     file_thread_.Start();
64     SignedSettingsHelper::Get()->set_test_delegate(this);
65   }
66 
TearDown()67   virtual void TearDown() {
68     SignedSettingsHelper::Get()->set_test_delegate(NULL);
69   }
70 
OnOpCreated(SignedSettings * op)71   virtual void OnOpCreated(SignedSettings* op) {
72     // Use MockOwnershipService for all SignedSettings op.
73     op->set_service(&m_);
74   }
75 
OnOpStarted(SignedSettings * op)76   virtual void OnOpStarted(SignedSettings* op) {
77   }
78 
OnOpCompleted(SignedSettings * op)79   virtual void OnOpCompleted(SignedSettings* op) {
80     --pending_ops_;
81     if (!pending_ops_)
82       MessageLoop::current()->Quit();
83   }
84 
OnKeyOpComplete(OwnerManager::Delegate * op)85   static void OnKeyOpComplete(OwnerManager::Delegate* op) {
86     op->OnKeyOpComplete(OwnerManager::SUCCESS, std::vector<uint8>());
87   }
88 
BuildPolicyData()89   em::PolicyData BuildPolicyData() {
90     em::PolicyData to_return;
91     em::ChromeDeviceSettingsProto pol;
92     to_return.set_policy_type(SignedSettings::kDevicePolicyType);
93     to_return.set_policy_value(pol.SerializeAsString());
94     return to_return;
95   }
96 
97   const std::string fake_email_;
98   const std::string fake_prop_;
99   const std::string fake_value_;
100   MockOwnershipService m_;
101 
102   MessageLoop message_loop_;
103   BrowserThread ui_thread_;
104   BrowserThread file_thread_;
105 
106   int pending_ops_;
107 
108   ScopedStubCrosEnabler stub_cros_enabler_;
109 };
110 
TEST_F(SignedSettingsHelperTest,SerializedOps)111 TEST_F(SignedSettingsHelperTest, SerializedOps) {
112   MockSignedSettingsHelperCallback cb;
113 
114   EXPECT_CALL(m_, GetStatus(_))
115       .Times(2)
116       .WillRepeatedly(Return(OwnershipService::OWNERSHIP_TAKEN));
117   EXPECT_CALL(m_, has_cached_policy())
118       .Times(5)
119       .WillRepeatedly(Return(true));
120   em::PolicyData fake_pol = BuildPolicyData();
121   EXPECT_CALL(m_, cached_policy())
122       .Times(5)
123       .WillRepeatedly(ReturnRef(fake_pol));
124   EXPECT_CALL(m_, set_cached_policy(A<const em::PolicyData&>()))
125       .Times(3)
126       .WillRepeatedly(SaveArg<0>(&fake_pol));
127 
128   InSequence s;
129   EXPECT_CALL(m_, StartSigningAttempt(_, A<OwnerManager::Delegate*>()))
130       .WillOnce(WithArg<1>(Invoke(&SignedSettingsHelperTest::OnKeyOpComplete)));
131   EXPECT_CALL(cb, OnWhitelistCompleted(SignedSettings::SUCCESS, _))
132       .Times(1);
133 
134   EXPECT_CALL(cb, OnCheckWhitelistCompleted(SignedSettings::SUCCESS, _))
135       .Times(1);
136 
137   EXPECT_CALL(m_, StartSigningAttempt(_, A<OwnerManager::Delegate*>()))
138       .WillOnce(WithArg<1>(Invoke(&SignedSettingsHelperTest::OnKeyOpComplete)));
139   EXPECT_CALL(cb, OnUnwhitelistCompleted(SignedSettings::SUCCESS, _))
140       .Times(1);
141 
142   EXPECT_CALL(m_, StartSigningAttempt(_, A<OwnerManager::Delegate*>()))
143       .WillOnce(WithArg<1>(Invoke(&SignedSettingsHelperTest::OnKeyOpComplete)));
144   EXPECT_CALL(cb, OnStorePropertyCompleted(SignedSettings::SUCCESS, _, _))
145       .Times(1);
146 
147   EXPECT_CALL(cb, OnRetrievePropertyCompleted(SignedSettings::SUCCESS, _, _))
148       .Times(1);
149 
150   pending_ops_ = 5;
151   SignedSettingsHelper::Get()->StartWhitelistOp(fake_email_, true, &cb);
152   SignedSettingsHelper::Get()->StartCheckWhitelistOp(fake_email_, &cb);
153   SignedSettingsHelper::Get()->StartWhitelistOp(fake_email_, false, &cb);
154   SignedSettingsHelper::Get()->StartStorePropertyOp(fake_prop_, fake_value_,
155       &cb);
156   SignedSettingsHelper::Get()->StartRetrieveProperty(fake_prop_, &cb);
157 
158   message_loop_.Run();
159 }
160 
TEST_F(SignedSettingsHelperTest,CanceledOps)161 TEST_F(SignedSettingsHelperTest, CanceledOps) {
162   MockSignedSettingsHelperCallback cb;
163 
164   EXPECT_CALL(m_, GetStatus(_))
165       .Times(2)
166       .WillRepeatedly(Return(OwnershipService::OWNERSHIP_TAKEN));
167   EXPECT_CALL(m_, has_cached_policy())
168       .Times(6)
169       .WillRepeatedly(Return(true));
170   em::PolicyData fake_pol = BuildPolicyData();
171   EXPECT_CALL(m_, cached_policy())
172       .Times(7)
173       .WillRepeatedly(ReturnRef(fake_pol));
174   EXPECT_CALL(m_, set_cached_policy(A<const em::PolicyData&>()))
175       .Times(3)
176       .WillRepeatedly(SaveArg<0>(&fake_pol));
177 
178   InSequence s;
179 
180   EXPECT_CALL(m_, StartSigningAttempt(_, A<OwnerManager::Delegate*>()))
181       .WillOnce(WithArg<1>(Invoke(&SignedSettingsHelperTest::OnKeyOpComplete)));
182   EXPECT_CALL(cb, OnWhitelistCompleted(SignedSettings::SUCCESS, _))
183       .Times(1);
184 
185   EXPECT_CALL(cb, OnCheckWhitelistCompleted(SignedSettings::SUCCESS, _))
186       .Times(1);
187 
188   EXPECT_CALL(m_, StartSigningAttempt(_, A<OwnerManager::Delegate*>()))
189       .WillOnce(WithArg<1>(Invoke(&SignedSettingsHelperTest::OnKeyOpComplete)));
190   EXPECT_CALL(cb, OnUnwhitelistCompleted(SignedSettings::SUCCESS, _))
191       .Times(1);
192 
193   // CheckWhitelistOp for cb_to_be_canceled still gets executed but callback
194   // does not happen.
195 
196   EXPECT_CALL(m_, StartSigningAttempt(_, A<OwnerManager::Delegate*>()))
197       .WillOnce(WithArg<1>(Invoke(&SignedSettingsHelperTest::OnKeyOpComplete)));
198   EXPECT_CALL(cb, OnStorePropertyCompleted(SignedSettings::SUCCESS, _, _))
199       .Times(1);
200 
201   EXPECT_CALL(cb, OnRetrievePropertyCompleted(SignedSettings::SUCCESS, _, _))
202       .Times(1);
203 
204   pending_ops_ = 6;
205   SignedSettingsHelper::Get()->StartWhitelistOp(fake_email_, true, &cb);
206   SignedSettingsHelper::Get()->StartCheckWhitelistOp(fake_email_, &cb);
207   SignedSettingsHelper::Get()->StartWhitelistOp(fake_email_, false, &cb);
208 
209   MockSignedSettingsHelperCallback cb_to_be_canceled;
210   SignedSettingsHelper::Get()->StartCheckWhitelistOp(fake_email_,
211       &cb_to_be_canceled);
212   SignedSettingsHelper::Get()->CancelCallback(&cb_to_be_canceled);
213 
214   SignedSettingsHelper::Get()->StartStorePropertyOp(fake_prop_, fake_value_,
215       &cb);
216   SignedSettingsHelper::Get()->StartRetrieveProperty(fake_prop_, &cb);
217 
218   message_loop_.Run();
219 }
220 
221 }  // namespace chromeos
222