1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
3bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// found in the LICENSE file.
4bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
5bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/chromeos/login/signed_settings_helper.h"
6bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
7bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/chromeos/cros/cros_library.h"
8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/cros_settings_names.h"
9bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/chromeos/login/mock_ownership_service.h"
10bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/chromeos/login/owner_manager.h"
11bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/chromeos/login/signed_settings.h"
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/policy/proto/chrome_device_policy.pb.h"
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/policy/proto/device_management_backend.pb.h"
14dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h"
15bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "testing/gmock/include/gmock/gmock.h"
16bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "testing/gtest/include/gtest/gtest.h"
17bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
18bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenusing ::testing::_;
19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenusing ::testing::A;
20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenusing ::testing::AtLeast;
21bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenusing ::testing::InSequence;
22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenusing ::testing::Invoke;
23dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenusing ::testing::Return;
24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenusing ::testing::ReturnRef;
25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenusing ::testing::SaveArg;
26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenusing ::testing::WithArg;
27bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace em = enterprise_management;
29bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsennamespace chromeos {
30bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
31bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass MockSignedSettingsHelperCallback : public SignedSettingsHelper::Callback {
32bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public:
3321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  MOCK_METHOD2(OnCheckWhitelistCompleted, void(
3421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      SignedSettings::ReturnCode code, const std::string& email));
35bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  MOCK_METHOD2(OnWhitelistCompleted, void(
3621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      SignedSettings::ReturnCode code, const std::string& email));
37bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  MOCK_METHOD2(OnUnwhitelistCompleted, void(
3821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      SignedSettings::ReturnCode code, const std::string& email));
39bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  MOCK_METHOD3(OnStorePropertyCompleted, void(
4021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      SignedSettings::ReturnCode code,
4121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      const std::string& name,
4221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      const std::string& value));
43bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  MOCK_METHOD3(OnRetrievePropertyCompleted, void(
4421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      SignedSettings::ReturnCode code,
4521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      const std::string& name,
4621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      const std::string& value));
47bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen};
48bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
49bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass SignedSettingsHelperTest : public ::testing::Test,
50bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                 public SignedSettingsHelper::TestDelegate {
51bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public:
52bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SignedSettingsHelperTest()
533f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      : fake_email_("fakey@example.com"),
54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        fake_prop_(kAccountsPrefAllowGuest),
55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        fake_value_("false"),
56bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        message_loop_(MessageLoop::TYPE_UI),
57731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        ui_thread_(BrowserThread::UI, &message_loop_),
58731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        file_thread_(BrowserThread::FILE),
59bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        pending_ops_(0) {
60bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
61bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
62bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void SetUp() {
63bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    file_thread_.Start();
64bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    SignedSettingsHelper::Get()->set_test_delegate(this);
65bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
66bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
67bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void TearDown() {
68bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    SignedSettingsHelper::Get()->set_test_delegate(NULL);
69bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
70bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
71bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void OnOpCreated(SignedSettings* op) {
72bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // Use MockOwnershipService for all SignedSettings op.
73bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    op->set_service(&m_);
74bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
75bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
76bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void OnOpStarted(SignedSettings* op) {
77bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
78bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
79bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void OnOpCompleted(SignedSettings* op) {
80bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    --pending_ops_;
81bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (!pending_ops_)
82bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      MessageLoop::current()->Quit();
83bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
84bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  static void OnKeyOpComplete(OwnerManager::Delegate* op) {
86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    op->OnKeyOpComplete(OwnerManager::SUCCESS, std::vector<uint8>());
87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  em::PolicyData BuildPolicyData() {
90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    em::PolicyData to_return;
91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    em::ChromeDeviceSettingsProto pol;
92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    to_return.set_policy_type(SignedSettings::kDevicePolicyType);
93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    to_return.set_policy_value(pol.SerializeAsString());
94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return to_return;
95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
97bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  const std::string fake_email_;
98bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  const std::string fake_prop_;
99bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  const std::string fake_value_;
100bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  MockOwnershipService m_;
101bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
102bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  MessageLoop message_loop_;
103731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BrowserThread ui_thread_;
104731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BrowserThread file_thread_;
105bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
106bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  int pending_ops_;
10721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
10821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ScopedStubCrosEnabler stub_cros_enabler_;
109bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen};
110bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
111bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(SignedSettingsHelperTest, SerializedOps) {
112bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  MockSignedSettingsHelperCallback cb;
113bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(m_, GetStatus(_))
115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .Times(2)
116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .WillRepeatedly(Return(OwnershipService::OWNERSHIP_TAKEN));
117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(m_, has_cached_policy())
118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .Times(5)
119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .WillRepeatedly(Return(true));
120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  em::PolicyData fake_pol = BuildPolicyData();
121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(m_, cached_policy())
122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .Times(5)
123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .WillRepeatedly(ReturnRef(fake_pol));
124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(m_, set_cached_policy(A<const em::PolicyData&>()))
125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .Times(3)
126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .WillRepeatedly(SaveArg<0>(&fake_pol));
127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
128bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  InSequence s;
129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(m_, StartSigningAttempt(_, A<OwnerManager::Delegate*>()))
130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .WillOnce(WithArg<1>(Invoke(&SignedSettingsHelperTest::OnKeyOpComplete)));
13121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  EXPECT_CALL(cb, OnWhitelistCompleted(SignedSettings::SUCCESS, _))
132bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      .Times(1);
133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(cb, OnCheckWhitelistCompleted(SignedSettings::SUCCESS, _))
135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .Times(1);
136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(m_, StartSigningAttempt(_, A<OwnerManager::Delegate*>()))
138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .WillOnce(WithArg<1>(Invoke(&SignedSettingsHelperTest::OnKeyOpComplete)));
13921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  EXPECT_CALL(cb, OnUnwhitelistCompleted(SignedSettings::SUCCESS, _))
140bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      .Times(1);
141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(m_, StartSigningAttempt(_, A<OwnerManager::Delegate*>()))
143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .WillOnce(WithArg<1>(Invoke(&SignedSettingsHelperTest::OnKeyOpComplete)));
14421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  EXPECT_CALL(cb, OnStorePropertyCompleted(SignedSettings::SUCCESS, _, _))
145bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      .Times(1);
146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
14721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  EXPECT_CALL(cb, OnRetrievePropertyCompleted(SignedSettings::SUCCESS, _, _))
148bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      .Times(1);
149bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
150bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  pending_ops_ = 5;
151bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SignedSettingsHelper::Get()->StartWhitelistOp(fake_email_, true, &cb);
152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SignedSettingsHelper::Get()->StartCheckWhitelistOp(fake_email_, &cb);
153bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SignedSettingsHelper::Get()->StartWhitelistOp(fake_email_, false, &cb);
154bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SignedSettingsHelper::Get()->StartStorePropertyOp(fake_prop_, fake_value_,
155bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      &cb);
156bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SignedSettingsHelper::Get()->StartRetrieveProperty(fake_prop_, &cb);
157bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
158bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  message_loop_.Run();
159bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
160bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
161bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(SignedSettingsHelperTest, CanceledOps) {
162bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  MockSignedSettingsHelperCallback cb;
163bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(m_, GetStatus(_))
165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .Times(2)
166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .WillRepeatedly(Return(OwnershipService::OWNERSHIP_TAKEN));
167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(m_, has_cached_policy())
168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .Times(6)
169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .WillRepeatedly(Return(true));
170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  em::PolicyData fake_pol = BuildPolicyData();
171ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(m_, cached_policy())
172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .Times(7)
173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .WillRepeatedly(ReturnRef(fake_pol));
174ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(m_, set_cached_policy(A<const em::PolicyData&>()))
175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .Times(3)
176ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .WillRepeatedly(SaveArg<0>(&fake_pol));
177ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
178bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  InSequence s;
179ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
180ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(m_, StartSigningAttempt(_, A<OwnerManager::Delegate*>()))
181ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .WillOnce(WithArg<1>(Invoke(&SignedSettingsHelperTest::OnKeyOpComplete)));
18221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  EXPECT_CALL(cb, OnWhitelistCompleted(SignedSettings::SUCCESS, _))
183bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      .Times(1);
184ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
185ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(cb, OnCheckWhitelistCompleted(SignedSettings::SUCCESS, _))
186ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .Times(1);
187ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
188ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(m_, StartSigningAttempt(_, A<OwnerManager::Delegate*>()))
189ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .WillOnce(WithArg<1>(Invoke(&SignedSettingsHelperTest::OnKeyOpComplete)));
19021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  EXPECT_CALL(cb, OnUnwhitelistCompleted(SignedSettings::SUCCESS, _))
191bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      .Times(1);
192bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
193bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // CheckWhitelistOp for cb_to_be_canceled still gets executed but callback
194bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // does not happen.
195bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
196ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(m_, StartSigningAttempt(_, A<OwnerManager::Delegate*>()))
197ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .WillOnce(WithArg<1>(Invoke(&SignedSettingsHelperTest::OnKeyOpComplete)));
19821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  EXPECT_CALL(cb, OnStorePropertyCompleted(SignedSettings::SUCCESS, _, _))
199bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      .Times(1);
200ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
20121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  EXPECT_CALL(cb, OnRetrievePropertyCompleted(SignedSettings::SUCCESS, _, _))
202bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      .Times(1);
203bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
204bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  pending_ops_ = 6;
205bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SignedSettingsHelper::Get()->StartWhitelistOp(fake_email_, true, &cb);
206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SignedSettingsHelper::Get()->StartCheckWhitelistOp(fake_email_, &cb);
207bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SignedSettingsHelper::Get()->StartWhitelistOp(fake_email_, false, &cb);
208bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
209bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  MockSignedSettingsHelperCallback cb_to_be_canceled;
210bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SignedSettingsHelper::Get()->StartCheckWhitelistOp(fake_email_,
211bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      &cb_to_be_canceled);
212bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SignedSettingsHelper::Get()->CancelCallback(&cb_to_be_canceled);
213bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
214bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SignedSettingsHelper::Get()->StartStorePropertyOp(fake_prop_, fake_value_,
215bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      &cb);
216bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SignedSettingsHelper::Get()->StartRetrieveProperty(fake_prop_, &cb);
217bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
218bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  message_loop_.Run();
219bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
220bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
221bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}  // namespace chromeos
222