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.h"
6bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
7bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/file_util.h"
8bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/logging.h"
9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_temp_dir.h"
10bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/stringprintf.h"
11bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/chromeos/cros/cros_library.h"
1221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/chromeos/cros/mock_library_loader.h"
1321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/chromeos/cros/mock_login_library.h"
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/cros_settings_names.h"
15bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/chromeos/login/mock_owner_key_utils.h"
16bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/chromeos/login/mock_ownership_service.h"
17bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/chromeos/login/owner_manager_unittest.h"
18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/policy/proto/chrome_device_policy.pb.h"
19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/policy/proto/device_management_backend.pb.h"
2021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/test/thread_test_helper.h"
21dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h"
22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "crypto/rsa_private_key.h"
23bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "testing/gmock/include/gmock/gmock.h"
24bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "testing/gtest/include/gtest/gtest.h"
25bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenusing ::testing::A;
2721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenusing ::testing::AnyNumber;
28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenusing ::testing::InvokeArgument;
29bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenusing ::testing::Return;
30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenusing ::testing::ReturnRef;
31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenusing ::testing::SaveArg;
32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenusing ::testing::StrEq;
33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenusing ::testing::WithArg;
34bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenusing ::testing::_;
35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenusing google::protobuf::RepeatedPtrField;
36bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace em = enterprise_management;
38bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsennamespace chromeos {
39bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
40bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsennamespace {
41bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsentemplate <class T>
42bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass DummyDelegate : public SignedSettings::Delegate<T> {
43bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public:
44bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  explicit DummyDelegate(T to_expect)
45bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      : expect_success_(false),
4621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        expected_failure_(SignedSettings::SUCCESS),
47bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        expected_(to_expect),
48bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        run_(false) {}
49bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual ~DummyDelegate() { EXPECT_TRUE(run_); }
5021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual void OnSettingsOpCompleted(SignedSettings::ReturnCode code,
5121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                                     T value) {
52bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    run_ = true;
5321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    if (expect_success_)
54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      compare_expected(value);
5521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    EXPECT_EQ(expected_failure_, code);
56bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
5721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual void expect_success() {
5821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    expect_success_ = true;
5921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    expected_failure_ = SignedSettings::SUCCESS;
6021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  }
6121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual void expect_failure(SignedSettings::ReturnCode code) {
6221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    expect_success_ = false;
6321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    expected_failure_ = code;
64bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen protected:
67bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  bool expect_success_;
6821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  SignedSettings::ReturnCode expected_failure_;
69bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  T expected_;
70bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  bool run_;
71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void compare_expected(T to_compare) = 0;
72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsentemplate <class T>
75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass NormalDelegate : public DummyDelegate<T> {
76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public:
77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  explicit NormalDelegate(T to_expect) : DummyDelegate<T>(to_expect) {}
78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual ~NormalDelegate() {}
79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen protected:
80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void compare_expected(T to_compare) {
81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    EXPECT_EQ(this->expected_, to_compare);  // without this-> this won't build.
82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass ProtoDelegate : public DummyDelegate<const em::PolicyFetchResponse&> {
86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public:
87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  explicit ProtoDelegate(const em::PolicyFetchResponse& e)
88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      : DummyDelegate<const em::PolicyFetchResponse&>(e) {
89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual ~ProtoDelegate() {}
91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen protected:
92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void compare_expected(const em::PolicyFetchResponse& to_compare) {
93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    std::string ex_string, comp_string;
94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    EXPECT_TRUE(expected_.SerializeToString(&ex_string));
95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    EXPECT_TRUE(to_compare.SerializeToString(&comp_string));
96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    EXPECT_EQ(ex_string, comp_string);
97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
98bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen};
99bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
100bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}  // anonymous namespace
101bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
102bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass SignedSettingsTest : public ::testing::Test {
103bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public:
104bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SignedSettingsTest()
1053f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      : fake_email_("fakey@example.com"),
106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        fake_domain_("*@example.com"),
107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        fake_prop_(kAccountsPrefAllowGuest),
108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        fake_value_("false"),
109bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        message_loop_(MessageLoop::TYPE_UI),
110731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        ui_thread_(BrowserThread::UI, &message_loop_),
111731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        file_thread_(BrowserThread::FILE),
112bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        mock_(new MockKeyUtils),
113bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        injector_(mock_) /* injector_ takes ownership of mock_ */ {
114bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
115bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
116bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual ~SignedSettingsTest() {}
117bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
118bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void SetUp() {
119bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    file_thread_.Start();
120bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
121bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
122bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void TearDown() {
123bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    OwnerKeyUtils::set_factory(NULL);
124bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
125bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
126bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void mock_service(SignedSettings* s, MockOwnershipService* m) {
127bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    s->set_service(m);
128bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
129bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  em::PolicyData BuildPolicyData(std::vector<std::string> whitelist) {
131ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    em::PolicyData to_return;
132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    em::ChromeDeviceSettingsProto pol;
133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    em::GuestModeEnabledProto* allow = pol.mutable_guest_mode_enabled();
134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    allow->set_guest_mode_enabled(false);
135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    pol.mutable_device_proxy_settings()->set_proxy_mode("direct");
136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!whitelist.empty()) {
138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      em::UserWhitelistProto* whitelist_proto = pol.mutable_user_whitelist();
139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      for (std::vector<std::string>::const_iterator it = whitelist.begin();
140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen           it != whitelist.end();
141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen           ++it) {
142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        whitelist_proto->add_user_whitelist(*it);
143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    to_return.set_policy_type(SignedSettings::kDevicePolicyType);
147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    to_return.set_policy_value(pol.SerializeAsString());
148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return to_return;
149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
150bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void SetAllowNewUsers(bool desired, em::PolicyData* poldata) {
152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    em::ChromeDeviceSettingsProto pol;
153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    pol.ParseFromString(poldata->policy_value());
154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    em::AllowNewUsersProto* allow = pol.mutable_allow_new_users();
155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    allow->set_allow_new_users(desired);
156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    poldata->set_policy_value(pol.SerializeAsString());
157bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
158bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool CheckWhitelist(const std::string& email, const em::PolicyData& poldata) {
160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!poldata.has_policy_value())
161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return false;
162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    em::ChromeDeviceSettingsProto pol;
163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    pol.ParseFromString(poldata.policy_value());
164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!pol.has_user_whitelist())
165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return false;
166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const RepeatedPtrField<std::string>& whitelist =
168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        pol.user_whitelist().user_whitelist();
169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    for (RepeatedPtrField<std::string>::const_iterator it = whitelist.begin();
170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen         it != whitelist.end();
171ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen         ++it) {
172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (email == *it)
173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return true;
174ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return false;
176ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
177bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
178ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void ExpectWhitelistOp(SignedSettings* s,
179ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                         em::PolicyData* fake_pol,
180ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                         em::PolicyData* out_pol) {
181ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    mock_service(s, &m_);
182ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    EXPECT_CALL(m_, StartSigningAttempt(_, _))
183bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        .Times(1);
184ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    EXPECT_CALL(m_, has_cached_policy())
185ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        .WillOnce(Return(true));
186ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    EXPECT_CALL(m_, cached_policy())
187ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        .WillOnce(ReturnRef(*fake_pol));
188ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    EXPECT_CALL(m_, set_cached_policy(A<const em::PolicyData&>()))
189ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        .WillOnce(SaveArg<0>(out_pol));
190bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
191bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
192bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void FailingStorePropertyOp(const OwnerManager::KeyOpCode return_code) {
193ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NormalDelegate<bool> d(false);
194bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    scoped_refptr<SignedSettings> s(
195bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        SignedSettings::CreateStorePropertyOp(fake_prop_, fake_value_, &d));
19621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    d.expect_failure(SignedSettings::MapKeyOpCode(return_code));
197ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
198bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    mock_service(s.get(), &m_);
199ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    EXPECT_CALL(m_, StartSigningAttempt(_, _))
200bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        .Times(1);
201dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    EXPECT_CALL(m_, GetStatus(_))
202dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        .WillOnce(Return(OwnershipService::OWNERSHIP_TAKEN));
203ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    EXPECT_CALL(m_, has_cached_policy())
204ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        .WillOnce(Return(true));
205ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    em::PolicyData fake_pol;
206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    EXPECT_CALL(m_, cached_policy())
207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        .WillOnce(ReturnRef(fake_pol));
208bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
20921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    s->Execute();
210bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    s->OnKeyOpComplete(return_code, std::vector<uint8>());
211ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    message_loop_.RunAllPending();
212bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
213bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
214ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void FailingStorePolicyOp(const OwnerManager::KeyOpCode return_code) {
215ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NormalDelegate<bool> d(false);
21621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    d.expect_failure(SignedSettings::MapKeyOpCode(return_code));
217ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
218ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    em::PolicyFetchResponse fake_policy;
219ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    fake_policy.set_policy_data(fake_prop_);
220ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    std::string serialized;
221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASSERT_TRUE(fake_policy.SerializeToString(&serialized));
222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
223ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    scoped_refptr<SignedSettings> s(
224ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        SignedSettings::CreateStorePolicyOp(&fake_policy, &d));
225ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
226bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    mock_service(s.get(), &m_);
227ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    EXPECT_CALL(m_, StartSigningAttempt(StrEq(fake_prop_), _))
228bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        .Times(1);
229bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
23021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    s->Execute();
231bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    s->OnKeyOpComplete(return_code, std::vector<uint8>());
232ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    message_loop_.RunAllPending();
233bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
234bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
23521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  MockLoginLibrary* MockLoginLib() {
23621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    chromeos::CrosLibrary::TestApi* test_api =
23721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        chromeos::CrosLibrary::Get()->GetTestApi();
23821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
23921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    // Mocks, ownership transferred to CrosLibrary class on creation.
24021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    MockLoginLibrary* mock_library;
24121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    MockLibraryLoader* loader;
24221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
24321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    loader = new MockLibraryLoader();
24421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    ON_CALL(*loader, Load(_))
24521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        .WillByDefault(Return(true));
24621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    EXPECT_CALL(*loader, Load(_))
24721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        .Times(AnyNumber());
24821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
24921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    test_api->SetLibraryLoader(loader, true);
25021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
25121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    mock_library = new MockLoginLibrary();
25221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    test_api->SetLoginLibrary(mock_library, true);
25321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    return mock_library;
25421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  }
25521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
25621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  void UnMockLoginLib() {
25721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    // Prevent bogus gMock leak check from firing.
25821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    chromeos::CrosLibrary::TestApi* test_api =
25921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        chromeos::CrosLibrary::Get()->GetTestApi();
26021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    test_api->SetLibraryLoader(NULL, false);
26121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    test_api->SetLoginLibrary(NULL, false);
26221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  }
26321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
264ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  em::PolicyFetchResponse BuildProto(const std::string& data,
265ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                     const std::string& sig,
266ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                     std::string* out_serialized) {
267ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    em::PolicyFetchResponse fake_policy;
268ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!data.empty())
269ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      fake_policy.set_policy_data(data);
270ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!sig.empty())
271ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      fake_policy.set_policy_data_signature(sig);
272ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    EXPECT_TRUE(fake_policy.SerializeToString(out_serialized));
273ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return fake_policy;
274ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
275ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
276ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void DoRetrieveProperty(const std::string& name,
277ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                          const std::string& value,
278ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                          em::PolicyData* fake_pol) {
279ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NormalDelegate<std::string> d(value);
280ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    d.expect_success();
281ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    scoped_refptr<SignedSettings> s(
282ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        SignedSettings::CreateRetrievePropertyOp(name, &d));
283ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    mock_service(s.get(), &m_);
284ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    EXPECT_CALL(m_, GetStatus(_))
285ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        .WillOnce(Return(OwnershipService::OWNERSHIP_TAKEN));
286ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    EXPECT_CALL(m_, has_cached_policy())
287ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        .WillOnce(Return(true));
288ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
289ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    EXPECT_CALL(m_, cached_policy())
290ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        .WillOnce(ReturnRef(*fake_pol));
291ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
292ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    s->Execute();
293ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    message_loop_.RunAllPending();
294ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
295ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
296bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  const std::string fake_email_;
297ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const std::string fake_domain_;
298bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  const std::string fake_prop_;
299bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  const std::string fake_value_;
300bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  MockOwnershipService m_;
301bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
302bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ScopedTempDir tmpdir_;
303bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  FilePath tmpfile_;
304bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
305bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  MessageLoop message_loop_;
306731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BrowserThread ui_thread_;
307731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BrowserThread file_thread_;
308bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
309bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::vector<uint8> fake_public_key_;
310ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_ptr<crypto::RSAPrivateKey> fake_private_key_;
311bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
312bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  MockKeyUtils* mock_;
313bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  MockInjector injector_;
314bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
31521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ScopedStubCrosEnabler stub_cros_enabler_;
316bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen};
317bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
318bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(SignedSettingsTest, CheckWhitelist) {
319ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  NormalDelegate<bool> d(true);
320bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  d.expect_success();
321bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  scoped_refptr<SignedSettings> s(
322bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      SignedSettings::CreateCheckWhitelistOp(fake_email_, &d));
323bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
324bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  mock_service(s.get(), &m_);
325ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(m_, has_cached_policy())
326ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .WillOnce(Return(true));
327ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
328ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::vector<std::string> whitelist(1, fake_email_);
329ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  whitelist.push_back(fake_email_ + "m");
330ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  em::PolicyData fake_pol = BuildPolicyData(whitelist);
331ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(m_, cached_policy())
332ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .WillOnce(ReturnRef(fake_pol));
333bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
33421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  s->Execute();
335ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  message_loop_.RunAllPending();
336bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
337bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
338ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(SignedSettingsTest, CheckWhitelistWildcards) {
339ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  NormalDelegate<bool> d(true);
340ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  d.expect_success();
34121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  scoped_refptr<SignedSettings> s(
34221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      SignedSettings::CreateCheckWhitelistOp(fake_email_, &d));
343ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
344ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  mock_service(s.get(), &m_);
345ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(m_, has_cached_policy())
346ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .WillOnce(Return(true));
347ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
348ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::vector<std::string> whitelist(1, fake_domain_);
349ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  whitelist.push_back(fake_email_ + "m");
350ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  em::PolicyData fake_pol = BuildPolicyData(whitelist);
351ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(m_, cached_policy())
352ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .WillOnce(ReturnRef(fake_pol))
353ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .WillOnce(ReturnRef(fake_pol));
354ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
35521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  s->Execute();
356ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  message_loop_.RunAllPending();
35721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
35821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
359ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(SignedSettingsTest, CheckWhitelistNotFound) {
360ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  NormalDelegate<bool> d(true);
361ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_refptr<SignedSettings> s(
362ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      SignedSettings::CreateCheckWhitelistOp(fake_email_, &d));
363ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  d.expect_failure(SignedSettings::NOT_FOUND);
364bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
365ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  mock_service(s.get(), &m_);
366ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(m_, has_cached_policy())
367ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .WillOnce(Return(true));
368ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
369ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::vector<std::string> whitelist(1, fake_email_ + "m");
370ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  em::PolicyData fake_pol = BuildPolicyData(whitelist);
371ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(m_, cached_policy())
372ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .WillOnce(ReturnRef(fake_pol))
373ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .WillOnce(ReturnRef(fake_pol));
374ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
375ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s->Execute();
376ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  message_loop_.RunAllPending();
377bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
378bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
379bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(SignedSettingsTest, Whitelist) {
380ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  NormalDelegate<bool> d(true);
381bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  d.expect_success();
382bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  scoped_refptr<SignedSettings> s(
383bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      SignedSettings::CreateWhitelistOp(fake_email_, true, &d));
384ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  em::PolicyData in_pol = BuildPolicyData(std::vector<std::string>());
385ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  em::PolicyData out_pol;
386ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ExpectWhitelistOp(s.get(), &in_pol, &out_pol);
387bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
388ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s->Execute();
389ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s->OnKeyOpComplete(OwnerManager::SUCCESS, std::vector<uint8>());
390ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  message_loop_.RunAllPending();
391ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
392ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_TRUE(CheckWhitelist(fake_email_, out_pol));
393ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
394ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
395ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(SignedSettingsTest, AddToExistingWhitelist) {
396ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  NormalDelegate<bool> d(true);
397ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  d.expect_success();
398ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_refptr<SignedSettings> s(
399ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      SignedSettings::CreateWhitelistOp(fake_email_, true, &d));
400ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  em::PolicyData in_pol =
401ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      BuildPolicyData(std::vector<std::string>(1, fake_domain_));
402ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  em::PolicyData out_pol;
403ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ExpectWhitelistOp(s.get(), &in_pol, &out_pol);
404bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
40521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  s->Execute();
406bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  s->OnKeyOpComplete(OwnerManager::SUCCESS, std::vector<uint8>());
40721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  message_loop_.RunAllPending();
408ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
409ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_TRUE(CheckWhitelist(fake_email_, out_pol));
410bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
411bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
412bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(SignedSettingsTest, Unwhitelist) {
413ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  NormalDelegate<bool> d(true);
414bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  d.expect_success();
415bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  scoped_refptr<SignedSettings> s(
416bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      SignedSettings::CreateWhitelistOp(fake_email_, false, &d));
417ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  em::PolicyData in_pol =
418ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      BuildPolicyData(std::vector<std::string>(1, fake_email_));
419ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  em::PolicyData out_pol;
420ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ExpectWhitelistOp(s.get(), &in_pol, &out_pol);
421bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
42221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  s->Execute();
423bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  s->OnKeyOpComplete(OwnerManager::SUCCESS, std::vector<uint8>());
42421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  message_loop_.RunAllPending();
425bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
426ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_FALSE(CheckWhitelist(fake_email_, out_pol));
427bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
428bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
429ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(SignedSettingsTest, RemoveFromExistingWhitelist) {
430ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  NormalDelegate<bool> d(true);
431ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  d.expect_success();
432ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_refptr<SignedSettings> s(
433ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      SignedSettings::CreateWhitelistOp(fake_email_, false, &d));
434ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::vector<std::string> whitelist(1, fake_domain_);
435ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  whitelist.push_back(fake_email_);
436ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  whitelist.push_back(fake_email_ + "m");
437ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  em::PolicyData in_pol = BuildPolicyData(whitelist);
438ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  em::PolicyData out_pol;
439ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ExpectWhitelistOp(s.get(), &in_pol, &out_pol);
440ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
441ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s->Execute();
442ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s->OnKeyOpComplete(OwnerManager::SUCCESS, std::vector<uint8>());
443ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  message_loop_.RunAllPending();
444ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
445ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_FALSE(CheckWhitelist(fake_email_, out_pol));
446bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
447bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
448bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(SignedSettingsTest, StoreProperty) {
449ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  NormalDelegate<bool> d(true);
450bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  d.expect_success();
451bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  scoped_refptr<SignedSettings> s(
452bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      SignedSettings::CreateStorePropertyOp(fake_prop_, fake_value_, &d));
453ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
454bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  mock_service(s.get(), &m_);
455ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(m_, StartSigningAttempt(_, _))
456bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      .Times(1);
457dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  EXPECT_CALL(m_, GetStatus(_))
458dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      .WillOnce(Return(OwnershipService::OWNERSHIP_TAKEN));
459ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(m_, has_cached_policy())
460ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .WillOnce(Return(true));
461ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  em::PolicyData in_pol =
462ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      BuildPolicyData(std::vector<std::string>(1, fake_email_));
463ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(m_, cached_policy())
464ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .WillOnce(ReturnRef(in_pol));
465ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  em::PolicyData out_pol;
466ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(m_, set_cached_policy(A<const em::PolicyData&>()))
467ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .WillOnce(SaveArg<0>(&out_pol));
468bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
46921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  s->Execute();
470bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  s->OnKeyOpComplete(OwnerManager::SUCCESS, std::vector<uint8>());
47121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  message_loop_.RunAllPending();
472ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
473ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_TRUE(out_pol.has_policy_value());
474ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  em::ChromeDeviceSettingsProto pol;
475ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  pol.ParseFromString(out_pol.policy_value());
476ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_TRUE(pol.has_guest_mode_enabled());
477ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_TRUE(pol.guest_mode_enabled().has_guest_mode_enabled());
478ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_FALSE(pol.guest_mode_enabled().guest_mode_enabled());
479bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
480bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
481bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(SignedSettingsTest, StorePropertyNoKey) {
482bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  FailingStorePropertyOp(OwnerManager::KEY_UNAVAILABLE);
483bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
484bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
485bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(SignedSettingsTest, StorePropertyFailed) {
486bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  FailingStorePropertyOp(OwnerManager::OPERATION_FAILED);
487bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
488bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
489bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(SignedSettingsTest, RetrieveProperty) {
490ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  em::PolicyData fake_pol = BuildPolicyData(std::vector<std::string>());
491ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DoRetrieveProperty(fake_prop_, fake_value_, &fake_pol);
492ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
493ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
494ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(SignedSettingsTest, RetrieveOwnerProperty) {
495ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  em::PolicyData fake_pol = BuildPolicyData(std::vector<std::string>());
496ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  fake_pol.set_username(fake_email_);
497ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DoRetrieveProperty(kDeviceOwner, fake_email_, &fake_pol);
498ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
499ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
500ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(SignedSettingsTest, ExplicitlyAllowNewUsers) {
501ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  em::PolicyData fake_pol = BuildPolicyData(std::vector<std::string>());
502ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SetAllowNewUsers(true, &fake_pol);
503ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DoRetrieveProperty(kAccountsPrefAllowNewUser, "true", &fake_pol);
504ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
505ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
506ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(SignedSettingsTest, ExplicitlyDisallowNewUsers) {
507ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::vector<std::string> whitelist(1, fake_email_ + "m");
508ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  em::PolicyData fake_pol = BuildPolicyData(whitelist);
509ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SetAllowNewUsers(false, &fake_pol);
510ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DoRetrieveProperty(kAccountsPrefAllowNewUser, "false", &fake_pol);
511ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
512ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
513ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(SignedSettingsTest, ImplicitlyDisallowNewUsers) {
514ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::vector<std::string> whitelist(1, fake_email_ + "m");
515ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  em::PolicyData fake_pol = BuildPolicyData(whitelist);
516ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DoRetrieveProperty(kAccountsPrefAllowNewUser, "false", &fake_pol);
517ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
518ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
519ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(SignedSettingsTest, AccidentallyDisallowNewUsers) {
520ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  em::PolicyData fake_pol = BuildPolicyData(std::vector<std::string>());
521ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SetAllowNewUsers(false, &fake_pol);
522ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DoRetrieveProperty(kAccountsPrefAllowNewUser, "true", &fake_pol);
523ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
524ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
525ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(SignedSettingsTest, RetrievePropertyNotFound) {
526ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  NormalDelegate<std::string> d(fake_value_);
527ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  d.expect_failure(SignedSettings::NOT_FOUND);
528ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_refptr<SignedSettings> s(
529ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      SignedSettings::CreateRetrievePropertyOp("unknown_prop", &d));
530ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  mock_service(s.get(), &m_);
531ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(m_, GetStatus(_))
532ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .WillOnce(Return(OwnershipService::OWNERSHIP_TAKEN));
533ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(m_, has_cached_policy())
534ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .WillOnce(Return(true));
535ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
536ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  em::PolicyData fake_pol = BuildPolicyData(std::vector<std::string>());
537ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(m_, cached_policy())
538ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .WillOnce(ReturnRef(fake_pol));
539ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
540ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s->Execute();
541ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  message_loop_.RunAllPending();
542ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
543ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
544ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenACTION_P(Retrieve, s) { (*arg0)((void*)arg1, s.c_str(), s.length()); }
545ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenACTION_P(FinishKeyOp, s) { arg2->OnKeyOpComplete(OwnerManager::SUCCESS, s); }
546ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
547ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(SignedSettingsTest, RetrievePolicyToRetrieveProperty) {
548ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  NormalDelegate<std::string> d(fake_value_);
549bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  d.expect_success();
550bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  scoped_refptr<SignedSettings> s(
551bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      SignedSettings::CreateRetrievePropertyOp(fake_prop_, &d));
552ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
553ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  em::PolicyData fake_pol = BuildPolicyData(std::vector<std::string>());
554ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string data = fake_pol.SerializeAsString();
555ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string signed_serialized;
556ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  em::PolicyFetchResponse signed_policy = BuildProto(data,
557ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                                     fake_value_,
558ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                                     &signed_serialized);
559ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  MockLoginLibrary* lib = MockLoginLib();
560ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(*lib, RequestRetrievePolicy(_, _))
561ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .WillOnce(Retrieve(signed_serialized))
562ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .RetiresOnSaturation();
563ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
564bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  mock_service(s.get(), &m_);
565ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
566dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  EXPECT_CALL(m_, GetStatus(_))
567ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .WillOnce(Return(OwnershipService::OWNERSHIP_TAKEN))
568dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      .WillOnce(Return(OwnershipService::OWNERSHIP_TAKEN));
569ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(m_, has_cached_policy())
570ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .WillOnce(Return(false))
571ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .WillOnce(Return(true));
572ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  em::PolicyData out_pol;
573ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(m_, set_cached_policy(A<const em::PolicyData&>()))
574ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .WillOnce(SaveArg<0>(&out_pol));
575ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(m_, cached_policy())
576ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .WillOnce(ReturnRef(out_pol));
577ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
578ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::vector<uint8> fake_sig(fake_value_.c_str(),
579ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                              fake_value_.c_str() + fake_value_.length());
580ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(m_, StartVerifyAttempt(data, fake_sig, _))
581ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .WillOnce(FinishKeyOp(fake_sig))
582ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .RetiresOnSaturation();
583bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
58421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  s->Execute();
585ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  message_loop_.RunAllPending();
586ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  UnMockLoginLib();
587bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
588bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
589ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(SignedSettingsTest, SignAndStorePolicy) {
590ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  NormalDelegate<bool> d(true);
591ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  d.expect_success();
592ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
593ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  em::PolicyData in_pol = BuildPolicyData(std::vector<std::string>());
594ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string data_serialized = in_pol.SerializeAsString();
595ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string serialized;
596ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  em::PolicyFetchResponse fake_policy = BuildProto(data_serialized,
597ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                                   std::string(),
598ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                                   &serialized);
59921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  scoped_refptr<SignedSettings> s(
600ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      SignedSettings::CreateStorePolicyOp(&fake_policy, &d));
601ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
602ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  mock_service(s.get(), &m_);
603ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(m_, StartSigningAttempt(StrEq(data_serialized), _))
604ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .Times(1);
605ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  em::PolicyData out_pol;
606ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(m_, set_cached_policy(A<const em::PolicyData&>()))
607ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .WillOnce(SaveArg<0>(&out_pol));
608ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
609ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Ask for signature over unsigned policy.
610ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s->Execute();
611ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  message_loop_.RunAllPending();
612ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
613ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Fake out a successful signing.
614ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string signed_serialized;
615ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  em::PolicyFetchResponse signed_policy = BuildProto(data_serialized,
616ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                                     fake_value_,
617ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                                     &signed_serialized);
618ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::vector<uint8> fake_sig(fake_value_.c_str(),
619ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                              fake_value_.c_str() + fake_value_.length());
620ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
621ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  MockLoginLibrary* lib = MockLoginLib();
622ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(*lib, RequestStorePolicy(StrEq(signed_serialized), _, s.get()))
623ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .WillOnce(InvokeArgument<1>(static_cast<void*>(s.get()), true))
624ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .RetiresOnSaturation();
625ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s->OnKeyOpComplete(OwnerManager::SUCCESS, fake_sig);
626ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  message_loop_.RunAllPending();
627ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  UnMockLoginLib();
628ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
629ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
630ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(SignedSettingsTest, StoreSignedPolicy) {
631ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  NormalDelegate<bool> d(true);
632ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  d.expect_success();
633ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
634ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  em::PolicyData in_pol = BuildPolicyData(std::vector<std::string>());
635ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string serialized = in_pol.SerializeAsString();
636ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string signed_serialized;
637ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  em::PolicyFetchResponse signed_policy = BuildProto(serialized,
638ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                                     fake_value_,
639ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                                     &signed_serialized);
640ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_refptr<SignedSettings> s(
641ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      SignedSettings::CreateStorePolicyOp(&signed_policy, &d));
642ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  MockLoginLibrary* lib = MockLoginLib();
643ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(*lib, RequestStorePolicy(StrEq(signed_serialized), _, s.get()))
644ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .WillOnce(InvokeArgument<1>(static_cast<void*>(s.get()), true))
645ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .RetiresOnSaturation();
646ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
647ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  mock_service(s.get(), &m_);
648ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  em::PolicyData out_pol;
649ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(m_, set_cached_policy(A<const em::PolicyData&>()))
650ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .WillOnce(SaveArg<0>(&out_pol));
651ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
652ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s->Execute();
653ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  message_loop_.RunAllPending();
654ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  UnMockLoginLib();
655ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
656ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
657ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(SignedSettingsTest, StorePolicyNoKey) {
658ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  FailingStorePolicyOp(OwnerManager::KEY_UNAVAILABLE);
659ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
660ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
661ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(SignedSettingsTest, StorePolicyFailed) {
662ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  FailingStorePolicyOp(OwnerManager::OPERATION_FAILED);
663ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
664ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
665ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(SignedSettingsTest, StorePolicyNoPolicyData) {
666ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  NormalDelegate<bool> d(false);
667ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  d.expect_failure(SignedSettings::OPERATION_FAILED);
668ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
669ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string serialized;
670ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  em::PolicyFetchResponse fake_policy = BuildProto(std::string(),
671ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                                   std::string(),
672ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                                   &serialized);
673ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_refptr<SignedSettings> s(
674ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      SignedSettings::CreateStorePolicyOp(&fake_policy, &d));
675ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
676ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s->Execute();
677ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  message_loop_.RunAllPending();
678ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
679ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
680ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(SignedSettingsTest, RetrievePolicy) {
681ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  em::PolicyData in_pol = BuildPolicyData(std::vector<std::string>());
682ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string serialized = in_pol.SerializeAsString();
683ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string signed_serialized;
684ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  em::PolicyFetchResponse signed_policy = BuildProto(serialized,
685ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                                     fake_value_,
686ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                                     &signed_serialized);
687ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ProtoDelegate d(signed_policy);
688ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  d.expect_success();
689ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_refptr<SignedSettings> s(SignedSettings::CreateRetrievePolicyOp(&d));
690ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
691ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  MockLoginLibrary* lib = MockLoginLib();
692ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(*lib, RequestRetrievePolicy(_, s.get()))
693ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .WillOnce(InvokeArgument<0>(static_cast<void*>(s.get()),
694ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                  signed_serialized.c_str(),
695ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                  signed_serialized.length()))
696ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .RetiresOnSaturation();
697ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
698ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  mock_service(s.get(), &m_);
699ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::vector<uint8> fake_sig(fake_value_.c_str(),
700ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                              fake_value_.c_str() + fake_value_.length());
701ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(m_, StartVerifyAttempt(serialized, fake_sig, _))
702ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .Times(1);
703ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  em::PolicyData out_pol;
704ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(m_, set_cached_policy(A<const em::PolicyData&>()))
705ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .WillOnce(SaveArg<0>(&out_pol));
706ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
707ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s->Execute();
708ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  message_loop_.RunAllPending();
709ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  UnMockLoginLib();
710ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
711ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s->OnKeyOpComplete(OwnerManager::SUCCESS, std::vector<uint8>());
712ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  message_loop_.RunAllPending();
713ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
714ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
715ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(SignedSettingsTest, RetrieveNullPolicy) {
716ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  em::PolicyFetchResponse policy;
717ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ProtoDelegate d(policy);
71821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  d.expect_failure(SignedSettings::NOT_FOUND);
719ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_refptr<SignedSettings> s(SignedSettings::CreateRetrievePolicyOp(&d));
720ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
72121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  MockLoginLibrary* lib = MockLoginLib();
722ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(*lib, RequestRetrievePolicy(_, s.get()))
723ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .WillOnce(InvokeArgument<0>(static_cast<void*>(s.get()),
724ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                  static_cast<const char*>(NULL),
725ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                  0))
726ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .RetiresOnSaturation();
727ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
728ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s->Execute();
729ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  message_loop_.RunAllPending();
730ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  UnMockLoginLib();
731ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
732ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
733ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(SignedSettingsTest, RetrieveEmptyPolicy) {
734ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string serialized;
735ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  em::PolicyFetchResponse policy = BuildProto("", "", &serialized);
736ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ProtoDelegate d(policy);
737ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  d.expect_failure(SignedSettings::NOT_FOUND);
738ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_refptr<SignedSettings> s(SignedSettings::CreateRetrievePolicyOp(&d));
739ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
740ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  MockLoginLibrary* lib = MockLoginLib();
741ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(*lib, RequestRetrievePolicy(_, s.get()))
742ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .WillOnce(InvokeArgument<0>(static_cast<void*>(s.get()), "", 0))
74321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      .RetiresOnSaturation();
744ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
74521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  s->Execute();
746ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  message_loop_.RunAllPending();
74721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  UnMockLoginLib();
74821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
74921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
750ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(SignedSettingsTest, RetrieveUnsignedPolicy) {
751ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string serialized;
752ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  em::PolicyFetchResponse policy = BuildProto(fake_prop_,
753ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                              std::string(),
754ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                              &serialized);
755ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ProtoDelegate d(policy);
756ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  d.expect_failure(SignedSettings::BAD_SIGNATURE);
757ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_refptr<SignedSettings> s(SignedSettings::CreateRetrievePolicyOp(&d));
758ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
759ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  MockLoginLibrary* lib = MockLoginLib();
760ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(*lib, RequestRetrievePolicy(_, s.get()))
761ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .WillOnce(InvokeArgument<0>(static_cast<void*>(s.get()),
762ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                  serialized.c_str(),
763ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                  serialized.length()))
764ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .RetiresOnSaturation();
765ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
766ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s->Execute();
767ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  message_loop_.RunAllPending();
768ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  UnMockLoginLib();
769bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
770bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
771ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(SignedSettingsTest, RetrieveMalsignedPolicy) {
772ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string signed_serialized;
773ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  em::PolicyFetchResponse signed_policy = BuildProto(fake_prop_,
774ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                                     fake_value_,
775ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                                     &signed_serialized);
776ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ProtoDelegate d(signed_policy);
777ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  d.expect_failure(SignedSettings::BAD_SIGNATURE);
778ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_refptr<SignedSettings> s(SignedSettings::CreateRetrievePolicyOp(&d));
779ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
780ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  MockLoginLibrary* lib = MockLoginLib();
781ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(*lib, RequestRetrievePolicy(_, s.get()))
782ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .WillOnce(InvokeArgument<0>(static_cast<void*>(s.get()),
783ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                  signed_serialized.c_str(),
784ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                  signed_serialized.length()))
785ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .RetiresOnSaturation();
786ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
787ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  mock_service(s.get(), &m_);
788ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::vector<uint8> fake_sig(fake_value_.c_str(),
789ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                              fake_value_.c_str() + fake_value_.length());
790ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(m_, StartVerifyAttempt(fake_prop_, fake_sig, _))
791ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .Times(1);
792ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
793ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s->Execute();
794ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  message_loop_.RunAllPending();
795ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  UnMockLoginLib();
796ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
797ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s->OnKeyOpComplete(OwnerManager::OPERATION_FAILED, std::vector<uint8>());
798ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  message_loop_.RunAllPending();
799bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
800bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
801bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}  // namespace chromeos
802