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/owner_manager.h"
6bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/chromeos/login/owner_manager_unittest.h"
7bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
8bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include <string>
9bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
10bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/file_path.h"
11bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/file_util.h"
12bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/logging.h"
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_temp_dir.h"
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "crypto/nss_util.h"
15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "crypto/rsa_private_key.h"
16bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/chromeos/login/mock_owner_key_utils.h"
17dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h"
18bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "testing/gmock/include/gmock/gmock.h"
19bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "testing/gtest/include/gtest/gtest.h"
20bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenusing ::crypto::RSAPrivateKey;
22bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenusing ::testing::DoAll;
23bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenusing ::testing::Eq;
24bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenusing ::testing::Invoke;
25bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenusing ::testing::Return;
26bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenusing ::testing::SetArgumentPointee;
27bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenusing ::testing::_;
28bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
29bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsennamespace chromeos {
30bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
31bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass OwnerManagerTest : public ::testing::Test {
32bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public:
33bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  OwnerManagerTest()
34bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      : message_loop_(MessageLoop::TYPE_UI),
35731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        ui_thread_(BrowserThread::UI, &message_loop_),
36731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        file_thread_(BrowserThread::FILE),
37bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        mock_(new MockKeyUtils),
38bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        injector_(mock_) /* injector_ takes ownership of mock_ */ {
39bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
40bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual ~OwnerManagerTest() {}
41bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
42bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void SetUp() {
43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    crypto::OpenPersistentNSSDB();  // TODO(cmasone): use test DB instead
44bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    fake_private_key_.reset(RSAPrivateKey::Create(256));
45bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    ASSERT_TRUE(fake_private_key_->ExportPublicKey(&fake_public_key_));
46bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
47bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // Mimic ownership.
48bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    ASSERT_TRUE(tmpdir_.CreateUniqueTempDir());
49bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    ASSERT_TRUE(file_util::CreateTemporaryFileInDir(tmpdir_.path(), &tmpfile_));
50bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
51bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    file_thread_.Start();
52bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    OwnerKeyUtils::set_factory(&injector_);
53bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
54bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
55bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void TearDown() {
56bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    OwnerKeyUtils::set_factory(NULL);
57bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
58bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
59bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void StartUnowned() {
60bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    file_util::Delete(tmpfile_, false);
61bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
62bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
63bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void InjectKeys(OwnerManager* manager) {
64bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    manager->public_key_ = fake_public_key_;
65bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    manager->private_key_.reset(fake_private_key_.release());
66bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
67bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
68bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ScopedTempDir tmpdir_;
69bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  FilePath tmpfile_;
70bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
71bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  MessageLoop message_loop_;
72731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BrowserThread ui_thread_;
73731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BrowserThread file_thread_;
74bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
75bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::vector<uint8> fake_public_key_;
76bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  scoped_ptr<RSAPrivateKey> fake_private_key_;
77bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
78bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  MockKeyUtils* mock_;
79bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  MockInjector injector_;
80bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
81bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen};
82bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(OwnerManagerTest, UpdateOwnerKey) {
84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_refptr<OwnerManager> manager(new OwnerManager);
85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  MockKeyUpdateUser delegate;
87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  BrowserThread::PostTask(
88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      BrowserThread::FILE, FROM_HERE,
89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NewRunnableMethod(manager.get(),
90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                        &OwnerManager::UpdateOwnerKey,
91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                        BrowserThread::UI,
92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                        std::vector<uint8>(),
93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                        &delegate));
94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  message_loop_.Run();
95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
97bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(OwnerManagerTest, LoadOwnerKeyFail) {
98bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  StartUnowned();
99bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  MockKeyLoadObserver loader;
100bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  scoped_refptr<OwnerManager> manager(new OwnerManager);
101bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
102bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  EXPECT_CALL(*mock_, GetOwnerKeyFilePath())
103bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      .WillRepeatedly(Return(tmpfile_));
104bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  EXPECT_CALL(*mock_, ImportPublicKey(tmpfile_, _))
105bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      .WillOnce(Return(false))
106bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      .RetiresOnSaturation();
107bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
108731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BrowserThread::PostTask(
109731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      BrowserThread::FILE, FROM_HERE,
110bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      NewRunnableMethod(manager.get(),
111bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        &OwnerManager::LoadOwnerKey));
112bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  message_loop_.Run();
113bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
114bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
115bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(OwnerManagerTest, AlreadyLoadedOwnerKey) {
116bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  MockKeyLoadObserver loader;
117bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  loader.ExpectKeyFetchSuccess(true);
118bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  scoped_refptr<OwnerManager> manager(new OwnerManager);
119bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
120bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  EXPECT_CALL(*mock_, GetOwnerKeyFilePath())
121bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      .WillRepeatedly(Return(tmpfile_));
122bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
123bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  InjectKeys(manager.get());
124bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
125731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BrowserThread::PostTask(
126731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      BrowserThread::FILE, FROM_HERE,
127bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      NewRunnableMethod(manager.get(),
128bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        &OwnerManager::LoadOwnerKey));
129bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
130bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  message_loop_.Run();
131bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
132bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
133bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(OwnerManagerTest, LoadOwnerKey) {
134bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  MockKeyLoadObserver loader;
135bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  loader.ExpectKeyFetchSuccess(true);
136bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  scoped_refptr<OwnerManager> manager(new OwnerManager);
137bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
138bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  EXPECT_CALL(*mock_, GetOwnerKeyFilePath())
139bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      .WillRepeatedly(Return(tmpfile_));
140bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  EXPECT_CALL(*mock_, ImportPublicKey(tmpfile_, _))
141bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      .WillOnce(DoAll(SetArgumentPointee<1>(fake_public_key_),
142bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                      Return(true)))
143bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      .RetiresOnSaturation();
144bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
145731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BrowserThread::PostTask(
146731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      BrowserThread::FILE, FROM_HERE,
147bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      NewRunnableMethod(manager.get(),
148bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        &OwnerManager::LoadOwnerKey));
149bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
150bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  message_loop_.Run();
151bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
152bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
153bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(OwnerManagerTest, GetKeyFailDuringVerify) {
154bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  StartUnowned();
155bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  MockKeyLoadObserver loader;
156bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  loader.ExpectKeyFetchSuccess(false);
157bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  scoped_refptr<OwnerManager> manager(new OwnerManager);
158bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
159bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  EXPECT_CALL(*mock_, GetOwnerKeyFilePath())
160bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      .WillRepeatedly(Return(tmpfile_));
161bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  EXPECT_CALL(*mock_, ImportPublicKey(tmpfile_, _))
162bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      .WillOnce(Return(false))
163bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      .RetiresOnSaturation();
164bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
165bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  MockKeyUser delegate(OwnerManager::KEY_UNAVAILABLE);
166bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
167731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BrowserThread::PostTask(
168731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      BrowserThread::FILE, FROM_HERE,
169bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      NewRunnableMethod(manager.get(),
170bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        &OwnerManager::Verify,
171731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                        BrowserThread::UI,
172bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        std::string(),
173bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        std::vector<uint8>(),
174bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        &delegate));
175bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  message_loop_.Run();
176bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
177bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
178bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(OwnerManagerTest, AlreadyHaveKeysVerify) {
179bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  scoped_refptr<OwnerManager> manager(new OwnerManager);
180bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
181bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::string data;
182bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::vector<uint8> sig(0, 2);
183bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
184bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  EXPECT_CALL(*mock_, GetOwnerKeyFilePath())
185bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      .WillRepeatedly(Return(tmpfile_));
186bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  EXPECT_CALL(*mock_, Verify(Eq(data), Eq(sig), Eq(fake_public_key_)))
187bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      .WillOnce(Return(true))
188bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      .RetiresOnSaturation();
189bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
190bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  InjectKeys(manager.get());
191bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  MockKeyUser delegate(OwnerManager::SUCCESS);
192bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
193731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BrowserThread::PostTask(
194731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      BrowserThread::FILE, FROM_HERE,
195bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      NewRunnableMethod(manager.get(),
196bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        &OwnerManager::Verify,
197731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                        BrowserThread::UI,
198bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        data,
199bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        sig,
200bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        &delegate));
201bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  message_loop_.Run();
202bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
203bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
204bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(OwnerManagerTest, GetKeyAndVerify) {
205bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  MockKeyLoadObserver loader;
206bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  loader.ExpectKeyFetchSuccess(true);
207bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  loader.SetQuitOnKeyFetch(false);
208bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  scoped_refptr<OwnerManager> manager(new OwnerManager);
209bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
210bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::string data;
211bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::vector<uint8> sig(0, 2);
212bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
213bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  EXPECT_CALL(*mock_, GetOwnerKeyFilePath())
214bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      .WillRepeatedly(Return(tmpfile_));
215bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  EXPECT_CALL(*mock_, ImportPublicKey(tmpfile_, _))
216bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      .WillOnce(DoAll(SetArgumentPointee<1>(fake_public_key_),
217bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                      Return(true)))
218bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      .RetiresOnSaturation();
219bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  EXPECT_CALL(*mock_, Verify(Eq(data), Eq(sig), Eq(fake_public_key_)))
220bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      .WillOnce(Return(true))
221bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      .RetiresOnSaturation();
222bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
223bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  MockKeyUser delegate(OwnerManager::SUCCESS);
224bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
225731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BrowserThread::PostTask(
226731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      BrowserThread::FILE, FROM_HERE,
227bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      NewRunnableMethod(manager.get(),
228bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        &OwnerManager::Verify,
229731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                        BrowserThread::UI,
230bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        data,
231bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        sig,
232bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        &delegate));
233bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  message_loop_.Run();
234bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
235bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
236bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(OwnerManagerTest, AlreadyHaveKeysSign) {
237bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  scoped_refptr<OwnerManager> manager(new OwnerManager);
238bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
239bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::string data;
240bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::vector<uint8> sig(0, 2);
241bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
242bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  EXPECT_CALL(*mock_, GetOwnerKeyFilePath())
243bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      .WillRepeatedly(Return(tmpfile_));
244bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  EXPECT_CALL(*mock_, Sign(Eq(data), _, Eq(fake_private_key_.get())))
245bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      .WillOnce(DoAll(SetArgumentPointee<1>(sig),
246bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                      Return(true)))
247bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      .RetiresOnSaturation();
248bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
249bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  InjectKeys(manager.get());
250bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  MockSigner delegate(OwnerManager::SUCCESS, sig);
251bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
252731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BrowserThread::PostTask(
253731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      BrowserThread::FILE, FROM_HERE,
254bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      NewRunnableMethod(manager.get(),
255bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        &OwnerManager::Sign,
256731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                        BrowserThread::UI,
257bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        data,
258bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        &delegate));
259bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  message_loop_.Run();
260bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
261bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
262bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}  // namespace chromeos
263